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: . dockerfile: dashboard/Dockerfile 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 networks: guardden: driver: bridge name: guardden-network volumes: postgres_data: redis_data: guardden_data: guardden_logs: prometheus_data: