x-logging: &default-logging driver: json-file options: max-size: "10m" max-file: "3" x-bot-common: &bot-common build: context: . dockerfile: Dockerfile restart: unless-stopped init: true depends_on: postgres: condition: service_healthy redis: condition: service_healthy security_opt: - no-new-privileges:true cap_drop: - ALL stop_grace_period: 30s networks: - edge_net - backend_net logging: *default-logging services: bot_alpha: <<: *bot-common env_file: - .env.bot-alpha.prod environment: STATE_BACKEND: redis COMMAND_DISPATCH_MODE: local bot_beta: <<: *bot-common env_file: - .env.bot-beta.prod environment: STATE_BACKEND: redis COMMAND_DISPATCH_MODE: local postgres: image: postgres:16-alpine restart: unless-stopped init: true environment: POSTGRES_DB: discord_bots POSTGRES_USER: discord_bot POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required} POSTGRES_INITDB_ARGS: --auth-host=scram-sha-256 --auth-local=scram-sha-256 volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"] interval: 10s timeout: 5s retries: 5 start_period: 15s security_opt: - no-new-privileges:true stop_grace_period: 30s networks: - backend_net logging: *default-logging redis: image: redis:7-alpine restart: unless-stopped init: true environment: REDIS_PASSWORD: ${REDIS_PASSWORD:?REDIS_PASSWORD is required} command: - sh - -ec - > exec redis-server --appendonly yes --save 60 1000 --requirepass "$${REDIS_PASSWORD}" --maxmemory-policy noeviction volumes: - redis_data:/data healthcheck: test: ["CMD-SHELL", "redis-cli -a \"$${REDIS_PASSWORD}\" ping | grep -q PONG"] interval: 10s timeout: 5s retries: 5 start_period: 10s security_opt: - no-new-privileges:true stop_grace_period: 20s networks: - backend_net logging: *default-logging volumes: postgres_data: redis_data: networks: edge_net: driver: bridge backend_net: driver: bridge internal: true