# Gordon v2 - Production Configuration Example # Optimized for production environments with multiple services [server] port = 8080 registry_port = 5000 registry_domain = "registry.company.com" runtime = "auto" # auto-detects Docker/Podman # socket_path = "" # optional: override with custom socket path ssl_email = "devops@company.com" data_dir = "/var/lib/gordon" [registry_auth] enabled = true username = "deploy-bot" password = "CHANGE-THIS-IN-PRODUCTION" # Use environment variables in production! # Production logging configuration [logging] enabled = true # Enable comprehensive logging level = "info" # Standard production logging level dir = "/var/log/gordon" # System log directory main_log_file = "gordon.log" # Main application logs proxy_log_file = "proxy.log" # HTTP proxy traffic logs container_log_dir = "containers" # Container logs subdirectory # Production log rotation settings max_size = 100 # Max 100MB per log file max_backups = 10 # Keep 10 old files for history max_age = 90 # Keep logs for 3 months compress = true # Compress old logs to save space # Environment variables configuration [env] # Directory where .env files are stored for each route dir = "/var/lib/gordon/env" # Secret providers for secure credential management providers = ["pass", "sops"] # Production service routes [routes] "app.company.com" = "company-app:v2.1.0" # Main app with pinned version "api.company.com" = "company-api:v1.5.2" # API service "admin.company.com" = "admin-panel:v1.0.1" # Admin interface "docs.company.com" = "company-docs:latest" # Documentation site "status.company.com" = "status-page:v0.3.0" # Status page # Monitoring and internal tools "grafana.company.com" = "grafana/grafana:latest" # Metrics dashboard "prometheus.company.com" = "prom/prometheus:latest" # Metrics collection # Network isolation for production security [network_isolation] enabled = true # Enable per-app network isolation network_prefix = "prod" # Production network prefix dns_suffix = ".internal" # Internal DNS suffix # Network groups for microservices that need to communicate [network_groups] "backend" = ["app.company.com", "api.company.com"] # App and API share services "monitoring" = ["grafana.company.com", "prometheus.company.com"] # Monitoring stack # Service attachments with isolated networks [attachments] # Shared backend services "backend" = ["company-redis:latest", "company-rabbitmq:latest"] # Individual databases for isolation "app.company.com" = ["company-postgres:latest"] "api.company.com" = ["company-postgres:latest"] "admin.company.com" = ["company-mysql:latest"] # Monitoring services get their own network "monitoring" = ["company-prometheus-data:latest"] # Environment Variables Usage: # # For each route, create a .env file named after the domain: # /var/lib/gordon/env/app_company_com.env # /var/lib/gordon/env/api_company_com.env # # Example env file content: # NODE_ENV=production # DATABASE_URL=postgresql://user:pass@db:5432/prod # API_KEY=${pass:company/api-key} # From pass # SECRET_KEY=${sops:secrets.yaml:app.secret} # From sops # # Secret syntax: # ${pass:path/to/secret} - Unix password manager # ${sops:file.yaml:key.path} - SOPS encrypted file # Production deployment workflow: # 1. Build and tag: docker build -t company-app:v2.1.1 . # 2. Tag for registry: docker tag company-app:v2.1.1 registry.company.com/company-app:v2.1.1 # 3. Update this config: "app.company.com" = "company-app:v2.1.1" # 4. Create/update env file: /var/lib/gordon/env/app_company_com.env # 5. Restart Gordon to reload config # 6. Push to deploy: docker push registry.company.com/company-app:v2.1.1 # 7. Gordon automatically deploys to app.company.com with environment variables! # # NETWORK ISOLATION IN PRODUCTION: # - Each app gets its own isolated network (prod-app-company-com, prod-admin-company-com) # - Network groups allow controlled sharing (prod-backend, prod-monitoring) # - Services communicate via simple DNS names (redis:6379, postgres:5432) # - Complete isolation between tenant/service boundaries # # Example service Dockerfiles for persistent storage: # # company-postgres/Dockerfile: # FROM postgres:15 # VOLUME ["/var/lib/postgresql/data"] # ENV POSTGRES_DB=production # ENV POSTGRES_USER=app # ENV POSTGRES_PASSWORD=supersecret # # company-redis/Dockerfile: # FROM redis:7-alpine # VOLUME ["/data"] # CMD ["redis-server", "--appendonly", "yes"]