Files
2026-10-21 16:55:37 +00:00

54 lines
3.1 KiB
Bash

#!/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)"