80 lines
4.2 KiB
Docker
80 lines
4.2 KiB
Docker
# =============================================================================
|
|
# 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 <courcelle.m@tthieu.be>"
|
|
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;"]
|