Ensure database schema on app startup

This commit is contained in:
2026-06-10 23:00:39 +07:00
parent d94edcda98
commit 14f7425dff
4 changed files with 74 additions and 9 deletions
+4 -1
View File
@@ -11,6 +11,9 @@ WORKDIR /var/www/html
COPY . /var/www/html/
RUN mkdir -p /var/www/html/Leaflet2/uploads/bukti \
&& chown -R www-data:www-data /var/www/html/Leaflet2/uploads
&& chown -R www-data:www-data /var/www/html/Leaflet2/uploads \
&& chmod +x /var/www/html/docker/app-entrypoint.sh
EXPOSE 80
ENTRYPOINT ["/var/www/html/docker/app-entrypoint.sh"]
+7 -8
View File
@@ -1,8 +1,7 @@
DROP DATABASE IF EXISTS webgis_miskin;
CREATE DATABASE webgis_miskin CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE IF NOT EXISTS webgis_miskin CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE webgis_miskin;
CREATE TABLE admins (
CREATE TABLE IF NOT EXISTS admins (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
@@ -11,10 +10,10 @@ CREATE TABLE admins (
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
INSERT INTO admins (username, password_hash, nama) VALUES
INSERT IGNORE INTO admins (username, password_hash, nama) VALUES
('admin', '$2y$10$7O061pVz/aZ5YNK/fQyYIePIPnzDb.uZn38pC/Te3s7gRyko20dIK', 'Administrator');
CREATE TABLE rumah_ibadah (
CREATE TABLE IF NOT EXISTS rumah_ibadah (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(150) NOT NULL,
jenis ENUM('Masjid', 'Gereja', 'Pura', 'Vihara', 'Klenteng', 'Lainnya') NOT NULL,
@@ -26,7 +25,7 @@ CREATE TABLE rumah_ibadah (
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
CREATE TABLE penduduk_miskin (
CREATE TABLE IF NOT EXISTS penduduk_miskin (
id INT AUTO_INCREMENT PRIMARY KEY,
kk_nama VARCHAR(150) NOT NULL,
kk_nik VARCHAR(20),
@@ -52,7 +51,7 @@ CREATE TABLE penduduk_miskin (
FOREIGN KEY (ibadah_id) REFERENCES rumah_ibadah(id) ON DELETE SET NULL
) ENGINE=InnoDB;
CREATE TABLE anggota_keluarga (
CREATE TABLE IF NOT EXISTS anggota_keluarga (
id INT AUTO_INCREMENT PRIMARY KEY,
penduduk_id INT NOT NULL,
nama VARCHAR(150) NOT NULL,
@@ -62,7 +61,7 @@ CREATE TABLE anggota_keluarga (
FOREIGN KEY (penduduk_id) REFERENCES penduduk_miskin(id) ON DELETE CASCADE
) ENGINE=InnoDB;
CREATE TABLE riwayat_bantuan (
CREATE TABLE IF NOT EXISTS riwayat_bantuan (
id INT AUTO_INCREMENT PRIMARY KEY,
penduduk_id INT NOT NULL,
jenis_bantuan VARCHAR(120) NOT NULL,
+6
View File
@@ -0,0 +1,6 @@
#!/bin/sh
set -e
php /var/www/html/docker/ensure-database.php
exec apache2-foreground
+57
View File
@@ -0,0 +1,57 @@
<?php
declare(strict_types=1);
$host = getenv('DB_HOST') ?: 'db';
$username = getenv('DB_SETUP_USERNAME') ?: getenv('DB_USERNAME') ?: 'root';
$password = getenv('DB_SETUP_PASSWORD') ?: getenv('DB_PASSWORD') ?: '';
$charset = getenv('DB_CHARSET') ?: 'utf8mb4';
$schemas = [
__DIR__ . '/../Leaflet/sql/schema.sql',
__DIR__ . '/../Leaflet/sql/spatial_schema.sql',
__DIR__ . '/../Leaflet2/sql/miskin_schema.sql',
];
function connectWithRetry(string $dsn, string $username, string $password): PDO
{
$lastException = null;
for ($attempt = 1; $attempt <= 20; $attempt++) {
try {
return new PDO($dsn, $username, $password, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
} catch (PDOException $exception) {
$lastException = $exception;
fwrite(STDERR, "Database belum siap, mencoba lagi ({$attempt}/20)...\n");
sleep(3);
}
}
throw $lastException ?? new RuntimeException('Koneksi database gagal.');
}
try {
$dsn = "mysql:host={$host};charset={$charset}";
$pdo = connectWithRetry($dsn, $username, $password);
foreach ($schemas as $schemaPath) {
$sql = file_get_contents($schemaPath);
if ($sql === false) {
throw new RuntimeException("File schema tidak ditemukan: {$schemaPath}");
}
$pdo->exec($sql);
}
$pdo->exec("
GRANT ALL PRIVILEGES ON webgis_spbu.* TO 'webgis_user'@'%';
GRANT ALL PRIVILEGES ON webgis_miskin.* TO 'webgis_user'@'%';
FLUSH PRIVILEGES;
");
fwrite(STDOUT, "Database schema siap.\n");
} catch (Throwable $exception) {
fwrite(STDERR, "Gagal memastikan database schema: " . $exception->getMessage() . "\n");
exit(1);
}