Files
D1041231009-WebGIS-SPBU/_legacy_original/docker/init-db.php
T
2026-06-11 14:53:35 +07:00

63 lines
2.1 KiB
PHP

<?php
// ── INIT DATABASE (dijalankan entrypoint pada SETIAP container start) ────────
// Pengganti "migrate + seed" dari coolify-deployment.md Aturan #6:
// 1. Tunggu database siap (retry ±60 detik).
// 2. Kalau tabel `spbu` sudah ada → skip, supaya idempoten antar restart
// (INSERT seed di schema.sql tidak boleh jalan dua kali).
// 3. Kalau belum → eksekusi database/schema.sql, dengan melewati statement
// CREATE DATABASE/USE — database sudah disediakan Coolify dan user
// aplikasi tidak punya privilege CREATE DATABASE.
require __DIR__ . '/../api/env.php';
$db = dbConfig();
$dsn = "mysql:host={$db['host']};port={$db['port']};dbname={$db['dbname']};charset=utf8mb4";
echo "Waiting for database at {$db['host']}:{$db['port']}...\n";
$pdo = null;
$maxAttempts = 30;
for ($attempt = 1; $attempt <= $maxAttempts; $attempt++) {
try {
$pdo = new PDO($dsn, $db['username'], $db['password'], [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_TIMEOUT => 3,
]);
break;
} catch (PDOException $e) {
if ($attempt === $maxAttempts) {
fwrite(STDERR, "Database {$db['host']}:{$db['port']} unreachable after {$maxAttempts} attempts: {$e->getMessage()}\n");
exit(1);
}
sleep(2);
}
}
echo "Database connection OK.\n";
if ($pdo->query("SHOW TABLES LIKE 'spbu'")->fetch() !== false) {
echo "Table 'spbu' already exists, skipping schema init.\n";
exit(0);
}
echo "Initializing schema from database/schema.sql...\n";
$sql = file_get_contents(__DIR__ . '/../database/schema.sql');
// Buang baris komentar penuh supaya pemecahan per `;` tetap aman.
$lines = array_filter(
explode("\n", $sql),
fn ($line) => !str_starts_with(trim($line), '--')
);
$statements = array_filter(array_map('trim', explode(';', implode("\n", $lines))));
foreach ($statements as $statement) {
if (preg_match('/^(CREATE\s+DATABASE|USE)\b/i', $statement)) {
continue;
}
$pdo->exec($statement);
}
echo "Schema initialized: table 'spbu' created and seeded.\n";