This commit is contained in:
Saufi
2026-06-14 09:17:46 +08:00
parent 359229685d
commit 5ec68d3fe9
10 changed files with 515 additions and 1 deletions

66
docker/php/entrypoint.sh Normal file
View File

@@ -0,0 +1,66 @@
#!/usr/bin/env bash
set -euo pipefail
cd /var/www/html
echo "[entrypoint] Preparing storage directories..."
mkdir -p \
storage/app/public \
storage/framework/cache/data \
storage/framework/sessions \
storage/framework/views \
storage/framework/testing \
storage/logs \
bootstrap/cache
chown -R www-data:www-data storage bootstrap/cache || true
chmod -R ug+rwX storage bootstrap/cache || true
# Refresh package manifest (env vars are available now via compose env_file).
php artisan package:discover --ansi || true
# Wait for the database to be reachable before migrating / caching config.
wait_for_db() {
local host="${DB_HOST:-127.0.0.1}"
local port="${DB_PORT:-3306}"
echo "[entrypoint] Waiting for database at ${host}:${port}..."
for i in $(seq 1 30); do
if php -r '
$h=getenv("DB_HOST")?:"127.0.0.1";
$p=getenv("DB_PORT")?:"3306";
$d=getenv("DB_DATABASE")?:"";
$u=getenv("DB_USERNAME")?:"root";
$w=getenv("DB_PASSWORD")?:"";
try { new PDO("mysql:host=$h;port=$p;dbname=$d", $u, $w, [PDO::ATTR_TIMEOUT=>2]); exit(0); }
catch (Throwable $e) { exit(1); }
' >/dev/null 2>&1; then
echo "[entrypoint] Database is up."
return 0
fi
sleep 2
done
echo "[entrypoint] WARNING: database not reachable after timeout; continuing anyway."
return 0
}
# Cache framework config for performance. Runs in every role so all containers
# share the same compiled config.
cache_app() {
php artisan config:cache --ansi || true
php artisan route:cache --ansi || true
php artisan view:cache --ansi || true
}
# Only the primary (web/app) container runs migrations & storage:link, so the
# queue/scheduler workers don't race on them. Toggle with RUN_MIGRATIONS.
if [ "${RUN_MIGRATIONS:-true}" = "true" ]; then
wait_for_db
cache_app
echo "[entrypoint] Running migrations..."
php artisan migrate --force --ansi || echo "[entrypoint] WARNING: migrate failed."
php artisan storage:link --ansi || true
else
cache_app
fi
echo "[entrypoint] Starting: $*"
exec "$@"

20
docker/php/php.ini Normal file
View File

@@ -0,0 +1,20 @@
; Application PHP settings (production-leaning)
expose_php = Off
memory_limit = 256M
max_execution_time = 60
; File uploads (attendance app — keep modest but comfortable)
upload_max_filesize = 20M
post_max_size = 21M
; Timezone (app uses Asia/Kuala_Lumpur)
date.timezone = Asia/Kuala_Lumpur
; OPcache — enabled for production performance
opcache.enable = 1
opcache.enable_cli = 0
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 20000
opcache.validate_timestamps = 1
opcache.revalidate_freq = 60