feat : bake la CA racine MALIO pour joindre GlitchTip HTTPS via Tailscale (Option A)

GlitchTip est servi en HTTPS sur logs.malio-dev.fr (cert auto-signé interne).
Le SDK backend (sur le VPS OVH) le joint via Tailscale en gardant le DSN
hostname inchangé : la CA publique est installée dans le trust store de
l'image prod, et le hostname est résolu vers l'IP tailnet via extra_hosts
côté serveur (documenté). Aucun changement côté GlitchTip.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-28 13:45:05 +02:00
parent 48b177e805
commit 231a1a1c15
4 changed files with 94 additions and 22 deletions
+53 -20
View File
@@ -8,8 +8,22 @@ compatible SDK Sentry), org `malio`, projet `sirh-api`. **Prod uniquement**, **i
## Contrainte réseau & transport
GlitchTip est sur le réseau interne (bloqué par Sophos). SIRH tourne sur un VPS OVH public. Le
container PHP joint GlitchTip via un **tunnel Tailscale** monté sur le host de prod.
GlitchTip est sur le réseau interne (bloqué par Sophos), servi en **HTTPS sur
`logs.malio-dev.fr`** (cert auto-signé par la CA interne « MALIO-DEV Local Root CA »). SIRH tourne
sur un **VPS OVH** public. Le lien passe par un **tunnel Tailscale** entre les deux hôtes.
**Topologie retenue (Option A — HTTPS + hostname mappé sur le tailnet) :**
- Tailscale est installé **sur l'hôte GlitchTip** (IP tailnet `100.111.223.34`) **et sur le VPS
OVH** (IP tailnet `100.93.52.45`).
- Le **DSN reste inchangé** : `https://<clé>@logs.malio-dev.fr/<id>` (même endpoint que le
navigateur → pas de souci `ALLOWED_HOSTS`, Host header et cert cohérents).
- Côté SIRH, le nom `logs.malio-dev.fr` est résolu vers l'**IP tailnet de GlitchTip** via
`extra_hosts` dans le `docker-compose` du serveur.
- La **CA racine MALIO** est bakée dans l'image SIRH (`deploy/docker/Dockerfile.prod`) pour que le
SDK accepte le TLS auto-signé.
> Pré-requis : le nginx qui sert `logs.malio-dev.fr` en 443 doit écouter sur une interface
> joignable via le tailnet (typiquement `0.0.0.0:443` → joignable sur `100.111.223.34:443`).
## Fichiers concernés
@@ -19,28 +33,34 @@ container PHP joint GlitchTip via un **tunnel Tailscale** monté sur le host de
| `config/bundles.php` | `SentryBundle` enregistré `['prod' => true]` |
| `config/packages/monolog.yaml` | handler `sentry` (service) en `when@prod` |
| `.env` | bloc documenté `SENTRY_DSN` (vide → inerte) |
| `deploy/docker/Dockerfile.prod` | bake la CA racine MALIO (`update-ca-certificates`) pour le TLS interne |
| `deploy/docker/malio-dev-root-ca.crt` | certificat **public** de la CA interne (aucune clé privée) |
## Activation (runbook)
1. **Tailscale sur le host prod OVH** :
1. **Tailscale sur les deux hôtes** (GlitchTip **et** VPS OVH) :
```bash
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up # ou --authkey tskey-auth-XXXX (headless)
tailscale status && tailscale ip -4
tailscale ip -4 # GlitchTip → 100.111.223.34 ; OVH → 100.93.52.45
```
2. **Vérifier l'accès à GlitchTip** depuis le host :
2. **Vérifier l'accès** depuis le VPS OVH (tunnel + nginx 443 de GlitchTip) :
```bash
tailscale ping <glitchtip-tailnet>
curl -sS -o /dev/null -w "%{http_code}\n" http://<glitchtip-IP-tailnet>:<port>/_health/
tailscale ping 100.111.223.34
curl -sSk -o /dev/null -w "%{http_code}\n" https://100.111.223.34/ # réponse HTTP = tunnel OK
```
3. **Routage container → tailnet** : pointer `SENTRY_DSN` sur l'**IP tailnet** de GlitchTip
(le container ne résout pas MagicDNS). Repli si non routé : sidecar `tailscale/tailscale`
+ `network_mode: service:tailscale`.
4. **Créer le projet GlitchTip** `sirh-api` (plateforme `php-symfony`) dans l'org `malio`,
récupérer le DSN (Settings → Client Keys).
5. **Injecter le DSN** dans l'env_file serveur (pas dans l'image), puis redéployer :
3. **Mapper le hostname vers l'IP tailnet** dans le `docker-compose` du serveur OVH (service `php`),
pour que le container résolve `logs.malio-dev.fr` :
```yaml
extra_hosts:
- "logs.malio-dev.fr:100.111.223.34"
```
4. **Projet GlitchTip** : déjà créé (org `malio`, projet `sirh-api`, id `3`). DSN de base affiché
dans *Settings → Client Keys* : `https://<clé>@logs.malio-dev.fr/3`.
5. **Injecter le DSN tel quel** (hostname conservé) dans l'env_file serveur (pas dans l'image),
puis rebuild/redéployer l'image (la CA est bakée au build) :
```env
SENTRY_DSN=http://<clé>@100.x.y.z:<port>/<id-sirh-api>
SENTRY_DSN=https://<clé>@logs.malio-dev.fr/3
```
```bash
docker compose up -d
@@ -62,20 +82,33 @@ Sortie attendue : `Sending test message... done.` → une **Issue de test** appa
`sirh-api` côté GlitchTip. Si l'envoi échoue (`Message not sent`), le problème est réseau
(Tailscale/route/port) ou DSN, pas applicatif.
Pré-check connectivité depuis le host prod (ex. IP tailnet GlitchTip `100.111.223.34`) :
Pré-check connectivité depuis le VPS OVH (`-k` ignore le cert juste pour ce test) :
```bash
tailscale ping 100.111.223.34
curl -sS -o /dev/null -w "%{http_code}\n" http://100.111.223.34:<port>/_health/ # 200 attendu
curl -sSk -o /dev/null -w "%{http_code}\n" https://100.111.223.34/ # réponse HTTP = tunnel OK
# Avec résolution du hostname (comme le container) + validation par la CA :
curl --resolve logs.malio-dev.fr:443:100.111.223.34 \
--cacert deploy/docker/malio-dev-root-ca.crt \
-sS -o /dev/null -w "%{http_code}\n" https://logs.malio-dev.fr/
```
Alternative sans commande dédiée : déclencher un `throw new \RuntimeException('glitchtip test')`
temporaire dans un endpoint, ou un `$logger->error('glitchtip test')` (niveau ERROR+ → Issue).
## CA HTTPS (conditionnel)
## CA HTTPS interne (bakée dans l'image)
Uniquement si le DSN cible l'HTTPS interne `logs.malio-dev.fr` (cert auto-signé) : baker la CA
racine MALIO dans `deploy/docker/Dockerfile.prod` (stage production). Recommandé : préférer
l'endpoint **HTTP** via le tailnet (déjà chiffré par WireGuard) → pas de CA.
GlitchTip est en HTTPS avec un cert auto-signé par la **CA interne MALIO**. Le SDK refuse un TLS
non approuvé (« Message not sent »). La CA publique (`deploy/docker/malio-dev-root-ca.crt`, aucune
clé privée) est donc installée dans le trust store de l'image au build (`deploy/docker/Dockerfile.prod`,
stage production) :
```dockerfile
COPY deploy/docker/malio-dev-root-ca.crt /usr/local/share/ca-certificates/malio-dev-root-ca.crt
RUN update-ca-certificates
```
Combinée à l'`extra_hosts` (hostname → IP tailnet), le container fait confiance à
`logs.malio-dev.fr` et l'atteint via le tunnel.
Design détaillé : `docs/superpowers/specs/2026-06-28-glitchtip-backend-error-tracking-design.md`.