Bonnes pratiques et cas avances¶
Ce chapitre couvre les sujets avances pour opérer la plateforme de documentation en production : haute disponibilité, optimisation des performances, migration depuis d'autres outils, gestion multilingue, conventions pour les assets et résolution de problèmes courants.
Haute disponibilité¶
MkDocs produit des fichiers statiques — HTML, CSS, JS, images. Toute stratégie HA standard pour un serveur de fichiers statiques s'applique sans adaptation particulière. Il n'y a pas d'état applicatif a synchroniser entre les replicas.
| Stratégie | Complexité | Coût | Recommandation |
|---|---|---|---|
| Replica unique + restart automatique | Faible | Minimal | Acceptable pour une équipe < 20 personnes |
| 2 replicas Caddy derriere un load balancer | Moyenne | Faible | Recommande pour une DSI interne |
| CDN interne (Nginx + cache) | Moyenne | Moyen | Pertinent si la documentation est tres consultee |
| Stockage partage NFS/S3 + N replicas | Elevee | Variable | Grandes organisations, multi-sites |
Pour une documentation interne classifiee, deux replicas Caddy derriere un load balancer suffisent. Le build CI pousse les fichiers vers un volume NFS partage monte par les deux instances.
# Caddyfile du load balancer
docs.example.com {
reverse_proxy caddy-1:80 caddy-2:80 {
lb_policy round_robin
health_uri /
health_interval 10s
}
}
Écriture concurrente pendant le build
Pendant qu'un build CI pousse de nouveaux fichiers sur le volume partage, les replicas continuent a servir l'ancienne version. Pour une transition propre, poussez dans un répertoire staging puis effectuez un swap atomique avec rsync --delete.
Performance et optimisation¶
Minification HTML¶
Le plugin mkdocs-minify reduit la taille des pages HTML a la compilation sans modifier le rendu.
# mkdocs.yml
plugins:
- search
- minify:
minify_html: true
minify_js: true
minify_css: true
htmlmin_opts:
remove_comments: true
Cache CI et compression¶
Mettre en cache le virtualenv Python entre les executions CI divise le temps de build par deux en moyenne. Dans GitLab CI :
Activer la compression et les en-têtes de cache navigateur dans Caddy :
docs.example.com {
encode { br; gzip 6 }
root * /srv/docs
file_server
@assets { path *.css *.js *.png *.svg *.woff2 }
header @assets Cache-Control "public, max-age=31536000, immutable"
header *.html Cache-Control "no-cache, must-revalidate"
}
Pre-rendu de l'index de recherche¶
MkDocs Material pre-calcule l'index Lunr au moment du build. Pour les sites volumineux (> 500 pages), limiter la profondeur d'indexation reduit la taille de l'index :
Migration de contenu¶
Depuis Confluence¶
Confluence exporte le contenu en HTML via "Space Export". Pandoc convertit ce HTML en Markdown.
#!/bin/bash
# confluence-to-md.sh — prerequis : pandoc >= 3.0
INPUT_DIR="./confluence-export/html"
OUTPUT_DIR="./docs/migrated"
mkdir -p "${OUTPUT_DIR}"
find "${INPUT_DIR}" -name "*.html" | while read -r html_file; do
base=$(basename "${html_file}" .html)
out="${OUTPUT_DIR}/${base}.md"
pandoc --from html --to markdown+pipe_tables+fenced_code_blocks \
--wrap=none --output "${out}" "${html_file}"
# Prepend front matter
printf -- '---\ntitle: "%s"\nclassification: internal\n---\n\n' "${base}" \
| cat - "${out}" > "${out}.tmp" && mv "${out}.tmp" "${out}"
done
Profiter de la migration pour classifier
La migration est le bon moment pour ajouter un front matter classification à chaque page. Examinez chaque page et attribuez la valeur correcte (public, internal, confidential, restricted) plutôt que d'appliquer une valeur par defaut en masse.
Depuis Wiki.js¶
Wiki.js dispose d'un export natif en Markdown (Administration > Storage > Export). La structure exportee est généralement plate ; reorganisez les fichiers pour correspondre a l'arborescence MkDocs cible.
Depuis un wiki interne generique¶
- Exporter le contenu dans le format le plus proche du Markdown disponible.
- Utiliser Pandoc pour la conversion (HTML, RST, DOCX).
- Passer
markdownlintpour corriger les artefacts de conversion. - Reclasser les pages selon le plan de navigation MkDocs.
- Vérifier les liens internes — ils changent systematiquement lors d'une reorganisation.
Multi-langue¶
Le plugin mkdocs-i18n gère des sites multilingues avec une structure de fichiers dédiée par langue.
# mkdocs.yml
plugins:
- i18n:
default_language: fr
languages:
fr: { name: Francais, build: true }
en: { name: English, build: true }
Structure recommandee :
docs/
index.md # Langue par defaut (fr)
index.en.md # Version anglaise
tutorials/
services/
documentation/
01-fondamentaux.md
01-fondamentaux.en.md
Le champ classification du front matter est indépendant de la langue. Une page confidentielle et sa traduction doivent toutes deux porter la même valeur. Le plugin de filtrage opère avant la génération de la navigation quelle que soit la langue active.
Gestion des assets¶
Les images et fichiers attaches a une page classifiee doivent etre places dans un sous-répertoire images/ au même niveau que la page, pas dans un répertoire partage global.
docs/
tutorials/
services/
documentation/
images/
architecture-confidentielle.png # asset classe
03-architecture.md
| Type d'asset | Emplacement | Exemple |
|---|---|---|
| Image liee a une page classifiee | <meme-repertoire>/images/ | docs/.../images/schema.png |
| Diagramme Mermaid | Inline dans la page Markdown | ```mermaid ``` |
| Fichier telechargeable | <meme-repertoire>/files/ | docs/.../files/modele.xlsx |
| Logo ou asset global public | docs/assets/ | docs/assets/logo.svg |
Assets dans un répertoire partage
Un asset place dans docs/assets/ sera copie dans tous les builds, y compris le build public. Une image confidentielle (schema d'infrastructure, données personnelles) stockee dans un répertoire partage sera accessible sans authentification. Placez systematiquement les assets sensibles au plus pres de la page classifiee.
Granularité infra-page¶
Le filtre de classification opère au niveau de la page entière, pas au niveau d'une section. Il n'est pas possible de masquer un seul paragraphe dans une page visible par tous.
Si une page contient des sections de niveaux différents, divisez-la en deux fichiers distincts :
# Avant (problematique)
guide-deploiement.md # classification: internal
## Etapes publiques
## Cles et secrets <-- devrait etre restricted
# Apres (recommande)
guide-deploiement.md # classification: internal
guide-deploiement-secrets.md # classification: restricted
Garder la granularité au niveau page
Maintenir la granularité au niveau de la page simplifie l'audit et la gouvernance. Il est trivial de lister toutes les pages restricted avec un grep sur les front matters. Une granularité infra-page rendrait cet audit impossible sans parser le contenu de chaque fichier.
Troubleshooting¶
| Problème | Cause probable | Solution |
|---|---|---|
| Page manquante dans la nav | classification supérieure au build cible | Vérifier le front matter |
| Build échoue "classification invalide" | Typo dans le front matter | Corriger la valeur |
| Proxy renvoie toujours le build public | Claim doc_classification absent du token | Vérifier le mapper Keycloak |
| 404 apres authentification | Routage Caddy mal configure | Vérifier le Caddyfile (ordre des handle) |
| Section vide dans la navigation | Toutes les pages de la section sont filtrees | Normal — le plugin nettoie les sections vides |
| Assets visibles dans un build inférieur | Image dans un répertoire partage | Déplacer l'asset pres de la page classifiee |