mysql ewrror

This commit is contained in:
Saufi
2026-06-24 19:35:22 +08:00
parent c0c3d7c09c
commit 87fc252651
5 changed files with 55 additions and 37 deletions

View File

@@ -1,11 +1,13 @@
# ───────────────────────────────────────────────────────────────────────────── # ─────────────────────────────────────────────────────────────────────────────
# KOIPB MAT — Templat .env untuk Docker (dev & Ubuntu server) # KOIPB MAT — Templat env untuk Docker (dev & Ubuntu server)
# #
# cp .env.docker.example .env # cp .env.docker.example .env.docker
# # kemudian tukar SEMUA password di bawah # # kemudian tukar SEMUA password di bawah
# #
# Fail .env ini dibaca oleh Laravel (env_file) DAN oleh Docker Compose # PENTING: guna nama fail .env.docker (BUKAN .env) supaya tidak berlanggar
# untuk gantian ${DB_*} pada service mysql. # dengan .env tempatan anda untuk `php artisan serve`.
#
# Fail ini dibaca oleh kedua-dua service (app & mysql) melalui env_file.
# ───────────────────────────────────────────────────────────────────────────── # ─────────────────────────────────────────────────────────────────────────────
APP_NAME="KOIPB MAT" APP_NAME="KOIPB MAT"
@@ -14,22 +16,27 @@ APP_KEY=
APP_DEBUG=false APP_DEBUG=false
APP_URL=http://localhost APP_URL=http://localhost
# Port nginx pada host (dev biasanya 8000; prod 80) # Port nginx pada host (dev 8000; prod 80). Untuk tukar, hantar --env-file .env.docker
APP_PORT=80 APP_PORT=80
APP_LOCALE=ms APP_LOCALE=ms
APP_FALLBACK_LOCALE=en APP_FALLBACK_LOCALE=en
APP_FAKER_LOCALE=ms_MY APP_FAKER_LOCALE=ms_MY
# ── Database (DB_HOST mesti "mysql" = nama service Docker) ──────────────────── # ── Database — untuk Laravel (DB_HOST mesti "mysql" = nama service Docker) ────
DB_CONNECTION=mysql DB_CONNECTION=mysql
DB_HOST=mysql DB_HOST=mysql
DB_PORT=3306 DB_PORT=3306
DB_DATABASE=koipb_mat DB_DATABASE=koipb_mat
DB_USERNAME=koipb DB_USERNAME=koipb
DB_PASSWORD=tukar_password_ini DB_PASSWORD=tukar_password_ini
# Digunakan hanya untuk root MySQL dalam container (gantian ${DB_ROOT_PASSWORD})
DB_ROOT_PASSWORD=tukar_root_password_ini # ── MySQL container — MESTI SAMA dengan DB_* di atas ─────────────────────────
# (MYSQL_USER TIDAK boleh "root" — guna "koipb")
MYSQL_DATABASE=koipb_mat
MYSQL_USER=koipb
MYSQL_PASSWORD=tukar_password_ini
MYSQL_ROOT_PASSWORD=tukar_root_password_ini
# Seed data demo (200 anggota + 21 hadiah) pada deploy pertama? true/false # Seed data demo (200 anggota + 21 hadiah) pada deploy pertama? true/false
SEED_DEMO=true SEED_DEMO=true

View File

@@ -25,7 +25,7 @@ Untuk 150200 peserta, server kecil sudah memadai.
``` ```
/srv/koipb/ /srv/koipb/
├── .env # disalin dari .env.docker.example (JANGAN commit) ├── .env.docker # disalin dari .env.docker.example (JANGAN commit)
├── .env.docker.example # templat ├── .env.docker.example # templat
├── Dockerfile # imej PHP-FPM (Laravel) ├── Dockerfile # imej PHP-FPM (Laravel)
├── docker-compose.yml # dev (nginx + app + mysql) ├── docker-compose.yml # dev (nginx + app + mysql)
@@ -62,10 +62,12 @@ git clone <repo-url> .
### 3. Konfigurasi environment ### 3. Konfigurasi environment
```bash ```bash
cp .env.docker.example .env cp .env.docker.example .env.docker
nano .env nano .env.docker
``` ```
> Guna nama fail **`.env.docker`** (bukan `.env`) supaya tidak berlanggar dengan `.env` tempatan untuk `php artisan serve`.
Wajib tukar: Wajib tukar:
| Pemboleh ubah | Nota | | Pemboleh ubah | Nota |
@@ -73,11 +75,11 @@ Wajib tukar:
| `APP_KEY` | Biar kosong — entrypoint jana automatik kali pertama | | `APP_KEY` | Biar kosong — entrypoint jana automatik kali pertama |
| `APP_URL` | cth `https://mat.koipb.gov.my` | | `APP_URL` | cth `https://mat.koipb.gov.my` |
| `APP_PORT` | `80` (atau di belakang reverse proxy) | | `APP_PORT` | `80` (atau di belakang reverse proxy) |
| `DB_PASSWORD` | password user `koipb` | | `DB_PASSWORD` **dan** `MYSQL_PASSWORD` | password user `koipb`**mesti sama** |
| `DB_ROOT_PASSWORD` | password root MySQL container | | `MYSQL_ROOT_PASSWORD` | password root MySQL container |
| `SEED_DEMO` | `true` = isi 200 anggota + 21 hadiah contoh; `false` = data kosong (import sendiri) | | `SEED_DEMO` | `true` = isi 200 anggota + 21 hadiah contoh; `false` = data kosong (import sendiri) |
> `DB_HOST` mesti kekal `mysql` (nama service container). > `DB_HOST`/`MYSQL_*` jangan diubah namanya. `MYSQL_USER` mesti `koipb` (BUKAN `root` — MySQL menolaknya).
### 4. Logo ### 4. Logo
@@ -89,7 +91,8 @@ cp /path/ke/logo.jpg public/images/logo-koipb.jpg
### 5. Bina & jalankan (production) ### 5. Bina & jalankan (production)
```bash ```bash
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --build docker compose --env-file .env.docker \
-f docker-compose.yml -f docker-compose.prod.yml up -d --build
``` ```
Entrypoint akan automatik: tunggu MySQL → composer install → `key:generate``migrate --force` → seed peranan/pengguna (+ demo jika `SEED_DEMO=true`) → cache config/route/view. Entrypoint akan automatik: tunggu MySQL → composer install → `key:generate``migrate --force` → seed peranan/pengguna (+ demo jika `SEED_DEMO=true`) → cache config/route/view.
@@ -134,8 +137,8 @@ docker compose exec mysql sh -c 'mysqldump -u root -p"$MYSQL_ROOT_PASSWORD" koip
cat backup.sql | docker compose exec -T mysql sh -c 'mysql -u root -p"$MYSQL_ROOT_PASSWORD" koipb_mat' cat backup.sql | docker compose exec -T mysql sh -c 'mysql -u root -p"$MYSQL_ROOT_PASSWORD" koipb_mat'
# Henti / mula semula # Henti / mula semula
docker compose -f docker-compose.yml -f docker-compose.prod.yml down docker compose --env-file .env.docker -f docker-compose.yml -f docker-compose.prod.yml down
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d docker compose --env-file .env.docker -f docker-compose.yml -f docker-compose.prod.yml up -d
``` ```
> Data MySQL kekal dalam named volume **`koipb_db_data`** walaupun container dipadam. `docker compose down` (tanpa `-v`) **tidak** memadam data. **Jangan** guna `down -v` semasa event. > Data MySQL kekal dalam named volume **`koipb_db_data`** walaupun container dipadam. `docker compose down` (tanpa `-v`) **tidak** memadam data. **Jangan** guna `down -v` semasa event.
@@ -147,7 +150,7 @@ docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
```bash ```bash
cd /srv/koipb cd /srv/koipb
git pull git pull
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --build docker compose --env-file .env.docker -f docker-compose.yml -f docker-compose.prod.yml up -d --build
# Entrypoint akan migrate + cache semula automatik. # Entrypoint akan migrate + cache semula automatik.
``` ```

View File

@@ -2,7 +2,8 @@
# KOIPB MAT — Docker Compose Production Override (Ubuntu Server) # KOIPB MAT — Docker Compose Production Override (Ubuntu Server)
# #
# Penggunaan: # Penggunaan:
# docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --build # docker compose --env-file .env.docker \
# -f docker-compose.yml -f docker-compose.prod.yml up -d --build
# #
# Perbezaan dari dev: # Perbezaan dari dev:
# • APP_ENV=production, APP_DEBUG=false → config/route/view cache # • APP_ENV=production, APP_DEBUG=false → config/route/view cache
@@ -28,6 +29,7 @@ services:
DB_PORT: "3306" DB_PORT: "3306"
volumes: volumes:
- ./:/var/www/html - ./:/var/www/html
- ./.env.docker:/var/www/html/.env
- ./docker/php/php.ini:/usr/local/etc/php/conf.d/99-koipb.ini:ro - ./docker/php/php.ini:/usr/local/etc/php/conf.d/99-koipb.ini:ro
- ./docker/php/php-prod.ini:/usr/local/etc/php/conf.d/99-koipb-prod.ini:ro - ./docker/php/php-prod.ini:/usr/local/etc/php/conf.d/99-koipb-prod.ini:ro

View File

@@ -2,14 +2,15 @@
# KOIPB MAT — Docker Compose (Development) # KOIPB MAT — Docker Compose (Development)
# #
# Penggunaan: # Penggunaan:
# cp .env.docker.example .env # isi DB_PASSWORD / DB_ROOT_PASSWORD # cp .env.docker.example .env.docker # isi password
# docker compose up -d --build # docker compose --env-file .env.docker up -d --build
# #
# Aplikasi : http://localhost:8000 # Aplikasi : http://localhost:8000
# MySQL : service "mysql" (named volume koipb_db_data) # MySQL : service "mysql" (named volume koipb_db_data)
# #
# NOTA: .env yang sama dibaca oleh Laravel (env_file) DAN oleh Docker Compose # NOTA: Docker guna .env.docker (BUKAN .env). Ini elak konflik dengan .env
# untuk gantian ${DB_*} pada service mysql. Pastikan DB_HOST=mysql. # tempatan anda (yang mungkin DB_USERNAME=root untuk php artisan serve).
# MYSQL_USER TIDAK boleh "root" — sebab itu .env.docker guna "koipb".
############################################################################### ###############################################################################
name: koipb name: koipb
@@ -20,17 +21,15 @@ services:
image: mysql:8.0 image: mysql:8.0
container_name: koipb_mysql container_name: koipb_mysql
restart: unless-stopped restart: unless-stopped
environment: # Baca MYSQL_DATABASE / MYSQL_USER / MYSQL_PASSWORD / MYSQL_ROOT_PASSWORD
MYSQL_DATABASE: ${DB_DATABASE:-koipb_mat} env_file:
MYSQL_USER: ${DB_USERNAME:-koipb} - .env.docker
MYSQL_PASSWORD: ${DB_PASSWORD:-secret}
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-rootsecret}
volumes: volumes:
- koipb_db_data:/var/lib/mysql - koipb_db_data:/var/lib/mysql
ports: ports:
- "127.0.0.1:3307:3306" # akses dev dari host (elak conflict dgn MySQL tempatan 3306) - "127.0.0.1:3307:3306" # akses dev dari host (elak conflict dgn MySQL tempatan 3306)
healthcheck: healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${DB_ROOT_PASSWORD:-rootsecret}"] test: ["CMD-SHELL", "mysqladmin ping -h localhost -u root -p\"$$MYSQL_ROOT_PASSWORD\" --silent"]
interval: 10s interval: 10s
timeout: 5s timeout: 5s
retries: 10 retries: 10
@@ -46,14 +45,16 @@ services:
restart: unless-stopped restart: unless-stopped
working_dir: /var/www/html working_dir: /var/www/html
env_file: env_file:
- .env - .env.docker
environment: environment:
APP_ENV: local APP_ENV: local
APP_DEBUG: "true" APP_DEBUG: "true"
DB_HOST: mysql # paksa ke container mysql, walau .env tersilap DB_HOST: mysql # paksa ke container mysql, walau .env.docker tersilap
DB_PORT: "3306" DB_PORT: "3306"
volumes: volumes:
- ./:/var/www/html - ./:/var/www/html
# .env dalam container = .env.docker (elak .env tempatan root/1234 dibaca Laravel)
- ./.env.docker:/var/www/html/.env
- ./docker/php/php.ini:/usr/local/etc/php/conf.d/99-koipb.ini:ro - ./docker/php/php.ini:/usr/local/etc/php/conf.d/99-koipb.ini:ro
- ./docker/php/php-dev.ini:/usr/local/etc/php/conf.d/99-koipb-dev.ini:ro - ./docker/php/php-dev.ini:/usr/local/etc/php/conf.d/99-koipb-dev.ini:ro
depends_on: depends_on:

View File

@@ -58,20 +58,25 @@ chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache 2
chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache 2>/dev/null || true chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache 2>/dev/null || true
# ── 3. Generate APP_KEY jika kosong ─────────────────────────────────────────── # ── 3. Generate APP_KEY jika kosong ───────────────────────────────────────────
# Fail .env dalam container = .env.docker (di-overlay melalui volume).
if [ -z "${APP_KEY}" ]; then if [ -z "${APP_KEY}" ]; then
echo "🔑 Menjana APP_KEY..." echo "🔑 Menjana APP_KEY..."
php artisan key:generate --force php artisan key:generate --force
fi fi
# Penting: env_file mungkin hantar APP_KEY="" (kosong) sebagai env var sebenar # env_file menyuntik APP_KEY (mungkin kosong) sebagai env var sebenar yang
# yang mengatasi nilai dalam .env. Baca semula dari .env & EXPORT supaya # mengatasi nilai dalam fail. Baca semula dari .env & EXPORT supaya proses anak
# proses anak (migrate, config:cache, php-fpm) mewarisi kunci yang betul. # (migrate, config:cache, php-fpm) mewarisi kunci yang betul.
if [ -f /var/www/html/.env ]; then if [ -f /var/www/html/.env ]; then
FILE_KEY=$(grep -E '^APP_KEY=' /var/www/html/.env | head -1 | cut -d= -f2-) FILE_KEY=$(grep -E '^APP_KEY=' /var/www/html/.env | head -1 | cut -d= -f2-)
if [ -n "${FILE_KEY}" ]; then [ -n "${FILE_KEY}" ] && export APP_KEY="${FILE_KEY}"
export APP_KEY="${FILE_KEY}"
fi
fi fi
# ── 3b. Bersihkan cache lama ──────────────────────────────────────────────────
# Penting: config.php basi (cth dari deploy lama) boleh mengatasi .env semasa.
php artisan config:clear 2>/dev/null || true
php artisan route:clear 2>/dev/null || true
php artisan view:clear 2>/dev/null || true
# ── 4. Migration + seed peranan & pengguna (idempotent) ─────────────────────── # ── 4. Migration + seed peranan & pengguna (idempotent) ───────────────────────
echo "🗄 Menjalankan migration..." echo "🗄 Menjalankan migration..."
php artisan migrate --force php artisan migrate --force