154 lines
5.3 KiB
PowerShell
154 lines
5.3 KiB
PowerShell
<#
|
||
.SYNOPSIS
|
||
Deployt GPLX MediaWiki auf den Bitpalast-Server.
|
||
|
||
.PARAMETER Mode
|
||
skin - Cavendish-Skin synchronisieren (Standard, schnell)
|
||
templates - Wiki-Seiten-Vorlagen synchronisieren
|
||
all - Skin + Templates
|
||
initial - Erstinstallation: gesamten MediaWiki-Core übertragen
|
||
|
||
.EXAMPLE
|
||
.\deploy.ps1 # Skin deployen
|
||
.\deploy.ps1 -Mode all # Skin + Templates
|
||
.\deploy.ps1 -Mode initial
|
||
#>
|
||
param(
|
||
[ValidateSet('skin', 'templates', 'all', 'initial')]
|
||
[string]$Mode = 'skin'
|
||
)
|
||
|
||
Set-StrictMode -Version Latest
|
||
$ErrorActionPreference = 'Stop'
|
||
|
||
# === Config laden ===
|
||
$envFile = Join-Path $PSScriptRoot '..' '.deploy.env'
|
||
if (-not (Test-Path $envFile)) {
|
||
Write-Error @"
|
||
.deploy.env nicht gefunden.
|
||
Kopiere .deploy.example.env zu .deploy.env und trage deine Zugangsdaten ein.
|
||
"@
|
||
exit 1
|
||
}
|
||
|
||
Get-Content $envFile | ForEach-Object {
|
||
if ($_ -match '^\s*([^#][^=]+)=(.*)$') {
|
||
[System.Environment]::SetEnvironmentVariable($Matches[1].Trim(), $Matches[2].Trim(), 'Process')
|
||
}
|
||
}
|
||
|
||
$deployHost = $env:DEPLOY_HOST
|
||
$deployUser = $env:DEPLOY_USER
|
||
$mwPath = $env:DEPLOY_MW_PATH
|
||
$projectPath = $env:DEPLOY_PROJECT_PATH
|
||
$target = "${deployUser}@${deployHost}"
|
||
|
||
foreach ($var in @('DEPLOY_HOST','DEPLOY_USER','DEPLOY_MW_PATH')) {
|
||
if (-not [System.Environment]::GetEnvironmentVariable($var, 'Process')) {
|
||
Write-Error "$var ist nicht in .deploy.env gesetzt."
|
||
exit 1
|
||
}
|
||
}
|
||
|
||
# === WSL rsync oder scp ===
|
||
$hasWsl = $null -ne (Get-Command 'wsl' -ErrorAction SilentlyContinue)
|
||
|
||
function ConvertTo-WslPath([string]$winPath) {
|
||
$abs = [System.IO.Path]::GetFullPath($winPath)
|
||
$drive = $abs.Substring(0, 1).ToLower()
|
||
$rest = $abs.Substring(2).Replace('\', '/')
|
||
return "/mnt/$drive$rest"
|
||
}
|
||
|
||
function Sync-Dir([string]$localDir, [string]$remoteDir, [bool]$delete = $false) {
|
||
Write-Host " $localDir" -ForegroundColor DarkGray
|
||
Write-Host " -> ${target}:${remoteDir}" -ForegroundColor DarkGray
|
||
|
||
if ($hasWsl) {
|
||
$wslSrc = (ConvertTo-WslPath $localDir) + '/'
|
||
$rsyncArgs = @('-az', '--progress')
|
||
if ($delete) { $rsyncArgs += '--delete' }
|
||
$rsyncArgs += $wslSrc
|
||
$rsyncArgs += "${target}:${remoteDir}/"
|
||
wsl rsync @rsyncArgs
|
||
} else {
|
||
# Fallback: scp (kein automatisches Loeschen von Remotedateien)
|
||
Write-Warning "WSL nicht gefunden – nutze scp. Geloeschte lokale Dateien bleiben auf dem Server."
|
||
ssh $target "mkdir -p '$remoteDir'"
|
||
scp -r "${localDir}\." "${target}:${remoteDir}/"
|
||
}
|
||
|
||
if ($LASTEXITCODE -ne 0) {
|
||
Write-Error "Uebertragung fehlgeschlagen (Exit $LASTEXITCODE)."
|
||
exit $LASTEXITCODE
|
||
}
|
||
}
|
||
|
||
$repoRoot = Split-Path $PSScriptRoot
|
||
|
||
# === Deploy-Modi ===
|
||
switch ($Mode) {
|
||
|
||
'skin' {
|
||
Write-Host "Deploye Cavendish-Skin..." -ForegroundColor Cyan
|
||
Sync-Dir "$repoRoot\mediawiki\skins\Cavendish" "$mwPath/skins/Cavendish" -delete $true
|
||
Write-Host "Fertig." -ForegroundColor Green
|
||
}
|
||
|
||
'templates' {
|
||
if (-not $projectPath) {
|
||
Write-Error "DEPLOY_PROJECT_PATH muss in .deploy.env gesetzt sein."
|
||
exit 1
|
||
}
|
||
Write-Host "Deploye Wiki-Templates..." -ForegroundColor Cyan
|
||
Sync-Dir "$repoRoot\scripts\templates" "$projectPath/scripts/templates"
|
||
Write-Host "Fertig." -ForegroundColor Green
|
||
}
|
||
|
||
'all' {
|
||
Write-Host "Deploye Skin + Templates..." -ForegroundColor Cyan
|
||
Sync-Dir "$repoRoot\mediawiki\skins\Cavendish" "$mwPath/skins/Cavendish" -delete $true
|
||
if ($projectPath) {
|
||
Sync-Dir "$repoRoot\scripts\templates" "$projectPath/scripts/templates"
|
||
}
|
||
Write-Host "Fertig." -ForegroundColor Green
|
||
}
|
||
|
||
'initial' {
|
||
Write-Host "Erstinstallation – uebertraege MediaWiki-Core..." -ForegroundColor Yellow
|
||
Write-Host "Das kann einige Minuten dauern." -ForegroundColor DarkGray
|
||
|
||
$excludes = @(
|
||
'--exclude=.git',
|
||
'--exclude=vendor/',
|
||
'--exclude=images/',
|
||
'--exclude=cache/',
|
||
'--exclude=LocalSettings.php'
|
||
)
|
||
|
||
if ($hasWsl) {
|
||
$wslSrc = (ConvertTo-WslPath "$repoRoot\mediawiki") + '/'
|
||
$rsyncArgs = @('-az', '--progress') + $excludes + @($wslSrc, "${target}:${mwPath}/")
|
||
wsl rsync @rsyncArgs
|
||
} else {
|
||
Write-Warning "Fuer die Erstinstallation wird WSL empfohlen (grosse Datenmenge)."
|
||
Write-Warning "Alternative: WinSCP GUI verwenden oder WSL installieren."
|
||
exit 1
|
||
}
|
||
|
||
Write-Host ""
|
||
Write-Host "Erstinstallation abgeschlossen." -ForegroundColor Green
|
||
Write-Host ""
|
||
Write-Host "Naechste Schritte auf dem Server:" -ForegroundColor Yellow
|
||
Write-Host " 1. LocalSettings.php anlegen:"
|
||
Write-Host " Vorlage: mediawiki/LocalSettings.production.example.php"
|
||
Write-Host " 2. Composer-Abhaengigkeiten installieren:"
|
||
Write-Host " cd $mwPath && composer install --no-dev"
|
||
Write-Host " 3. Datenbank einrichten:"
|
||
Write-Host " php maintenance/run.php install ..."
|
||
Write-Host " oder: Dump importieren mit mysql -u user -p dbname < dump.sql"
|
||
Write-Host " 4. SMW initialisieren:"
|
||
Write-Host " php maintenance/run.php setupStore"
|
||
}
|
||
}
|