#!/usr/bin/env bash # Baut das Docker-Image der Plugin-Webseite mit fest eingebautem Admin-Zugang und Signierschlüssel. # Benötigt nur Docker (PHP muss lokal nicht installiert sein). # # ./docker-build.sh https://plugins.example.de [admin-benutzer] [image-tag] # # Der private Schlüssel liegt danach in ./schluessel/herausgeber-privat.pem: SICHERN, nie weitergeben. # Das Image enthält Passwort-Hash und privaten Schlüssel: nur in eine PRIVATE Registry hochladen. set -euo pipefail cd "$(dirname "$0")" BASE_URL="${1:-}"; ADMIN_USER="${2:-admin}"; TAG="${3:-deskhub-plugins:latest}"; SITE_NAME="${SITE_NAME:-DeskHub Plugins und Themes}" [[ "$BASE_URL" == https://* ]] || { echo "Aufruf: $0 https://plugins.example.de [admin-benutzer] [image-tag]"; exit 1; } read -r -s -p "Admin-Passwort (mindestens 12 Zeichen): " PW; echo [[ ${#PW} -ge 12 ]] || { echo "Das Passwort ist zu kurz."; exit 1; } mkdir -p schluessel; chmod 700 schluessel printf '%s' "$(DH_PW="$PW" docker run --rm -e DH_PW php:8.3-cli php -r 'echo password_hash(getenv("DH_PW"), PASSWORD_DEFAULT);')" > schluessel/admin-hash.txt unset PW # Zugangsschlüssel für den Katalog: DeskHub schickt ihn bei jedem Abruf mit, ohne ihn liefert die Webseite nichts aus if [[ ! -f schluessel/katalog-zugangsschluessel.txt ]]; then docker run --rm php:8.3-cli php -r 'echo bin2hex(random_bytes(24));' > schluessel/katalog-zugangsschluessel.txt chmod 600 schluessel/katalog-zugangsschluessel.txt fi if [[ ! -f schluessel/herausgeber-privat.pem ]]; then echo "Erzeuge neuen Signierschlüssel (RSA 3072) ..." docker run --rm php:8.3-cli php -r '$c=tempnam(sys_get_temp_dir(),"c");file_put_contents($c,"[req]\ndistinguished_name=d\n[d]\n");$k=openssl_pkey_new(["config"=>$c,"private_key_bits"=>3072,"private_key_type"=>OPENSSL_KEYTYPE_RSA]);openssl_pkey_export($k,$p,null,["config"=>$c]);echo $p;' > schluessel/herausgeber-privat.pem chmod 600 schluessel/herausgeber-privat.pem fi FCM_ARGS=() if [[ -f schluessel/firebase-dienstkonto.json ]]; then FCM_ARGS=(--secret id=fcm_service_account,src=schluessel/firebase-dienstkonto.json) echo "Firebase-Dienstkonto gefunden: Push-Dienst wird fest eingebaut." else echo "Hinweis: schluessel/firebase-dienstkonto.json fehlt - der Push-Dienst wird ohne Firebase-Schlüssel gebaut (keine Push-Nachrichten)." fi DOCKER_BUILDKIT=1 docker build "${FCM_ARGS[@]}" \ --secret id=admin_hash,src=schluessel/admin-hash.txt \ --secret id=signing_key,src=schluessel/herausgeber-privat.pem \ --secret id=catalog_key,src=schluessel/katalog-zugangsschluessel.txt \ --build-arg "BASE_URL=$BASE_URL" --build-arg "ADMIN_USER=$ADMIN_USER" --build-arg "SITE_NAME=$SITE_NAME" \ -t "$TAG" . rm -f schluessel/admin-hash.txt echo echo "Fertig: Image $TAG gebaut. Admin-Zugang und Signierschlüssel sind fest eingebaut." echo "Privater Schlüssel (SICHERN, nicht weitergeben): $(pwd)/schluessel/herausgeber-privat.pem" echo "Zugangsschluessel fuer DeskHub (in includes/catalog_defaults.php als access_key eintragen): $(cat schluessel/katalog-zugangsschluessel.txt)" echo "Starten: docker compose up -d (Webseite auf Port 3040, davor einen HTTPS-Proxy schalten)"