Architecture réelle de mon-site.ca (Docker, Caddy, Traefik)

Architecture réelle de mon-site.ca

Cette note documente l’architecture actuelle du site mon-site.ca en production sur un serveur Linode.

⚠️ Toute ancienne référence à Apache est désormais obsolète.

Le site fonctionne aujourd’hui avec :

  • Hugo (génération statique)
  • Docker
  • Caddy (serveur statique)
  • Traefik (reverse proxy + TLS)

1️⃣ Vue d’ensemble

Architecture logique :

Navigateur
→ Internet (HTTPS)
→ Traefik (reverse proxy, TLS)
→ Conteneur Caddy
→ Fichiers statiques générés par Hugo

2️⃣ Génération du site

Le site est généré localement :

hugo --minify

Cette commande produit le dossier :

/public

Ce dossier contient uniquement :

  • HTML
  • CSS
  • JavaScript
  • Images

Aucun code serveur n’est exécuté en production.

Déploiement

./deploy.sh

Le script copie le contenu vers le serveur dans :

/opt/apps/<APP_SLUG>/public

3️⃣ docker-compose.prod.yml

Service principal :

frontend:
  image: caddy:2

Le conteneur :

  • Monte le dossier ./public en lecture seule
  • Monte le Caddyfile
  • Écoute sur le port 80 interne
  • Est connecté au réseau edge (Traefik)

Important : le conteneur ne gère pas le HTTPS. Le TLS est entièrement géré par Traefik.


4️⃣ Rôle exact de Caddy

Caddy est utilisé comme serveur de fichiers statiques optimisé.

Caddyfile

:80
root * /usr/share/caddy
file_server
encode zstd gzip
header Cache-Control max-age=300,public

Fonctionnalités :

  • Service de fichiers statiques
  • Compression automatique (zstd + gzip)
  • Cache-Control de 5 minutes
  • Aucune logique applicative

Caddy ne fait pas de reverse proxy dans cette architecture.


5️⃣ Rôle exact de Traefik

Traefik agit comme point d’entrée unique du serveur.

Il :

  • Écoute sur les ports 80 et 443
  • Gère les certificats Let’s Encrypt
  • Force la redirection HTTP → HTTPS
  • Route vers le conteneur Caddy

Les labels Docker définissent les règles de routage par nom d’hôte.

Le conteneur Caddy n’est jamais exposé directement sur Internet.


6️⃣ Flux réseau réel

  1. L’utilisateur accède à https://mon-site.ca
  2. Le DNS pointe vers l’adresse IP du serveur Linode
  3. Traefik reçoit la requête
  4. Traefik valide le certificat TLS
  5. Traefik route vers le conteneur Caddy (port 80 interne)
  6. Caddy sert les fichiers statiques

7️⃣ Ce que le site n’est pas

  • Pas un serveur Apache
  • Pas un serveur Nginx
  • Pas une application backend
  • Pas de base de données
  • Pas d’exécution dynamique

C’est un site statique conteneurisé.


8️⃣ Points forts de l’architecture

  • ✔ Isolation via Docker
  • ✔ Reverse proxy centralisé
  • ✔ HTTPS automatique
  • ✔ Surface d’attaque minimale
  • ✔ Déploiement simple
  • ✔ Performance élevée

9️⃣ Bonnes pratiques recommandées

Versionner l’infrastructure

À mettre dans Git :

  • docker-compose.prod.yml
  • Caddyfile
  • deploy.sh
  • Documentation d’infrastructure

À ne jamais versionner :

  • Fichiers .env contenant des secrets
  • Certificats
  • Clés privées

Séparer configuration et secrets

Conserver :

  • .env (sans secrets) versionné
  • .env.local non versionné

Optimiser le cache

Actuellement :

max-age=300

Améliorations possibles :

  • Cache long pour assets fingerprintés
  • Cache court pour HTML

Ajouter des headers de sécurité

Exemples :

  • Strict-Transport-Security
  • X-Content-Type-Options
  • Referrer-Policy
  • X-Frame-Options

Automatiser le déploiement

Option avancée :

  • GitHub Actions
  • Build Hugo automatique
  • Déploiement SSH
  • docker compose up -d

Ajouter un environnement staging

Créer un sous-domaine :

staging.mon-site.ca

Permet de tester avant mise en production.


🔟 Conclusion

Architecture actuelle :

Hugo (build local)
→ Docker
→ Caddy (serveur statique)
→ Traefik (TLS + routing)

L’architecture est simple, robuste et adaptée à un site statique personnel.

Elle constitue une base saine pour héberger plusieurs applications derrière Traefik sur le même serveur.