Upload via GUI (24 Dateien)

This commit is contained in:
2026-10-16 18:42:18 +00:00
parent 1f03c7e4cd
commit d9d58112e0
24 changed files with 1167 additions and 0 deletions
+66
View File
@@ -0,0 +1,66 @@
<#
.SYNOPSIS
Baut das Docker-Image der Plugin-Webseite mit fest eingebautem Admin-Zugang und Signierschlüssel.
.DESCRIPTION
Fragt Adresse, Benutzername und Passwort ab, erzeugt (falls nötig) den Signierschlüssel und baut das Image.
Passwort-Hash und privater Schlüssel werden als BuildKit-Secrets übergeben und stehen nicht im Image-Verlauf.
Benötigt nur Docker. PHP muss lokal NICHT installiert sein.
Der private Schlüssel liegt danach in .\schluessel\herausgeber-privat.pem. DIESE DATEI SICHERN und niemals weitergeben.
Das fertige Image enthält Passwort-Hash und privaten Schlüssel: nur in eine PRIVATE Registry hochladen.
#>
param(
[string]$BaseUrl,
[string]$AdminUser = 'admin',
[string]$SiteName = 'DeskHub Plugins und Themes',
[string]$Tag = 'deskhub-plugins:latest',
[string]$KeyDir = (Join-Path $PSScriptRoot 'schluessel')
)
$ErrorActionPreference = 'Stop'
if (-not $BaseUrl) { $BaseUrl = Read-Host 'Öffentliche Adresse der Webseite (https://plugins.example.de)' }
if ($BaseUrl -notmatch '^https://') { throw 'Die Adresse muss mit https:// beginnen (DeskHub lädt nur über https).' }
$AdminUser = (Read-Host "Admin-Benutzername [$AdminUser]").Trim() | ForEach-Object { if ($_ -eq '') { $AdminUser } else { $_ } }
$secure = Read-Host 'Admin-Passwort (mindestens 12 Zeichen)' -AsSecureString
$plain = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($secure))
if ($plain.Length -lt 12) { throw 'Das Passwort ist zu kurz (mindestens 12 Zeichen).' }
New-Item -ItemType Directory -Force $KeyDir | Out-Null
$hashFile = Join-Path $KeyDir 'admin-hash.txt'
$keyFile = Join-Path $KeyDir 'herausgeber-privat.pem'
# Passwort-Hash in einem Wegwerf-Container erzeugen (das Passwort kommt über die Umgebung, nicht über die Befehlszeile)
$env:DH_PW = $plain
docker run --rm -e DH_PW php:8.3-cli php -r 'echo password_hash(getenv("DH_PW"), PASSWORD_DEFAULT);' | Out-File -NoNewline -Encoding ascii $hashFile
Remove-Item Env:\DH_PW
$plain = $null
# Zugangsschlüssel für den Katalog: DeskHub schickt ihn bei jedem Abruf mit, ohne ihn liefert die Webseite nichts aus
$catalogKeyFile = Join-Path $KeyDir 'katalog-zugangsschluessel.txt'
if (-not (Test-Path $catalogKeyFile)) {
docker run --rm php:8.3-cli php -r 'echo bin2hex(random_bytes(24));' | Out-File -NoNewline -Encoding ascii $catalogKeyFile
}
if (-not (Test-Path $keyFile)) {
Write-Host '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;' | Out-File -NoNewline -Encoding ascii $keyFile
} else {
Write-Host "Vorhandenen Signierschlüssel weiterverwenden: $keyFile"
}
$env:DOCKER_BUILDKIT = '1'
docker build `
--secret "id=admin_hash,src=$hashFile" `
--secret "id=signing_key,src=$keyFile" `
--secret "id=catalog_key,src=$catalogKeyFile" `
--build-arg "BASE_URL=$BaseUrl" --build-arg "ADMIN_USER=$AdminUser" --build-arg "SITE_NAME=$SiteName" `
-t $Tag $PSScriptRoot
if ($LASTEXITCODE -ne 0) { throw 'docker build ist fehlgeschlagen.' }
Remove-Item $hashFile -Force
Write-Host "`nFertig: Image $Tag gebaut. Admin-Zugang und Signierschlüssel sind fest eingebaut."
Write-Host "Privater Schlüssel (SICHERN, nicht weitergeben): $keyFile"
Write-Host "Zugangsschlüssel für DeskHub (in includes/catalog_defaults.php als access_key eintragen): $(Get-Content $catalogKeyFile -Raw)"
Write-Host "Starten: docker compose up -d (Webseite auf Port 3040, davor einen HTTPS-Proxy schalten)"