# ============================================================================= # Dockerfile — Site statique courcellematthi.eu # ----------------------------------------------------------------------------- # Image mono-étape : le site n'a aucune dépendance et aucune compilation. # Une étape de build (Node, npm install…) n'apporterait ici que du temps # de déploiement et de la surface d'attaque en plus. # # Image finale : environ 50 Mo, dont 48 Mo pour Nginx Alpine. # ============================================================================= # Version épinglée plutôt que « latest » : un redéploiement six mois plus tard # doit produire exactement la même image. « latest » rend les builds # non reproductibles et peut casser la production sans qu'on ait rien changé. FROM nginx:1.27-alpine # ----------------------------------------------------------------------------- # MÉTADONNÉES (spécification OCI) # Visibles via « docker inspect », utiles pour l'inventaire et le débogage. # ----------------------------------------------------------------------------- LABEL org.opencontainers.image.title="courcellematthi.eu" LABEL org.opencontainers.image.description="Site personnel et CV de Matthieu Courcelle" LABEL org.opencontainers.image.authors="Matthieu Courcelle " LABEL org.opencontainers.image.url="https://www.courcellematthi.eu" LABEL org.opencontainers.image.licenses="UNLICENSED" # ----------------------------------------------------------------------------- # CONFIGURATION NGINX # On remplace le fichier par défaut du site, pas nginx.conf global : la # configuration de base de l'image (workers, types MIME, limites) est saine. # ----------------------------------------------------------------------------- RUN rm /etc/nginx/conf.d/default.conf COPY deploy/nginx.conf /etc/nginx/conf.d/site.conf # ----------------------------------------------------------------------------- # CONTENU DU SITE # .dockerignore exclut le superflu (README, configs alternatives, .git). # ----------------------------------------------------------------------------- COPY . /usr/share/nginx/html/ # Retire du conteneur les fichiers qui n'ont rien à y faire : documentation, # configurations serveur alternatives, sources de déploiement. Ils sont utiles # dans le dépôt, pas dans l'image servie au public. RUN rm -rf /usr/share/nginx/html/deploy \ /usr/share/nginx/html/Dockerfile \ /usr/share/nginx/html/.dockerignore \ /usr/share/nginx/html/docker-compose.yaml \ /usr/share/nginx/html/README.md \ /usr/share/nginx/html/DEPLOIEMENT-COOLIFY.md \ /usr/share/nginx/html/nginx.conf.example \ /usr/share/nginx/html/.htaccess \ /usr/share/nginx/html/verifier-depot.sh # ----------------------------------------------------------------------------- # PERMISSIONS # Lecture seule pour tous, aucun fichier exécutable : rien dans un site # statique n'a besoin du bit d'exécution, sauf les répertoires (parcours). # ----------------------------------------------------------------------------- RUN chmod -R a=r,u+w /usr/share/nginx/html && \ find /usr/share/nginx/html -type d -exec chmod a+x {} \; # ----------------------------------------------------------------------------- # RÉSEAU # EXPOSE est purement déclaratif : il documente le port et permet à Coolify # de le détecter automatiquement. Il n'ouvre rien par lui-même. # ----------------------------------------------------------------------------- EXPOSE 80 # ----------------------------------------------------------------------------- # SONDE DE SANTÉ # Coolify affiche l'état du conteneur et peut le redémarrer s'il ne répond # plus. wget est présent dans l'image Alpine, inutile d'installer curl. # ----------------------------------------------------------------------------- HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD wget --quiet --tries=1 --spider http://localhost/healthz || exit 1 # L'image officielle définit déjà le bon CMD ; on le réécrit pour rendre # explicite le fonctionnement au premier plan (daemon off), indispensable # pour que Docker suive correctement le cycle de vie du processus. CMD ["nginx", "-g", "daemon off;"]