Google Drive, Dropbox, iCloud… còmodes, però les teves dades acaben en servidors d'altri. Nextcloud és l'alternativa de codi obert que et permet tenir el teu propi núvol, al teu servidor, sota el teu control. En aquest article veurem com muntar-lo amb Docker Compose en menys d'una hora, amb MariaDB com a base de dades (l'opció oficial recomanada) i Redis per accelerar la caché.

Què muntarem exactament

El stack complet té quatre contenidors que treballen junts:

  • MariaDB 11.4: base de dades principal, recomanada per la documentació oficial de Nextcloud.
  • Redis 7.2: caché en memòria per a sessions i bloqueig de fitxers. Millora notablement el rendiment.
  • Nextcloud 29: l'aplicació principal amb el servidor web Apache inclòs.
  • Cron: un segon contenidor de Nextcloud que executa les tasques periòdiques en segon pla (índexs, neteja, notificacions).

Requisits previs

Necessites Docker i Docker Compose instal·lats al servidor. Comprova que funcionin correctament:

docker --version
docker compose version

Pas 1 — Crear l'estructura de carpetes

Crea una carpeta per al projecte i una subcarpeta per a les dades dels usuaris:

mkdir -p ~/nextcloud/nextcloud-data
cd ~/nextcloud

L'estructura final serà:

nextcloud/
├── docker-compose.yml
├── .env
└── nextcloud-data/    ← fitxers dels usuaris (al host)

Pas 2 — El fitxer .env

El fitxer .env centralitza totes les variables sensibles. Mai pujis aquest fitxer a un repositori públic. Crea'l i edita els valors marcats amb ⚠️:

# Versions
NEXTCLOUD_VERSION=29-apache
MARIADB_VERSION=11.4
REDIS_VERSION=7.2-alpine

# MariaDB
MYSQL_ROOT_PASSWORD=canvia_root_pass    # ⚠️
MYSQL_DATABASE=nextcloud
MYSQL_USER=nextcloud
MYSQL_PASSWORD=canvia_db_pass           # ⚠️

# Redis
REDIS_PASSWORD=canvia_redis_pass        # ⚠️

# Compte admin de Nextcloud
NC_ADMIN_USER=admin
NC_ADMIN_PASSWORD=canvia_admin_pass     # ⚠️

# URL i xarxa
NC_TRUSTED_DOMAINS=localhost
NC_PROTOCOL=http
NC_HTTP_PORT=8080

# Dades dels usuaris
LOCAL_DATA_PATH=./nextcloud-data

# Límits PHP
PHP_MEMORY_LIMIT=512M
PHP_UPLOAD_LIMIT=10G

Pas 3 — El docker-compose.yml

Crea el fitxer docker-compose.yml. Els healthcheck a MariaDB i Redis garanteixen que Nextcloud no arrenca fins que la base de dades estigui del tot llesta, evitant errors en el primer inici:

services:

  db:
    image: mariadb:${MARIADB_VERSION}
    container_name: nextcloud-db
    restart: unless-stopped
    command: >
      --transaction-isolation=READ-COMMITTED
      --binlog-format=ROW
      --innodb-file-per-table=1
      --skip-innodb-read-only-compressed
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE:      ${MYSQL_DATABASE}
      MYSQL_USER:          ${MYSQL_USER}
      MYSQL_PASSWORD:      ${MYSQL_PASSWORD}
    networks:
      - nextcloud_net
    healthcheck:
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s

  redis:
    image: redis:${REDIS_VERSION}
    container_name: nextcloud-redis
    restart: unless-stopped
    command: redis-server --requirepass ${REDIS_PASSWORD}
    volumes:
      - redis_data:/data
    networks:
      - nextcloud_net
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5

  nextcloud:
    image: nextcloud:${NEXTCLOUD_VERSION}
    container_name: nextcloud-app
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy
    volumes:
      - nextcloud_data:/var/www/html
      - ${LOCAL_DATA_PATH}:/var/www/html/data
    environment:
      MYSQL_HOST:               db
      MYSQL_DATABASE:           ${MYSQL_DATABASE}
      MYSQL_USER:               ${MYSQL_USER}
      MYSQL_PASSWORD:           ${MYSQL_PASSWORD}
      NEXTCLOUD_ADMIN_USER:     ${NC_ADMIN_USER}
      NEXTCLOUD_ADMIN_PASSWORD: ${NC_ADMIN_PASSWORD}
      NEXTCLOUD_TRUSTED_DOMAINS: ${NC_TRUSTED_DOMAINS}
      OVERWRITEPROTOCOL:        ${NC_PROTOCOL}
      OVERWRITECLIURL:          ${NC_PROTOCOL}://${NC_TRUSTED_DOMAINS}
      REDIS_HOST:               redis
      REDIS_HOST_PASSWORD:      ${REDIS_PASSWORD}
      PHP_MEMORY_LIMIT:         ${PHP_MEMORY_LIMIT}
      PHP_UPLOAD_LIMIT:         ${PHP_UPLOAD_LIMIT}
    networks:
      - nextcloud_net
    ports:
      - "${NC_HTTP_PORT}:80"

  cron:
    image: nextcloud:${NEXTCLOUD_VERSION}
    container_name: nextcloud-cron
    restart: unless-stopped
    depends_on:
      - nextcloud
    volumes:
      - nextcloud_data:/var/www/html
      - ${LOCAL_DATA_PATH}:/var/www/html/data
    entrypoint: /cron.sh
    networks:
      - nextcloud_net

volumes:
  db_data:
  redis_data:
  nextcloud_data:

networks:
  nextcloud_net:
    driver: bridge

Pas 4 — Primer arrencada

Amb els dos fitxers a lloc, aixeca els contenidors:

docker compose up -d

El primer cop triga uns 2-3 minuts perquè Docker descarrega les imatges i Nextcloud inicialitza la base de dades. Pots seguir el progrés en temps real:

docker compose logs -f nextcloud

Quan vegis la línia apache2 -D FOREGROUND als logs, Nextcloud ja és actiu. Obre el navegador a http://localhost:8080 i hauries de veure la pantalla de benvinguda.

Pas 5 — Primer accés i verificació

Entra amb l'usuari i contrasenya definits al .env. Un cop dins, verifica que Redis funciona correctament a Administració → Informació del sistema. A l'apartat "Memcache" hauries de veure el caché local i distribuït actius.

Comprova l'estat general dels contenidors:

docker compose ps

Els quatre serveis han d'aparèixer amb estat running.

Pas 6 — Comandes útils del dia a dia

Aturar el stack sense perdre dades:

docker compose down

Actualitzar Nextcloud a una versió nova (canvia la versió al .env i executa):

docker compose pull
docker compose up -d

Executar comandes d'administració amb occ, l'eina CLI de Nextcloud:

docker exec -u www-data nextcloud-app php occ status
docker exec -u www-data nextcloud-app php occ maintenance:mode --on

Passos següents recomanats

Amb el servidor funcionant, hi ha tres millores que val la pena fer aviat:

  • HTTPS amb reverse proxy: afegir Nginx, Traefik o Caddy davant de Nextcloud per servir-ho amb certificat TLS. Imprescindible si el servidor és accessible des d'internet.
  • Dominis de confiança: afegir la IP o el domini real a la variable NC_TRUSTED_DOMAINS del .env i reiniciar.
  • Còpies de seguretat: programar un script que faci mysqldump de la base de dades i comprimi la carpeta nextcloud-data/ periòdicament.

Reflexió final

En menys d'una hora tens un núvol privat funcional, amb la teva pròpia app de fotos, sincronització de fitxers, calendari i contactes. Les dades queden al teu servidor i no marxen a cap lloc. Per al dia a dia a casa o per a un entorn de treball petit, Nextcloud + Docker és una combinació sòlida que no requereix manteniment constant un cop configurat.

Més informació