services: postgres: image: postgres:16-alpine container_name: basil-postgres restart: unless-stopped environment: POSTGRES_USER: basil POSTGRES_PASSWORD: basil POSTGRES_DB: basil ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data networks: - internal healthcheck: test: ["CMD-SHELL", "pg_isready -U basil"] interval: 10s timeout: 5s retries: 5 api: build: context: . dockerfile: packages/api/Dockerfile container_name: basil-api restart: unless-stopped depends_on: postgres: condition: service_healthy environment: NODE_ENV: production PORT: 3001 # Use DATABASE_URL from .env if set, otherwise default to local postgres DATABASE_URL: ${DATABASE_URL:-postgresql://basil:basil@postgres:5432/basil?schema=public} STORAGE_TYPE: local LOCAL_STORAGE_PATH: /app/uploads BACKUP_PATH: /app/backups CORS_ORIGIN: https://basil.pkartchner.com volumes: - uploads_data:/app/uploads - backups_data:/app/backups networks: - internal - traefik web: build: context: . dockerfile: packages/web/Dockerfile container_name: basil-web restart: unless-stopped depends_on: - api networks: - traefik - internal labels: - "traefik.enable=true" - "traefik.http.routers.basil.rule=Host(`basil.pkartchner.com`)" - "traefik.http.routers.basil.entrypoints=https" - "traefik.http.routers.basil.tls.certresolver=letsencrypt" - "traefik.http.services.basil.loadbalancer.server.port=80" volumes: postgres_data: uploads_data: backups_data: networks: traefik: external: true internal: driver: bridge