Aller au contenu

Bonnes pratiques

Opérer Nextcloud et Mattermost en production — haute disponibilité, sauvegarde, gestion du stockage, onboarding et depannage.


Haute disponibilité

Nextcloud multi-instance

Pour éliminer le point unique de défaillance, deployez plusieurs instances Nextcloud derriere un load balancer :

graph TB
    LB["Load Balancer<br/>(HAProxy / Caddy)"]
    NC1["Nextcloud 1"]
    NC2["Nextcloud 2"]
    Redis["Redis Sentinel"]
    PG["PostgreSQL<br/>(primaire + replica)"]
    S3["MinIO distribue"]

    LB --> NC1
    LB --> NC2
    NC1 --> Redis
    NC2 --> Redis
    NC1 --> PG
    NC2 --> PG
    NC1 --> S3
    NC2 --> S3

Conditions prealables :

Composant Exigence
Stockage fichiers Backend S3 obligatoire (pas de stockage local)
Sessions PHP Stockees dans Redis (pas sur le filesystem)
File locking Via Redis (déjà configure)
Cron Execute sur une seule instance (desactive sur les autres)

Configuration des sessions Redis :

// config/config.php (ajout)
'session_handler' => '\\OC\\Session\\Redis',

Mattermost cluster

Le clustering Mattermost necessite la licence Enterprise. En mode Team Edition, la haute disponibilité se fait par reconstruction rapide :

Stratégie Licence requise RPO RTO
Instance unique Team 1h 30 min
Cluster actif-actif Enterprise 0 < 1 min
Cold standby Team 1h 15 min

Pour la version Team Edition, privilegiez un cold standby :

  1. Sauvegarde automatique de la BDD toutes les heures
  2. Réplication MinIO vers un second site
  3. Script de reconstruction automatise (Ansible)
  4. DNS failover (TTL court, 60s)

Sauvegarde et restauration

Stratégie de sauvegarde

Composant Méthode Fréquence Retention
PostgreSQL (NC + MM) pg_dump compresse Toutes les heures 30 jours
MinIO (fichiers) mc mirror incrementiel Quotidien 90 jours
Configuration Nextcloud Copie config/ À chaque modification Illimitée
Configuration Mattermost Copie config.json À chaque modification Illimitée
Redis Snapshot RDB Toutes les heures 7 jours
Volumes Podman podman volume export Hebdomadaire 30 jours

Script de sauvegarde

#!/bin/bash
# backup-collaboration.sh
set -euo pipefail

BACKUP_DIR="/backup/collaboration/$(date +%F)"
mkdir -p "${BACKUP_DIR}"

# PostgreSQL Nextcloud
podman exec nc-postgres pg_dump -U nextcloud nextcloud | \
    gzip > "${BACKUP_DIR}/nextcloud-db.sql.gz"

# PostgreSQL Mattermost
podman exec mm-postgres pg_dump -U mattermost mattermost | \
    gzip > "${BACKUP_DIR}/mattermost-db.sql.gz"

# Configuration
cp -r ~/collaboration/nextcloud/config/ "${BACKUP_DIR}/nc-config/"
cp -r ~/collaboration/mattermost/config/ "${BACKUP_DIR}/mm-config/"

# MinIO (incrementiel)
mc mirror --newer-than "24h" minio/nextcloud "${BACKUP_DIR}/nc-files/"
mc mirror --newer-than "24h" minio/mattermost "${BACKUP_DIR}/mm-files/"

# Chiffrement
gpg --symmetric --cipher-algo AES256 \
    --batch --passphrase-file /etc/backup-key \
    --output "${BACKUP_DIR}.tar.gz.gpg" \
    <(tar czf - -C "$(dirname ${BACKUP_DIR})" "$(basename ${BACKUP_DIR})")

# Nettoyage du repertoire temporaire
rm -rf "${BACKUP_DIR}"

echo "Sauvegarde terminee : ${BACKUP_DIR}.tar.gz.gpg"

Restauration

# Dechiffrer
gpg --decrypt --batch --passphrase-file /etc/backup-key \
    /backup/collaboration/2026-04-16.tar.gz.gpg | tar xzf -

# Restaurer PostgreSQL
cat nextcloud-db.sql.gz | gunzip | \
    podman exec -i nc-postgres psql -U nextcloud nextcloud

cat mattermost-db.sql.gz | gunzip | \
    podman exec -i mm-postgres psql -U mattermost mattermost

# Restaurer les fichiers
mc mirror /backup/2026-04-16/nc-files/ minio/nextcloud
mc mirror /backup/2026-04-16/mm-files/ minio/mattermost

# Restaurer la configuration
cp -r nc-config/* ~/collaboration/nextcloud/config/
cp -r mm-config/* ~/collaboration/mattermost/config/

# Redemarrer les services
cd ~/collaboration/nextcloud && podman-compose restart
cd ~/collaboration/mattermost && podman-compose restart

# Scanner les fichiers Nextcloud
podman exec -u www-data nextcloud php occ files:scan --all

Gestion du stockage

Quotas utilisateur

Definissez des quotas par defaut et par groupe :

# Quota par defaut : 5 Go
podman exec -u www-data nextcloud php occ config:app:set files \
    default_quota --value="5 GB"

# Quota par groupe
podman exec -u www-data nextcloud php occ user:setting alice \
    files quota "10 GB"
Groupe Quota recommande
developers 10 Go
opérations 10 Go
management 20 Go
external 1 Go

Nettoyage automatique

# Purger les fichiers en corbeille de plus de 30 jours
podman exec -u www-data nextcloud php occ trashbin:cleanup --all-users

# Supprimer les anciennes versions de fichiers
podman exec -u www-data nextcloud php occ versions:cleanup

Automatisez via un timer systemd hebdomadaire :

# ~/.config/systemd/user/nextcloud-cleanup.service
[Unit]
Description=Nextcloud storage cleanup

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'podman exec -u www-data nextcloud php occ trashbin:cleanup --all-users && podman exec -u www-data nextcloud php occ versions:cleanup'

Cycle de vie S3

Si vous utilisez MinIO avec un backend S3 compatible, configurez des regles de cycle de vie pour archiver les fichiers anciens :

# Deplacer les fichiers non accedes depuis 180 jours vers un tier froid
mc ilm rule add --transition-days 180 --storage-class GLACIER \
    minio/nextcloud

Onboarding utilisateur

Auto-provisioning depuis Keycloak

Quand un utilisateur se connecte via OIDC pour la première fois, Nextcloud et Mattermost creent automatiquement son compte. Configurez le mapping des attributs :

Attribut Keycloak Nextcloud Mattermost
preferred_username UID Username
name Display name Full name
email Email Email
groups Groups (via claim) Teams (via plugin)

Dossiers pre-configures

Creez une structure de dossiers par defaut pour chaque nouvel utilisateur via un script de provisioning :

#!/bin/bash
# provision-user.sh <username>
USER=$1

podman exec -u www-data nextcloud php occ files:mkdir "${USER}/files/Documents"
podman exec -u www-data nextcloud php occ files:mkdir "${USER}/files/Projets"
podman exec -u www-data nextcloud php occ files:mkdir "${USER}/files/Partages"

Guide de demarrage

Fournissez aux nouveaux utilisateurs un document d'accueil couvrant :

  • URL des services (cloud.example.com, chat.example.com)
  • Installation du client desktop Nextcloud et de l'app mobile Mattermost
  • Configuration CalDAV dans Thunderbird / DAVx5
  • Conventions de nommage des fichiers et canaux

Migration depuis Google Workspace / Microsoft 365

Migration des fichiers

Source Outil Méthode
Google Drive rclone rclone copy gdrive: nextcloud:
OneDrive rclone rclone copy onedrive: nextcloud:
SharePoint rclone rclone copy sharepoint: nextcloud:
Export Google (MBOX) Nextcloud Mail import Import MBOX dans Nextcloud Mail
# Exemple : migration Google Drive vers Nextcloud via rclone
rclone copy gdrive:/ /mnt/nextcloud-import/ --progress

# Puis scanner dans Nextcloud
podman exec -u www-data nextcloud php occ files:scan --all

Migration des messages

Source Outil Format
Slack mattermost-data-warehouse Import natif
Microsoft Teams Export Teams + mmctl import JSONL
Rocket.Chat Export JSON + script de conversion JSONL
# Import Slack dans Mattermost
podman exec mattermost mmctl import upload slack-export.zip
podman exec mattermost mmctl import process <job-id>

Performance

PHP OPcache

Verifiez que OPcache est actif et correctement dimensionne :

podman exec nextcloud php -i | grep opcache
Parametre Valeur recommandee
opcache.enable 1
opcache.memory_consumption 128
opcache.interned_strings_buffer 16
opcache.max_accelerated_files 10000
opcache.revalidate_freq 60

Redis

Surveillez l'utilisation mémoire de Redis :

podman exec nc-redis redis-cli info memory
Metrique Seuil d'alerte
used_memory > 80 % de maxmemory
evicted_keys > 0
connected_clients > 100

PostgreSQL

Parametres de performance essentiels :

Parametre Valeur recommandee (8 Go RAM)
shared_buffers 2GB
effective_cache_size 6GB
work_mem 16MB
maintenance_work_mem 512MB
max_connections 200

Depannage

Conflits de synchronisation

Symptome : des fichiers (conflit) apparaissent dans les dossiers synchronises.

Cause : deux clients ont modifie le même fichier avant la synchronisation.

Résolution :

  1. Identifier le fichier en conflit dans le client desktop (icone d'avertissement)
  2. Comparer les deux versions (original et conflit)
  3. Fusionner manuellement les modifications
  4. Supprimer le fichier (conflit)

Prevention : privilegier l'edition en ligne (Collabora) pour les documents collaboratifs — la co-edition temps reel elimine les conflits.

Uploads lents

Symptome : les fichiers volumineux mettent tres longtemps a s'uploader.

Diagnostic :

# Verifier la limite upload du reverse proxy
curl -sI https://cloud.example.com | grep -i "client-max-body"

# Verifier la limite PHP
podman exec nextcloud php -i | grep upload_max_filesize

Corrections courantes :

Parametre Fichier / Service Valeur recommandee
client_max_body_size Nginx 16G
request_body max_size Caddy 16GB
upload_max_filesize PHP (php.ini) 16G
post_max_size PHP (php.ini) 16G
max_input_time PHP (php.ini) 3600
max_execution_time PHP (php.ini) 3600

Problèmes WebSocket

Symptome : Mattermost affiche "connexion perdue" de manière intermittente, ou les messages n'arrivent pas en temps reel.

Diagnostic :

# Tester la connexion WebSocket
curl -i -N \
    -H "Connection: Upgrade" \
    -H "Upgrade: websocket" \
    -H "Sec-WebSocket-Version: 13" \
    -H "Sec-WebSocket-Key: dGVzdA==" \
    https://chat.example.com/api/v4/websocket

Corrections courantes :

  • Vérifier que le reverse proxy passe les headers Upgrade et Connection
  • Augmenter les timeouts de connexion (proxy_read_timeout 3600s pour Nginx)
  • Vérifier qu'aucun WAF ou proxy intermédiaire ne bloque les WebSockets

Notifications push mobiles

Symptome : les notifications n'arrivent pas sur les appareils mobiles.

Diagnostic :

# Verifier les logs du push proxy
podman logs mattermost-push-proxy --tail 50

# Tester la connectivite vers APNs/FCM
curl -v https://fcm.googleapis.com/fcm/send

Corrections courantes :

Problème Solution
Push proxy non configure Vérifier MM_EMAILSETTINGS_PUSHNOTIFICATIONSERVER
Certificat APNs expire Renouveler dans le portail Apple Developer
Cle FCM invalide Régénérer dans la console Firebase
App non officielle Compiler avec les bonnes cles push

Checklist operationnelle

Tâche Fréquence Commande / Action
Sauvegarde BDD Toutes les heures backup-collaboration.sh
Sauvegarde fichiers Quotidienne mc mirror
Nettoyage corbeille Hebdomadaire php occ trashbin:cleanup --all-users
Nettoyage versions Hebdomadaire php occ versions:cleanup
Mise à jour conteneurs Mensuelle podman-compose pull && podman-compose up -d
Vérification certificats TLS Mensuelle curl -sI https://cloud.example.com
Revue des partages externes Trimestrielle Console admin Nextcloud > Partages
Test de restauration Trimestrielle Restauration complète sur environnement de test
Revue des quotas Semestrielle php occ user:list --output=json + analyse stockage