Files
eCert-MBIP/docker/entrypoint.sh
Saufi 55c077ee48 fix: guna PHP PDO untuk semak MySQL dalam entrypoint
mysqladmin resolve host.docker.internal ke IPv6 dahulu — MySQL Windows
tidak dengar pada IPv6, menyebabkan loop tak berakhir dan 502 pada Nginx.
PHP PDO guna IPv4 terus dan berjaya sambung.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 17:24:38 +08:00

89 lines
3.6 KiB
Bash

#!/bin/sh
# ──────────────────────────────────────────────────────────────────────────────
# eCert MBIP — Container Entrypoint
# Jalankan sebelum php-fpm bermula:
# 1. Tunggu MySQL
# 2. Install Composer deps (dev sahaja)
# 3. Generate APP_KEY jika tiada
# 4. Migrate + seed AdminSeeder
# 5. Storage link
# 6. Cache (prod sahaja)
# ──────────────────────────────────────────────────────────────────────────────
set -e
echo ""
echo "╔══════════════════════════════════════╗"
echo "║ eCert MBIP — Container Start ║"
echo "╚══════════════════════════════════════╝"
echo ""
# ── 1. Tunggu MySQL bersedia ──────────────────────────────────────────────────
DB_HOST="${DB_HOST:-host.docker.internal}"
DB_PORT="${DB_PORT:-3306}"
DB_DATABASE="${DB_DATABASE:-ecert_mbip}"
DB_USERNAME="${DB_USERNAME:-root}"
DB_PASSWORD="${DB_PASSWORD:-secret}"
echo "⏳ Menunggu MySQL di ${DB_HOST}:${DB_PORT}..."
until php -r "
try {
new PDO(
'mysql:host=${DB_HOST};port=${DB_PORT};dbname=${DB_DATABASE}',
'${DB_USERNAME}',
'${DB_PASSWORD}'
);
exit(0);
} catch (Exception \$e) {
exit(1);
}
" 2>/dev/null; do
printf "."
sleep 2
done
echo ""
echo "✓ MySQL bersedia."
# ── 2. Pasang Composer dependencies (development sahaja) ─────────────────────
if [ "${APP_ENV}" != "production" ] && [ ! -d /var/www/vendor ]; then
echo "📦 Memasang Composer dependencies (dev)..."
composer install \
--no-interaction \
--no-progress \
--prefer-dist
fi
# ── 3. Generate APP_KEY jika kosong ───────────────────────────────────────────
if [ -z "${APP_KEY}" ] || [ "${APP_KEY}" = "" ]; then
echo "🔑 Menjana APP_KEY..."
php artisan key:generate --force
fi
# ── 4. Database migration ─────────────────────────────────────────────────────
echo "🗄 Menjalankan migration..."
php artisan migrate --force
# Seed admin account (idempotent — guna firstOrCreate)
echo "👤 Seeding AdminSeeder..."
php artisan db:seed --class=AdminSeeder --force
# ── 5. Storage symbolic link ──────────────────────────────────────────────────
php artisan storage:link 2>/dev/null || true
# ── 6. Cache (production sahaja) ──────────────────────────────────────────────
if [ "${APP_ENV}" = "production" ]; then
echo "⚡ Caching config, routes, views..."
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan event:cache
# Opcache: matikan validate_timestamps untuk prestasi
# (sudah dikonfigur dalam php.ini prod)
fi
echo ""
echo "✅ Aplikasi bersedia."
echo ""
exec "$@"