# Three services: db, bot (long polling and workers), web (Mini App and API on a local HTTP port). # HTTPS is provided by an external Caddy in front of the web port. x-app: &app build: context: . platforms: - linux/arm64 platform: linux/arm64 restart: unless-stopped depends_on: db: condition: service_healthy environment: &env DATABASE_URL: postgres://${POSTGRES_USER:-jevchik}:${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD in .env}@db:5432/${POSTGRES_DB:-jevchik} TELEGRAM_BOT_TOKEN: ${TELEGRAM_BOT_TOKEN:?set TELEGRAM_BOT_TOKEN in .env} TYPESAFE_API_KEY: ${TYPESAFE_API_KEY:?set TYPESAFE_API_KEY in .env} VISION_BASE_URL: ${VISION_BASE_URL:-} VISION_MODEL: ${VISION_MODEL:-} VISION_API_KEY: ${VISION_API_KEY:-} BOT_USERNAME: ${BOT_USERNAME:-} TELEGRAM_API_ROOT: ${TELEGRAM_API_ROOT:-} JEV_API_URL: ${JEV_API_URL:-} IMPORT_DIR: /data/imports volumes: - imports:/data/imports labels: com.centurylinklabs.watchtower.enable: "false" services: db: image: postgres:16-alpine platform: linux/arm64 restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER:-jevchik} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD in .env} POSTGRES_DB: ${POSTGRES_DB:-jevchik} volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] interval: 5s timeout: 3s retries: 20 labels: com.centurylinklabs.watchtower.enable: "false" bot: <<: *app command: ["node", "dist/main.js", "bot"] healthcheck: test: ["CMD", "node", "-e", "const s=require('fs').statSync('/tmp/heartbeat');process.exit(Date.now()-s.mtimeMs<90000?0:1)"] interval: 15s timeout: 5s retries: 4 start_period: 40s web: <<: *app command: ["node", "dist/main.js", "web"] environment: <<: *env PORT: "8080" ports: - "127.0.0.1:${WEB_PORT:-8080}:8080" healthcheck: test: ["CMD", "wget", "-qO-", "http://127.0.0.1:8080/healthz"] interval: 10s timeout: 3s retries: 5 start_period: 20s volumes: pgdata: imports: