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>