Nextcloud Docker Compose : déployer un cloud privé avec Nginx, Ansible et Restic

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.

Nextcloud Docker Compose avec Nginx, Ansible et Restic - architecture cloud prive Linux
Architecture Nextcloud Docker Compose : reverse proxy Nginx, automatisation Ansible et sauvegardes Restic.

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 :

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 :

# 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 :

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.

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.

Discutons de votre projet →

Quitter la version mobile