services: # PostgreSQL database postgres: image: postgres:16-alpine container_name: certctl-postgres environment: POSTGRES_DB: certctl POSTGRES_USER: certctl POSTGRES_PASSWORD: certctl ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data - ../migrations/000001_initial_schema.up.sql:/docker-entrypoint-initdb.d/001_schema.sql - ../migrations/seed.sql:/docker-entrypoint-initdb.d/002_seed.sql - ../migrations/seed_demo.sql:/docker-entrypoint-initdb.d/003_seed_demo.sql networks: - certctl-network healthcheck: test: ["CMD-SHELL", "pg_isready -U certctl -d certctl"] interval: 5s timeout: 5s retries: 5 restart: unless-stopped # Certctl Server (API + scheduler) certctl-server: build: context: .. dockerfile: Dockerfile container_name: certctl-server depends_on: postgres: condition: service_healthy environment: CERTCTL_DATABASE_URL: postgres://certctl:certctl@postgres:5432/certctl?sslmode=disable CERTCTL_SERVER_HOST: 0.0.0.0 CERTCTL_SERVER_PORT: 8443 CERTCTL_LOG_LEVEL: info CERTCTL_AUTH_TYPE: none ports: - "8443:8443" networks: - certctl-network healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8443/health"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped logging: driver: "json-file" options: max-size: "10m" max-file: "3" # Certctl Agent certctl-agent: build: context: .. dockerfile: Dockerfile.agent container_name: certctl-agent depends_on: certctl-server: condition: service_healthy environment: CERTCTL_SERVER_URL: http://certctl-server:8443 CERTCTL_API_KEY: change-me-in-production CERTCTL_AGENT_NAME: docker-agent CERTCTL_LOG_LEVEL: info networks: - certctl-network restart: unless-stopped logging: driver: "json-file" options: max-size: "10m" max-file: "3" networks: certctl-network: driver: bridge volumes: postgres_data: driver: local