Contexte

Mon ancien site, en PHP, n'était plus maintenu. Je voulais le remplacer par un site qui remplisse quatre exigences :

  • lisible en cinq secondes par un recruteur : nom, rôle, expériences et contact visibles sans défiler ;
  • éditable sans compétence technique : modifier un texte ne doit demander ni compilation ni base de données ;
  • hébergeable partout : un hébergement mutualisé classique (Apache + PHP) doit suffire ;
  • sécurisé par défaut, puisque c'est mon métier.

Architecture

flowchart LR
  subgraph edit["Édition"]
    md["Fichiers Markdown<br/>content/fr · content/en"]
  end
  subgraph tools["Outils locaux (Node)"]
    gen["tools/"] --> og["Images de partage"]
    gen --> qr["QR code"]
  end
  subgraph host["Hébergement mutualisé : Apache + PHP"]
    pages["Pages statiques<br/>/ · /cv · /projets · /blog"]
    api["api/contact.php"]
  end
  md --> pages
  md --> gen
  visitor(("Visiteur")) -->|"HTTPS + CSP stricte"| pages
  visitor -->|"jeton signé"| api
  api --> mailbox[("Boîte mail")]

Un petit script transforme le contenu Markdown en pages HTML complètes, lisibles par les moteurs de recherche et les robots des IA sans exécuter de JavaScript. Dans le navigateur, le même code de rendu reprend la main pour les animations et l'interactivité. Publier un texte, c'est modifier un fichier .md, lancer le script, puis pousser : le déploiement est automatique.

Choix techniques

BesoinChoixPourquoi
Contenu éditableMarkdown + parseur maisonNi CMS, ni base de données, ni compilation
InterfaceHTML, CSS et JavaScript natifsZéro dépendance, rapide, durable
HébergementMutualisé Apache + PHPCoût minimal ; .htaccess pour le cache et la sécurité
FormulairePHP sans dépendanceJeton signé, limitation de débit, adresse jamais exposée
SchémasMermaid auto-hébergéChargé uniquement sur les pages qui en contiennent
Aperçus, QRScripts Node locauxToujours alignés avec le contenu, rien à publier en plus

Sécurité

  • Politique de contenu stricte (script-src 'self') : aucun script inline, aucune ressource tierce, police auto-hébergée.
  • En-têtes HSTS, X-Frame-Options, Permissions-Policy, isolation Cross-Origin-*.
  • Rendu du Markdown sans innerHTML : le HTML éventuellement présent dans le contenu n'est jamais interprété.
  • Formulaire de contact : jeton HMAC à usage unique, contrôle d'origine, champ piège, limitation par IP hachée, en-têtes de mail non injectables. L'adresse de destination n'existe que dans la configuration serveur.

Résultats

  • 0 dépendance de production, 0 requête vers un tiers ;
  • mise à jour du contenu = modifier un fichier texte.