services: app: build: context: . dockerfile: Dockerfile environment: NODE_ENV: production PORT: 3000 HOST: 0.0.0.0 LOG_LEVEL: info # Database connection (use Coolify-managed PostgreSQL) POSTGRES_HOST: ${POSTGRES_HOST:-postgres} POSTGRES_PORT: ${POSTGRES_PORT:-5432} POSTGRES_USER: ${POSTGRES_USER:-agenthub} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB:-agenthub} # Redis connection (use Coolify-managed Redis) REDIS_HOST: ${REDIS_HOST:-redis} REDIS_PORT: ${REDIS_PORT:-6379} # JWT secret for authentication JWT_SECRET: ${JWT_SECRET} # CORS allowed origins ALLOWED_ORIGINS: ${ALLOWED_ORIGINS:-https://agenthub.barodine.net} networks: - default - coolify depends_on: postgres: condition: service_healthy redis: condition: service_started restart: unless-stopped labels: # Coolify labels for reverse proxy - 'coolify.managed=true' - 'coolify.name=agenthub' - 'coolify.type=application' # Enable HTTPS and WebSocket support - 'traefik.enable=true' - 'traefik.http.routers.agenthub.rule=Host(`agenthub.barodine.net`)' - 'traefik.http.routers.agenthub.entrypoints=websecure' - 'traefik.http.routers.agenthub.tls=true' - 'traefik.http.routers.agenthub.tls.certresolver=letsencrypt' # WebSocket support - 'traefik.http.services.agenthub.loadbalancer.server.port=3000' - 'traefik.http.middlewares.agenthub-headers.headers.customrequestheaders.X-Forwarded-Proto=https' - 'traefik.http.routers.agenthub.middlewares=agenthub-headers' healthcheck: test: ['CMD', 'curl', '-f', 'http://localhost:3000/healthz'] interval: 30s timeout: 5s retries: 3 start_period: 10s postgres: image: postgres:16-alpine environment: POSTGRES_DB: ${POSTGRES_DB:-agenthub} POSTGRES_USER: ${POSTGRES_USER:-agenthub} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_INITDB_ARGS: '--encoding=UTF8 --locale=C' PGDATA: /var/lib/postgresql/data/pgdata volumes: - postgres_data:/var/lib/postgresql/data restart: unless-stopped healthcheck: test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER:-agenthub} -d ${POSTGRES_DB:-agenthub}'] interval: 10s timeout: 5s retries: 5 start_period: 10s labels: - 'coolify.managed=true' - 'coolify.type=database' redis: image: redis:7-alpine command: - redis-server - --save 60 100 - --appendonly yes - --appendfsync everysec - --maxmemory 256mb - --maxmemory-policy allkeys-lru volumes: - redis_data:/data restart: unless-stopped healthcheck: test: ['CMD', 'redis-cli', 'ping'] interval: 10s timeout: 3s retries: 3 start_period: 5s labels: - 'coolify.managed=true' - 'coolify.type=database' # Database backup service (optional, can be enabled in production) backup: build: context: . dockerfile: Dockerfile.backup environment: PGHOST: postgres PGPORT: 5432 PGDATABASE: ${POSTGRES_DB:-agenthub} PGUSER: ${POSTGRES_USER:-agenthub} PGPASSWORD: ${POSTGRES_PASSWORD} BACKUP_DIR: /backups RETENTION_DAYS: ${BACKUP_RETENTION_DAYS:-14} # Optional S3 upload S3_ENDPOINT: ${S3_ENDPOINT:-} S3_BUCKET: ${S3_BUCKET:-} AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID:-} AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY:-} # Optional GPG encryption GPG_RECIPIENT_KEY: ${GPG_RECIPIENT_KEY:-} volumes: - backup_data:/backups depends_on: postgres: condition: service_healthy restart: 'no' profiles: - backup labels: - 'coolify.managed=true' - 'coolify.type=service' # Ofelia cron labels for scheduled backups - 'ofelia.enabled=true' - 'ofelia.job-exec.backup-daily.schedule=0 0 3 * * *' - 'ofelia.job-exec.backup-daily.command=/usr/local/bin/backup.sh' volumes: postgres_data: driver: local labels: - 'coolify.managed=true' redis_data: driver: local labels: - 'coolify.managed=true' backup_data: driver: local labels: - 'coolify.managed=true' networks: default: labels: - 'coolify.managed=true' coolify: external: true