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>
40 lines
1011 B
Plaintext
40 lines
1011 B
Plaintext
# Routing auf dem App-Node:
|
|
# /api, /p, /t, /css, /bundles, /health → Symfony (PHP-FPM)
|
|
# alles andere → Vue-SPA (history-fallback)
|
|
server {
|
|
listen 80;
|
|
server_name _;
|
|
|
|
# Standard: SPA-Build
|
|
root /spa;
|
|
index index.html;
|
|
|
|
client_max_body_size 32m;
|
|
|
|
# Symfony-Pfade (API + serverseitige öffentliche Seiten)
|
|
location ~ ^/(api|p|t|css|bundles|health)(/|$) {
|
|
root /app/public;
|
|
try_files $uri /index.php$is_args$args;
|
|
}
|
|
|
|
location ~ ^/index\.php(/|$) {
|
|
root /app/public;
|
|
fastcgi_pass php:9000;
|
|
fastcgi_split_path_info ^(.+\.php)(/.*)$;
|
|
include fastcgi_params;
|
|
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
|
fastcgi_param DOCUMENT_ROOT $document_root;
|
|
internal;
|
|
}
|
|
|
|
# SPA-Routing (history mode)
|
|
location / {
|
|
try_files $uri /index.html;
|
|
}
|
|
|
|
# direkte .php-Aufrufe blockieren
|
|
location ~ \.php$ {
|
|
return 404;
|
|
}
|
|
}
|