Files
nexarch/deploy/rollout-131-apply.sh
patrickandClaude Sonnet 5 c6c6e3949a
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
deploy: Rollout-131-Skripte und Doku (aus PR #186 auf aktuellen main portiert)
Branch docs/rollout-131-vorbereitung war von einem älteren main-Stand
abgezweigt; nur die neuen Deploy-Dateien werden hier sauber auf den
aktuellen main-Stand übertragen, ohne die seither gemergten Pakete zu
verlieren.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-26 00:41:54 +02:00

183 lines
7.9 KiB
Bash

#!/usr/bin/env bash
# Rollout-Abschluss fuer Host 131 (Vorstufe zur Produktion): fuehrt die
# verbleibenden manuellen Schritte aus docs/ROLLOUT-131-VORBEREITUNG.md,
# Abschnitt 5 (Schritte 3-9) automatisiert aus.
#
# Setzt voraus, dass deploy/rollout-131-sync.sh bereits gelaufen ist (Build-
# Pruefung + Env-Datei-Grundgeruest) UND dass die 5 echten TODO-Werte in
# /etc/nexarch/connect-app.env und /etc/nexarch/dms-app.env von Hand
# eingetragen wurden -- dieses Skript generiert/raet sie NICHT.
#
# Aufruf (als root, auf Host 131): ./deploy/rollout-131-apply.sh
#
# Idempotent: mehrfacher Aufruf ist sicher (Units werden neu geschrieben,
# aber Env-Dateien nie ueberschrieben; systemctl enable --now ist idempotent).
# Gibt NIRGENDS einen Secret-/Token-Wert aus, auch nicht beim Pruefen ob eine
# Variable gesetzt ist.
set -euo pipefail
REPO_DIR="${NEXARCH_ROLLOUT_REPO_DIR:-/root/nexarch-code}"
ENV_DIR=/etc/nexarch
DMS_INSTALL_DIR="${NEXARCH_DMS_INSTALL_DIR:-/opt/nexarch-dms}"
CONNECT_INSTALL_DIR="${NEXARCH_CONNECT_INSTALL_DIR:-/opt/nexarch-connect}"
DMS_STORAGE_DIR="${NEXARCH_DMS_STORAGE_DIR:-/var/lib/nexarch-dms/storage}"
DMS_STAGING_DIR="${NEXARCH_DMS_STAGING_DIR:-/var/lib/nexarch-dms/staging}"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
if [ "$(id -u)" -ne 0 ]; then
echo "Bitte als root ausfuehren." >&2
exit 1
fi
# Prueft nur ob eine Variable gesetzt UND nicht mehr als "# TODO" markiert
# ist -- gibt den Wert selbst nie aus.
require_set() {
local file="$1" name="$2"
local line
line="$(grep "^${name}=" "$file" 2>/dev/null || true)"
if [ -z "$line" ]; then
echo "FEHLT: ${name} in ${file} (Variable existiert gar nicht)" >&2
return 1
fi
if echo "$line" | grep -q '# TODO'; then
echo "OFFEN: ${name} in ${file} ist noch als TODO markiert" >&2
return 1
fi
if [ "$line" = "${name}=" ]; then
echo "LEER: ${name} in ${file} ist gesetzt, aber ohne Wert" >&2
return 1
fi
return 0
}
echo "== 1. Pruefe die 5 echten TODO-Werte =="
missing=0
require_set "$ENV_DIR/connect-app.env" NEXARCH_CONNECT_APP_LISTEN_ADDR || missing=1
require_set "$ENV_DIR/connect-app.env" NEXARCH_CONNECT_APP_TENANT_DSN || missing=1
require_set "$ENV_DIR/dms-app.env" NEXARCH_DMS_APP_CORE_SERVICE_TOKEN || missing=1
require_set "$ENV_DIR/dms-app.env" NEXARCH_DMS_APP_KEK_CLIENT_ID || missing=1
require_set "$ENV_DIR/dms-app.env" NEXARCH_DMS_APP_KEK_CLIENT_SECRET || missing=1
if [ "$missing" -eq 1 ]; then
echo "Abbruch: mindestens ein TODO-Wert fehlt noch (siehe oben)." >&2
echo "Trage die fehlenden Werte von Hand in die genannten Dateien ein und starte das Skript erneut." >&2
exit 1
fi
echo "Alle 5 TODO-Werte sind gesetzt."
echo "== 2. Build (falls rollout-131-sync.sh das noch nicht getan hat) =="
for mod in dms connect; do
if [ -f "$REPO_DIR/$mod/go.mod" ]; then
( cd "$REPO_DIR/$mod" && go build ./... && go vet ./... )
echo "gebaut/verifiziert: $mod"
else
echo "FEHLER: $REPO_DIR/$mod/go.mod nicht gefunden -- Code-Sync vorher ausfuehren." >&2
exit 1
fi
done
echo "== 3. Binaries kopieren =="
mkdir -p "$DMS_INSTALL_DIR/bin" "$CONNECT_INSTALL_DIR/bin"
( cd "$REPO_DIR/dms" && go build -o "$DMS_INSTALL_DIR/bin/dms-app" ./cmd/app )
( cd "$REPO_DIR/dms" && go build -o "$DMS_INSTALL_DIR/bin/dms-worker" ./cmd/worker )
( cd "$REPO_DIR/connect" && go build -o "$CONNECT_INSTALL_DIR/bin/connect-app" ./cmd/connect-app )
echo "Binaries liegen unter ${DMS_INSTALL_DIR}/bin und ${CONNECT_INSTALL_DIR}/bin."
if id nexarch >/dev/null 2>&1; then
chown -R nexarch:nexarch "$DMS_INSTALL_DIR" "$CONNECT_INSTALL_DIR"
else
echo "WARNUNG: Systembenutzer 'nexarch' existiert nicht -- Units werden trotzdem als User=nexarch geschrieben (wie bei Core/Archive ueblich), legen den Benutzer aber nicht an. Falls er fehlt, vor dem Start anlegen: useradd --system --no-create-home --shell /usr/sbin/nologin nexarch" >&2
fi
echo "== 4. Storage-/Staging-Verzeichnisse fuer DMS anlegen =="
mkdir -p "$DMS_STORAGE_DIR" "$DMS_STAGING_DIR"
if id nexarch >/dev/null 2>&1; then
chown -R nexarch:nexarch "$DMS_STORAGE_DIR" "$DMS_STAGING_DIR"
fi
echo "== 5. dms-worker.env anlegen (falls noch nicht vorhanden) =="
# Uebernimmt was direkt aus der bereits fertigen dms-app.env ableitbar ist
# (beide gehoeren zum selben Dienst/Mandanten). Werte werden aus der
# Quelldatei kopiert, nie hier im Skript ausgegeben.
if [ ! -f "$ENV_DIR/dms-worker.env" ]; then
for v in NEXARCH_DMS_APP_TENANT_DSN NEXARCH_DMS_APP_TENANT_SLUG \
NEXARCH_DMS_APP_STORAGE_DIR NEXARCH_DMS_APP_STORAGE_SIGNING_SECRET \
NEXARCH_DMS_APP_STORAGE_PUBLIC_BASE_URL NEXARCH_DMS_APP_USAGE_ENDPOINT_URL \
NEXARCH_DMS_APP_USAGE_CLIENT_ID NEXARCH_DMS_APP_USAGE_CLIENT_SECRET \
NEXARCH_DMS_APP_KEK_ENDPOINT_URL NEXARCH_DMS_APP_KEK_CLIENT_ID \
NEXARCH_DMS_APP_KEK_CLIENT_SECRET NEXARCH_DMS_APP_RETENTION_BASE_URL; do
line="$(grep "^${v}=" "$ENV_DIR/dms-app.env" 2>/dev/null || true)"
if [ -n "$line" ] && ! echo "$line" | grep -q '# TODO'; then
# NEXARCH_DMS_APP_* -> NEXARCH_DMS_WORKER_* (gleicher Suffix)
worker_name="NEXARCH_DMS_WORKER_${v#NEXARCH_DMS_APP_}"
worker_value="${line#*=}"
echo "${worker_name}=${worker_value}" >> "$ENV_DIR/dms-worker.env"
fi
done
{
echo "NEXARCH_DMS_WORKER_METRICS_ADDR=127.0.0.1:8601"
echo "NEXARCH_DMS_WORKER_KOSIT_ADDR=127.0.0.1:8610"
echo "NEXARCH_DMS_WORKER_CONCURRENCY=2"
} >> "$ENV_DIR/dms-worker.env"
chmod 600 "$ENV_DIR/dms-worker.env"
if id nexarch >/dev/null 2>&1; then
chown nexarch:nexarch "$ENV_DIR/dms-worker.env"
fi
echo "${ENV_DIR}/dms-worker.env angelegt (Werte aus dms-app.env uebernommen, Metrics-Adresse + KoSIT-Sidecar + Concurrency gesetzt)."
echo "Pruefe danach von Hand, ob NEXARCH_DMS_WORKER_TENANT_SLUG/_STORAGE_* uebernommen wurden -- ohne Storage-Variablen werden Fachjobs nicht verarbeitet (siehe dms/docs/BETRIEB-UMGEBUNGSVARIABLEN.md, Abschnitt dms-worker)."
else
echo "${ENV_DIR}/dms-worker.env existiert bereits -- wird nicht ueberschrieben."
fi
echo "== 6. systemd-Units installieren =="
sed -e "s#__INSTALL_DIR__#${CONNECT_INSTALL_DIR}#g" \
"$SCRIPT_DIR/systemd/nexarch-connect-app.service.tmpl" > /etc/systemd/system/nexarch-connect-app.service
sed -e "s#__INSTALL_DIR__#${DMS_INSTALL_DIR}#g" \
-e "s#__STORAGE_DIR__#${DMS_STORAGE_DIR}#g" \
-e "s#__STAGING_DIR__#${DMS_STAGING_DIR}#g" \
"$SCRIPT_DIR/systemd/nexarch-dms-app.service.tmpl" > /etc/systemd/system/nexarch-dms-app.service
sed -e "s#__INSTALL_DIR__#${DMS_INSTALL_DIR}#g" \
-e "s#__STORAGE_DIR__#${DMS_STORAGE_DIR}#g" \
"$SCRIPT_DIR/systemd/nexarch-dms-worker.service.tmpl" > /etc/systemd/system/nexarch-dms-worker.service
echo "Units geschrieben: nexarch-connect-app, nexarch-dms-app, nexarch-dms-worker"
echo "== 7. daemon-reload =="
systemctl daemon-reload
echo "== 8. account-api neu starten (Code wurde durch rollout-131-sync.sh bereits neu gebaut) =="
systemctl restart nexarch-account-api
echo "Warte auf /auth/module-jwks..."
ok=0
for i in 1 2 3 4 5 6 7 8 9 10; do
if curl -sf --max-time 2 http://127.0.0.1:8099/auth/module-jwks >/dev/null 2>&1; then
ok=1
break
fi
sleep 2
done
if [ "$ok" -ne 1 ]; then
echo "FEHLER: http://127.0.0.1:8099/auth/module-jwks antwortet nach Neustart und 20s Wartezeit nicht." >&2
echo "Abbruch -- Connect/DMS wuerden ohne funktionierende JWKS-Route mit ungueltigen Tokens starten." >&2
echo "Pruefe: journalctl -u nexarch-account-api -n 50" >&2
exit 1
fi
echo "account-api liefert /auth/module-jwks."
echo "== 9. connect-app, dms-app, dms-worker aktivieren und starten =="
systemctl enable --now nexarch-connect-app.service
systemctl enable --now nexarch-dms-app.service
systemctl enable --now nexarch-dms-worker.service
echo "== 10. Health-Check =="
"$SCRIPT_DIR/rollout-131-healthcheck.sh"
echo "== Fertig =="
echo "Bei NICHT-ERREICHBAR-Eintraegen oben: journalctl -u <dienstname> -n 50 pruefen."
echo "Die fuenf bereits vor diesem Rollout fehlgeschlagenen Archive-Backup-/Scrub-Dienste"
echo "(siehe docs/ROLLOUT-131-VORBEREITUNG.md, Abschnitt 1) sind unabhaengig davon und"
echo "wurden von diesem Skript nicht angefasst."