production.toml RawHistoryFolder
1# Gordon v2 - Production Configuration Example
2# Optimized for production environments with multiple services
3
4[server]
5port = 8080
6registry_port = 5000
7registry_domain = "registry.company.com"
8runtime = "auto" # auto-detects Docker/Podman
9# socket_path = "" # optional: override with custom socket path
10ssl_email = "devops@company.com"
11data_dir = "/var/lib/gordon"
12
13[registry_auth]
14enabled = true
15username = "deploy-bot"
16password = "CHANGE-THIS-IN-PRODUCTION" # Use environment variables in production!
17
18# Production logging configuration
19[logging]
20enabled = true # Enable comprehensive logging
21level = "info" # Standard production logging level
22dir = "/var/log/gordon" # System log directory
23main_log_file = "gordon.log" # Main application logs
24proxy_log_file = "proxy.log" # HTTP proxy traffic logs
25container_log_dir = "containers" # Container logs subdirectory
26
27# Production log rotation settings
28max_size = 100 # Max 100MB per log file
29max_backups = 10 # Keep 10 old files for history
30max_age = 90 # Keep logs for 3 months
31compress = true # Compress old logs to save space
32
33# Environment variables configuration
34[env]
35# Directory where .env files are stored for each route
36dir = "/var/lib/gordon/env"
37# Secret providers for secure credential management
38providers = ["pass", "sops"]
39
40# Production service routes
41[routes]
42"app.company.com" = "company-app:v2.1.0" # Main app with pinned version
43"api.company.com" = "company-api:v1.5.2" # API service
44"admin.company.com" = "admin-panel:v1.0.1" # Admin interface
45"docs.company.com" = "company-docs:latest" # Documentation site
46"status.company.com" = "status-page:v0.3.0" # Status page
47
48# Monitoring and internal tools
49"grafana.company.com" = "grafana/grafana:latest" # Metrics dashboard
50"prometheus.company.com" = "prom/prometheus:latest" # Metrics collection
51
52# Network isolation for production security
53[network_isolation]
54enabled = true # Enable per-app network isolation
55network_prefix = "prod" # Production network prefix
56dns_suffix = ".internal" # Internal DNS suffix
57
58# Network groups for microservices that need to communicate
59[network_groups]
60"backend" = ["app.company.com", "api.company.com"] # App and API share services
61"monitoring" = ["grafana.company.com", "prometheus.company.com"] # Monitoring stack
62
63# Service attachments with isolated networks
64[attachments]
65# Shared backend services
66"backend" = ["company-redis:latest", "company-rabbitmq:latest"]
67# Individual databases for isolation
68"app.company.com" = ["company-postgres:latest"]
69"api.company.com" = ["company-postgres:latest"]
70"admin.company.com" = ["company-mysql:latest"]
71# Monitoring services get their own network
72"monitoring" = ["company-prometheus-data:latest"]
73
74# Environment Variables Usage:
75#
76# For each route, create a .env file named after the domain:
77# /var/lib/gordon/env/app_company_com.env
78# /var/lib/gordon/env/api_company_com.env
79#
80# Example env file content:
81# NODE_ENV=production
82# DATABASE_URL=postgresql://user:pass@db:5432/prod
83# API_KEY=${pass:company/api-key} # From pass
84# SECRET_KEY=${sops:secrets.yaml:app.secret} # From sops
85#
86# Secret syntax:
87# ${pass:path/to/secret} - Unix password manager
88# ${sops:file.yaml:key.path} - SOPS encrypted file
89
90# Production deployment workflow:
91# 1. Build and tag: docker build -t company-app:v2.1.1 .
92# 2. Tag for registry: docker tag company-app:v2.1.1 registry.company.com/company-app:v2.1.1
93# 3. Update this config: "app.company.com" = "company-app:v2.1.1"
94# 4. Create/update env file: /var/lib/gordon/env/app_company_com.env
95# 5. Restart Gordon to reload config
96# 6. Push to deploy: docker push registry.company.com/company-app:v2.1.1
97# 7. Gordon automatically deploys to app.company.com with environment variables!
98#
99# NETWORK ISOLATION IN PRODUCTION:
100# - Each app gets its own isolated network (prod-app-company-com, prod-admin-company-com)
101# - Network groups allow controlled sharing (prod-backend, prod-monitoring)
102# - Services communicate via simple DNS names (redis:6379, postgres:5432)
103# - Complete isolation between tenant/service boundaries
104#
105# Example service Dockerfiles for persistent storage:
106#
107# company-postgres/Dockerfile:
108# FROM postgres:15
109# VOLUME ["/var/lib/postgresql/data"]
110# ENV POSTGRES_DB=production
111# ENV POSTGRES_USER=app
112# ENV POSTGRES_PASSWORD=supersecret
113#
114# company-redis/Dockerfile:
115# FROM redis:7-alpine
116# VOLUME ["/data"]
117# CMD ["redis-server", "--appendonly", "yes"]