Fix: mailwolt:migrate-env-reverb Command + Update führt Migration immer aus

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
main v1.1.294
boban 2026-04-26 11:01:57 +02:00
parent 093b5a9eea
commit 60ebd0ed16
2 changed files with 89 additions and 1 deletions

View File

@ -0,0 +1,76 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class MigrateEnvReverb extends Command
{
protected $signature = 'mailwolt:migrate-env-reverb';
protected $description = 'Migriert veraltete REVERB_* .env-Werte auf Domain-Basis';
public function handle(): int
{
$env = base_path('.env');
if (!file_exists($env)) {
$this->warn('.env nicht gefunden.');
return self::SUCCESS;
}
$content = file_get_contents($env);
// APP_HOST ermitteln Fallback auf APP_URL
$appHost = $this->extractVar($content, 'APP_HOST');
if (!$appHost) {
$appUrl = $this->extractVar($content, 'APP_URL');
$appHost = parse_url($appUrl ?: '', PHP_URL_HOST) ?: '';
}
if (!$appHost || preg_match('/^\d+\.\d+\.\d+\.\d+$/', $appHost)) {
$this->warn('Kein gültiger Hostname gefunden Migration übersprungen.');
return self::SUCCESS;
}
$viteHost = $this->extractVar($content, 'VITE_REVERB_HOST');
if ($viteHost === '${REVERB_HOST}' || $viteHost === $appHost) {
$this->info('REVERB-Werte bereits korrekt.');
return self::SUCCESS;
}
$scheme = file_exists("/etc/letsencrypt/live/{$appHost}/fullchain.pem") ? 'https' : 'http';
$port = $scheme === 'https' ? '443' : '80';
$fixes = [
'REVERB_HOST' => '${APP_HOST}',
'REVERB_PORT' => $port,
'REVERB_SCHEME' => $scheme,
'REVERB_PATH' => '/ws',
'REVERB_SERVER_HOST' => '127.0.0.1',
'REVERB_SERVER_PORT' => '8080',
'REVERB_SERVER_SCHEME' => 'http',
'REVERB_SERVER_PATH' => '',
'VITE_REVERB_HOST' => '${REVERB_HOST}',
'VITE_REVERB_PORT' => '${REVERB_PORT}',
'VITE_REVERB_SCHEME' => '${REVERB_SCHEME}',
'VITE_REVERB_PATH' => '${REVERB_PATH}',
];
foreach ($fixes as $key => $val) {
if (preg_match("/^{$key}=/m", $content)) {
$content = preg_replace("/^{$key}=.*/m", "{$key}={$val}", $content);
} else {
$content .= "\n{$key}={$val}";
}
}
file_put_contents($env, $content);
$this->info("REVERB .env migriert für Host: {$appHost}");
return self::SUCCESS;
}
private function extractVar(string $content, string $key): string
{
preg_match("/^{$key}=(.*)$/m", $content, $m);
return trim($m[1] ?? '', " \t\"'");
}
}

View File

@ -284,12 +284,16 @@ echo " Sbin-Scripts : $([[ $NEED_SBIN_UPDATE -eq 1 ]] && echo JA || echo nein
# System-Scripts aus scripts/ sofort nach dem Pull einspielen (kein Downtime nötig)
# ensure_system() am Ende des Scripts übernimmt das vollständig.
# .env immer migrieren (unabhängig vom Update-Pfad)
as_app "cd ${APP_DIR} && php artisan mailwolt:migrate-env-reverb" 2>/dev/null || migrate_env_reverb
# Wenn gar nichts relevantes geändert wurde → sauber beenden
if [[ $NEED_COMPOSER -eq 0 && $NEED_MIGRATIONS -eq 0 && $NEED_FRONTEND -eq 0 && $NEED_PHP_RESTART -eq 0 ]]; then
echo "[✓] Code-Stand aktualisiert, aber keine Build/Runtime-Änderungen keine Neustarts nötig."
NEW_VER="$(get_version)"
write_build_info "$NEW_VER" "$NEW_REV"
echo "[i] Version: ${OLD_VER}${NEW_VER}"
ensure_system
exit 0
fi
@ -356,10 +360,18 @@ migrate_env_reverb() {
local env_file="${APP_DIR}/.env"
[ -f "${env_file}" ] || return 0
# APP_HOST auslesen (authoritative Domain)
# APP_HOST auslesen — Fallback auf APP_URL wenn nicht gesetzt
local app_host
app_host=$(grep '^APP_HOST=' "${env_file}" | head -1 | cut -d= -f2- | tr -d '"' | tr -d "'")
if [ -z "${app_host}" ]; then
local app_url
app_url=$(grep '^APP_URL=' "${env_file}" | head -1 | cut -d= -f2- | tr -d '"' | tr -d "'")
# https://domain.at → domain.at oder http://1.2.3.4 → 1.2.3.4
app_host=$(echo "${app_url}" | sed 's|https\?://||' | cut -d/ -f1 | cut -d: -f1)
fi
[ -z "${app_host}" ] && return 0
# IP-Adresse → nichts tun (kein sinnvoller Hostname für TLS)
echo "${app_host}" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' && return 0
# Nur migrieren wenn VITE_REVERB_HOST nicht auf app_host zeigt
local current_vite_host