Ristruttura il deploy: immagine autosufficiente per Dokploy
Il Dockerfile compilava l'applicazione in /app-src mentre il runtime girava da /var/www/html, popolato solo dal bind mount del sorgente: l'immagine costruita non veniva mai usata. L'entrypoint rieseguiva composer install e npm run build a ogni avvio, dentro il container. Su Dokploy, senza sorgente sull'host, questo significava build a runtime a ogni deploy. Ora vendor/ e public/build sono compilati in stage separati e copiati nell'immagine finale. I container di produzione non montano il sorgente e non eseguono build all'avvio: un redeploy e' build, migrazioni, online. - Dockerfile multi-stage (composer, node, runtime) - nginx e php-fpm nello stesso container via supervisor: con container separati nginx avrebbe bisogno di una copia di public/ e del volume storage solo per servire file statici - clear_env = no in www.conf, senza cui php-fpm nasconde a Laravel tutte le variabili d'ambiente - configurazione da ambiente di processo invece di .env riscritto con sed; il compose fissa solo i valori dettati dalla topologia - fail-fast su APP_URL, DB_PASSWORD, DB_ROOT_PASSWORD, REDIS_PASSWORD - servizio scheduler dedicato: schedule:work non veniva mai eseguito, quindi la pulizia dell'audit log non e' mai partita - solo il container app esegue le migrazioni, per evitare che due container in gara lascino uno schema applicato a meta' - healthcheck separati per worker e scheduler, che non espongono HTTP - docker-compose.dev.yml per lo sviluppo locale - documentazione unificata in README.md e HANDOFF.md Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
40
docker/php/queue-entrypoint.sh
Normal file
40
docker/php/queue-entrypoint.sh
Normal file
@@ -0,0 +1,40 @@
|
||||
#!/bin/bash
|
||||
set -Eeuo pipefail
|
||||
|
||||
# =============================================================================
|
||||
# TerManager2 — queue worker entrypoint
|
||||
#
|
||||
# Deliberately does NOT migrate or seed: the app container owns schema changes.
|
||||
# Two containers racing on `artisan migrate` is how you get a half-applied
|
||||
# schema. This one only waits for its dependencies and starts working.
|
||||
# =============================================================================
|
||||
|
||||
warn() { echo "[!] $*" >&2; }
|
||||
|
||||
# APP_KEY must match the app container or encrypted payloads won't decrypt.
|
||||
KEY_FILE="/var/www/html/storage/app/.app_key"
|
||||
if [ -z "${APP_KEY:-}" ] && [ -s "$KEY_FILE" ]; then
|
||||
APP_KEY="$(cat "$KEY_FILE")"
|
||||
export APP_KEY
|
||||
fi
|
||||
|
||||
echo "[*] Queue worker waiting for database and redis..."
|
||||
for _ in $(seq 1 60); do
|
||||
if nc -z "${DB_HOST:-mariadb}" "${DB_PORT:-3306}" \
|
||||
&& nc -z "${REDIS_HOST:-redis}" "${REDIS_PORT:-6379}"; then
|
||||
echo "[✓] Dependencies reachable."
|
||||
break
|
||||
fi
|
||||
sleep 2
|
||||
done
|
||||
|
||||
# Wait for the app container to finish migrating before consuming jobs, so a
|
||||
# job doesn't hit a table that doesn't exist yet.
|
||||
for _ in $(seq 1 60); do
|
||||
if php artisan migrate:status --no-interaction >/dev/null 2>&1; then
|
||||
break
|
||||
fi
|
||||
sleep 2
|
||||
done
|
||||
|
||||
exec "$@"
|
||||
Reference in New Issue
Block a user