Upload via GUI (24 Dateien)
This commit is contained in:
@@ -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)"
|
||||
Reference in New Issue
Block a user