diff --git a/docker-compose.yml b/docker-compose.yml index 687bc34..7a1e7b7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,10 +4,11 @@ services: restart: unless-stopped depends_on: - db - command: sh -c "sleep 25 && apache2-foreground" + command: sh -c "php /var/www/html/docker/initdb.php && apache2-foreground" environment: DB_HOST: db DB_PORT: "3306" + DB_ROOT_PASSWORD: rootwebgis DB_USER: webgis DB_PASSWORD: webgis DB_NAME_01: spbu_db @@ -24,10 +25,6 @@ services: MARIADB_ROOT_PASSWORD: rootwebgis volumes: - webgis_db_data:/var/lib/mysql - - ./docker/initdb/00-user.sql:/docker-entrypoint-initdb.d/00-user.sql:ro - - ./01/spbu_db.sql:/docker-entrypoint-initdb.d/01-spbu_db.sql:ro - - ./02/webgis2.sql:/docker-entrypoint-initdb.d/02-webgis2.sql:ro - - ./05/webgis_uas.sql:/docker-entrypoint-initdb.d/05-webgis_uas.sql:ro volumes: webgis_db_data: diff --git a/docker/initdb.php b/docker/initdb.php new file mode 100644 index 0000000..8c47ca8 --- /dev/null +++ b/docker/initdb.php @@ -0,0 +1,106 @@ +options(MYSQLI_OPT_CONNECT_TIMEOUT, 5); + if (@$conn->real_connect($host, $user, $pass, $db, $port)) { + $conn->set_charset('utf8mb4'); + return $conn; + } + return null; +} + +$conn = null; +$lastError = ''; + +for ($i = 1; $i <= 90; $i++) { + $conn = connect_mysql($host, 'root', $rootPass, null, $port); + if ($conn) { + break; + } + $lastError = mysqli_connect_error(); + log_line("Menunggu database siap ($i/90): " . ($lastError ?: 'belum siap')); + sleep(2); +} + +if (!$conn) { + log_line("Database tidak bisa dihubungi. Host=$host Port=$port Error=$lastError"); + exit(1); +} + +log_line('Database siap.'); + +$safeUser = $conn->real_escape_string($appUser); +$safePass = $conn->real_escape_string($appPass); +$conn->query("CREATE USER IF NOT EXISTS '{$safeUser}'@'%' IDENTIFIED BY '{$safePass}'"); +$conn->query("GRANT ALL PRIVILEGES ON *.* TO '{$safeUser}'@'%'"); +$conn->query("FLUSH PRIVILEGES"); + +function table_exists($conn, $db, $table) { + $db = $conn->real_escape_string($db); + $table = $conn->real_escape_string($table); + $result = $conn->query("SHOW TABLES FROM `{$db}` LIKE '{$table}'"); + return $result && $result->num_rows > 0; +} + +function import_sql_file($conn, $path, $label) { + if (!is_file($path)) { + log_line("Lewati {$label}: file tidak ditemukan {$path}"); + return; + } + + $sql = file_get_contents($path); + if ($sql === false || trim($sql) === '') { + log_line("Lewati {$label}: file kosong"); + return; + } + + log_line("Import {$label} dari {$path}"); + if (!$conn->multi_query($sql)) { + log_line("Import {$label} gagal: " . $conn->error); + exit(1); + } + + do { + if ($result = $conn->store_result()) { + $result->free(); + } + if ($conn->errno) { + log_line("Import {$label} gagal: " . $conn->error); + exit(1); + } + } while ($conn->more_results() && $conn->next_result()); + + log_line("Import {$label} selesai."); +} + +if (!table_exists($conn, 'spbu_db', 'spbu')) { + import_sql_file($conn, '/var/www/html/01/spbu_db.sql', 'spbu_db'); +} else { + log_line('spbu_db sudah ada.'); +} + +if (!table_exists($conn, 'webgis2', 'jalan')) { + import_sql_file($conn, '/var/www/html/02/webgis2.sql', 'webgis2'); +} else { + log_line('webgis2 sudah ada.'); +} + +if (!table_exists($conn, 'webgis_uas', 'rumah_ibadah')) { + import_sql_file($conn, '/var/www/html/05/webgis_uas.sql', 'webgis_uas'); +} else { + log_line('webgis_uas sudah ada.'); +} + +log_line('Inisialisasi database selesai.'); diff --git a/docker/initdb/00-user.sql b/docker/initdb/00-user.sql deleted file mode 100644 index 460cade..0000000 --- a/docker/initdb/00-user.sql +++ /dev/null @@ -1,3 +0,0 @@ -CREATE USER IF NOT EXISTS 'webgis'@'%' IDENTIFIED BY 'webgis'; -GRANT ALL PRIVILEGES ON *.* TO 'webgis'@'%'; -FLUSH PRIVILEGES;