diff --git a/.env.docker b/.env.docker index 5536215..512b4a0 100644 --- a/.env.docker +++ b/.env.docker @@ -28,7 +28,9 @@ LOG_LEVEL=debug # ── Database ────────────────────────────────────────────────────────────────── DB_CONNECTION=mysql -DB_HOST=db # nama service dalam docker-compose.yml +# DEV (Windows): DB_HOST=host.docker.internal ← MySQL pada host Windows +# PRODUCTION: DB_HOST=172.17.200.16 ← MySQL server external +DB_HOST=host.docker.internal DB_PORT=3306 DB_DATABASE=ecert_mbip DB_USERNAME=ecert diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 4aee433..753c7bc 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -4,12 +4,14 @@ # Penggunaan: # docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --build # +# DB external: 172.17.200.16:3306 +# Dalam .env (production): DB_HOST=172.17.200.16 +# # Perbezaan dari dev: # • APP_ENV=production, APP_DEBUG=false -# • DB port TIDAK didedahkan ke host -# • Storage sijil/template disimpan dalam named volume (kekal semasa deploy) -# • Opcache validate_timestamps=0 (prestasi) +# • Storage sijil/template dalam named volume (kekal semasa redeploy) # • php-dev.ini tidak dimuat +# • extra_hosts dibuang (IP terus boleh dicapai dari container) ############################################################################### name: ecert @@ -20,15 +22,13 @@ services: container_name: ecert_app restart: always volumes: - # Kod dari server (git pull) - .:/var/www - # php.ini sahaja (tanpa php-dev.ini) - ./docker/php/php.ini:/usr/local/etc/php/conf.d/99-ecert.ini:ro - # Storage kekal semasa redeploy - storage_data:/var/www/storage environment: APP_ENV: production APP_DEBUG: "false" + extra_hosts: [] # buang host.docker.internal, guna IP terus # ── Nginx (production) ───────────────────────────────────────────────────── nginx: @@ -37,17 +37,8 @@ services: volumes: - .:/var/www:ro - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro - # Mount storage supaya nginx boleh serve fail statik jika perlu - storage_data:/var/www/storage:ro - # ── MySQL (production) ───────────────────────────────────────────────────── - db: - container_name: ecert_db - restart: always - ports: [] # Jangan dedahkan DB port ke luar dalam production - volumes: - - dbdata:/var/lib/mysql - # ── Queue Worker (production) ────────────────────────────────────────────── queue: container_name: ecert_queue @@ -58,6 +49,7 @@ services: - storage_data:/var/www/storage environment: APP_ENV: production + extra_hosts: [] ############################################################################### volumes: diff --git a/docker-compose.yml b/docker-compose.yml index 0dab64f..4381f8a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,11 +1,15 @@ ############################################################################### -# eCert MBIP — Docker Compose (Development — Windows 11 / Linux) +# eCert MBIP — Docker Compose (Development — Windows 11) # # Penggunaan: # docker compose up -d --build # -# Aplikasi: http://localhost:8003 -# DB (host): localhost:33060 (untuk TablePlus / HeidiSQL) +# Aplikasi: http://localhost:8003 +# DB : host.docker.internal:3306 (MySQL pada Windows host) +# +# NOTA: Dari dalam container, MySQL pada Windows tidak boleh guna "localhost". +# Kena guna host.docker.internal (disediakan oleh Docker Desktop). +# Dalam .env: DB_HOST=host.docker.internal ############################################################################### name: ecert @@ -28,9 +32,8 @@ services: environment: APP_ENV: local APP_DEBUG: "true" - depends_on: - db: - condition: service_healthy + extra_hosts: + - "host.docker.internal:host-gateway" # pastikan resolusi host pada Linux juga networks: - ecert @@ -49,37 +52,6 @@ services: networks: - ecert - # ── MySQL 8.0 ────────────────────────────────────────────────────────────── - db: - image: mysql:8.0 - container_name: ecert_db - restart: unless-stopped - environment: - MYSQL_DATABASE: ${DB_DATABASE:-ecert_mbip} - MYSQL_ROOT_PASSWORD: ${DB_PASSWORD:-secret} - MYSQL_USER: ${DB_USERNAME:-ecert} - MYSQL_PASSWORD: ${DB_PASSWORD:-secret} - volumes: - - dbdata:/var/lib/mysql - ports: - - "33060:3306" # port host 33060 → elak konflik dengan MySQL tempatan (3306) - healthcheck: - test: - - CMD - - mysqladmin - - ping - - -h - - localhost - - -u - - root - - --password=${DB_PASSWORD:-secret} - interval: 5s - timeout: 5s - retries: 15 - start_period: 20s - networks: - - ecert - # ── Queue Worker ─────────────────────────────────────────────────────────── queue: build: @@ -95,7 +67,8 @@ services: - .env environment: APP_ENV: local - # Override entrypoint: langkau migrate/seed (app container dah buat) + extra_hosts: + - "host.docker.internal:host-gateway" entrypoint: [] command: - php @@ -106,10 +79,7 @@ services: - --max-time=3600 - --timeout=90 depends_on: - db: - condition: service_healthy - app: - condition: service_started + - app networks: - ecert @@ -117,7 +87,3 @@ services: networks: ecert: driver: bridge - -volumes: - dbdata: - driver: local diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index d3fe901..b3369bc 100644 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -18,7 +18,7 @@ echo "╚═══════════════════════ echo "" # ── 1. Tunggu MySQL bersedia ────────────────────────────────────────────────── -DB_HOST="${DB_HOST:-db}" +DB_HOST="${DB_HOST:-host.docker.internal}" DB_PORT="${DB_PORT:-3306}" DB_DATABASE="${DB_DATABASE:-ecert_mbip}" DB_USERNAME="${DB_USERNAME:-root}"