← Code-Übersicht

golive-demo.sh

Pfad: root-staging/golive-demo.sh

Ext: sh

Größe: 2827 Bytes

Geändert: 2026-07-15 19:41:12+02

#!/usr/bin/env bash
# Go-Live fuer demo.karlkratz.com. ALS ROOT ausfuehren.
# Installiert die (von claudeteam4 gestagten) Caddy-Configs, legt den
# System-User und die Laufzeitverzeichnisse an, rotiert das DB-Passwort,
# schreibt die Credentials, aktiviert die Instanz und laedt den Caddy neu.
set -euo pipefail

if [[ "${EUID}" -ne 0 ]]; then
	echo "Bitte als root ausfuehren." >&2
	exit 1
fi

SLUG=demo
HOST=demo.karlkratz.com
STAGE="/var/www/${HOST}/root-staging"
CRED_DIR="/var/credentials/${HOST}"

# 1. Dedizierter System-User (nologin) fuer die isolierte Instanz.
id -u "${SLUG}_web" >/dev/null 2>&1 || useradd -r -s /usr/sbin/nologin -d /nonexistent "${SLUG}_web"
# Mitglied von webdev, damit der Dienst /var/credentials (770 root:webdev) durchqueren kann.
usermod -aG webdev "${SLUG}_web"

# 2. Laufzeitverzeichnisse (Caddy-Storage + Logs) im Besitz der Instanz.
install -d -o "${SLUG}_web" -g "${SLUG}_web" "/var/lib/caddy/site-${SLUG}"
install -d -o "${SLUG}_web" -g "${SLUG}_web" "/var/log/frankenphp/${SLUG}"

# 3. Caddy-Configs an ihre Zielorte installieren.
install -o root -g root -m 644 "${STAGE}/demo.caddy" "/etc/frankenphp/sites-available/demo.caddy"
install -o root -g root -m 644 "${STAGE}/demo.karlkratz.com.caddy" "/var/lib/caddy/kig-vhosts/demo.karlkratz.com.caddy"

# 4. Frisches DB-Passwort setzen (rotiert den bei der Anlage gesetzten Wert).
PW="$(openssl rand -hex 24)"
sudo -u postgres psql -v ON_ERROR_STOP=1 -c "ALTER ROLE demo_app LOGIN PASSWORD '${PW}'"

# 5. Credentials schreiben, nur fuer root und die Instanz lesbar.
install -d -m 750 -o root -g "${SLUG}_web" "${CRED_DIR}"
umask 027
cat > "${CRED_DIR}/db.json" <<JSON
{
  "dsn": "pgsql:host=127.0.0.1;port=5432;dbname=demo_karlkratz_com",
  "user": "demo_app",
  "password": "${PW}"
}
JSON
chown root:"${SLUG}_web" "${CRED_DIR}/db.json"
chmod 640 "${CRED_DIR}/db.json"

# 6. Instanz-Config validieren, bevor der Dienst startet.
/usr/local/bin/frankenphp validate --config "/etc/frankenphp/sites-available/demo.caddy" --adapter caddyfile

# 6b. Vom Validate (root) erzeugte Logdatei dem Instanz-User uebereignen.
chown -R "${SLUG}_web:${SLUG}_web" "/var/log/frankenphp/${SLUG}"

# 7. Eigene FrankenPHP-Instanz aktivieren (127.0.0.1:9128).
systemctl enable --now "frankenphp-site@${SLUG}"

# 8. Shared Caddy neu laden, damit der neue TLS-vhost aktiv wird.
systemctl reload frankenphp

echo "demo.karlkratz.com ist live."
echo "Test: curl -sS -o /dev/null -w '%{http_code}\n' https://demo.karlkratz.com/health"

# Rueckbau (bei Bedarf, als root):
#   systemctl disable --now frankenphp-site@demo
#   rm -f /etc/frankenphp/sites-available/demo.caddy /var/lib/caddy/kig-vhosts/demo.karlkratz.com.caddy
#   systemctl reload frankenphp
#   userdel demo_web
#   sudo -u postgres psql -c "DROP DATABASE demo_karlkratz_com" -c "DROP ROLE demo_app"