chore(deploy): nginx härten, deploy.sh mit Sperre, Zeitlimit und ohne Webhook-Geheimnis

nginx: server_tokens off, HSTS, exaktes /v1 liefert 404 (Regex-Block statt
^~ /v1/). deploy.sh: AIRCARD_WEBHOOK_TOKEN nicht an npm, Sperrverzeichnis
gegen parallele Läufe (verwaiste Sperren werden übernommen), timeout 900
für npm ci und Build. Neuer Test deploy/deploy.test.js gegen das echte Skript.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Opus 5.5 committed 2026-10-04 11:08:09 +00:00
1 parent 436ea4f4a5
commit 144181f2c9
5 files changed
+302 -8

No files matched your search

+7 -2
View File
@@ -7,6 +7,7 @@
server {
listen 80;
server_name _;
server_tokens off;
root /usr/share/nginx/html;
index index.html;
@@ -15,6 +16,8 @@ server {
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# TLS endet bei Traefik; der Header läuft durch und gilt für den Browser (kein includeSubDomains).
add_header Strict-Transport-Security "max-age=31536000" always;
gzip on;
gzip_vary on;
@@ -39,8 +42,10 @@ server {
}
# Die Appwrite-API liegt nur über Traefik (Header X-Appwrite-Project) auf /v1.
# Ohne diesen Header darf nginx hier nie die App (index.html) ausliefern.
location ^~ /v1/ {
# Ohne diesen Header darf nginx hier nie die App (index.html) ausliefern, auch nicht für genau /v1.
# Regex-Block: steht vor den anderen Regex-Blöcken (die erste passende Regel gewinnt, /v1/x.png
# soll also 404 liefern); /assets/ bleibt durch das ^~ oben unberührt.
location ~ ^/v1(/|$) {
return 404;
}