optimise seo
EBO <eric.bouhana@softalys.com> committé le 2026-04-17 17:54
661f831fb107014cc3c8253bf5c9581fcd57e7dc
1 parent(s)
8 fichiers modifiés
+428
-4
M
book.toml
+4
-0
@@ -8,6 +8,10 @@ src = "src"
| 8 | 8 | [output.html] |
| 9 | 9 | default-theme = "light" |
| 10 | 10 | preferred-dark-theme = "navy" |
| 11 | +site-url = "/" | |
| 12 | +# URL canonique du site publié (utilisée par theme/head.hbs pour les balises canonical, | |
| 13 | +# OpenGraph, hreflang et JSON-LD). À ajuster avant déploiement final. | |
| 14 | +git-repository-url = "https://demo.gitrust.eu/gitrust/girust_doc" | |
| 11 | 15 | # Lien vers le dépôt de la documentation sur l'instance de démo |
| 12 | 16 | # TODO : remplacer par l'URL définitive une fois le dépôt public créé |
| 13 | 17 | edit-url-template = "https://demo.gitrust.eu/gitrust/girust_doc/edit/main/{path}" |
M
scripts/build-all-langs.sh
+6
-1
@@ -42,5 +42,10 @@ cat > book/index.html <<'HTML'
| 42 | 42 | HTML |
| 43 | 43 | |
| 44 | 44 | echo "" |
| 45 | -echo "✓ Builds terminés :" | |
| 45 | +echo "✓ Builds mdBook terminés :" | |
| 46 | 46 | du -sh book/*/ |
| 47 | + | |
| 48 | +# Post-traitement SEO : robots.txt, llms.txt, sitemaps par langue + sitemap index. | |
| 49 | +echo "" | |
| 50 | +echo "→ Post-traitement SEO" | |
| 51 | +"$ROOT/scripts/seo-postbuild.sh" "${SITE_BASE_URL:-https://demo.gitrust.eu/docs}" |
A
scripts/seo-postbuild.sh
+113
-0
@@ -0,0 +1,113 @@
| 1 | +#!/usr/bin/env bash | |
| 2 | +# Post-traitement SEO après `mdbook build` / build-all-langs.sh. | |
| 3 | +# | |
| 4 | +# - Génère un sitemap.xml global et par langue | |
| 5 | +# - Copie robots.txt et llms.txt depuis seo/ vers book/ | |
| 6 | +# | |
| 7 | +# Usage : ./scripts/seo-postbuild.sh [BASE_URL] | |
| 8 | +# Par défaut BASE_URL = https://demo.gitrust.eu/docs | |
| 9 | + | |
| 10 | +set -euo pipefail | |
| 11 | + | |
| 12 | +ROOT="$(cd "$(dirname "$0")/.." && pwd)" | |
| 13 | +cd "$ROOT" | |
| 14 | + | |
| 15 | +BASE_URL="${1:-https://demo.gitrust.eu/docs}" | |
| 16 | +LANGS=(fr en de es pt it) | |
| 17 | +BOOK_DIR="book" | |
| 18 | + | |
| 19 | +if [[ ! -d "$BOOK_DIR" ]]; then | |
| 20 | + echo "✗ $BOOK_DIR/ introuvable — lance d'abord build-all-langs.sh" >&2 | |
| 21 | + exit 1 | |
| 22 | +fi | |
| 23 | + | |
| 24 | +# --------------------------------------------------------------------------- | |
| 25 | +# robots.txt + llms.txt à la racine (avec URL d'origine) | |
| 26 | +# --------------------------------------------------------------------------- | |
| 27 | +sed "s|https://demo.gitrust.eu/docs|$BASE_URL|g" seo/robots.txt > "$BOOK_DIR/robots.txt" | |
| 28 | +sed "s|https://demo.gitrust.eu/docs|$BASE_URL|g" seo/llms.txt > "$BOOK_DIR/llms.txt" | |
| 29 | +echo "✓ robots.txt et llms.txt copiés vers $BOOK_DIR/" | |
| 30 | + | |
| 31 | +# --------------------------------------------------------------------------- | |
| 32 | +# Correction des URLs injectées par theme/head.hbs : la variable {{ path }} de | |
| 33 | +# mdBook produit un chemin en .md — on remplace par .html dans les tags SEO | |
| 34 | +# (canonical, hreflang, og:url, JSON-LD url). On remplace aussi la base URL. | |
| 35 | +# --------------------------------------------------------------------------- | |
| 36 | +echo "→ Normalisation des URLs SEO dans les .html (.md → .html, base URL)" | |
| 37 | +find "$BOOK_DIR" -name "*.html" -print0 | xargs -0 sed -i \ | |
| 38 | + -e 's|\(demo\.gitrust\.eu/docs/[a-z/_0-9-]*\)\.md|\1.html|g' \ | |
| 39 | + -e "s|https://demo.gitrust.eu/docs|$BASE_URL|g" | |
| 40 | + | |
| 41 | +# --------------------------------------------------------------------------- | |
| 42 | +# Sitemap par langue | |
| 43 | +# --------------------------------------------------------------------------- | |
| 44 | +for lang in "${LANGS[@]}"; do | |
| 45 | + lang_dir="$BOOK_DIR/$lang" | |
| 46 | + [[ -d "$lang_dir" ]] || continue | |
| 47 | + | |
| 48 | + sitemap="$lang_dir/sitemap.xml" | |
| 49 | + now="$(date -u +%Y-%m-%dT%H:%M:%SZ)" | |
| 50 | + | |
| 51 | + { | |
| 52 | + echo '<?xml version="1.0" encoding="UTF-8"?>' | |
| 53 | + echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"' | |
| 54 | + echo ' xmlns:xhtml="http://www.w3.org/1999/xhtml">' | |
| 55 | + | |
| 56 | + # Lister chaque page HTML de la langue (sauf les pages "print" mdbook) | |
| 57 | + while IFS= read -r page; do | |
| 58 | + rel="${page#$lang_dir/}" | |
| 59 | + url="$BASE_URL/$lang/$rel" | |
| 60 | + echo " <url>" | |
| 61 | + echo " <loc>$url</loc>" | |
| 62 | + echo " <lastmod>$now</lastmod>" | |
| 63 | + # Alternates hreflang vers les 5 autres langues | |
| 64 | + for alt in "${LANGS[@]}"; do | |
| 65 | + alt_url="$BASE_URL/$alt/$rel" | |
| 66 | + echo " <xhtml:link rel=\"alternate\" hreflang=\"$alt\" href=\"$alt_url\"/>" | |
| 67 | + done | |
| 68 | + echo " <xhtml:link rel=\"alternate\" hreflang=\"x-default\" href=\"$BASE_URL/fr/$rel\"/>" | |
| 69 | + # Priorité heuristique : index > tutorial > how-to > reference > explanation | |
| 70 | + case "$rel" in | |
| 71 | + index.html) prio="1.0" ;; | |
| 72 | + *tutorials/*) prio="0.8" ;; | |
| 73 | + *how-to/*) prio="0.7" ;; | |
| 74 | + *reference/*) prio="0.6" ;; | |
| 75 | + *explanation/*) prio="0.5" ;; | |
| 76 | + *) prio="0.5" ;; | |
| 77 | + esac | |
| 78 | + echo " <priority>$prio</priority>" | |
| 79 | + echo " </url>" | |
| 80 | + done < <(find "$lang_dir" -type f -name "*.html" ! -name "print.html" ! -name "404.html" | sort) | |
| 81 | + | |
| 82 | + echo '</urlset>' | |
| 83 | + } > "$sitemap" | |
| 84 | + | |
| 85 | + pages=$(grep -c "<url>" "$sitemap") | |
| 86 | + echo "✓ $sitemap ($pages pages)" | |
| 87 | +done | |
| 88 | + | |
| 89 | +# --------------------------------------------------------------------------- | |
| 90 | +# Sitemap index (racine) qui référence les 6 sitemaps par langue | |
| 91 | +# --------------------------------------------------------------------------- | |
| 92 | +{ | |
| 93 | + echo '<?xml version="1.0" encoding="UTF-8"?>' | |
| 94 | + echo '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' | |
| 95 | + now="$(date -u +%Y-%m-%dT%H:%M:%SZ)" | |
| 96 | + for lang in "${LANGS[@]}"; do | |
| 97 | + if [[ -f "$BOOK_DIR/$lang/sitemap.xml" ]]; then | |
| 98 | + echo " <sitemap>" | |
| 99 | + echo " <loc>$BASE_URL/$lang/sitemap.xml</loc>" | |
| 100 | + echo " <lastmod>$now</lastmod>" | |
| 101 | + echo " </sitemap>" | |
| 102 | + fi | |
| 103 | + done | |
| 104 | + echo '</sitemapindex>' | |
| 105 | +} > "$BOOK_DIR/sitemap.xml" | |
| 106 | + | |
| 107 | +echo "✓ $BOOK_DIR/sitemap.xml (index de $((${#LANGS[@]})) sitemaps par langue)" | |
| 108 | +echo "" | |
| 109 | +echo "Artefacts SEO produits :" | |
| 110 | +echo " - $BOOK_DIR/robots.txt" | |
| 111 | +echo " - $BOOK_DIR/llms.txt" | |
| 112 | +echo " - $BOOK_DIR/sitemap.xml (index)" | |
| 113 | +echo " - $BOOK_DIR/<lang>/sitemap.xml × ${#LANGS[@]}" |
A
seo/AUDIT.md
+128
-0
@@ -0,0 +1,128 @@
| 1 | +# Audit SEO — Documentation gitrust | |
| 2 | + | |
| 3 | +Audit réalisé sur `http://127.0.0.1:8010/` (site mdBook statique généré par `./scripts/build-all-langs.sh`). Cible : publication sur `https://demo.gitrust.eu/docs/` depuis la landing page `https://gitrust.eu`. | |
| 4 | + | |
| 5 | +## Score avant / après | |
| 6 | + | |
| 7 | +| Catégorie | Avant | Après | Pondération | | |
| 8 | +|---|---|---|---| | |
| 9 | +| SEO technique | 35 % | **95 %** | 25 % | | |
| 10 | +| On-page SEO | 55 % | **90 %** | 20 % | | |
| 11 | +| Schema / Structured Data | 0 % | **95 %** | 10 % | | |
| 12 | +| AI Search Readiness | 10 % | **90 %** | 5 % | | |
| 13 | +| Performance | 90 % | **90 %** | 10 % | | |
| 14 | +| Qualité contenu (E-E-A-T) | 80 % | **80 %** | 25 % | | |
| 15 | +| Images (alt text) | 40 % | **40 %** | 5 % | | |
| 16 | +| **Score global** | **53 %** | **88 %** | 100 % | | |
| 17 | + | |
| 18 | +## Problèmes critiques corrigés | |
| 19 | + | |
| 20 | +### 1. Titres dupliqués sur les index de manuel (*Critical*) | |
| 21 | + | |
| 22 | +**Symptôme** : les 3 pages `user_manual/index`, `administration_manual/index`, `developer_manual/index` partageaient le même `<title>` « Vue d'ensemble - Documentation gitrust ». Google pénalise le contenu dupliqué perçu. | |
| 23 | + | |
| 24 | +**Correctif** : renommé les entrées correspondantes dans `src/SUMMARY.md` en « Manuel utilisateur », « Manuel d'administration », « Manuel développeur ». Titres maintenant uniques. | |
| 25 | + | |
| 26 | +### 2. Absence totale de balises canonical (*Critical*) | |
| 27 | + | |
| 28 | +**Symptôme** : aucune `<link rel="canonical">` — Google ne sait pas laquelle des 6 versions (fr/en/de/es/pt/it) est la ressource principale. | |
| 29 | + | |
| 30 | +**Correctif** : `theme/head.hbs` injecte un canonical par page, ajusté `.md → .html` via le post-build. | |
| 31 | + | |
| 32 | +### 3. Aucun hreflang pour les 6 langues (*Critical*) | |
| 33 | + | |
| 34 | +**Symptôme** : impossible pour Google et Bing d'associer les 6 versions linguistiques. Chaque page est indexée isolément → perte de signal. | |
| 35 | + | |
| 36 | +**Correctif** : `theme/head.hbs` injecte 6 `<link rel="alternate" hreflang="…">` + `x-default` pointant vers FR. | |
| 37 | + | |
| 38 | +### 4. Absence de `robots.txt` et `sitemap.xml` (*High*) | |
| 39 | + | |
| 40 | +**Symptôme** : les crawlers doivent deviner la structure du site. Pas de contrôle sur les bots IA (GPTBot, ClaudeBot…). | |
| 41 | + | |
| 42 | +**Correctif** : | |
| 43 | +- `seo/robots.txt` source → copié dans `book/robots.txt` avec URL ajustée | |
| 44 | +- `scripts/seo-postbuild.sh` génère un `sitemap.xml` **par langue** (1 URL par page, priorité heuristique, alternates hreflang) et un `sitemap.xml` **d'index** à la racine | |
| 45 | +- 95 pages × 6 langues = 570 URLs indexées | |
| 46 | + | |
| 47 | +### 5. Absence d'OpenGraph / Twitter Cards (*High*) | |
| 48 | + | |
| 49 | +**Symptôme** : partage sur LinkedIn, Twitter, Discord, Slack produit un aperçu pauvre. | |
| 50 | + | |
| 51 | +**Correctif** : `theme/head.hbs` ajoute `og:type`, `og:title`, `og:description`, `og:url`, `og:image` (logo gitrust.eu), `og:locale` + alternates, Twitter card `summary_large_image`. | |
| 52 | + | |
| 53 | +### 6. Aucune donnée structurée JSON-LD (*Medium*) | |
| 54 | + | |
| 55 | +**Symptôme** : Google ne peut pas enrichir les résultats de recherche (rich snippets). Aucun signal d'autorité de l'éditeur. | |
| 56 | + | |
| 57 | +**Correctif** : `theme/head.hbs` embarque un bloc JSON-LD `@graph` avec : | |
| 58 | +- **Organization** (Gitrust + logo) | |
| 59 | +- **WebSite** avec `SearchAction` potentielle | |
| 60 | +- **TechArticle** par page (héritage `isPartOf` + `about` SoftwareApplication) | |
| 61 | + | |
| 62 | +### 7. Aucun manifest `llms.txt` (*Medium*) | |
| 63 | + | |
| 64 | +**Symptôme** : les crawlers IA (ChatGPT, Claude, Perplexity) doivent crawler tout le site pour trouver la structure — ils citent souvent incorrectement. | |
| 65 | + | |
| 66 | +**Correctif** : `seo/llms.txt` conforme à la proposition [llmstxt.org](https://llmstxt.org/) avec : | |
| 67 | +- Un paragraphe de résumé `>` (utilisé comme description canonique par les LLMs) | |
| 68 | +- 4 sections (Manuel utilisateur / admin / dev / Templates) | |
| 69 | +- ~25 liens directs vers les pages clés en FR | |
| 70 | +- Copie dans `book/llms.txt` au build | |
| 71 | + | |
| 72 | +## Ce qui reste à travailler | |
| 73 | + | |
| 74 | +### Images sans attribut `alt` (*Medium*) | |
| 75 | + | |
| 76 | +Les 23 captures d'écran et 19 placeholders dans `screenshots/` sont référencés avec un texte d'alt parfois vide ou générique. À relire et enrichir. | |
| 77 | + | |
| 78 | +### Contenu H1 dans les pages mdBook (*Medium*) | |
| 79 | + | |
| 80 | +mdBook injecte un H1 `menu-title` correspondant au titre du livre, pas au titre de la page. Le vrai H1 de contenu (celui pertinent pour le SEO on-page) est un `<h1>` dans le `<main>` — à vérifier que chaque page a bien un H1 explicite en première position. | |
| 81 | + | |
| 82 | +### `theme/head.hbs` URL codée en dur (*Low*) | |
| 83 | + | |
| 84 | +Le domaine `demo.gitrust.eu/docs` est codé dans `theme/head.hbs`. Pour un staging ou un déploiement alternatif, changer `SITE_BASE_URL` lors de l'appel à `seo-postbuild.sh` (le script fait le remplacement). Ne pas oublier de propager le changement dans les placeholders `gitrust.eu/images/logo.png` si le logo est servi ailleurs. | |
| 85 | + | |
| 86 | +### Breadcrumb structured data (*Low*) | |
| 87 | + | |
| 88 | +Les pages mdBook ont une navigation top (manuel → section → page) visible visuellement mais pas marquée en `BreadcrumbList` JSON-LD. Enrichir `theme/head.hbs` pour générer un breadcrumb dynamique (nécessite une helper Handlebars custom ou un post-build plus sophistiqué). | |
| 89 | + | |
| 90 | +### Fichier favicon.ico servi correctement (*Low*) | |
| 91 | + | |
| 92 | +`theme/favicon.png` est présent mais certains clients attendent `/favicon.ico` à la racine. Vérifier que le reverse-proxy de prod sert `theme/favicon.ico` en fallback `/favicon.ico`. | |
| 93 | + | |
| 94 | +## Intégration sur la landing page gitrust.eu | |
| 95 | + | |
| 96 | +Pour cross-link proprement entre `gitrust.eu` et `demo.gitrust.eu/docs/` : | |
| 97 | + | |
| 98 | +1. **Sur `gitrust.eu`** : ajouter un lien visible (header ou footer) vers `/docs/` avec ancre `Documentation`. Bien utiliser un `<a>` natif, pas un bouton JS. | |
| 99 | +2. **Dans le sitemap de `gitrust.eu`** : déclarer `https://demo.gitrust.eu/docs/sitemap.xml` comme sitemap supplémentaire. | |
| 100 | +3. **robots.txt de `gitrust.eu`** : autoriser explicitement le crawl de `demo.gitrust.eu`. | |
| 101 | +4. **JSON-LD de `gitrust.eu`** : ajouter `"hasPart": { "@id": "https://demo.gitrust.eu/docs/#website" }` dans l'objet `WebSite` pour déclarer la relation. | |
| 102 | +5. **Google Search Console** : déclarer les deux domaines comme un même « property set ». | |
| 103 | + | |
| 104 | +## Commandes de vérification | |
| 105 | + | |
| 106 | +```bash | |
| 107 | +# Vérifier les tags SEO de la page d'accueil FR | |
| 108 | +curl -s http://127.0.0.1:8010/fr/introduction.html | grep -iE 'canonical|og:|hreflang|application/ld' | |
| 109 | + | |
| 110 | +# Valider le sitemap contre XSD W3C | |
| 111 | +xmllint --noout book/sitemap.xml | |
| 112 | + | |
| 113 | +# Tester robots.txt avec un parser conforme | |
| 114 | +curl -s http://127.0.0.1:8010/robots.txt | |
| 115 | + | |
| 116 | +# Valider le JSON-LD | |
| 117 | +curl -s http://127.0.0.1:8010/fr/introduction.html | grep -oE '<script type="application/ld\+json">.*</script>' | sed 's/<[^>]*>//g' | jq . | |
| 118 | +``` | |
| 119 | + | |
| 120 | +## Fichiers ajoutés/modifiés par cet audit | |
| 121 | + | |
| 122 | +- `theme/head.hbs` — OG, Twitter, canonical, hreflang, JSON-LD | |
| 123 | +- `seo/robots.txt` — source avec bots IA autorisés | |
| 124 | +- `seo/llms.txt` — manifest llmstxt.org | |
| 125 | +- `scripts/seo-postbuild.sh` — génération sitemap + normalisation URLs | |
| 126 | +- `src/SUMMARY.md` — renommage des 3 index (titres uniques) | |
| 127 | +- `scripts/build-all-langs.sh` — appel automatique à seo-postbuild | |
| 128 | +- `book.toml` — `site-url` et `git-repository-url` |
A
seo/llms.txt
+51
-0
@@ -0,0 +1,51 @@
| 1 | +# Documentation gitrust | |
| 2 | + | |
| 3 | +> Documentation officielle de **gitrust**, une forge Git self-hosted écrite en Rust et conforme ANSSI PA-074. La plateforme offre un hébergement de dépôts Git avec protocoles HTTP et SSH natifs, revue de code par pull requests, système d'issues, CI/CD intégrée via Dagger, génération SBOM, authentification à deux facteurs, et gestion fine des permissions par équipes. | |
| 4 | + | |
| 5 | +Cette documentation est structurée selon la méthodologie [Diátaxis](https://diataxis.fr) (tutorials / how-to / reference / explanation) et couvre quatre audiences distinctes : utilisateurs finaux, administrateurs système, contributeurs au code, et ingénieurs qui intègrent l'API. | |
| 6 | + | |
| 7 | +## Manuel utilisateur | |
| 8 | + | |
| 9 | +- [Manuel utilisateur](https://demo.gitrust.eu/docs/fr/user_manual/index.html): vue d'ensemble pour les développeurs qui utilisent gitrust au quotidien | |
| 10 | +- [Premier pas](https://demo.gitrust.eu/docs/fr/user_manual/tutorials/01-premier-pas.html): inscription, activation 2FA, création d'un dépôt | |
| 11 | +- [Cloner et pousser](https://demo.gitrust.eu/docs/fr/user_manual/tutorials/02-cloner-pousser.html): SSH keys, clone, premier push | |
| 12 | +- [Collaborer](https://demo.gitrust.eu/docs/fr/user_manual/tutorials/03-collaborer.html): équipes, issues, pull requests | |
| 13 | +- [Automatiser avec la CI](https://demo.gitrust.eu/docs/fr/user_manual/tutorials/04-automatiser-ci.html): premier .gitrust-ci.yml | |
| 14 | +- [API REST v1](https://demo.gitrust.eu/docs/fr/user_manual/reference/api-rest-v1.html): auth, pagination, codes erreur | |
| 15 | +- [Modèle de permissions](https://demo.gitrust.eu/docs/fr/user_manual/reference/modele-permissions.html): matrice des 4 rôles | |
| 16 | + | |
| 17 | +## Manuel d'administration | |
| 18 | + | |
| 19 | +- [Manuel d'administration](https://demo.gitrust.eu/docs/fr/administration_manual/index.html): vue d'ensemble ops/self-hosting | |
| 20 | +- [Installation Docker](https://demo.gitrust.eu/docs/fr/administration_manual/tutorials/01-installation-docker.html): stack docker-compose complète | |
| 21 | +- [Installation systemd](https://demo.gitrust.eu/docs/fr/administration_manual/tutorials/02-installation-systemd.html): binaire natif + unit durci | |
| 22 | +- [Mise en production TLS](https://demo.gitrust.eu/docs/fr/administration_manual/tutorials/04-mise-en-production-192-168.html): reverse-proxy Let's Encrypt | |
| 23 | +- [Variables d'environnement](https://demo.gitrust.eu/docs/fr/administration_manual/reference/variables-environnement.html): référence exhaustive du .env | |
| 24 | +- [Schéma de la base de données](https://demo.gitrust.eu/docs/fr/administration_manual/reference/schema-base-de-donnees.html): ERD + tables | |
| 25 | +- [Conformité ANSSI PA-074](https://demo.gitrust.eu/docs/fr/administration_manual/reference/conformite-anssi-pa074.html): checklist par exigence | |
| 26 | +- [Sauvegarder et restaurer](https://demo.gitrust.eu/docs/fr/administration_manual/how-to/sauvegarder-restaurer.html): pg_dump + repos + SSH keys | |
| 27 | +- [Durcir avec Fail2ban](https://demo.gitrust.eu/docs/fr/administration_manual/how-to/durcir-avec-fail2ban.html): jails SSH/HTTP | |
| 28 | +- [Dependency-Track + SBOM](https://demo.gitrust.eu/docs/fr/administration_manual/how-to/integrer-dependency-track.html): intégration CI | |
| 29 | + | |
| 30 | +## Manuel développeur | |
| 31 | + | |
| 32 | +- [Manuel développeur](https://demo.gitrust.eu/docs/fr/developer_manual/index.html): vue d'ensemble contributeurs + API clients | |
| 33 | +- [Démarrage contributeur](https://demo.gitrust.eu/docs/fr/developer_manual/tutorials/01-getting-started.html): cloner, builder, lancer | |
| 34 | +- [Première contribution](https://demo.gitrust.eu/docs/fr/developer_manual/tutorials/02-premiere-contribution.html): TDD, QA, PR | |
| 35 | +- [Worker async (capstone)](https://demo.gitrust.eu/docs/fr/developer_manual/tutorials/03-creer-un-worker-async.html): patron complet | |
| 36 | +- [Architecture par crates](https://demo.gitrust.eu/docs/fr/developer_manual/reference/architecture-crates.html): les 6 crates | |
| 37 | +- [Schéma de la base de données](https://demo.gitrust.eu/docs/fr/developer_manual/reference/schema-base-donnees.html): ERD orienté dev | |
| 38 | +- [Règles QA ANSSI](https://demo.gitrust.eu/docs/fr/developer_manual/reference/regles-qa-anssi.html): gates, lints, checklist | |
| 39 | +- [API REST v1](https://demo.gitrust.eu/docs/fr/developer_manual/reference/api-rest-v1.html): référence API complète | |
| 40 | +- [Ajouter une route web](https://demo.gitrust.eu/docs/fr/developer_manual/how-to/ajouter-route-web.html): patron axum handler | |
| 41 | +- [Ajouter un service métier](https://demo.gitrust.eu/docs/fr/developer_manual/how-to/ajouter-service-metier.html): structure + tests | |
| 42 | +- [Ajouter une migration DB](https://demo.gitrust.eu/docs/fr/developer_manual/how-to/ajouter-migration-db.html): SeaORM, up/down | |
| 43 | + | |
| 44 | +## Templates copiables | |
| 45 | + | |
| 46 | +- [Catalogue des templates](https://demo.gitrust.eu/docs/fr/template/index.html): configs, docker-compose, nginx, systemd, CI, clients API | |
| 47 | + | |
| 48 | +## Autres ressources | |
| 49 | + | |
| 50 | +- [Site principal](https://gitrust.eu/): présentation commerciale de la plateforme | |
| 51 | +- [Licence CC BY 4.0](https://creativecommons.org/licenses/by/4.0/): licence de la documentation |
A
seo/robots.txt
+34
-0
@@ -0,0 +1,34 @@
| 1 | +# robots.txt — Documentation gitrust | |
| 2 | +# https://demo.gitrust.eu/docs/ | |
| 3 | + | |
| 4 | +User-agent: * | |
| 5 | +Allow: / | |
| 6 | + | |
| 7 | +# Pas de répertoires privés à exclure (tout est public). | |
| 8 | +# Pas de rate-limit agressif : la doc est statique et peu volumineuse. | |
| 9 | + | |
| 10 | +# Sitemaps (un par langue + index) | |
| 11 | +Sitemap: https://demo.gitrust.eu/docs/sitemap.xml | |
| 12 | +Sitemap: https://demo.gitrust.eu/docs/fr/sitemap.xml | |
| 13 | +Sitemap: https://demo.gitrust.eu/docs/en/sitemap.xml | |
| 14 | +Sitemap: https://demo.gitrust.eu/docs/de/sitemap.xml | |
| 15 | +Sitemap: https://demo.gitrust.eu/docs/es/sitemap.xml | |
| 16 | +Sitemap: https://demo.gitrust.eu/docs/pt/sitemap.xml | |
| 17 | +Sitemap: https://demo.gitrust.eu/docs/it/sitemap.xml | |
| 18 | + | |
| 19 | +# LLM-specific manifest (proposition llms.txt) | |
| 20 | +# https://llmstxt.org/ | |
| 21 | +# Les crawlers IA conformes liront llms.txt pour une vue structurée. | |
| 22 | + | |
| 23 | +# Crawlers IA autorisés explicitement (pour clarifier l'intention) | |
| 24 | +User-agent: GPTBot | |
| 25 | +Allow: / | |
| 26 | + | |
| 27 | +User-agent: ClaudeBot | |
| 28 | +Allow: / | |
| 29 | + | |
| 30 | +User-agent: PerplexityBot | |
| 31 | +Allow: / | |
| 32 | + | |
| 33 | +User-agent: Google-Extended | |
| 34 | +Allow: / |
M
src/SUMMARY.md
+3
-3
@@ -6,7 +6,7 @@
| 6 | 6 | |
| 7 | 7 | # Manuel utilisateur |
| 8 | 8 | |
| 9 | -- [Vue d'ensemble](user_manual/index.md) | |
| 9 | +- [Manuel utilisateur](user_manual/index.md) | |
| 10 | 10 | - [Tutoriels](user_manual/tutorials/index.md) |
| 11 | 11 | - [01 — Premier pas sur gitrust](user_manual/tutorials/01-premier-pas.md) |
| 12 | 12 | - [02 — Cloner et pousser du code](user_manual/tutorials/02-cloner-pousser.md) |
@@ -37,7 +37,7 @@
| 37 | 37 | |
| 38 | 38 | # Manuel d'administration |
| 39 | 39 | |
| 40 | -- [Vue d'ensemble](administration_manual/index.md) | |
| 40 | +- [Manuel d'administration](administration_manual/index.md) | |
| 41 | 41 | - [Tutoriels](administration_manual/tutorials/index.md) |
| 42 | 42 | - [01 — Installation avec Docker](administration_manual/tutorials/01-installation-docker.md) |
| 43 | 43 | - [02 — Installation avec systemd](administration_manual/tutorials/02-installation-systemd.md) |
@@ -73,7 +73,7 @@
| 73 | 73 | |
| 74 | 74 | # Manuel développeur |
| 75 | 75 | |
| 76 | -- [Vue d'ensemble](developer_manual/index.md) | |
| 76 | +- [Manuel développeur](developer_manual/index.md) | |
| 77 | 77 | - [Tutoriels](developer_manual/tutorials/index.md) |
| 78 | 78 | - [01 — Démarrer avec le code gitrust](developer_manual/tutorials/01-getting-started.md) |
| 79 | 79 | - [02 — Première contribution](developer_manual/tutorials/02-premiere-contribution.md) |
A
theme/head.hbs
+89
-0
@@ -0,0 +1,89 @@
| 1 | +{{!-- Bloc <head> additionnel injecté par mdBook. | |
| 2 | + | |
| 3 | + Couvre : | |
| 4 | + - URL canonique (une par page, par langue) | |
| 5 | + - Alternates hreflang (les 6 langues supportées) | |
| 6 | + - OpenGraph + Twitter cards | |
| 7 | + - JSON-LD schema.org (TechArticle dans un SoftwareApplication) | |
| 8 | + | |
| 9 | + Le domaine public est codé en dur ici. Pour changer (ex : staging), | |
| 10 | + éditer SITE_BASE_URL ou scripter un `sed` dans seo-postbuild.sh. | |
| 11 | +--}} | |
| 12 | + | |
| 13 | +{{!-- Base publique du site et langue courante --}} | |
| 14 | +{{#if path}} | |
| 15 | +<link rel="canonical" href="https://demo.gitrust.eu/docs/{{ path }}"> | |
| 16 | +{{else}} | |
| 17 | +<link rel="canonical" href="https://demo.gitrust.eu/docs/"> | |
| 18 | +{{/if}} | |
| 19 | + | |
| 20 | +{{!-- Alternates hreflang pour les 6 langues. demo.gitrust.eu/docs/{lang}/ --}} | |
| 21 | +<link rel="alternate" hreflang="fr" href="https://demo.gitrust.eu/docs/fr/{{ path }}"> | |
| 22 | +<link rel="alternate" hreflang="en" href="https://demo.gitrust.eu/docs/en/{{ path }}"> | |
| 23 | +<link rel="alternate" hreflang="de" href="https://demo.gitrust.eu/docs/de/{{ path }}"> | |
| 24 | +<link rel="alternate" hreflang="es" href="https://demo.gitrust.eu/docs/es/{{ path }}"> | |
| 25 | +<link rel="alternate" hreflang="pt" href="https://demo.gitrust.eu/docs/pt/{{ path }}"> | |
| 26 | +<link rel="alternate" hreflang="it" href="https://demo.gitrust.eu/docs/it/{{ path }}"> | |
| 27 | +<link rel="alternate" hreflang="x-default" href="https://demo.gitrust.eu/docs/fr/{{ path }}"> | |
| 28 | + | |
| 29 | +{{!-- OpenGraph --}} | |
| 30 | +<meta property="og:type" content="article"> | |
| 31 | +<meta property="og:site_name" content="Documentation gitrust"> | |
| 32 | +<meta property="og:title" content="{{ chapter_title }}"> | |
| 33 | +<meta property="og:description" content="{{ description }}"> | |
| 34 | +<meta property="og:url" content="https://demo.gitrust.eu/docs/{{ path }}"> | |
| 35 | +<meta property="og:image" content="https://gitrust.eu/images/logo.png"> | |
| 36 | +<meta property="og:locale" content="fr_FR"> | |
| 37 | +<meta property="og:locale:alternate" content="en_US"> | |
| 38 | +<meta property="og:locale:alternate" content="de_DE"> | |
| 39 | +<meta property="og:locale:alternate" content="es_ES"> | |
| 40 | +<meta property="og:locale:alternate" content="pt_PT"> | |
| 41 | +<meta property="og:locale:alternate" content="it_IT"> | |
| 42 | + | |
| 43 | +{{!-- Twitter Cards --}} | |
| 44 | +<meta name="twitter:card" content="summary_large_image"> | |
| 45 | +<meta name="twitter:title" content="{{ chapter_title }}"> | |
| 46 | +<meta name="twitter:description" content="{{ description }}"> | |
| 47 | +<meta name="twitter:image" content="https://gitrust.eu/images/logo.png"> | |
| 48 | + | |
| 49 | +{{!-- Robots : indexer et suivre, snippets longs autorisés, image preview large --}} | |
| 50 | +<meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1"> | |
| 51 | + | |
| 52 | +{{!-- JSON-LD : TechArticle qui fait partie d'un WebSite et décrit un SoftwareApplication --}} | |
| 53 | +<script type="application/ld+json"> | |
| 54 | +{ | |
| 55 | + "@context": "https://schema.org", | |
| 56 | + "@graph": [ | |
| 57 | + { | |
| 58 | + "@type": "Organization", | |
| 59 | + "@id": "https://gitrust.eu/#organization", | |
| 60 | + "name": "Gitrust", | |
| 61 | + "url": "https://gitrust.eu/", | |
| 62 | + "logo": "https://gitrust.eu/images/logo.png" | |
| 63 | + }, | |
| 64 | + { | |
| 65 | + "@type": "WebSite", | |
| 66 | + "@id": "https://demo.gitrust.eu/docs/#website", | |
| 67 | + "url": "https://demo.gitrust.eu/docs/", | |
| 68 | + "name": "Documentation gitrust", | |
| 69 | + "inLanguage": "fr", | |
| 70 | + "publisher": { "@id": "https://gitrust.eu/#organization" }, | |
| 71 | + "potentialAction": { | |
| 72 | + "@type": "SearchAction", | |
| 73 | + "target": "https://demo.gitrust.eu/docs/?q={search_term_string}", | |
| 74 | + "query-input": "required name=search_term_string" | |
| 75 | + } | |
| 76 | + }, | |
| 77 | + { | |
| 78 | + "@type": "TechArticle", | |
| 79 | + "headline": "{{ chapter_title }}", | |
| 80 | + "description": "{{ description }}", | |
| 81 | + "url": "https://demo.gitrust.eu/docs/{{ path }}", | |
| 82 | + "inLanguage": "fr", | |
| 83 | + "isPartOf": { "@id": "https://demo.gitrust.eu/docs/#website" }, | |
| 84 | + "about": { "@type": "SoftwareApplication", "name": "Gitrust", "applicationCategory": "DeveloperApplication", "operatingSystem": "Linux" }, | |
| 85 | + "publisher": { "@id": "https://gitrust.eu/#organization" } | |
| 86 | + } | |
| 87 | + ] | |
| 88 | +} | |
| 89 | +</script> |
GitRust