Guide du développeur Goooy
Les fondations techniques pour les personnes qui construisent, déploient et intègrent Goooy : de quoi le système est fait, comment le déployer et comment il est configuré.
Goooy est une suite de groupware complète que vous hébergez vous-même : courrier, calendrier, contacts, tâches, notes, conversation, fichiers, réunions vidéo, office collaboratif et une console d’administration, le tout depuis une seule application, un seul modèle de données et un seul chart Helm. Vous possédez les serveurs, les données et les clés.
Ce guide couvre la plateforme elle-même. L’exploitation au quotidien (la console
d’administration, les organisations et utilisateurs, la politique
d’authentification, le serveur de messagerie, la gestion des appareils, la
migration, la multi-tenancy et les sauvegardes) fait l’objet du
Guide de l’administrateur ; la vue des applications côté
utilisateur final est le Guide de l’utilisateur. Pour les
détails techniques approfondis, le dossier docs/ du code source du produit
contient des références dédiées (architecture, sécurité, serveur de messagerie,
multi-tenancy, déploiement, migration et les protocoles clients natifs).
Sommaire
Ce que vous exécutez
Goooy est un monolithe modulaire : une seule API Fastify/TypeScript adossée à PostgreSQL, Redis et un stockage objet compatible S3, plus une application web monopage React servie par nginx. Les clients natifs (Outlook, Thunderbird, Apple Mail, téléphones) se connectent via les protocoles standard. En option, un vrai serveur de messagerie (Postfix + Dovecot + Rspamd) transforme l’API en centre de distribution du courrier Internet entrant et sortant.
Browser ───────▶ web (React SPA, nginx) ──proxies /api, /ws──▶
Native clients ─▶ api (Fastify, modular monolith)
(DAV · EAS · │ │ │
Autodiscover · ┌───────▼──┐ ┌───▼────┐ ┌──▼───────┐
IMAP/POP3/SMTP) │PostgreSQL│ │ Redis │ │ S3/MinIO │
│ (Prisma) │ │pub/sub │ │ (blobs) │
└──────────┘ └────────┘ └──────────┘
Les services sous-jacents et ce qu’ils contiennent :
| Store | Rôle | En cas de perte |
|---|---|---|
| PostgreSQL | Système de référence : toutes les données structurées et la vue webmail des messages | Catastrophique ; c’est ce que vous sauvegardez |
| S3 / MinIO | Blobs opaques : fichiers téléversés (versionnés) et pièces jointes | Contenu des fichiers/pièces jointes perdu |
| Redis | Éphémère uniquement : pub/sub temps réel, présence, listes de participants aux réunions | Le temps réel se dégrade brièvement ; aucune donnée durable perdue |
Toute la suite est livrée sous forme de chart Helm (deploy/helm/goooy) qui peut
inclure Postgres/Redis/MinIO pour vous ou pointer vers des instances externes
managées.
Déployer Goooy
Kubernetes (recommandé)
Une installation minimale met en route toute la suite : les Deployments api +
web, PostgreSQL/Redis/MinIO inclus, et un Ingress qui route par chemin
l’application et chaque chemin de protocole client natif :
helm install goooy ./deploy/helm/goooy \
--namespace goooy --create-namespace \
--set ingress.host=mail.example.com
L’Ingress route / vers l’application web et /api, /ws, /dav, /share,
/autodiscover, /.well-known/autoconfig, /mail/config et
/Microsoft-Server-ActiveSync vers l’API. Le TLS se termine ici.
Services sous-jacents inclus ou externes. Chaque store peut être inclus (par défaut) ou externe :
helm install goooy ./deploy/helm/goooy \
--set postgresql.enabled=false --set externalDatabase.url=postgresql://… \
--set redis.enabled=false --set externalRedis.url=redis://… \
--set minio.enabled=false --set externalS3.endpoint=https://s3… \
--set externalS3.accessKey=… --set externalS3.secretKey=…
Durcissement pour la production. Activez l’autoscaling, les budgets de disruption, les sauvegardes nocturnes, le TLS automatique et votre propre secret :
helm upgrade goooy ./deploy/helm/goooy \
--set autoscaling.enabled=true \ # HPA for api + web (needs metrics-server)
--set podDisruptionBudget.enabled=true \
--set backup.enabled=true \ # nightly pg_dump CronJob
--set ingress.tls.clusterIssuer=letsencrypt-prod \
--set secret.existingSecret=goooy-prod-secret
Chaque paramètre est documenté dans
deploy/helm/goooy/values.yaml ; la topologie complète figure dans
Déploiement.
Évaluation locale (Docker Compose)
Pour essayer Goooy sur un ordinateur portable :
cp .env.example .env # sets JWT_SECRET, DATABASE_URL, …
docker compose up -d postgres redis minio mailpit # backing services
npm install
npm run db:migrate --workspace @goooy/api # apply schema
npm run db:seed --workspace @goooy/api # bootstrap org + admin + demo users
npm run dev # api :4000 + web :5173
Ouvrez http://localhost:5173 et connectez-vous en tant qu’administrateur de
bootstrap. Deux utilisateurs de démonstration (alice@goooy.local /
bob@goooy.local, mot de passe demo) vous permettent d’envoyer du courrier entre
les comptes et d’observer la distribution locale fonctionner.
Images de conteneurs
Des builds multi-étapes, tous exécutés en non-root (uid 1000) sous un contexte de sécurité de pod restrictif :
- api : Node 22, exécute
prisma migrate deploypuis le serveur ; expose HTTP (4000) et les ports d’ingestion SMTP/LMTP (2525/2526). - web : build Vite servi par nginx ; relaie en proxy inverse
/api,/wset les chemins de protocole, définit les en-têtes de sécurité et effectue le repli SPA. - marketing : un site public statique Astro (optionnel ; voir le Guide de l’administrateur).
- mail : Postfix, Dovecot, Rspamd (uniquement lorsque le serveur de messagerie est activé).
L’essentiel de la configuration
La configuration est centralisée et validée par Zod au démarrage. L’API
échoue rapidement si JWT_SECRET (≥16 caractères) ou DATABASE_URL est manquant
ou invalide, pour qu’un déploiement mal configuré ne démarre jamais dans un état à
moitié cassé. Tout le reste a des valeurs par défaut raisonnables.
Les variables les plus importantes :
| Groupe | Variables clés |
|---|---|
| Cœur | PUBLIC_WEB_URL, PUBLIC_API_URL, API_PORT (4000) |
| Auth (requis) | JWT_SECRET (≥16 caractères), JWT_ACCESS_TTL (900s), JWT_REFRESH_TTL (30d) |
| Données (requis) | DATABASE_URL, REDIS_URL |
| Stockage objet | S3_ENDPOINT, S3_BUCKET, S3_ACCESS_KEY / S3_SECRET_KEY |
| Courrier (sortant) | SMTP_HOST / SMTP_PORT / SMTP_SECURE |
| Courrier (entrant) | SMTP_INGEST_*, LMTP_INGEST_*, RSPAMD_URL, DOVECOT_LMTP_* |
| Réunion | MEET_ICE_SERVERS (serveurs STUN/TURN au format JSON) |
| Bootstrap | BOOTSTRAP_ORG / BOOTSTRAP_DOMAIN / BOOTSTRAP_ADMIN_EMAIL / BOOTSTRAP_ADMIN_PASSWORD |
Secrets.
JWT_SECRETetDATABASE_URLdoivent provenir d’un Secret Kubernetes que vous fournissez (secret.existingSecret). N’expédiez jamais la valeur par défaut du chart en production.JWT_SECRETa un double rôle : il scelle aussi les clés privées S/MIME, les secrets clients SSO et les identifiants de migration au repos, donc le changer invalide ces valeurs scellées. Effectuez la rotation de façon délibérée. La table complète des variables d’environnement figure dans Déploiement.
Où aller ensuite
- Le Guide de l’administrateur couvre l’exploitation de la suite déployée : la console d’administration, les organisations et utilisateurs, la politique d’authentification, le serveur de messagerie, la gestion des appareils, la migration, la multi-tenancy et les sauvegardes.
- Le Guide de l’utilisateur est la vue de chaque application côté utilisateur final.
- La référence technique complète (architecture, modèle de données, serveur de messagerie, multi-tenancy, déploiement, migration et les protocoles clients natifs) est fournie avec le code source du produit.