Automatische DB-Migrationen beim Container-Start
This commit is contained in:
parent
c9f5dd02f8
commit
44917852c6
2 changed files with 103 additions and 0 deletions
|
|
@ -1,4 +1,8 @@
|
|||
#!/bin/sh
|
||||
# Fix ownership of volume-mounted upload directory at container start
|
||||
chown -R www-data:www-data /var/www/html/public/static/uploads 2>/dev/null || true
|
||||
|
||||
# Datenbank-Migrationen automatisch einspielen
|
||||
php /var/www/html/scripts/migrate.php
|
||||
|
||||
exec "$@"
|
||||
|
|
|
|||
99
scripts/migrate.php
Normal file
99
scripts/migrate.php
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
<?php
|
||||
/**
|
||||
* Automatisches Migrations-Script
|
||||
* Wird beim Start des web-Containers ausgeführt (nach DB-Healthcheck).
|
||||
* Prüft welche migrations/*.sql noch nicht angewendet wurden und führt sie aus.
|
||||
*/
|
||||
|
||||
$host = getenv('DB_HOST') ?: 'db';
|
||||
$dbName = getenv('DB_NAME') ?: 'steuerkram';
|
||||
$dbUser = getenv('DB_USER') ?: 'steuerkram';
|
||||
$dbPass = getenv('DB_PASS') ?: 'steuerkram';
|
||||
$migrDir = __DIR__ . '/../migrations';
|
||||
|
||||
function mlog(string $msg): void {
|
||||
echo '[migrate] ' . $msg . PHP_EOL;
|
||||
}
|
||||
|
||||
mlog('Starte Migrations-Prüfung...');
|
||||
|
||||
try {
|
||||
$pdo = new PDO(
|
||||
"mysql:host=$host;dbname=$dbName;charset=utf8mb4",
|
||||
$dbUser,
|
||||
$dbPass,
|
||||
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
|
||||
);
|
||||
} catch (PDOException $e) {
|
||||
echo '[migrate] FEHLER: DB-Verbindung fehlgeschlagen: ' . $e->getMessage() . PHP_EOL;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// schema_migrations anlegen falls nicht vorhanden
|
||||
$pdo->exec('CREATE TABLE IF NOT EXISTS schema_migrations (
|
||||
migration VARCHAR(255) NOT NULL PRIMARY KEY,
|
||||
applied_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||||
)');
|
||||
|
||||
// Alle vorhandenen Migrations-Dateien ermitteln (alphabetisch)
|
||||
$files = glob($migrDir . '/*.sql');
|
||||
sort($files);
|
||||
|
||||
if (empty($files)) {
|
||||
mlog('Keine Migrations-Dateien gefunden.');
|
||||
exit(0);
|
||||
}
|
||||
|
||||
// Prüfen ob schema_migrations leer ist, aber belege bereits existiert
|
||||
// → bestehender Server: alle Dateien als applied markieren ohne Ausführung
|
||||
$migrationCount = (int)$pdo->query('SELECT COUNT(*) FROM schema_migrations')->fetchColumn();
|
||||
$belegeExists = (int)$pdo->query(
|
||||
"SELECT COUNT(*) FROM information_schema.tables
|
||||
WHERE table_schema = DATABASE() AND table_name = 'belege'"
|
||||
)->fetchColumn();
|
||||
|
||||
if ($migrationCount === 0 && $belegeExists === 1) {
|
||||
mlog('Bestehende Datenbank erkannt – markiere vorhandene Migrations-Dateien als applied...');
|
||||
$stmt = $pdo->prepare('INSERT IGNORE INTO schema_migrations (migration) VALUES (?)');
|
||||
foreach ($files as $file) {
|
||||
$name = basename($file);
|
||||
$stmt->execute([$name]);
|
||||
mlog(' markiert: ' . $name);
|
||||
}
|
||||
mlog('Fertig – keine Migrationen ausgeführt.');
|
||||
exit(0);
|
||||
}
|
||||
|
||||
// Bereits angewendete Migrationen laden
|
||||
$applied = $pdo->query('SELECT migration FROM schema_migrations')
|
||||
->fetchAll(PDO::FETCH_COLUMN);
|
||||
$applied = array_flip($applied);
|
||||
|
||||
// Neue Migrationen ausführen
|
||||
$count = 0;
|
||||
foreach ($files as $file) {
|
||||
$name = basename($file);
|
||||
if (isset($applied[$name])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
mlog('Führe aus: ' . $name);
|
||||
$sql = file_get_contents($file);
|
||||
|
||||
try {
|
||||
// Mehrteilige SQL-Dateien (mehrere Statements) aufteilen und einzeln ausführen
|
||||
$pdo->exec($sql);
|
||||
$pdo->prepare('INSERT INTO schema_migrations (migration) VALUES (?)')
|
||||
->execute([$name]);
|
||||
$count++;
|
||||
} catch (PDOException $e) {
|
||||
echo '[migrate] FEHLER bei ' . $name . ': ' . $e->getMessage() . PHP_EOL;
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
if ($count === 0) {
|
||||
mlog('Datenbank ist aktuell – keine Migrationen notwendig.');
|
||||
} else {
|
||||
mlog($count . ' Migration(en) erfolgreich angewendet.');
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue