Files
GuardDen/docker-compose.yml

154 lines
4.7 KiB
YAML

services:
bot:
build:
context: .
args:
INSTALL_AI: ${INSTALL_AI:-true}
image: guardden:latest
container_name: guardden-bot
restart: unless-stopped
depends_on:
db:
condition: service_healthy
environment:
- GUARDDEN_DISCORD_TOKEN=${GUARDDEN_DISCORD_TOKEN}
- GUARDDEN_DATABASE_URL=postgresql://guardden:guardden@db:5432/guardden
- GUARDDEN_LOG_LEVEL=${GUARDDEN_LOG_LEVEL:-INFO}
- GUARDDEN_ALLOWED_GUILDS=${GUARDDEN_ALLOWED_GUILDS:-}
- GUARDDEN_OWNER_IDS=${GUARDDEN_OWNER_IDS:-}
- GUARDDEN_AI_PROVIDER=${GUARDDEN_AI_PROVIDER:-none}
- GUARDDEN_ANTHROPIC_API_KEY=${GUARDDEN_ANTHROPIC_API_KEY:-}
- GUARDDEN_OPENAI_API_KEY=${GUARDDEN_OPENAI_API_KEY:-}
volumes:
- guardden_data:/app/data
- guardden_logs:/app/logs
networks:
- guardden
healthcheck:
test: ["CMD", "python", "-m", "guardden.health", "--check"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
dashboard:
build:
context: .
target: runtime
image: guardden-dashboard:latest
container_name: guardden-dashboard
restart: unless-stopped
depends_on:
db:
condition: service_healthy
ports:
- "${DASHBOARD_PORT:-8080}:8000"
environment:
- GUARDDEN_DATABASE_URL=postgresql://guardden:guardden@db:5432/guardden
- GUARDDEN_DASHBOARD_BASE_URL=${GUARDDEN_DASHBOARD_BASE_URL:-http://localhost:8080}
- GUARDDEN_DASHBOARD_SECRET_KEY=${GUARDDEN_DASHBOARD_SECRET_KEY}
- GUARDDEN_DASHBOARD_ENTRA_TENANT_ID=${GUARDDEN_DASHBOARD_ENTRA_TENANT_ID}
- GUARDDEN_DASHBOARD_ENTRA_CLIENT_ID=${GUARDDEN_DASHBOARD_ENTRA_CLIENT_ID}
- GUARDDEN_DASHBOARD_ENTRA_CLIENT_SECRET=${GUARDDEN_DASHBOARD_ENTRA_CLIENT_SECRET}
- GUARDDEN_DASHBOARD_DISCORD_CLIENT_ID=${GUARDDEN_DASHBOARD_DISCORD_CLIENT_ID}
- GUARDDEN_DASHBOARD_DISCORD_CLIENT_SECRET=${GUARDDEN_DASHBOARD_DISCORD_CLIENT_SECRET}
- GUARDDEN_DASHBOARD_OWNER_DISCORD_ID=${GUARDDEN_DASHBOARD_OWNER_DISCORD_ID}
- GUARDDEN_DASHBOARD_OWNER_ENTRA_OBJECT_ID=${GUARDDEN_DASHBOARD_OWNER_ENTRA_OBJECT_ID}
- GUARDDEN_DASHBOARD_CORS_ORIGINS=${GUARDDEN_DASHBOARD_CORS_ORIGINS:-}
volumes:
- guardden_logs:/app/logs:ro
networks:
- guardden
command: ["python", "-m", "guardden.dashboard"]
db:
image: postgres:15-alpine
container_name: guardden-db
restart: unless-stopped
environment:
- POSTGRES_USER=guardden
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-guardden}
- POSTGRES_DB=guardden
- POSTGRES_INITDB_ARGS=--auth-host=scram-sha-256
volumes:
- postgres_data:/var/lib/postgresql/data
- ./scripts/init-db.sh:/docker-entrypoint-initdb.d/init-db.sh:ro
ports:
- "${POSTGRES_PORT:-5432}:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U guardden -d guardden"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
networks:
- guardden
# Optional: Redis for caching and rate limiting
redis:
image: redis:7-alpine
container_name: guardden-redis
restart: unless-stopped
command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD:-guardden_redis}
volumes:
- redis_data:/data
ports:
- "${REDIS_PORT:-6379}:6379"
healthcheck:
test: ["CMD", "redis-cli", "--raw", "incr", "ping"]
interval: 10s
timeout: 3s
retries: 5
networks:
- guardden
# Optional: Monitoring stack
prometheus:
image: prom/prometheus:latest
container_name: guardden-prometheus
restart: unless-stopped
profiles:
- monitoring
command:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.path=/prometheus"
- "--web.console.libraries=/etc/prometheus/console_libraries"
- "--web.console.templates=/etc/prometheus/consoles"
- "--web.enable-lifecycle"
ports:
- "${PROMETHEUS_PORT:-9090}:9090"
volumes:
- ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus_data:/prometheus
networks:
- guardden
grafana:
image: grafana/grafana:latest
container_name: guardden-grafana
restart: unless-stopped
profiles:
- monitoring-grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD:-admin}
ports:
- "${GRAFANA_PORT:-3000}:3000"
volumes:
- grafana_data:/var/lib/grafana
- ./monitoring/grafana/provisioning:/etc/grafana/provisioning:ro
networks:
- guardden
networks:
guardden:
driver: bridge
name: guardden-network
volumes:
postgres_data:
redis_data:
guardden_data:
guardden_logs:
prometheus_data:
grafana_data: