Aller au contenu

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