diff --git a/.env.example b/.env.example index fc12e1e..e84cdb8 100644 --- a/.env.example +++ b/.env.example @@ -3,6 +3,10 @@ DB_PORT=3306 DB_USER=webgis DB_PASSWORD=change-this-password +MYSQL_ROOT_PASSWORD=change-this-root-password +MYSQL_USER=webgis +MYSQL_PASSWORD=change-this-password + DB_NAME_GIS_SPBU=gis_spbu DB_NAME_DATA_JALAN=data_jalan DB_NAME_WEBGIS=webgis diff --git a/README.md b/README.md index 19a26c1..dc7bee0 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,23 @@ ## Konfigurasi Database Coolify -Project ini membaca konfigurasi database dari environment variable. Di Coolify, isi environment pada aplikasi PHP seperti contoh berikut: +Project ini bisa dideploy di Coolify dengan Docker Compose. Pilih build pack **Docker Compose**, base directory `/`, dan compose file `docker-compose.yml`. + +Di Coolify, isi environment stack seperti contoh berikut: + +```env +MYSQL_ROOT_PASSWORD=change-this-root-password +MYSQL_USER=webgis +MYSQL_PASSWORD=change-this-password +``` + +Compose akan mengisi koneksi aplikasi PHP ke service MySQL internal: ```env DB_HOST=mysql DB_PORT=3306 -DB_USER=webgis -DB_PASSWORD=change-this-password +DB_USER=${MYSQL_USER} +DB_PASSWORD=${MYSQL_PASSWORD} DB_NAME_GIS_SPBU=gis_spbu DB_NAME_DATA_JALAN=data_jalan @@ -16,16 +26,24 @@ DB_NAME_WEBGIS=webgis DB_NAME_KEMISKINAN=webgisuas ``` -`DB_HOST` harus memakai hostname service MySQL internal di Coolify, bukan `localhost`. Nama host biasanya mengikuti nama service/resource MySQL yang dibuat di Coolify. +`DB_HOST` harus memakai hostname service MySQL internal di Compose, yaitu `mysql`, bukan `localhost`. -Disarankan membuat user database khusus untuk aplikasi: +Saat volume MySQL masih kosong, file SQL berikut otomatis dijalankan: + +- `01/database_01.sql` +- `02/database_02.sql` +- `05/webgis_uas_FIXED_v2/webgis_uas_FIXED/database_LENGKAP.sql` +- `docker/mysql/init/99-grants.sh` + +Script `99-grants.sh` memberi user `${MYSQL_USER}` akses tulis ke semua database project. + +Jika database Coolify sudah pernah dibuat sebelum perubahan Compose ini, init script tidak berjalan ulang. Jalankan grant manual sekali lewat phpMyAdmin atau terminal MySQL: ```sql -CREATE USER 'webgis'@'%' IDENTIFIED BY 'change-this-password'; -GRANT ALL PRIVILEGES ON gis_spbu.* TO 'webgis'@'%'; -GRANT ALL PRIVILEGES ON data_jalan.* TO 'webgis'@'%'; -GRANT ALL PRIVILEGES ON webgis.* TO 'webgis'@'%'; -GRANT ALL PRIVILEGES ON webgisuas.* TO 'webgis'@'%'; +GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, DROP ON gis_spbu.* TO 'webgis'@'%'; +GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, DROP ON data_jalan.* TO 'webgis'@'%'; +GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, DROP ON webgis.* TO 'webgis'@'%'; +GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, DROP ON webgisuas.* TO 'webgis'@'%'; FLUSH PRIVILEGES; ``` diff --git a/docker-compose.yml b/docker-compose.yml index 5b430cb..3962934 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,50 +1,63 @@ services: web: build: . - container_name: webgis_app - ports: - - "8080:80" + restart: unless-stopped + expose: + - "80" environment: + SERVICE_FQDN_WEBGIS: DB_HOST: mysql DB_PORT: 3306 - DB_USER: webgis - DB_PASSWORD: webgis_password + DB_USER: ${MYSQL_USER:?webgis} + DB_PASSWORD: ${MYSQL_PASSWORD:?} DB_NAME_GIS_SPBU: gis_spbu DB_NAME_DATA_JALAN: data_jalan DB_NAME_WEBGIS: webgis DB_NAME_KEMISKINAN: webgisuas depends_on: - - mysql + mysql: + condition: service_healthy + healthcheck: + test: ["CMD-SHELL", "php -r \"exit(@fsockopen('127.0.0.1', 80) ? 0 : 1);\""] + interval: 30s + timeout: 10s + retries: 5 mysql: image: mysql:8.0 - container_name: webgis_mysql restart: unless-stopped environment: - MYSQL_ROOT_PASSWORD: root_password - MYSQL_USER: webgis - MYSQL_PASSWORD: webgis_password - ports: - - "3307:3306" + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:?} + MYSQL_DATABASE: gis_spbu + MYSQL_USER: ${MYSQL_USER:?webgis} + MYSQL_PASSWORD: ${MYSQL_PASSWORD:?} volumes: - mysql_data:/var/lib/mysql - ./01/database_01.sql:/docker-entrypoint-initdb.d/01_database_01.sql:ro - ./02/database_02.sql:/docker-entrypoint-initdb.d/02_database_02.sql:ro - ./05/webgis_uas_FIXED_v2/webgis_uas_FIXED/database_LENGKAP.sql:/docker-entrypoint-initdb.d/05_database_lengkap.sql:ro + - ./docker/mysql/init/99-grants.sh:/docker-entrypoint-initdb.d/99-grants.sh:ro + healthcheck: + test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -uroot -p$${MYSQL_ROOT_PASSWORD} --silent"] + interval: 10s + timeout: 5s + retries: 10 phpmyadmin: image: phpmyadmin/phpmyadmin - container_name: webgis_phpmyadmin restart: unless-stopped - ports: - - "8081:80" + expose: + - "80" environment: + SERVICE_FQDN_PHPMYADMIN: PMA_HOST: mysql PMA_PORT: 3306 - PMA_USER: webgis - PMA_PASSWORD: webgis_password + PMA_USER: ${MYSQL_USER:?webgis} + PMA_PASSWORD: ${MYSQL_PASSWORD:?} + PMA_ABSOLUTE_URI: ${SERVICE_URL_PHPMYADMIN:-} depends_on: - - mysql + mysql: + condition: service_healthy volumes: mysql_data: diff --git a/docker/mysql/init/99-grants.sh b/docker/mysql/init/99-grants.sh new file mode 100644 index 0000000..9a76c4f --- /dev/null +++ b/docker/mysql/init/99-grants.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -e + +docker_process_sql --database=mysql <<-EOSQL + GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, DROP + ON gis_spbu.* TO '${MYSQL_USER}'@'%'; + GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, DROP + ON data_jalan.* TO '${MYSQL_USER}'@'%'; + GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, DROP + ON webgis.* TO '${MYSQL_USER}'@'%'; + GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, DROP + ON webgisuas.* TO '${MYSQL_USER}'@'%'; + FLUSH PRIVILEGES; +EOSQL