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
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>
183 lines
7.9 KiB
Bash
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."
|