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 :

  • 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 proxy
  • APACHE_IP_BINDING=127.0.0.1 – Empêche l’accès direct sans passer par le reverse proxy
  • SKIP_DOMAIN_VALIDATION=true – Nécessaire quand on gère le SSL côté Nginx
  • DAILY_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.

Discutons de votre projet →

Laisser un commentaire