How to install Nextcloud on an OVHcloud VPS with Docker and Traefik

Knowledge Base

How to install Nextcloud on an OVHcloud VPS with Docker and Traefik


Icons/System/eye-open Created with Sketch. 10 Views 04.02.2026 Virtual Private Servers

Objective

This guide is aimed at intermediate to advanced users wishing to deploy Nextcloud in a more robust architecture, closer to a production environment.

At the end of this guide, you will have:

  • A Nextcloud instance accessible via HTTPS
  • Automatic Let’s Encrypt certificates
  • A persistent Docker stack (Nextcloud + MariaDB + Redis)
  • A Traefik v2 reverse-proxy

Target architecture (simplified)

  • OVHcloud VPS (Ubuntu)
  • Docker and Docker Compose
  • Traefik v2 (HTTPS reverse-proxy)
  • Nextcloud (Apache)
  • MariaDB (database)
  • Redis (cache and locks)

Requirements

  • An OVHcloud VPS offer under Ubuntu 22.04 LTS
  • Access via SSH with sudo rights
  • A domain name (e.g., cloud.example.com) pointing to the VPS IP
  • Ports 80 and 443 must be open
  • A valid email address for Let’s Encrypt

Instructions

Table of contents:

Step 1: Preparing the VPS

sudo apt update && sudo apt upgrade -y
sudo apt install -y ca-certificates curl ufw

Allow the required ports:

sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

Step 2: Installing Docker

curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
newgrp docker

Step 3: Deploying Traefik

Create the directory structure:

sudo mkdir -p /opt/stack/traefik
cd /opt/stack/traefik

Create the traefik.yml file:

entryPoints:
  web:
    address: ":80"
  websecure:
    address: ":443"

certificatesResolvers:
  letsencrypt:
    acme:
      email: admin@example.com
      Storage: /letsencrypt/acme.json
      httpChallenge:
        entryPoint: web

providers:
  docker:
    exposedByDefault: false

Create the Traefik docker-compose.yml:

services:
  traefik:
    image: traefik:v2.11
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./traefik.yml:/etc/traefik/traefik.yml:ro
      - ./letsencrypt:/letsencrypt
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - proxy

networks:
  proxy:
    external: true
docker network create proxy
docker compose up -d

Step 4: Deploying Nextcloud

sudo mkdir -p /opt/stack/nextcloud
cd /opt/stack/nextcloud

Create a .env file:

NC_DOMAIN=cloud.example.com
NC_ADMIN_USER=admin
NC_ADMIN_PASSWORD=change-admin-password
DB_NAME=nextcloud
DB_USER=nextcloud
DB_PASSWORD=change-db-password
DB_ROOT_PASSWORD=change-root-password

Create the Nextcloud docker-compose.yml:

services:
  db:
    image: mariadb:11
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
    volumes:
      - db_data:/var/lib/MySQL

  Redis:
    image: Redis:7-alpine
    restart: unless-stopped

  app:
    image: nextcloud:apache
    restart: unless-stopped
    depends_on:
      - db
      - Redis
    environment:
      MYSQL_HOST: db
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      REDIS_HOST: Redis
      NEXTCLOUD_ADMIN_USER: ${NC_ADMIN_USER}
      NEXTCLOUD_ADMIN_PASSWORD: ${NC_ADMIN_PASSWORD}
      NEXTCLOUD_TRUSTED_DOMAINS: ${NC_DOMAIN}
    volumes:
      - nextcloud_html:/var/www/html
      - nextcloud_data:/var/www/html/data
    networks:
      - proxy
    labels:
      - traefik.enable=true
      - traefik.http.routers.nextcloud.rule=Host(`${NC_DOMAIN}`)
      - traefik.http.routers.nextcloud.entrypoints=websecure
      - traefik.http.routers.nextcloud.tls.certresolver=letsencrypt

volumes:
  db_data:
  nextcloud_html:
  nextcloud_data:

networks:
  proxy:
    external: true
docker compose up -d

Step 5: Post-installation checks

  • Access https://cloud.example.com
  • Check the HTTPS certificate
  • Enable Cron mode in the Nextcloud settings
  • Check Redis in the administration interface

Conclusion

Traefik is not mandatory, but it is an excellent practice for:

  • Managing multiple HTTPS services on the same VPS
  • Automating Let’s Encrypt certificates
  • Centralising routing and security

For a first deployment or personal use, the guide for beginner users is sufficient.

For advanced or multi-service use, this guide is recommended.

Go further

Traefik documentation

Nextcloud documentation

Secure an OVHcloud VPS

Join our community of users.

Related articles