# Warp on PostgreSQL: the homeserver, the admin panel, the web client and # PostgreSQL, each in its own container, pulled from a registry. # # cd Docker # WARP_SERVER_NAME=matrix.example.org WARP_POSTGRES_PASSWORD=change-me \ # docker compose -f docker-compose.postgresql.prod.yml up -d # # Homeserver http://localhost:8008, admin panel http://localhost:8009, web # client http://localhost:8080. PostgreSQL is reachable only on the compose # network. # # Create the first administrator once the server is up: # # docker compose -f docker-compose.postgresql.prod.yml exec warp warp create-account --username admin --admin # # Nothing is built here: the images come from WARP_REGISTRY (default # ghcr.io/dariuszjaniak) at tag WARP_VERSION (default latest). Pin # WARP_VERSION to a release in production, and update with # # docker compose -f docker-compose.postgresql.prod.yml pull && docker compose -f docker-compose.postgresql.prod.yml up -d name: warp-postgresql services: postgres: image: postgres:17-alpine restart: unless-stopped environment: POSTGRES_USER: warp POSTGRES_PASSWORD: ${WARP_POSTGRES_PASSWORD:?set WARP_POSTGRES_PASSWORD} POSTGRES_DB: warp # C sorts by byte, which is what room and event IDs are compared by. POSTGRES_INITDB_ARGS: --encoding=UTF8 --lc-collate=C --lc-ctype=C volumes: - postgres-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U warp -d warp"] interval: 5s timeout: 5s retries: 20 warp: image: ${WARP_REGISTRY:-ghcr.io/dariuszjaniak}/warp:${WARP_VERSION:-latest} pull_policy: always restart: unless-stopped depends_on: postgres: condition: service_healthy # The signing key is created on first start and kept in the volume: # losing it means other servers no longer recognise this one. entrypoint: ["/bin/sh", "-c"] command: - test -f /data/signing.key || warp generate-keys --output /data/signing.key; exec warp serve environment: WARP_SERVER_NAME: ${WARP_SERVER_NAME:-localhost} WARP_WELL_KNOWN_CLIENT_BASE_URL: ${WARP_PUBLIC_BASEURL:-http://localhost:8008} WARP_DB_DRIVER: postgres WARP_DB_CONNECTION_STRING: postgres://warp:${WARP_POSTGRES_PASSWORD:?set WARP_POSTGRES_PASSWORD}@postgres:5432/warp?sslmode=disable WARP_REGISTRATION_ENABLED: ${WARP_REGISTRATION_ENABLED:-false} WARP_FEDERATION_ENABLED: ${WARP_FEDERATION_ENABLED:-false} volumes: - warp-data:/data ports: - "${WARP_PORT:-8008}:8008" admin: image: ${WARP_REGISTRY:-ghcr.io/dariuszjaniak}/warp-admin:${WARP_VERSION:-latest} pull_policy: always restart: unless-stopped depends_on: - warp environment: WARP_ADMIN_HOMESERVER: http://warp:8008 ports: - "${WARP_ADMIN_PORT:-8009}:8009" web: image: ${WARP_REGISTRY:-ghcr.io/dariuszjaniak}/warp-web:${WARP_VERSION:-latest} pull_policy: always restart: unless-stopped depends_on: - warp environment: WARP_WEB_HOMESERVER: http://warp:8008 ports: - "${WARP_WEB_PORT:-8080}:8080" volumes: postgres-data: warp-data: