diff --git a/Dockerfile b/Dockerfile index fb96bcc..fde3cfc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -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"] diff --git a/Leaflet2/sql/miskin_schema.sql b/Leaflet2/sql/miskin_schema.sql index 0c85f89..2c09612 100644 --- a/Leaflet2/sql/miskin_schema.sql +++ b/Leaflet2/sql/miskin_schema.sql @@ -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, diff --git a/docker/app-entrypoint.sh b/docker/app-entrypoint.sh new file mode 100644 index 0000000..224e4f4 --- /dev/null +++ b/docker/app-entrypoint.sh @@ -0,0 +1,6 @@ +#!/bin/sh +set -e + +php /var/www/html/docker/ensure-database.php + +exec apache2-foreground diff --git a/docker/ensure-database.php b/docker/ensure-database.php new file mode 100644 index 0000000..3cb1e07 --- /dev/null +++ b/docker/ensure-database.php @@ -0,0 +1,57 @@ + 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); +}