Infrastruktur als Code für den Skalierungs-Test auf Hetzner: - deploy/terraform: privates Netz, Firewalls, 2 App-Nodes, DB-Node, Load Balancer (Health-Check /health); cloud-init bootet Docker + Stack je Node - deploy/compose/docker-compose.prod.yml + nginx.prod.conf: App-Node-Stack (PHP-FPM + Nginx) routet /api,/p,/t,/css,/health → Symfony, Rest → Vue-SPA - App-Anpassungen: HealthController (/health für LB), brand.css nach /css verschoben (kein Pfad-Clash mit SPA-Assets im Prod-Routing) - deploy/README.md: Anleitung inkl. JWT-Key-Verteilung & Cross-Node-Test - reference.php (auto-generiert) aus Versionierung entfernt Terraform validiert (terraform validate), Prod-Compose-Syntax geprüft. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
26 lines
801 B
YAML
26 lines
801 B
YAML
# Läuft auf jedem App-Node (zustandslos). DB & Object Storage sind extern.
|
|
# Aufruf mit --project-directory <repo> (Pfade relativ zum Repo-Root):
|
|
# docker compose --project-directory /opt/vcard4 \
|
|
# -f deploy/compose/docker-compose.prod.yml up -d --build
|
|
services:
|
|
php:
|
|
build:
|
|
context: ./docker/php
|
|
volumes:
|
|
- ./backend:/app
|
|
env_file:
|
|
- ./backend/.env.prod.local
|
|
restart: unless-stopped
|
|
|
|
nginx:
|
|
image: nginx:1.27-alpine
|
|
ports:
|
|
- "80:80"
|
|
volumes:
|
|
- ./backend:/app:ro # Symfony public (API + öffentliche Seiten)
|
|
- ./frontend/dist:/spa:ro # gebautes Vue-SPA (Dashboard)
|
|
- ./deploy/compose/nginx.prod.conf:/etc/nginx/conf.d/default.conf:ro
|
|
depends_on:
|
|
- php
|
|
restart: unless-stopped
|