Files
everythingbutwork/docker-compose.yml
T
dejanandClaude Opus 4.7 4f33509a0f
ci / quality (push) Has been cancelled
ci / build (push) Has been cancelled
Initial commit: everythingbutwork MVP
Internes Project-Management-Tool für ToolCTRL — ergänzend zu Plane (Tickets)
und Outline (Doku). Umfasst Puls-Übersicht, Tagesrhythmus (Lock-in + Reflexion),
Bereichs-Detail-Views (Entwicklung/Vertrieb/Marketing), Pflicht-Minimum-Check
und Blocker-Lifecycle gemäß Projektmanagement-Leitfaden v3.0.

Stack: pnpm-Monorepo · Vite + React 18 + Tailwind · Fastify + tRPC v11 +
Drizzle ORM · Postgres 16 · Authentik OIDC (Phase 2, Dev-Auto-Login aktiv).

Planungs-Artefakte unter _bmad-output/planning-artifacts/.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 22:47:26 +02:00

86 lines
2.5 KiB
YAML

# Production Docker-Compose. Deployment auf ToolCTRL-interne Infrastruktur.
# Erforderliche Env-Datei: .env.production (per Docker-Secret-Mount oder
# Compose-Override).
services:
postgres:
image: postgres:16-alpine
container_name: cockpit-postgres
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER:-cockpit}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB:-cockpit}
TZ: Europe/Berlin
volumes:
- cockpit_postgres_data:/var/lib/postgresql/data
- cockpit_backups:/backups
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U $${POSTGRES_USER:-cockpit} -d $${POSTGRES_DB:-cockpit}']
interval: 10s
timeout: 5s
retries: 5
api:
build:
context: .
dockerfile: apps/api/Dockerfile
container_name: cockpit-api
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
environment:
NODE_ENV: production
DATABASE_URL: postgres://${POSTGRES_USER:-cockpit}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB:-cockpit}
AUTHENTIK_ISSUER: ${AUTHENTIK_ISSUER}
AUTHENTIK_CLIENT_ID: ${AUTHENTIK_CLIENT_ID}
AUTHENTIK_CLIENT_SECRET: ${AUTHENTIK_CLIENT_SECRET}
AUTHENTIK_REDIRECT_URI: ${AUTHENTIK_REDIRECT_URI}
SESSION_COOKIE_SECRET: ${SESSION_COOKIE_SECRET}
CRON_BEARER_TOKEN: ${CRON_BEARER_TOKEN}
PUBLIC_BASE_URL: ${PUBLIC_BASE_URL:-https://cockpit.tool-ctrl.de}
LOG_LEVEL: ${LOG_LEVEL:-info}
PORT: 3000
healthcheck:
test: ['CMD', 'wget', '-qO-', 'http://localhost:3000/api/health']
interval: 15s
timeout: 5s
retries: 3
web:
build:
context: .
dockerfile: apps/web/Dockerfile
container_name: cockpit-web
restart: unless-stopped
# Web ist statisches Asset-Image; Caddy mountet /srv aus diesem Container.
# In Compose teilen wir es via volume statt named-host.
volumes:
- cockpit_web_dist:/srv
caddy:
image: caddy:2-alpine
container_name: cockpit-caddy
restart: unless-stopped
depends_on:
- api
- web
ports:
- '80:80'
- '443:443'
environment:
COCKPIT_HOST: ${COCKPIT_HOST:-cockpit.tool-ctrl.de}
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- cockpit_web_dist:/srv:ro
- cockpit_caddy_data:/data
- cockpit_caddy_config:/config
volumes:
cockpit_postgres_data:
cockpit_backups:
cockpit_web_dist:
cockpit_caddy_data:
cockpit_caddy_config: