services: postgres: image: postgres:16-alpine restart: unless-stopped environment: POSTGRES_DB: silkie POSTGRES_USER: silkie POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U silkie -d silkie"] interval: 10s timeout: 5s retries: 10 redis: image: redis:7-alpine restart: unless-stopped command: ["redis-server", "--appendonly", "no"] volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 3s retries: 10 coturn: image: coturn/coturn:4.6 restart: unless-stopped network_mode: host command: - turnserver - --use-auth-secret - --static-auth-secret=${COTURN_SECRET} - --realm=${UOA_DOMAIN} - --external-ip=${TURN_HOST} - --listening-port=${TURN_PORT:-3478} - --tls-listening-port=5349 - --fingerprint - --no-cli - --no-loopback-peers - --no-multicast-peers - --min-port=49152 - --max-port=49200 server: build: . restart: unless-stopped depends_on: postgres: condition: service_healthy redis: condition: service_healthy env_file: - .env expose: - "${SERVER_PORT:-8080}" stop_grace_period: 45s healthcheck: test: ["CMD", "wget", "-qO-", "http://localhost:${SERVER_PORT:-8080}/healthz"] interval: 10s timeout: 3s retries: 5 caddy: image: caddy:2-alpine restart: unless-stopped depends_on: server: condition: service_healthy ports: - "80:80" - "443:443" volumes: - ./ops/Caddyfile:/etc/caddy/Caddyfile:ro - caddy_data:/data - caddy_config:/config volumes: postgres_data: redis_data: caddy_data: caddy_config: