Stack self-host Kohinos — alternatives aux SaaS cloud
Kohinos n'a aucune dépendance SaaS critique. Cette page liste tous les composants utilisés (code, données, mail, monitoring, CI…) et leur équivalent self-hostable. L'auto-hébergement n'est pas un caprice idéologique : c'est la condition pour qu'une MLCC reste maîtresse de ses données financières, de son infra et de sa licence AGPL-3.0. Souveraineté monétaire = priorité #2 du projet, juste après l'intégrité financière.
Aucun composant du path critique (auth, DB, code, déploiement, monnaie) ne dépend d'un SaaS propriétaire. Tout ce qui touche aux soldes adhérents tourne sur de l'infra que l'association Fédération Kohinos contrôle physiquement (VPS dédié ou Raspberry Pi à domicile).
Vue d'ensemble — flux de données
flowchart LR
A[Adhérent] -->|HTTPS| N[Nginx + Let's Encrypt]
N --> S[Symfony app PHP-FPM]
S --> DB[(MariaDB)]
S --> R[(Redis cache)]
S --> ST[Storage local / MinIO]
S --> M[Postfix / Mailcow SMTP]
S -.->|erreurs| G[GlitchTip self-host]
S -.->|métriques| P[Prometheus]
P --> GR[Grafana]
DEV[Dev / CI] --> GIT[Forgejo ou GitLab self-host]
GIT --> RUN[GitLab Runner local]
RUN --> N
OPS[Ops] -.->|VPN| WG[Wireguard]
WG --> N
classDef ext fill:#fff3cd,stroke:#856404;
HA[HelloAsso / PayZen]:::ext
S -.->|paiement| HA
Tout ce qui est en trait plein (auth, code, DB, mail, monitoring) tourne sur du matériel contrôlé. Le seul tiers irréductible est le passage paiement carte (HelloAsso ou PayZen), isolé via webhook signé — voir webhooks paiement.
Stack par catégorie
| Catégorie | Choix recommandé (self-host) | SaaS à éviter | Notes |
|---|---|---|---|
| Code & Git | Forgejo (préféré, fork Gitea) ou GitLab CE self-host | GitHub, Bitbucket Cloud | Forgejo tourne sur Raspberry Pi (≈80 Mo RAM). GitLab CE plus lourd mais intègre CI / Registry / Pages. |
| Issues & PR | Intégré Forgejo / GitLab | Linear, Jira Cloud, Shortcut | Pas de dépendance externe — issues partent avec le code en cas de fork. |
| CI/CD | GitLab Runner ou Forgejo Actions, runner local Docker | GitHub Actions payant, CircleCI, Travis Cloud | Détails : CI/CD. 1 runner ARM64 sur Pi 5 suffit pour Kohinos. |
| Container Registry | Registry intégré Forgejo / GitLab | Docker Hub paid, ECR, GHCR | Pour les images PHP / Node de build CI. Quotas Docker Hub anonymes = piège. |
| Bug tracking | Issues Forgejo / GitLab | Linear, Jira | Liens automatiques avec MR : Closes #123. |
| Logs centralisés | Monolog → fichiers rotatifs + (option) Loki self-host ou rsyslog distant | Datadog Logs, Papertrail, Logz.io | Voir monitoring. Loki léger (~50 Mo RAM), parle Grafana nativement. |
| Error tracking | GlitchTip self-host (API compatible Sentry SDK) | Sentry Cloud, Bugsnag, Rollbar | Drop-in compatible avec sentry/sentry-symfony. PostgreSQL +
Django, ~250 Mo RAM. |
| APM / Profiling | Tideways self-host ou Symfony Profiler (dev) + XHProf | Blackfire SaaS, New Relic, Datadog APM | Pour Kohinos, le profiler Symfony en dev + slow query log MariaDB suffisent largement. |
| Mail SMTP | Postfix ou OpenSMTPd local ou Mailcow (full stack) | SendGrid, Mailgun, Postmark, Amazon SES | Postfix relais → boîtes externes via SMTP authentifié. DKIM / SPF / DMARC obligatoires (cf. sécurité serveur). |
| DNS | Registrar + DNS self-host (Bind9, Knot, PowerDNS) ou dynDNS associatif | Cloudflare DNS managed, Route 53 | Le DNS authoritative peut être délégué au registrar (Gandi, OVH) sans casser la souveraineté tant qu'il reste exportable en zone file. |
| Stockage objet | MinIO self-host (API S3 compatible) ou simple rsync sur
Storage Box Hetzner |
S3 AWS, B2 Backblaze, GCS | Utilisé pour backups chiffrés. MinIO tourne sur Pi en quelques minutes. |
| Secrets | Symfony Secrets Vault (built-in, libsodium) — option Vault HashiCorp self-host pour multi-services | AWS Secrets Manager, Doppler, 1Password Connect | bin/console secrets:set — clés chiffrées Ed25519 versionnées avec
le code, déchiffrement uniquement en prod via clé locale. |
| VPN admin | Wireguard self-host sur le VPS | Tailscale (cloud control plane), Zscaler, NordLayer | Accès SSH / admin Sonata uniquement via VPN. Headscale possible si on veut le modèle Tailscale sans le SaaS. |
| Documentation | Ce site HTML statique dochtml/
| Voir doc dev et doc DevOps. Format Markdown / HTML : zéro lock-in. | |
| Chat équipe | Mattermost self-host ou Matrix/Element self-host ou IRC | Slack, MS Teams, Discord | Bonus Matrix : fédération possible avec d'autres MLCC. |
| Monitoring uptime | Uptime Kuma self-host (ou Gatus) | UptimeRobot, Pingdom, StatusCake | Uptime Kuma sur un second Pi ou un VPS séparé — sinon il ne peut pas alerter quand le serveur principal tombe. |
| Métriques | Prometheus + Grafana self-host (exporters Node, MariaDB, PHP-FPM) | Datadog, New Relic, Grafana Cloud paid | Grafana Cloud Free OK pour démarrer si stockage local impossible, mais à terme tout en local. |
| TLS / Certificats | Let's Encrypt via certbot ou acme.sh |
Cloudflare SSL géré, certificats EV payants | ACME = protocole ouvert, plusieurs CA possibles (Buypass, ZeroSSL). |
| Page de statut publique | Uptime Kuma status page ou Cachet self-host | Statuspage.io (Atlassian) | Transparence vis-à-vis des adhérents en cas d'incident. |
Composants tiers tolérés (mais à minimiser)
Trois composants externes sont actuellement tolérés faute d'équivalent
self-host réaliste. Ils doivent rester isolés du cœur métier par un
adaptateur (Strategy pattern : HelloAssoGateway,
PayzenGateway) afin de pouvoir être remplacés sans toucher le domaine.
- HelloAsso — encaissement adhésions et achats par CB. Pas substituable raisonnablement (agrément, conformité PCI-DSS). Webhook signé, idempotence stricte — voir webhooks paiement.
- PayZen (Lyra) — alternative paiement, idem.
-
Let's Encrypt — délivre les certificats TLS. Protocole ACME ouvert,
plusieurs CA. Acceptable car protocole standard et CA changeable en 1 commande
certbot.
Composants strictement interdits
Conformément à .claude/rules/global.md et
.claude/rules/mcp-policy.md, ces composants sont
refusés :
- Auth cloud (Auth0, Okta, Firebase Auth, Clerk) → ne JAMAIS déléguer l'authentification d'adhérents à un tiers. Auth = identité = monnaie. Garder Symfony Security + bundle local.
- DB managées cloud (RDS AWS, Aurora, Atlas, PlanetScale, Supabase prod) → les soldes et IBAN chiffrés des adhérents ne sortent pas de l'infra Fédération Kohinos.
- Sentry Cloud → GlitchTip self-host obligatoire.
- GitHub Actions payant / Actions cloud → GitLab Runner ou Forgejo Actions local. Le free tier GitHub Actions OK pour OSS public, mais pas pour le path critique.
- Anthropic Files API en SaaS (sauf usage direct via CLI Claude Code par le dev). Pas de pipeline prod qui envoie du code financier à un LLM SaaS.
-
MCP servers cloud — cf.
.claude/rules/mcp-policy.md. Tous les MCP doivent tourner en local (symfony-ai-mate, context7, mcp-server-mysql en read-only). - Frameworks JS lourds en SPA (React/Vue/Angular hébergés sur Vercel/Netlify) → Twig + Bootstrap 5.2 + Vanilla JS uniquement.
Coût indicatif
| Poste | Solution | Coût mensuel | Coût annuel |
|---|---|---|---|
| Serveur applicatif | VPS Hetzner CX22 (2 vCPU, 4 Go RAM, 40 Go SSD) | ~4 € | ~48 € |
| Alternative à domicile | Raspberry Pi 5 (8 Go) — one-shot ≈ 100 € + électricité ~2 €/mois | ~2 € | ~24 € |
| Backups | Storage Box Hetzner BX11 (1 To) | ~3 € | ~36 € |
| Domaine | Registrar européen (Gandi, OVH, Bookmyname) | — | ~10 € |
| VPS monitoring séparé | Hetzner CX11 ou Pi #2 — Uptime Kuma | ~4 € (optionnel) | ~48 € |
| Total typique MLCC < 1000 adhérents | VPS principal + backups + domaine | ~7 € | ~95–120 € |
À comparer avec un stack SaaS équivalent (Heroku + RDS + Sentry + SendGrid + Datadog) qui démarre autour de 150 €/mois pour la même charge — soit environ 20× plus cher et avec verrouillage des données financières chez des prestataires non-européens.
Procédure de migration progressive (depuis un stack SaaS)
-
Audit des composants externes :
Lister tout ce qui sort de l'infra contrôlée.composer show | grep -iE '(sentry|datadog|newrelic|sendgrid|aws|google)' grep -RInE '(SENTRY|DSN|MAILER|AWS_)' .env .env.dist .env.prod 2>/dev/null -
Prioriser dans cet ordre :
- Auth + DB — jamais cloud. Si vous êtes sur RDS, migrer immédiatement vers MariaDB sur VPS.
- Mail SMTP — Postfix relais en quelques heures.
- CI/CD — GitLab Runner ou Forgejo Actions sur un Pi suffit.
- Error tracking — GlitchTip drop-in compatible Sentry SDK : changer le DSN dans
SENTRY_DSNet c'est plié. - Métriques / monitoring — Prometheus + Grafana en parallèle pendant 2 semaines avant de couper le SaaS existant.
- Migrer 1 service à la fois. Garder l'ancien actif (write simultané ou fallback DNS) pendant 2 semaines minimum, le temps de valider qu'aucun cron / webhook ne pointe encore vers l'ancien.
- Archiver les credentials SaaS dans le coffre Symfony Secrets pendant 3 mois (au cas où) puis les révoquer chez le prestataire.
- Mettre à jour cette page — la doc fait foi. Tout nouveau composant doit apparaître dans le tableau "Stack par catégorie" avec son équivalent self-host.
Raspberry Pi friendly
Tout le stack self-host doit pouvoir tourner sur du matériel modeste — un Pi 5 8 Go héberge confortablement : Symfony app + MariaDB + Redis + Nginx + GlitchTip + Prometheus + Grafana pour une MLCC jusqu'à ~500 adhérents. Voir Pi low-tech pour les spécifications hardware, surveillance température / SSD endurance, et le découpage Pi-principal ↔ Pi-monitoring.
Toute brique self-host choisie doit avoir une image officielle ou un binaire
arm64 (Pi, Hetzner Ampere CAX11). Refuser tout composant qui n'existe
qu'en amd64 propriétaire — c'est un signal de dépendance plateforme
cachée.
Checklist d'audit annuel
- ☐ Aucune dépendance Composer ne fait d'appel sortant non documenté
(
composer audit+ grepfile_get_contents\|curl_initdansvendor/pour les libs sensibles). - ☐
.env.prodne contient aucun DSN pointant vers un domaine SaaS propriétaire. - ☐ Tous les backups (DB + storage) sont chiffrés côté client avant upload (clé Ed25519 / age).
- ☐ Le VPN Wireguard est actif et l'admin Sonata n'est pas exposé en clair sur Internet.
- ☐ La page de statut publique fonctionne et ne dépend pas du serveur principal.
- ☐ Le runbook de bascule HelloAsso → encaissement manuel chèque est testé une fois par an.