Nextcloud Docker Compose â Jâutilise cette stack en production pour hĂ©berger mon propre cloud privĂ©. Dans ce guide, je dĂ©taille ma mĂ©thode complĂšte : Nextcloud AIO, reverse proxy Nginx, certificats Letâs Encrypt, sauvegardes Restic et dĂ©ploiement automatisĂ© avec Ansible.
đ Sommaire
- Pourquoi Nextcloud All-in-One plutĂŽt quâune installation classique
- Prérequis : serveur, DNS et Docker
- Le fichier Docker Compose détaillé
- Nginx en reverse proxy avec SSL
- Automatiser le déploiement avec Ansible
- Sauvegardes automatiques avec Restic
- Pipeline GitLab CI pour le déploiement continu
- Sécurisation et durcissement
- Cas dâusage en entreprise
- Erreurs courantes et solutions
- Checklist de mise en production
- FAQ

Nextcloud Docker Compose permet de dĂ©ployer un cloud privĂ© complet en quelques minutes. Avec lâimage All-in-One, vous obtenez Nextcloud, Collabora, Talk et un systĂšme de backup intĂ©grĂ© dans un seul conteneur maĂźtre. Ce guide couvre lâinstallation, la configuration Nginx, les certificats SSL et les sauvegardes automatiques.
JâhĂ©berge mon instance Nextcloud en production sur un VPS Linux depuis plus dâun an. Au fil des itĂ©rations, jâai construit une stack reproductible que je dĂ©ploie avec Ansible et que je livre via GitLab CI. Si vous cherchez un guide pratique pour automatiser le dĂ©ploiement dâune application Docker avec Ansible, vous ĂȘtes au bon endroit.
Pourquoi Nextcloud All-in-One plutĂŽt quâune installation classique
Lâimage Docker classique de Nextcloud demande de configurer sĂ©parĂ©ment la base de donnĂ©es, Redis, le cron, Collabora et le stockage objet. Nextcloud AIO (All-in-One) simplifie tout ça en orchestrant automatiquement les conteneurs nĂ©cessaires Ă partir dâun seul mastercontainer.
ConcrĂštement, AIO gĂšre pour vous :
- PostgreSQL comme base de données (plus performant que MySQL pour Nextcloud)
- Redis pour le cache et le file locking
- Collabora Online pour lâĂ©dition de documents
- Nextcloud Talk pour la visioconférence
- Imaginary pour la génération de miniatures
- BorgBackup intégré pour les sauvegardes
Le compromis : AIO contrĂŽle le cycle de vie des conteneurs via le socket Docker. Ăa veut dire quâil a un accĂšs privilĂ©giĂ© â un point Ă prendre en compte pour la sĂ©curitĂ©.
âčïž Info â Jâutilise lâimage nextcloud/all-in-one en production. Pour un lab de test, la mĂȘme stack fonctionne sur un Vagrant avec 2 Go de RAM minimum.
Prérequis : serveur, DNS et Docker
Avant de lancer le Docker Compose, vous avez besoin de :
- Un VPS Linux (Debian 12/13 ou Ubuntu 22.04+) avec minimum 2 vCPU et 4 Go de RAM
- Docker Engine et Docker Compose v2 installés
- Un nom de domaine avec un enregistrement A pointant vers lâIP du serveur
- Les ports 80 et 443 ouverts dans le firewall
# Installer Docker sur Debian 13
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# Vérifier l'installation
docker --version
docker compose version
Le fichier Docker Compose détaillé
Voici le docker-compose.yml que jâutilise en production. Le mastercontainer Ă©coute sur 127.0.0.1:8080 pour lâinterface dâadministration, et Nextcloud lui-mĂȘme est exposĂ© sur le port 11000 en local â câest Nginx qui se charge du SSL et du routage public.
services:
nextcloud-aio-mastercontainer:
image: nextcloud/all-in-one:latest
init: true
restart: always
container_name: nextcloud-aio-mastercontainer
volumes:
- nextcloud_aio_mastercontainer:/mnt/docker-aio-config
- /var/run/docker.sock:/var/run/docker.sock:ro
ports:
- 127.0.0.1:8080:8080
environment:
- DAILY_BACKUP=1
- APACHE_PORT=11000
- APACHE_IP_BINDING=127.0.0.1
- SKIP_DOMAIN_VALIDATION=true
- NEXTCLOUD_UPLOAD_LIMIT=10G
- NEXTCLOUD_MAX_TIME=3600
- NEXTCLOUD_MEMORY_LIMIT=512M
- NEXTCLOUD_ADDITIONAL_PHP_EXTENSIONS=imagemagick ghostscript
- NEXTCLOUD_ADDITIONAL_APKS=imagemagick ghostscript
volumes:
nextcloud_aio_mastercontainer:
name: nextcloud_aio_mastercontainer
â ïž Attention â Le nom du conteneur nextcloud-aio-mastercontainer et le nom du volume nextcloud_aio_mastercontainer ne doivent jamais ĂȘtre modifiĂ©s. AIO les utilise en dur pour gĂ©rer les mises Ă jour et les sauvegardes.
Points clés de cette configuration :
APACHE_PORT=11000â Nextcloud Ă©coute sur ce port en local, Nginx fait le proxyAPACHE_IP_BINDING=127.0.0.1â EmpĂȘche lâaccĂšs direct sans passer par le reverse proxySKIP_DOMAIN_VALIDATION=trueâ NĂ©cessaire quand on gĂšre le SSL cĂŽtĂ© NginxDAILY_BACKUP=1â Active les sauvegardes BorgBackup quotidiennes intĂ©grĂ©es
Nginx en reverse proxy avec SSL
Je gĂšre le SSL avec Letâs Encrypt via Certbot, et Nginx fait office de reverse proxy devant le conteneur Nextcloud. La configuration que jâutilise en production supporte HTTP/2, les WebSockets (indispensables pour Talk et la collaboration en temps rĂ©el) et un upload illimitĂ© cĂŽtĂ© Nginx.
# /etc/nginx/sites-available/nextcloud.conf
# Redirection HTTP â HTTPS
server {
listen 80;
server_name cloud.example.com;
return 301 https://$host$request_uri;
}
# Configuration HTTPS
server {
listen 443 ssl http2;
server_name cloud.example.com;
ssl_certificate /etc/ssl/certs/cert.pem;
ssl_certificate_key /etc/ssl/private/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
location / {
proxy_pass http://127.0.0.1:11000$request_uri;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
# Upload illimité cÎté Nginx
client_max_body_size 0;
client_body_buffer_size 512k;
proxy_read_timeout 86400s;
# WebSocket support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Les headers X-Forwarded-* sont indispensables pour que Nextcloud dĂ©tecte correctement le protocole HTTPS et lâIP rĂ©elle des utilisateurs. Sans eux, vous aurez des avertissements de sĂ©curitĂ© dans lâinterface dâadministration.
Automatiser le déploiement avec Ansible
Je ne dĂ©ploie jamais Ă la main. Jâai conçu un playbook Ansible qui orchestre toute la stack : Certbot pour les certificats, gestion du SSL, Docker, le Docker Compose, Nginx et les sauvegardes Restic. Un seul ansible-playbook et tout est en place.
Voici la structure du playbook :
---
- name: Deploy Nextcloud
hosts: prod
become: true
vars:
domain_name: "cloud.example.com"
certbot_create_if_missing: true
certbot_certs:
- email: contact@linux-man.fr
domains:
- "{{ domain_name }}"
docker_install_compose: true
deploy_docker_compose_directory: /opt/my_nextcloud
roles:
- certbot
- manage-ssl-certs
- docker
- deploy-docker-compose
- nginx
- restic
- restic-exporter
Chaque rĂŽle est idempotent â je peux relancer le playbook autant de fois que nĂ©cessaire sans casser lâinstallation existante. Câest la base dâune infrastructure maintenable. Si le sujet de la structuration dâun playbook Ansible pour la production vous intĂ©resse, jâai Ă©crit un guide dĂ©diĂ©.
đĄ Astuce â Stockez vos secrets (mots de passe DB, clĂ©s API Restic) dans un fichier chiffrĂ© avec ansible-vault. Passez-le au playbook avec -e "@$SECRETS_VARS" pour ne jamais exposer de credentials dans vos dĂ©pĂŽts.
Sauvegardes automatiques avec Restic
AIO intĂšgre BorgBackup, mais je lui prĂ©fĂšre Restic pour plusieurs raisons : il supporte nativement le stockage objet (S3, Backblaze B2), il est plus simple Ă restaurer et je lâutilise dĂ©jĂ sur toute mon infrastructure.
Ma configuration Restic sauvegarde le rĂ©pertoire /mnt/nextcloud-backup/ qui contient lâexport AIO complet :
# Variables Ansible pour Restic
restic_repository: "s3:s3.eu-west-003.backblazeb2.com/lm-nextcloud-backup"
restic_aws_access_key_id: "{{ vault_b2_access_key }}"
restic_aws_secret_access_key: "{{ vault_b2_secret_key }}"
restic_folders:
- { path: "/mnt/nextcloud-backup/" }
restic_ssh_enabled: false
Jâexpose aussi un Restic Exporter sur le port 9443 (en HTTPS, filtrĂ© par IP) pour surveiller lâĂ©tat des sauvegardes dans Grafana. Si un backup Ă©choue, je suis alertĂ© dans la minute.
# Procédure de restauration
restic restore latest --target /
# L'arborescence /mnt/nextcloud-backup/ est recréée automatiquement
# Puis dans l'interface AIO (https://localhost:8080) :
# â "Restore" â sĂ©lectionner le chemin /mnt/nextcloud-backup/
Pipeline GitLab CI pour le déploiement continu
Chaque modification du docker-compose.yml ou du playbook déclenche un déploiement automatique via GitLab CI. Le pipeline est simple et efficace :
stages:
- deploy
variables:
ANSIBLE_HOST_KEY_CHECKING: "False"
deploy:
stage: deploy
image: registry.gitlab.com/babidi34/ansible:alpine3.18
before_script:
- mkdir /root/.ssh
- echo "$SSH_PRIVKEY_GITLAB_CI" | tr -d '\r' > /root/.ssh/private_key
- chmod 600 /root/.ssh/private_key
- ansible-galaxy install -r requirements.yml
script:
- ansible-playbook deploy_nextcloud.yml -e "@$SECRETS_VARS" -D
rules:
- if: $CI_COMMIT_REF_NAME == "master"
Le flag -D (--diff) affiche les changements appliquĂ©s dans les logs du pipeline â pratique pour un audit rapide de ce qui a changĂ©.
Sécurisation et durcissement
HĂ©berger un cloud privĂ© implique de prendre la sĂ©curitĂ© au sĂ©rieux. Voici les mesures que jâapplique systĂ©matiquement :
đŽ Critique â Le montage /var/run/docker.sock:/var/run/docker.sock:ro donne au mastercontainer un accĂšs en lecture au socket Docker. Câest nĂ©cessaire pour quâAIO gĂšre ses sous-conteneurs, mais ça signifie quâune compromission du conteneur donne potentiellement accĂšs Ă tout Docker. Isolez ce serveur et limitez les accĂšs rĂ©seau.
- Firewall UFW â Seuls les ports 22, 80, 443 et 3478 (Talk) sont ouverts
- Fail2ban â Protection contre le brute-force sur SSH et Nextcloud
- TLS 1.2+ uniquement â Les protocoles obsolĂštes (TLS 1.0/1.1, SSLv3) sont dĂ©sactivĂ©s
- Headers de sĂ©curitĂ© â HSTS, X-Content-Type-Options, X-Frame-Options configurĂ©s dans Nginx
- Mise Ă jour automatique â AIO gĂšre les mises Ă jour de Nextcloud via Watchtower
- 2FA obligatoire â TOTP activĂ© pour tous les comptes administrateurs
Pour aller plus loin sur le durcissement dâun serveur Debian avec Ansible, jâai documentĂ© ma mĂ©thode complĂšte.
Cas dâusage en entreprise
đ
Partage de fichiers sécurisé
Remplacer Google Drive ou Dropbox par une instance auto-hĂ©bergĂ©e. ContrĂŽle total sur la localisation des donnĂ©es â conformitĂ© RGPD garantie.
đ
Ădition collaborative
Collabora Online intĂ©grĂ© permet dâĂ©diter des documents Office directement dans le navigateur, sans licence Microsoft.
đ
Visioconférence interne
Nextcloud Talk offre audio, vidéo et chat sans dépendre de Zoom ou Teams. Les données restent sur votre infrastructure.
đ
Synchronisation multi-postes
Les clients desktop et mobile synchronisent les fichiers en continu. Idéal pour une équipe distribuée en télétravail.
Erreurs courantes et solutions
â « Could not connect to the docker socket »
Cause : Le socket Docker nâest pas montĂ© ou lâutilisateur nâa pas les droits. Solution : VĂ©rifiez que /var/run/docker.sock est bien montĂ© en lecture dans le volume et que le conteneur tourne en tant que root.
â « Reverse proxy not configured correctly »
Cause : Les headers X-Forwarded-* sont absents ou mal configurés. Solution : Ajoutez les 5 headers obligatoires dans votre bloc location / Nginx (voir la section reverse proxy ci-dessus).
â « Upload max filesize exceeded »
Cause : La limite dâupload Nginx ou PHP est atteinte. Solution : Mettez client_max_body_size 0; dans Nginx et NEXTCLOUD_UPLOAD_LIMIT=10G dans le Docker Compose.
â « Access through untrusted domain »
Cause : Le domaine utilisĂ© nâest pas dans la liste des domaines de confiance. Solution : Avec AIO, ajoutez SKIP_DOMAIN_VALIDATION=true si vous gĂ©rez le SSL vous-mĂȘme, ou configurez le domaine dans lâinterface AIO.
Checklist de mise en production
- â Docker Engine et Docker Compose v2 installĂ©s
- â DNS A record pointant vers lâIP du serveur
- â Ports 80 et 443 ouverts dans le firewall
- â Certificat SSL Letâs Encrypt gĂ©nĂ©rĂ©
- â Nginx configurĂ© avec les headers X-Forwarded-*
- â Docker Compose lancĂ©, mastercontainer actif
- â AIO accessible sur https://localhost:8080 via tunnel SSH
- â Domaine configurĂ© et Nextcloud dĂ©marrĂ© via AIO
- â Sauvegardes Restic (ou Borg) configurĂ©es et testĂ©es
- â 2FA activĂ© pour le compte administrateur
- â Fail2ban actif sur SSH et Nextcloud
- â Test de restauration effectuĂ© au moins une fois
Questions fréquentes
â¶ Quelle est la diffĂ©rence entre Nextcloud AIO et lâimage Docker classique ?
Lâimage Docker classique (nextcloud:latest) ne contient que lâapplication PHP. Vous devez configurer vous-mĂȘme la base de donnĂ©es, Redis, le cron et les services annexes. Nextcloud AIO orchestre tous ces composants automatiquement via un mastercontainer qui crĂ©e et gĂšre les sous-conteneurs nĂ©cessaires.
â¶ Peut-on utiliser Nextcloud Docker Compose sur un Raspberry Pi ?
Oui, lâimage AIO supporte ARM64. Un Raspberry Pi 4 avec 4 Go de RAM peut hĂ©berger une instance pour un usage personnel (5-10 utilisateurs max). Au-delĂ , les performances de Collabora et Talk seront limitĂ©es par le CPU ARM.
â¶ Comment migrer depuis une installation Nextcloud existante vers AIO ?
La migration nâest pas automatique. La mĂ©thode recommandĂ©e : exporter vos donnĂ©es et votre base via occ maintenance:mode --on, puis faire un dump SQL et une copie du rĂ©pertoire data. Installez AIO sur un nouveau serveur, puis utilisez la fonction de restauration AIO en pointant vers vos donnĂ©es exportĂ©es.
â¶ Faut-il un reverse proxy devant Nextcloud AIO ?
Ce nâest pas obligatoire â AIO peut gĂ©rer le SSL lui-mĂȘme avec son propre Apache. Mais je recommande fortement un reverse proxy Nginx ou Traefik pour garder le contrĂŽle sur la configuration TLS, ajouter des headers de sĂ©curitĂ© et pouvoir hĂ©berger dâautres services sur le mĂȘme serveur.
â¶ Comment superviser lâĂ©tat de mon instance Nextcloud ?
Jâutilise un Restic Exporter qui expose les mĂ©triques de backup sur un endpoint Prometheus. CĂŽtĂ© Nextcloud, lâAPI /ocs/v2.php/apps/serverinfo/api/v1/info fournit les mĂ©triques systĂšme (CPU, RAM, utilisateurs actifs). Le tout remonte dans Grafana pour avoir un tableau de bord complet.
ⶠNextcloud AIO est-il adapté pour une PME de 50 utilisateurs ?
Absolument. Sur un VPS avec 4 vCPU et 8 Go de RAM, AIO gÚre facilement 50 utilisateurs. Prévoyez un stockage SSD suffisant (ou un montage NFS/S3 pour les fichiers volumineux) et assurez-vous que les sauvegardes sont dimensionnées en conséquence.
Besoin dâaide pour dĂ©ployer Nextcloud en production ?
Je peux vous accompagner dans la mise en place dâun cloud privĂ© sĂ©curisĂ©, automatisĂ© et supervisĂ© â adaptĂ© Ă votre infrastructure.