67 lines
3.7 KiB
PowerShell
67 lines
3.7 KiB
PowerShell
<#
|
|
.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)"
|