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 :
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 :
- Sauvegarde automatique de la BDD toutes les heures
- Réplication MinIO vers un second site
- Script de reconstruction automatise (Ansible)
- 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 | ||
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 :
| 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 :
| 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 :
- Identifier le fichier en conflit dans le client desktop (icone d'avertissement)
- Comparer les deux versions (original et conflit)
- Fusionner manuellement les modifications
- 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
UpgradeetConnection - Augmenter les timeouts de connexion (
proxy_read_timeout 3600spour 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 |