feat: Docker Compose setup untuk development & production
- docker/php/Dockerfile: PHP 8.4-FPM + GD + imagick (PECL) + semua extension Laravel - docker/php/php.ini: upload 20MB, memory 512MB, opcache, Asia/Kuala_Lumpur - docker/php/php-dev.ini: validate_timestamps=1, display_errors=On (dev) - docker/nginx/default.conf: gzip, security headers, static asset caching - docker/entrypoint.sh: tunggu MySQL → migrate → seed AdminSeeder → cache (prod) - docker-compose.yml: dev stack — port 8003, DB host 33060, queue worker - docker-compose.prod.yml: production overrides — storage volume, no DB port exposed - .env.docker: template env untuk Docker (DB_HOST=db) - .dockerignore: exclude node_modules, vendor, .env, logs fix: testGenerate try/catch kembalikan JSON error (bukan HTML 500) fix: loadPreview() semak r.ok, tunjuk error alert, loading spinner Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
82
docker/entrypoint.sh
Normal file
82
docker/entrypoint.sh
Normal file
@@ -0,0 +1,82 @@
|
||||
#!/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:-db}"
|
||||
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 mysqladmin ping \
|
||||
-h "${DB_HOST}" \
|
||||
-P "${DB_PORT}" \
|
||||
-u "${DB_USERNAME}" \
|
||||
--password="${DB_PASSWORD}" \
|
||||
--silent 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 "$@"
|
||||
Reference in New Issue
Block a user