From fa10d792fa60200c3e3eca18bda30309f21f759f Mon Sep 17 00:00:00 2001 From: Thorsten Bus Date: Tue, 31 Mar 2026 09:17:47 +0200 Subject: [PATCH] feat(docker): add boot-container.sh and init-app.sh lifecycle scripts --- build/boot-container.sh | 55 +++++++++++++++++++++++++++++++++++++++++ build/init-app.sh | 23 +++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100755 build/boot-container.sh create mode 100755 build/init-app.sh diff --git a/build/boot-container.sh b/build/boot-container.sh new file mode 100755 index 0000000..56afafe --- /dev/null +++ b/build/boot-container.sh @@ -0,0 +1,55 @@ +#!/bin/bash +set -e + +cd /app + +echo "[boot] Starting pp-planer container boot..." + +# Ensure all required directories exist (volumes may be freshly mounted) +mkdir -p \ + storage/logs \ + storage/framework/views \ + storage/framework/cache/data \ + storage/framework/sessions \ + storage/app/public \ + database \ + public + +# Run first-time initialization (idempotent — safe to call every boot) +/app/build/init-app.sh + +# Fix permissions: www-data must own all writable directories. +# The || true prevents exit on macOS Docker Desktop (bind-mount ownership restrictions). +# On a Linux host running as root, chown will succeed silently. +chown -R www-data:www-data storage bootstrap/cache database 2>/dev/null || true +chmod -R 775 storage bootstrap/cache database 2>/dev/null || true + +# Sync built Vite assets from the image (public-build/) into the +# bind-mounted public/ directory. This ensures Caddy always serves +# up-to-date assets even though public/ is a host bind-mount. +if [ -d /app/public-build ]; then + echo "[boot] Syncing built assets to public/..." + cp -r /app/public-build/. /app/public/ + chown -R www-data:www-data /app/public 2>/dev/null || true +fi + +# Create the storage symlink after volumes are mounted +# (public/storage → storage/app/public) +echo "[boot] Creating storage symlink..." +php artisan storage:link --force 2>/dev/null || true + +# Run database migrations +echo "[boot] Running migrations..." +php artisan migrate --force + +# Warm up Laravel caches +echo "[boot] Warming caches..." +php artisan config:cache +php artisan route:cache +php artisan view:cache +php artisan event:cache + +echo "[boot] Boot complete. Starting supervisord..." + +# Hand off to CMD (supervisord) +exec "$@" diff --git a/build/init-app.sh b/build/init-app.sh new file mode 100755 index 0000000..58b66c2 --- /dev/null +++ b/build/init-app.sh @@ -0,0 +1,23 @@ +#!/bin/bash +set -e + +cd /app + +DB_PATH="/app/database/database.sqlite" + +if [ -f "$DB_PATH" ]; then + echo "[init] Database already exists, skipping first-run init." + exit 0 +fi + +echo "[init] First run detected — initializing application..." + +touch "$DB_PATH" +chmod 664 "$DB_PATH" + +if [ -z "${APP_KEY}" ]; then + echo "[init] Generating application key..." + php artisan key:generate --force +fi + +echo "[init] First-run init complete."