Architecture¶
Architecture de référence pour une plateforme Nextcloud + Mattermost auto-hebergee.
Vue d'ensemble¶
graph TB
subgraph "Clients"
Browser["Navigateur"]
Desktop["Client Desktop NC"]
Mobile["App Mobile MM"]
end
subgraph "Reverse Proxy"
RP["Caddy / Nginx<br/>TLS termination"]
end
subgraph "Nextcloud Stack"
NC["Nextcloud<br/>PHP-FPM"]
Redis["Redis<br/>Cache + File locking"]
Collabora["Collabora CODE<br/>Edition en ligne"]
end
subgraph "Mattermost Stack"
MM["Mattermost<br/>Go server"]
Push["Push Proxy<br/>Notifications mobiles"]
end
subgraph "Stockage"
PG_NC["PostgreSQL<br/>Nextcloud"]
PG_MM["PostgreSQL<br/>Mattermost"]
S3["MinIO / S3<br/>Fichiers"]
end
Browser --> RP
Desktop --> RP
Mobile --> RP
RP --> NC
RP --> MM
RP --> Collabora
NC --> Redis
NC --> PG_NC
NC --> S3
NC --> Collabora
MM --> PG_MM
MM --> S3
MM --> Push Composants Nextcloud¶
PHP-FPM¶
Nextcloud est une application PHP exécutée par PHP-FPM. Le serveur web (integre au conteneur ou deporte vers Caddy/Nginx) transmet les requêtes a PHP-FPM via FastCGI.
| Parametre | Valeur recommandee |
|---|---|
pm | dynamic |
pm.max_children | 16 (ajuster selon la RAM) |
pm.start_servers | 4 |
memory_limit | 512M |
opcache.memory | 128 |
upload_max_filesize | 16G |
PostgreSQL¶
Nextcloud stocke les metadonnees (comptes, partages, activité, tags, commentaires) dans PostgreSQL. Les fichiers eux-mêmes ne sont pas dans la base.
PostgreSQL partage ou dedie
Pour les petites installations (< 50 utilisateurs), une seule instance PostgreSQL avec des bases séparées pour Nextcloud et Mattermost suffit. Au-delà, dedicer une instance par service pour isoler les performances.
Redis¶
Redis remplit deux rôles :
| Rôle | Configuration |
|---|---|
| Cache APCu | memcache.distributed = \OC\Memcache\Redis |
| File locking | memcache.locking = \OC\Memcache\Redis |
Le file locking empeche les conflits quand plusieurs clients editent le même fichier via WebDAV. Sans Redis, Nextcloud utilise un locking base sur la BDD — nettement moins performant.
Stockage fichiers — S3 / MinIO¶
Par defaut, Nextcloud stocke les fichiers sur le système de fichiers local (data/). En production, un backend S3 (MinIO auto-heberge ou S3 compatible) est recommande :
// config/config.php (extrait)
'objectstore' => [
'class' => '\\OC\\Files\\ObjectStore\\S3',
'arguments' => [
'bucket' => 'nextcloud',
'hostname' => 'minio.internal',
'port' => 9000,
'key' => 'NC_ACCESS_KEY',
'secret' => 'NC_SECRET_KEY',
'use_ssl' => true,
'region' => 'us-east-1',
'use_path_style' => true,
],
],
Migration vers S3
Le passage du stockage local vers S3 est unidirectionnel. Il n'est pas possible de revenir au stockage local sans re-upload complet. Choisissez le backend de stockage avant la mise en production.
Collabora CODE¶
Collabora Online Development Edition est une version de LibreOffice Online empaquetee dans un conteneur Docker/Podman. Nextcloud communique avec Collabora via le protocole WOPI (Web Application Open Platform Interface).
sequenceDiagram
participant User as Navigateur
participant NC as Nextcloud
participant CO as Collabora
User->>NC: Ouvrir document.docx
NC->>NC: Generer token WOPI
NC->>User: Rediriger vers Collabora (iframe)
User->>CO: Charger editeur (WOPI token)
CO->>NC: Recuperer fichier (WOPI GetFile)
User->>CO: Editer le document
CO->>NC: Sauvegarder (WOPI PutFile) Composants Mattermost¶
Serveur Go¶
Mattermost est un binaire Go unique qui sert à la fois l'API REST, le serveur WebSocket et l'interface web. Cette architecture monolithique simplifie le déploiement.
| Parametre | Valeur recommandee |
|---|---|
MaxUsersPerTeam | 1000 |
MaxChannelsPerTeam | 2000 |
MaxFileSize | 104857600 (100 Mo) |
EnableLinkPreviews | true |
GoroutineHealthThreshold | 200 |
PostgreSQL¶
Mattermost stocke messages, canaux, équipes, utilisateurs et réactions dans PostgreSQL. Le schema est versionne et les migrations sont automatiques au demarrage.
Stockage fichiers¶
Les fichiers envoyes dans les canaux sont stockes sur le disque local ou dans un bucket S3 :
{
"FileSettings": {
"DriverName": "amazons3",
"AmazonS3AccessKeyId": "MM_ACCESS_KEY",
"AmazonS3SecretAccessKey": "MM_SECRET_KEY",
"AmazonS3Bucket": "mattermost",
"AmazonS3Endpoint": "minio.internal:9000",
"AmazonS3SSL": true,
"AmazonS3PathPrefix": "files"
}
}
Push Proxy¶
Les notifications push mobiles passent par un serveur proxy. Mattermost fournit un proxy open source (mattermost-push-proxy) que vous pouvez auto-héberger pour eviter de transiter par les serveurs Mattermost Inc.
graph LR
MM["Mattermost Server"] -->|"notification"| PP["Push Proxy<br/>(auto-heberge)"]
PP -->|"APNs"| iOS["iPhone"]
PP -->|"FCM"| Android["Android"] HPNS vs TPNS
- TPNS (Test Push Notification Service) — gratuit, limite en débit, passe par Mattermost Inc.
- HPNS (Hosted Push Notification Service) — licence Enterprise, heberge par Mattermost Inc.
- Auto-heberge — compilez les apps mobiles avec vos propres cles APNs/FCM et utilisez votre push proxy.
Reverse proxy¶
Caddy (ou Nginx) assure la terminaison TLS et le routage par sous-domaine :
| Sous-domaine | Backend | Port backend |
|---|---|---|
cloud.example.com | Nextcloud (PHP-FPM) | 8080 |
chat.example.com | Mattermost | 8065 |
office.example.com | Collabora CODE | 9980 |
# Caddyfile (extrait)
cloud.example.com {
reverse_proxy nextcloud:8080
request_body {
max_size 16GB
}
}
chat.example.com {
reverse_proxy mattermost:8065
}
office.example.com {
reverse_proxy collabora:9980 {
transport http {
tls_insecure_skip_verify
}
}
}
WebSocket
Le reverse proxy doit supporter le passage transparent des connexions WebSocket pour Mattermost (/api/v4/websocket) et Collabora. Caddy le fait automatiquement. Avec Nginx, ajoutez les headers Upgrade et Connection.
Dimensionnement¶
Petite équipe (< 50 utilisateurs)¶
| Composant | CPU | RAM | Stockage |
|---|---|---|---|
| Nextcloud | 2 vCPU | 2 Go | — |
| Mattermost | 1 vCPU | 512 Mo | — |
| PostgreSQL | 2 vCPU | 2 Go | 50 Go SSD |
| Redis | 0.5 | 256 Mo | — |
| Collabora | 2 vCPU | 2 Go | — |
| MinIO | 1 vCPU | 1 Go | 500 Go |
| Total | 8.5 vCPU | 7.75 Go | 550 Go |
Équipe moyenne (50-200 utilisateurs)¶
| Composant | CPU | RAM | Stockage |
|---|---|---|---|
| Nextcloud | 4 vCPU | 4 Go | — |
| Mattermost | 2 vCPU | 2 Go | — |
| PostgreSQL (x2) | 4 vCPU | 8 Go | 200 Go SSD |
| Redis | 1 vCPU | 1 Go | — |
| Collabora | 4 vCPU | 4 Go | — |
| MinIO (cluster) | 4 vCPU | 4 Go | 2 To |
| Total | 19 vCPU | 23 Go | 2.2 To |
Grande équipe (200+ utilisateurs)¶
Pour les installations de plus de 200 utilisateurs, passez a une architecture haute disponibilité (voir Bonnes pratiques) :
- Nextcloud multi-instance derriere un load balancer
- Mattermost cluster (licence Enterprise)
- PostgreSQL en réplication (primaire + replicas)
- MinIO distribue (4+ nœuds, erasure coding)
- Collabora multi-instance avec load balancing WOPI
Flux réseau¶
| Source | Destination | Port | Protocole | Usage |
|---|---|---|---|---|
| Client | Reverse proxy | 443 | HTTPS | Accès utilisateur |
| Reverse proxy | Nextcloud | 8080 | HTTP | PHP-FPM |
| Reverse proxy | Mattermost | 8065 | HTTP + WS | API + WebSocket |
| Reverse proxy | Collabora | 9980 | HTTP + WS | WOPI + Edition |
| Nextcloud | PostgreSQL | 5432 | TCP | Metadonnees |
| Nextcloud | Redis | 6379 | TCP | Cache + Locking |
| Nextcloud | MinIO | 9000 | HTTPS | Stockage fichiers |
| Nextcloud | Collabora | 9980 | HTTP | WOPI |
| Nextcloud | Keycloak | 443 | HTTPS | OIDC |
| Mattermost | PostgreSQL | 5432 | TCP | Messages |
| Mattermost | MinIO | 9000 | HTTPS | Fichiers joints |
| Mattermost | Keycloak | 443 | HTTPS | OIDC |
| Mattermost | Push Proxy | 8066 | HTTP | Notifications mobiles |
| Push Proxy | APNs | 443 | HTTPS | Push iOS |
| Push Proxy | FCM | 443 | HTTPS | Push Android |