documentation
Kohinos v3 Doc générée le commit 8d60b1904

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.

✓ Règle d'or

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égorieChoix recommandé (self-host)SaaS à éviterNotes
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)

⚠ Tiers irréductibles

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

⛔ Refus automatiques

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

PosteSolutionCoût mensuelCoû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)

  1. Audit des composants externes :
    composer show | grep -iE '(sentry|datadog|newrelic|sendgrid|aws|google)'
    grep -RInE '(SENTRY|DSN|MAILER|AWS_)' .env .env.dist .env.prod 2>/dev/null
    Lister tout ce qui sort de l'infra contrôlée.
  2. Prioriser dans cet ordre :
    1. Auth + DB — jamais cloud. Si vous êtes sur RDS, migrer immédiatement vers MariaDB sur VPS.
    2. Mail SMTP — Postfix relais en quelques heures.
    3. CI/CD — GitLab Runner ou Forgejo Actions sur un Pi suffit.
    4. Error tracking — GlitchTip drop-in compatible Sentry SDK : changer le DSN dans SENTRY_DSN et c'est plié.
    5. Métriques / monitoring — Prometheus + Grafana en parallèle pendant 2 semaines avant de couper le SaaS existant.
  3. 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.
  4. Archiver les credentials SaaS dans le coffre Symfony Secrets pendant 3 mois (au cas où) puis les révoquer chez le prestataire.
  5. 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.

ℹ ARM64 obligatoire

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