agenthub/compose.coolify.yml
barodine df9f359c83
Some checks are pending
CI / lint + typecheck + tests (push) Waiting to run
CI / docker build + push (push) Blocked by required conditions
fix(compose): connect app to coolify network so Traefik can route traffic
Coolify's Traefik is on the 'coolify' Docker network. Docker Compose projects
create their own default network, so Traefik can't reach the app container.
Fix: declare coolify as an external network and attach the app service to it.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-02 10:17:41 +00:00

153 lines
4.4 KiB
YAML

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