Este document completa la tasca de documentació de la issue #81 i descriu el flux recomanat per a construir, publicar i desplegar la imatge Docker de producció de la intranet. Els exemples estan inspirats en l’entorn de preproducció actual amb Caddy, però s’han simplificat perquè servisquen com a guia general.
La imatge de producció ha d’incloure el codi de l’aplicació i els assets compilats dins de la pròpia imatge. Això evita muntar el codi com a volum i fa el desplegament més previsible.
Els fitxers base del repositori són:
docker/8.3/Dockerfile.prod: build multi-stage amb Composer i npm run productiondocker-compose.prod.yml: arranque del contenidor de Laravel sense muntar el codi del projecte.dockerignore: exclusió de secrets i fitxers que no han d’entrar en el context de buildEn desenvolupament, docker-compose.yml munta el repositori complet com a volum (.:/var/www/html). En producció o preproducció, docker-compose.prod.yml usa una imatge publicada i només munta els elements que han de persistir o injectar-se en runtime:
.envstorageCaddyDes de l’arrel del projecte:
export IMAGE_TAG_PROD=laravel12-prod
docker build -f docker/8.3/Dockerfile.prod -t arturocandela/intranet:${IMAGE_TAG_PROD} .
docker push arturocandela/intranet:${IMAGE_TAG_PROD}
Si es vol un desplegament versionat, és preferible usar un tag explícit:
export IMAGE_TAG_PROD=2026.03.16
docker build -f docker/8.3/Dockerfile.prod -t arturocandela/intranet:${IMAGE_TAG_PROD} .
docker push arturocandela/intranet:${IMAGE_TAG_PROD}
La imatge resultant ja incorpora:
composer install --no-dev)npm run production)/var/www/htmlRequisits mínims:
.env fora del repositori o gestionat de forma segura en el servidorstorageCaddyfile adaptat al domini real de l’entornExemple d’estructura en el servidor:
/opt/intranet/
docker-compose.prod.yml
Caddyfile
.env
storage/
La carpeta storage/ ha de persistir entre desplegaments perquè conté logs, fitxers pujats i altres artefactes de runtime.
No s’ha de copiar mai el .env dins de la imatge. En este projecte, això es reforça de dues maneres:
.dockerignore exclou .env* i només permet .env.exampledocker-compose.prod.yml munta ./.env:/var/www/html/.envAbans de publicar una imatge convé revisar:
docker run --rm --entrypoint /bin/sh arturocandela/intranet:${IMAGE_TAG_PROD} -lc 'ls -la /var/www/html | grep .env'
docker history --no-trunc arturocandela/intranet:${IMAGE_TAG_PROD}
El primer comandament hauria de mostrar com a màxim .env generat des de .env.example dins del procés de build, mai un .env real del servidor. El segon permet inspeccionar que no s’hagen introduït secrets en cap capa de la imatge.
docker-compose per a preproduccióL’arxiu del repositori ja inclou una base vàlida. Per a preproducció, l’important és mantindre este patró:
services:
laravel.prod:
image: arturocandela/intranet:${IMAGE_TAG_PROD:-laravel12-prod}
restart: unless-stopped
expose:
- "80"
volumes:
- ./.env:/var/www/html/.env
- ./storage:/var/www/html/storage
caddy:
image: caddy:2-alpine
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
Notes:
.:/var/www/htmlstorage queda fora per a conservar dades entre versionsCaddy publica HTTP/HTTPS i fa de proxy invers cap al contenidor LaravelCaddyfilePer a una preproducció interna, el patró és tan senzill com:
preintranet.exemple.lan {
reverse_proxy laravel.prod:80
tls internal
}
Punts clau:
laravel.prod o equivalent) ha de coincidir amb el definit en docker-compose.prod.ymltls internal és útil per a entorns interns o de provesCaddy amb un domini resoluble públicamentUna vegada copiats docker-compose.prod.yml, Caddyfile, .env i la carpeta storage al servidor:
export IMAGE_TAG_PROD=laravel12-prod
docker compose -f docker-compose.prod.yml pull
docker compose -f docker-compose.prod.yml up -d
Per a actualitzar a una nova versió:
export IMAGE_TAG_PROD=2026.03.16
docker compose -f docker-compose.prod.yml pull
docker compose -f docker-compose.prod.yml up -d
Després d’alçar l’entorn, convé revisar:
Caddy resol el domini correcte i retorna la intranetstorage manté els fitxers i logs entre reinicis.env del servidor és l’única font de configuració sensibleComandes útils:
docker compose -f docker-compose.prod.yml ps
docker compose -f docker-compose.prod.yml logs -f laravel.prod
docker compose -f docker-compose.prod.yml logs -f caddy
artisan config:cache i route:cache s’han d’executar en runtime només si l’entorn ja disposa del .env definitiu. Si es vol activar eixa optimització, cal fer-ho en l’entrypoint després de muntar la configuració real del servidor.