Integration¶
Ce chapitre décrit comment le service documentaire s'articule avec les autres composants du catalogue : gestion de sources, pipeline CI/CD, gestion des identités, réseau, observabilité et messagerie.
Vue d'ensemble des integrations¶
graph LR
SCM["SCM (Gitea)"] -->|source Markdown| CICD["CI/CD (Gitea Actions)"]
CICD -->|4 builds| Docs["Documentation"]
IAM["IAM (Keycloak)"] -->|OIDC| Proxy["Reverse Proxy (Caddy)"]
Proxy -->|routage| Docs
DNS["DNS (CoreDNS)"] -->|docs.example.com| Proxy
Docs -->|logs JSON| Obs["Observabilite (Loki)"]
Docs -->|metriques| Prom["Prometheus"] - SCM → CI/CD : declenchement automatique du pipeline sur chaque push.
- CI/CD → Docs : publication du site statique.
- IAM → Proxy : authentification OIDC avant accès au contenu.
- DNS → Proxy : résolution du nom de domaine interne.
- Docs → Observabilité : export des logs et des metriques.
- CI/CD → Messagerie : notifications de publication et d'echec.
SCM (Gitea)¶
Le contenu documentaire est versionne dans un dépôt Gitea. La branche main constitue la source de vérité ; toute modification passe par une pull request soumise a revue.
Un webhook de type push declenche le pipeline CI/CD à chaque fusion sur main :
{
"secret": "WEBHOOK_SECRET",
"content_type": "json",
"url": "https://gitea.example.com/api/v1/repos/org/docs/hooks",
"events": ["push"],
"active": true,
"config": { "branch_filter": "main" }
}
La branche main est protegee avec au moins 1 approbation requise avant fusion, le push direct desactive et les checks CI obligatoires. Configuration : Depot > Parametres > Branches > Regles de protection.
| Service | Protocole | Port | Direction |
|---|---|---|---|
| Gitea (webhook sortant) | HTTPS | 443 | Gitea → Gitea Actions |
| Gitea (API) | HTTPS | 443 | CI/CD → Gitea |
| Poste développeur | SSH / HTTPS | 22 / 443 | Dev → Gitea |
Voir le service SCM : ../../chaîne-logicielle/scm/index.md
CI/CD (Gitea Actions)¶
Le pipeline est defini dans .gitea/workflows/docs.yml (cf. 04-installation). Le cache pip reduit le temps d'installation de MkDocs de 60 a 80 % sur les builds incrementaux :
- name: Cache pip
uses: actions/cache@v3
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-
En cas d'echec, une notification est envoyee vers Mattermost :
- name: Notifier echec
if: failure()
uses: appleboy/mattermost-action@v1
with:
url: ${{ secrets.MATTERMOST_WEBHOOK }}
channel: ops-alertes
text: |
**Build documentation echoue**
Depot : ${{ github.repository }} — Commit : ${{ github.sha }}
Secret a configurer
MATTERMOST_WEBHOOK doit etre declare dans les secrets du dépôt Gitea avant la première execution.
| Service | Protocole | Port | Direction |
|---|---|---|---|
| Gitea Actions → serveur docs | SSH / SCP | 22 | CI → Hôte |
| CI → Mattermost | HTTPS | 443 | CI → Messagerie |
| CI → Gitea (statut) | HTTPS | 443 | CI → SCM |
Voir le service CI/CD : ../../chaîne-logicielle/cicd/index.md
IAM (Keycloak)¶
L'accès est protège par authentification OIDC déléguée a Keycloak (configuration détaillée dans 04-installation). Un claim doc_classification est ajoute via un mapper de type Group Membership pour refléter le niveau de sensibilite (public, interne, confidentiel).
Flux d'authentification OIDC¶
sequenceDiagram
participant U as Utilisateur
participant C as Caddy (Proxy)
participant K as Keycloak
participant D as MkDocs (Site)
U->>C: GET https://docs.example.com/page
C->>U: 302 Redirect vers Keycloak
U->>K: Formulaire de connexion
K-->>U: Authorization Code
U->>C: GET /callback?code=...
C->>K: Echange code contre tokens (OIDC)
K-->>C: access_token + id_token
C->>C: Verification du claim doc_classification
C->>D: Requete proxy vers MkDocs
D-->>C: Page HTML
C-->>U: Reponse finale Gestion des sessions¶
| Parametre | Valeur recommandee |
|---|---|
| Duree de session SSO | 8 heures |
| Expiration du token d'accès | 5 minutes |
| Refresh token | 30 minutes |
| Revocation | Console Keycloak ou API REST |
Revocation d'urgence
Users > [utilisateur] > Sessions > Deconnecter toutes les sessions.
| Service | Protocole | Port | Direction |
|---|---|---|---|
| Caddy → Keycloak | HTTPS | 8443 | Proxy → IAM |
| Navigateur → Keycloak | HTTPS | 8443 | Client → IAM |
| Keycloak → LDAP | LDAPS | 636 | IAM → Annuaire |
Voir le service IAM : ../../production/iam/index.md
DNS (CoreDNS)¶
Le nom docs.example.com est resolu en interne vers l'IP du reverse proxy. Enregistrement CNAME recommande si Caddy sert plusieurs services :
Extrait du Corefile pour charger la zone interne :
| Service | Protocole | Port | Direction |
|---|---|---|---|
| Client → CoreDNS | UDP/TCP | 53 | Client → DNS |
| CoreDNS → Proxy | — | — | Résolution interne |
Voir le service DNS : ../../production/dns/index.md
Observabilité¶
Logs Caddy vers Loki¶
Caddy écrit les logs au format JSON ; Promtail les collecte et les envoie a Loki :
scrape_configs:
- job_name: caddy
static_configs:
- targets: [localhost]
labels:
job: caddy
__path__: /var/log/caddy/access.log
pipeline_stages:
- json:
expressions:
ts: ts
status: status
request_uri: request.uri
- labels:
status:
request_uri:
- timestamp:
source: ts
format: Unix
Metriques Prometheus¶
Caddy expose ses metriques sur le port 2019 (/metrics). Prometheus scrappe ce endpoint :
Tableaux de bord Grafana suggeres :
| Panneau | Type de requête |
|---|---|
| Visiteurs par niveau de classification | LogQL — filtre doc_classification |
| Pages les plus consultees | LogQL — topk sur request_uri |
| Erreurs 404 | LogQL — filtre status="404" |
| Latence mediane | PromQL — histogram_quantile(0.5, ...) |
Dashboard pre-construit
Le dashboard Grafana ID 14700 (Caddy) peut etre importe et adapte a vos labels.
| Service | Protocole | Port | Direction |
|---|---|---|---|
| Promtail → Loki | HTTP | 3100 | Collecteur → Loki |
| Prometheus → Caddy | HTTP | 2019 | Prometheus → Proxy |
| Grafana → Loki / Prometheus | HTTP | 3100 / 9090 | Dashboard → Backends |
Voir le service observabilité : ../../production/observabilité/index.md
Messagerie (notifications)¶
À chaque publication réussie, le pipeline envoie une notification Mattermost :
- name: Notifier publication
if: success()
run: |
curl -s -X POST "${{ secrets.MATTERMOST_WEBHOOK }}" \
-H "Content-Type: application/json" \
-d '{"channel":"docs-publications","text":"Documentation mise a jour — commit ${{ github.sha }}"}'
Une alerte Alertmanager surveille la disponibilité du service en complement :
groups:
- name: docs
rules:
- alert: DocsDown
expr: up{job="caddy"} == 0
for: 2m
labels:
severity: warning
annotations:
summary: "Service documentaire injoignable"
| Service | Protocole | Port | Direction |
|---|---|---|---|
| CI → Mattermost | HTTPS | 443 | CI → Messagerie |
| CI → SMTP | STARTTLS | 587 | CI → Messagerie |
| Alertmanager → Mattermost | HTTPS | 443 | Alertmanager → Messagerie |
Voir le service messagerie : ../messagerie/index.md
Recapitulatif des integrations¶
| Service integre | Protocole | Port | Direction | Usage |
|---|---|---|---|---|
| Gitea (SCM) | HTTPS / SSH | 443 / 22 | Dev → SCM, SCM → CI | Versionnement, webhook |
| Gitea Actions (CI/CD) | HTTPS | 443 | SCM → CI, CI → Docs | Pipeline de publication |
| Keycloak (IAM) | HTTPS | 8443 | Proxy → IAM, Client → IAM | Authentification OIDC |
| LDAP | LDAPS | 636 | IAM → Annuaire | Sync groupes |
| CoreDNS (DNS) | UDP/TCP | 53 | Client → DNS | Résolution nom de domaine |
| Caddy (Proxy) | HTTPS | 443 | Client → Proxy → Docs | Routage, TLS, auth |
| Loki | HTTP | 3100 | Docs → Loki | Centralisation des logs |
| Prometheus | HTTP | 2019 / 9090 | Prom → Caddy | Metriques |
| Grafana | HTTP | 3000 | Grafana → Prom / Loki | Tableaux de bord |
| Mattermost | HTTPS | 443 | CI → Messagerie | Notifications |
| SMTP | STARTTLS | 587 | CI → Messagerie | Notifications email |
| Alertmanager | HTTPS | 443 | Alertmanager → Messagerie | Alertes |