Ensure database schema on app startup
This commit is contained in:
+4
-1
@@ -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"]
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
php /var/www/html/docker/ensure-database.php
|
||||
|
||||
exec apache2-foreground
|
||||
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user