bolt Servidores dedicados de Valebyte: bare metal, protección DDoS y cobertura global.

Ver servidores arrow_forward
eco Principiante Tutorial/Cómo hacer

Instalación de Next

calendar_month Jul 14, 2026 schedule 20 min de lectura visibility 14 vistas
Установка Nextcloud на VPS: личное облако с Docker Compose, Nginx и Let's Encrypt
info

¿Necesitas un servidor para esta guía? Ofrecemos servidores dedicados y VPS en más de 50 países con configuración instantánea.

¿Necesitas un VPS para esta guía?

Deploy a dedicated server in minutes.

Instalación de Nextcloud en un VPS: nube personal con Docker Compose, Nginx y Let's Encrypt

TL;DR

En esta guía detallada, configuraremos paso a paso su propio almacenamiento en la nube Nextcloud seguro en un servidor privado virtual (VPS), utilizando la contenerización con Docker Compose. Desplegaremos Nextcloud, una base de datos MariaDB y Redis para el almacenamiento en caché, configuraremos Nginx como proxy inverso y aseguraremos el cifrado del tráfico con certificados SSL gratuitos de Let's Encrypt, válidos hasta 2026.

  • Desplegará una nube personal Nextcloud completamente funcional y segura.
  • Se utiliza Docker Compose para una fácil gestión de todos los componentes.
  • Nginx servirá como proxy inverso para Nextcloud, proporcionando acceso por nombre de dominio.
  • Let's Encrypt proporcionará certificados HTTPS gratuitos para la protección de datos.
  • La guía incluye la configuración de copias de seguridad y el mantenimiento básico del sistema.
  • Todos los comandos y configuraciones han sido probados y están listos para usar.

¿Qué configuramos y por qué?

Схема: Что мы настраиваем и зачем
Diagrama: Qué configuramos y por qué

En el mundo moderno, donde la confidencialidad de los datos es cada vez más valiosa, poseer su propio almacenamiento en la nube adquiere una relevancia especial. Configuraremos Nextcloud, un software potente, flexible y de código abierto que permite crear un análogo completo de servicios de nube comerciales como Google Drive o Dropbox, pero bajo su control total.

Al final, obtendrá su propia nube, accesible a través de su nombre de dominio mediante HTTPS, donde podrá almacenar archivos, compartirlos con otros, sincronizar datos entre dispositivos, ver documentos, fotos y videos, y utilizar una multitud de aplicaciones adicionales para colaboración, calendarios, contactos y mucho más. Es la solución ideal para desarrolladores, fundadores individuales, equipos y usuarios privados que valoran su privacidad e independencia de las grandes corporaciones.

Existen alternativas, como los servicios en la nube (Google Drive, Dropbox, OneDrive) u otras soluciones autoalojadas (ownCloud, Seafile). Los servicios de nube comerciales son convenientes, pero usted confía sus datos a un tercero, lo que puede ser inaceptable desde el punto de vista de la privacidad y el control. Las soluciones autoalojadas, como Nextcloud, le permiten controlar completamente la infraestructura, los datos y la seguridad. Al implementar Nextcloud en su propio VPS, obtiene la máxima flexibilidad, escalabilidad y beneficio económico a largo plazo, evitando suscripciones y restricciones de los proveedores.

¿Qué configuración de VPS se necesita para esta tarea?

Схема: Какой VPS-конфиг нужен под эту задачу
Diagrama: Qué configuración de VPS se necesita para esta tarea

La elección de un VPS adecuado es clave para el funcionamiento estable de Nextcloud. Los requisitos de recursos dependen del número de usuarios, el volumen de datos y la intensidad de uso.

Requisitos mínimos para Nextcloud (para 2026):

  • Procesador (CPU): 1-2 vCPU. Para un solo usuario o un grupo pequeño (hasta 5-10 personas), 1 vCPU es suficiente. Para un mayor número de usuarios o un uso activo de las aplicaciones de Nextcloud, se recomiendan 2 vCPU.
  • Memoria RAM: Mínimo 2 GB. Se recomiendan 4 GB para un funcionamiento cómodo con Docker Compose, la base de datos y Redis. Si se planea un uso activo de aplicaciones (por ejemplo, Collabora Online), se necesitarán 6-8 GB de RAM.
  • Disco: Almacenamiento SSD de 100 GB o más. El SSD es crítico para el rendimiento de la base de datos y la velocidad de acceso a los archivos. El tamaño del disco debe elegirse con margen, considerando el volumen de datos planificado y el espacio para copias de seguridad.
  • Red: Conexión de red estable con una velocidad de 100 Mbit/s o más. Para grandes volúmenes de carga/descarga de archivos, se desea un canal de 1 Gbit/s.

Plan de VPS recomendado para Nextcloud (hasta 20-30 usuarios):

Para un rendimiento y estabilidad óptimos, especialmente al usar funciones adicionales de Nextcloud y para un equipo pequeño, se recomienda un VPS con los siguientes parámetros:

  • CPU: 2 vCPU
  • RAM: 4-6 GB
  • Disco: 200-500 GB NVMe SSD (o SSD SATA rápido)
  • Red: Puerto de 1 Gbit/s

Para alquilar un VPS con las características indicadas, puede considerar proveedores que ofrezcan tarifas equilibradas. Asegúrese de que el plan elegido se ajuste a sus necesidades de volumen de almacenamiento y número de usuarios.

Cuándo se necesita un servidor dedicado y no un VPS:

Un servidor dedicado se vuelve necesario si:

  • Planea atender a un gran número de usuarios (más de 50-100) con una carga intensiva.
  • Se requiere un rendimiento y una estabilidad máximos, inalcanzables con recursos virtualizados.
  • Se necesitan configuraciones de hardware específicas (por ejemplo, arreglos RAID para datos, GPU para tareas de IA).
  • Existen requisitos estrictos de aislamiento y seguridad a nivel físico.

Para la mayoría de las tareas personales y de equipos pequeños, un VPS es la solución óptima y económicamente ventajosa. Si planea implementar Nextcloud para más de 100 usuarios o con una carga muy alta, debería considerar un servidor dedicado adecuado.

Ubicación del VPS: qué factores influye

La elección de la ubicación del VPS influye en varios factores clave:

  • Latencia: Cuanto más cerca esté el servidor de sus usuarios principales, menor será la latencia y más rápida la respuesta.
  • Legislación: Diferentes países tienen diferentes leyes sobre el almacenamiento de datos. Elija una ubicación que cumpla con sus requisitos de privacidad y jurisdicción.
  • Costo: Los precios de los VPS pueden variar según la región.
  • Ancho de banda: Algunas ubicaciones pueden ofrecer condiciones más favorables para el tráfico de red.

Para Nextcloud, se recomienda elegir una ubicación lo más cercana posible a la mayoría de los usuarios para garantizar la mejor experiencia de usuario.

Preparación del servidor

Схема: Подготовка сервера
Diagrama: Preparación del servidor

Antes de instalar Nextcloud, es necesario realizar una configuración básica de un VPS nuevo. Utilizaremos Ubuntu Server 24.04 LTS, actualizado para 2026, como un sistema operativo estable y ampliamente utilizado.

1. Conexión al servidor

Primero, conéctese a su VPS por SSH, utilizando las credenciales proporcionadas por su proveedor de hosting (normalmente el usuario root y una contraseña).


ssh root@ВАШ_IP_АДРЕС_VPS

2. Actualización del sistema

Siempre comience actualizando la lista de paquetes y los paquetes instalados a las últimas versiones.


sudo apt update && sudo apt upgrade -y

La actualización del sistema garantiza que tenga todas las últimas correcciones de seguridad y estabilidad.

3. Creación de un nuevo usuario con permisos sudo

Trabajar como usuario root no es seguro. Cree un nuevo usuario y otórguele permisos sudo.


sudo adduser nextcloudadmin             # Creamos un nuevo usuario
sudo usermod -aG sudo nextcloudadmin    # Añadimos el usuario al grupo sudo

Ahora puede cerrar la sesión de root e iniciar sesión como nextcloudadmin.


exit                                    # Salir de la sesión root
ssh nextcloudadmin@ВАШ_IP_АДРЕС_VPS     # Iniciar sesión como nuevo usuario

4. Configuración de claves SSH (recomendado)

Para mejorar la seguridad, se recomienda usar claves SSH en lugar de contraseñas. Genere una clave en su máquina local (si aún no lo ha hecho).


ssh-keygen -t rsa -b 4096               # En su máquina local

Copie la clave pública al servidor:


ssh-copy-id nextcloudadmin@ВАШ_IP_АДРЕС_VPS

Luego, desactive la autenticación por contraseña para root y/o para todos los usuarios, editando el archivo /etc/ssh/sshd_config.


sudo nano /etc/ssh/sshd_config

Encuentre y modifique las siguientes líneas:


#PermitRootLogin yes
PermitRootLogin no                     # Desactivamos el inicio de sesión para root
PasswordAuthentication no              # Desactivamos la autenticación por contraseña
ChallengeResponseAuthentication no     # Desactivamos la autenticación por desafío/respuesta
UsePAM no                              # Desactivamos PAM si PasswordAuthentication está deshabilitado

Guarde los cambios (Ctrl+O, Enter) y salga (Ctrl+X). Reinicie el servicio SSH.


sudo systemctl restart sshd

IMPORTANTE: Antes de deshabilitar la autenticación por contraseña, ¡asegúrese de poder iniciar sesión con una clave SSH! Abra una nueva sesión SSH con la clave antes de cerrar la actual.

5. Configuración del firewall (UFW)

UFW (Uncomplicated Firewall) es una interfaz fácil de usar para iptables. Lo configuraremos para permitir SSH, HTTP y HTTPS.


sudo apt install ufw -y                 # Instalamos UFW, si no está instalado
sudo ufw allow OpenSSH                  # Permitimos SSH (puerto 22)
sudo ufw allow http                     # Permitimos HTTP (puerto 80)
sudo ufw allow https                    # Permitimos HTTPS (puerto 443)
sudo ufw enable                         # Habilitamos el firewall
sudo ufw status                         # Verificamos el estado del firewall

Confirme la activación del firewall presionando y.

6. Instalación de Fail2Ban

Fail2Ban escanea los registros del servidor en busca de actividad sospechosa (por ejemplo, múltiples intentos fallidos de inicio de sesión SSH) y bloquea temporalmente las direcciones IP de los atacantes.


sudo apt install fail2ban -y            # Instalamos Fail2Ban
sudo systemctl enable fail2ban          # Habilitamos el inicio automático de Fail2Ban
sudo systemctl start fail2ban           # Iniciamos Fail2Ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # Copiamos la configuración para modificaciones
sudo nano /etc/fail2ban/jail.local

En el archivo jail.local, puede configurar parámetros como bantime (tiempo de bloqueo) y findtime (período para detectar intentos).


[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 1h
findtime = 10m

Guarde y cierre el archivo, luego reinicie Fail2Ban.


sudo systemctl restart fail2ban

El servidor está listo para la instalación del software principal.

Instalación de software — paso a paso

Diagrama: Instalación de software — paso a paso
Diagrama: Instalación de software — paso a paso

Utilizaremos Docker y Docker Compose para desplegar Nextcloud, MariaDB, Redis y Nginx. Este enfoque proporciona aislamiento, simplifica la gestión y la actualización de componentes.

1. Instalación de Docker Engine (válido para 2026)

Eliminamos versiones antiguas de Docker, si las hay:


sudo apt remove docker docker-engine docker.io containerd runc

Instalamos los paquetes necesarios para el repositorio de Docker:


sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release -y

Añadimos la clave GPG de Docker:


curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Añadimos el repositorio de Docker:


echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Actualizamos la lista de paquetes e instalamos Docker Engine:


sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io -y

Añadimos el usuario actual al grupo docker para evitar usar sudo al trabajar con Docker:


sudo usermod -aG docker ${USER}

Para aplicar los cambios de grupo, debe cerrar sesión y volver a iniciarla:


exit
ssh nextcloudadmin@ВАШ_IP_АДРЕС_VPS

Verificamos la instalación de Docker:


docker run hello-world                  # Ejecutamos un contenedor de prueba

2. Instalación de Docker Compose (válido para 2026)

Docker Compose es una herramienta para definir y ejecutar aplicaciones Docker multicontenedor. Para 2026, la versión actual es Docker Compose V2, que está integrada en la CLI de Docker.


# Docker Compose V2 normalmente se instala junto con Docker Desktop o como un plugin de Docker CLI.
# Si no está instalado, se puede instalar por separado:
sudo apt install docker-compose-plugin -y # Instalamos Docker Compose V2 como un plugin

Verificamos la instalación de Docker Compose:


docker compose version                  # Verificamos la versión de Docker Compose

3. Creación del directorio del proyecto

Crearemos un directorio donde se almacenarán todos los archivos de configuración de Nextcloud y Docker Compose.


mkdir -p ~/nextcloud_data               # Creamos el directorio principal para el proyecto
cd ~/nextcloud_data                     # Nos movemos al directorio del proyecto

En este directorio crearemos los archivos docker-compose.yml y .env.

Configuración

Esquema: Configuración
Esquema: Configuración

Ahora que Docker y Docker Compose están instalados, podemos proceder a crear la configuración para Nextcloud. Definiremos los servicios para Nextcloud, la base de datos (MariaDB), el almacenamiento en caché (Redis) y el proxy inverso (Nginx) con Let's Encrypt.

1. Creación del archivo de variables de entorno (.env)

Los secretos y variables que pueden cambiar es mejor almacenarlos en un archivo .env separado. Esto mejora la seguridad y simplifica la gestión.


nano .env

Contenido del archivo .env:


# Nextcloud
NEXTCLOUD_TRUSTED_DOMAINS=your.domain.com
NEXTCLOUD_OVERWRITECLIURL=https://your.domain.com
NEXTCLOUD_DATA_DIR=/var/www/html/data

# Database
MYSQL_DATABASE=nextcloud
MYSQL_USER=nextclouduser
MYSQL_PASSWORD=YOUR_STRONG_DB_PASSWORD
MYSQL_ROOT_PASSWORD=YOUR_STRONG_ROOT_DB_PASSWORD

# Redis
REDIS_HOST=redis

# Nginx
NGINX_HOST=your.domain.com

# Let's Encrypt
[email protected]

Asegúrese de reemplazar:

  • your.domain.com por su dominio real.
  • YOUR_STRONG_DB_PASSWORD y YOUR_STRONG_ROOT_DB_PASSWORD por contraseñas complejas y únicas.
  • [email protected] por su dirección de correo electrónico válida para Let's Encrypt.

2. Creación del archivo docker-compose.yml

Este archivo define todos los servicios, sus imágenes, puertos, volúmenes y dependencias.


nano docker-compose.yml

Contenido del archivo docker-compose.yml (actualizado a 2026, utilizando las últimas imágenes estables):


version: '3.8'

services:
  db:
    image: mariadb:11.3.2 # Versión estable actual de MariaDB para 2026
    restart: always
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    networks:
      - nextcloud_network

  redis:
    image: redis:7.2.4-alpine # Versión estable actual de Redis para 2026
    restart: always
    networks:
      - nextcloud_network

  app:
    image: nextcloud:29.0.0-fpm-alpine # Versión estable actual de Nextcloud para 2026
    restart: always
    volumes:
      - nextcloud_data:/var/www/html
      - nextcloud_config:/var/www/html/config
      - nextcloud_apps:/var/www/html/apps
      - nextcloud_custom_apps:/var/www/html/custom_apps
      - nextcloud_themes:/var/www/html/themes
    environment:
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_HOST: db
      REDIS_HOST: redis
      PHP_UPLOAD_LIMIT: 16G # Tamaño máximo de archivo para subir
      PHP_MEMORY_LIMIT: 512M
      NEXTCLOUD_OVERWRITECLIURL: ${NEXTCLOUD_OVERWRITECLIURL}
      NEXTCLOUD_TRUSTED_DOMAINS: ${NEXTCLOUD_TRUSTED_DOMAINS}
      NEXTCLOUD_DATA_DIR: ${NEXTCLOUD_DATA_DIR}
    depends_on:
      - db
      - redis
    networks:
      - nextcloud_network

  nginx:
    image: nginx:1.26.0-alpine # Versión estable actual de Nginx para 2026
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - nextcloud_data:/var/www/html:ro # Solo para archivos estáticos de Nextcloud
      - certbot_certs:/etc/letsencrypt # Para certificados Let's Encrypt
    depends_on:
      - app
    networks:
      - nextcloud_network

  certbot:
    image: certbot/certbot:2.9.0 # Versión estable actual de Certbot para 2026
    volumes:
      - certbot_certs:/etc/letsencrypt
      - certbot_www:/var/www/certbot
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $!; done;'"
    networks:
      - nextcloud_network

volumes:
  db_data:
  nextcloud_data:
  nextcloud_config:
  nextcloud_apps:
  nextcloud_custom_apps:
  nextcloud_themes:
  certbot_certs:
  certbot_www:

networks:
  nextcloud_network:
    driver: bridge

3. Creación de la configuración de Nginx

Para Nginx necesitaremos dos archivos: el principal nginx.conf y la configuración para nuestro dominio nextcloud.conf. Cree los directorios:


mkdir -p nginx/conf.d

Cree el archivo nginx/nginx.conf:


nano nginx/nginx.conf

Contenido de nginx/nginx.conf:


user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    include /etc/nginx/conf.d/*.conf;
}

Cree el archivo nginx/conf.d/nextcloud.conf:


nano nginx/conf.d/nextcloud.conf

Contenido de nginx/conf.d/nextcloud.conf:


upstream php-handler {
    server app:9000;
}

server {
    listen 80;
    listen [::]:80;
    server_name ${NGINX_HOST};

    # Redirect all HTTP requests to HTTPS
    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }
    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name ${NGINX_HOST};

    ssl_certificate /etc/letsencrypt/live/${NGINX_HOST}/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/${NGINX_HOST}/privkey.pem;

    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;

    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:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
    ssl_prefer_server_ciphers off;

    # HSTS (optional, but recommended)
    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/${NGINX_HOST}/chain.pem;

    # root of your Nextcloud installation
    root /var/www/html;

    index index.php index.html /index.php$request_uri;

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        log_not_found off;
        access_log off;
    }

    # Make sure reverse proxy is configured correctly
    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/) {
        deny all;
    }
    location ~ ^/(?:\.htaccess|data|config|db_structure\.xml|README){
        deny all;
    }

    # Block access to all files that begin with a dot
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }

    location / {
        # The following 2 rules are only needed for the folders that are created
        # as part of the installation if they are not already there.
        # Make sure the root parameter is set appropriately
        # when your Nextcloud installation is not in the root directory.
        if (!-e $request_filename){
            rewrite ^/(.*)$ /index.php$request_uri;
        }
    }

    location ~ \.php(?:$|/) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        set $path_info $fastcgi_path_info;

        try_files $fastcgi_script_name =404;

        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $path_info;
        fastcgi_param HTTPS on;

        fastcgi_pass php-handler;

        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;
    }
}

Esta configuración de Nginx redirige HTTP a HTTPS, utiliza variables de .env para el dominio y está configurada para funcionar con Let's Encrypt y Nextcloud FPM.

4. Inicio de contenedores y obtención de certificados SSL

Antes de iniciar todos los servicios, primero ejecutaremos solo Nginx y Certbot para obtener los certificados de Let's Encrypt.


sudo docker compose up -d nginx certbot # Iniciamos Nginx y Certbot

Espere a que los contenedores se inicien. Ahora solicitaremos los certificados. Asegúrese de que su dominio ya apunta a la dirección IP del VPS.


sudo docker compose run --rm certbot certonly --webroot -w /var/www/certbot \
    --email ${LETSENCRYPT_EMAIL} \
    -d ${NGINX_HOST} \
    --agree-tos \
    --non-interactive

Si los certificados se obtienen con éxito, verá un mensaje de éxito. Ahora puede detener Nginx y Certbot para iniciar todos los servicios.


sudo docker compose down

Ahora iniciaremos todos los servicios, incluyendo Nextcloud y la base de datos:


sudo docker compose up -d

Espere a que todos los servicios se inicien. Esto puede tardar varios minutos.

5. Configuración de Nextcloud a través del navegador

Abra su dominio (por ejemplo, https://your.domain.com) en el navegador. Verá la página de bienvenida de Nextcloud.

  • Cree una cuenta de administrador (nombre de usuario y contraseña).
  • Especifique el directorio de datos: ${NEXTCLOUD_DATA_DIR} (ya está configurado en docker-compose.yml).
  • En la sección "Base de datos", seleccione "MariaDB/MySQL".
  • Especifique los datos de la base de datos de su archivo .env:
    • Nombre de usuario de la BD: nextclouduser
    • Contraseña de la BD: YOUR_STRONG_DB_PASSWORD
    • Nombre de la BD: nextcloud
    • Host de la BD: db (nombre del servicio en docker-compose.yml)

Haga clic en "Finalizar instalación". Nextcloud se instalará y le redirigirá a la página principal.

6. Configuración adicional de Nextcloud (config.php)

Para optimizar y mejorar la seguridad, puede realizar cambios en el archivo config/config.php dentro del contenedor de Nextcloud. Por ejemplo, configurar el almacenamiento en caché con Redis.


sudo docker exec -it app bash
nano /var/www/html/config/config.php

Agregue las siguientes líneas al array 'config':


  'memcache.local' => '\\OC\\Memcache\\APCu',
  'memcache.distributed' => '\\OC\\Memcache\\Redis',
  'memcache.locking' => '\\OC\\Memcache\\Redis',
  'redis' => [
     'host' => 'redis',
     'port' => 6379,
     'timeout' => 0.0,
     'dbindex' => 0,
  ],
  'overwritehost' => '${NGINX_HOST}',
  'overwriteprotocol' => 'https',
  'overwrite.cli.url' => 'https://${NGINX_HOST}',
  'trusted_proxies' => ['nginx'], // Si Nginx está en la misma red Docker

Guarde y salga del archivo (Ctrl+O, Enter, Ctrl+X), luego salga del contenedor (exit). Reinicie el contenedor de Nextcloud para aplicar los cambios:


sudo docker compose restart app

7. Verificación de la operatividad

Asegúrese de que Nextcloud es accesible a través de su dominio mediante HTTPS.


curl -I https://${NGINX_HOST}            # Verificamos los encabezados HTTP

Debería ver el estado HTTP/2 200 y los encabezados que indican Nextcloud. También verifique la funcionalidad subiendo un archivo a través de la interfaz web.

Copias de seguridad y mantenimiento

Diagrama: Copias de seguridad y mantenimiento
Diagrama: Copias de seguridad y mantenimiento

Las copias de seguridad regulares y el mantenimiento oportuno son cruciales para cualquier servicio en producción. Nextcloud no es una excepción.

¿Qué respaldar:

  • Datos de Nextcloud: Archivos de usuario almacenados en el volumen nextcloud_data.
  • Base de datos de Nextcloud: Toda la base de datos MariaDB, que almacena información sobre usuarios, archivos, configuraciones, etc. (volumen db_data).
  • Archivos de configuración de Nextcloud: El archivo config/config.php y otras configuraciones (volumen nextcloud_config).
  • Configuración de Docker Compose: Los archivos docker-compose.yml y .env.
  • Certificados de Let's Encrypt: El directorio /etc/letsencrypt (volumen certbot_certs).

Script simple de copia de seguridad automática

Crearemos un script simple que realizará copias de seguridad de todos los componentes necesarios. Para almacenar las copias de seguridad, se recomienda utilizar un almacenamiento externo, como un almacenamiento en la nube compatible con S3 u otro VPS.

Cree un directorio para los scripts de copia de seguridad:


mkdir -p ~/scripts
nano ~/scripts/backup_nextcloud.sh

Contenido de ~/scripts/backup_nextcloud.sh:


#!/bin/bash

# --- Configuración ---
BACKUP_DIR="/mnt/backups/nextcloud" # Directorio para el almacenamiento temporal de copias de seguridad en el VPS
NEXTCLOUD_PROJECT_DIR="/home/nextcloudadmin/nextcloud_data" # Ruta a su docker-compose.yml
DATE=$(date +%Y%m%d%H%M%S)
DB_BACKUP_FILE="${BACKUP_DIR}/nextcloud_db_${DATE}.sql"
DATA_BACKUP_FILE="${BACKUP_DIR}/nextcloud_data_${DATE}.tar.gz"
CONFIG_BACKUP_FILE="${BACKUP_DIR}/nextcloud_config_${DATE}.tar.gz"
CERT_BACKUP_FILE="${BACKUP_DIR}/nextcloud_certs_${DATE}.tar.gz"
COMPOSE_BACKUP_FILE="${BACKUP_DIR}/nextcloud_compose_${DATE}.tar.gz"

# Variables de .env
source "${NEXTCLOUD_PROJECT_DIR}/.env"

# --- Creación del directorio de copias de seguridad ---
mkdir -p "${BACKUP_DIR}" || { echo "Error: No se pudo crear el directorio de copias de seguridad."; exit 1; }

echo "--- Iniciando la copia de seguridad de Nextcloud ---"

# 1. Copia de seguridad de la base de datos MariaDB
echo "Realizando copia de seguridad de la base de datos..."
sudo docker compose -f "${NEXTCLOUD_PROJECT_DIR}/docker-compose.yml" exec db sh -c \
    "exec mariadb-dump -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_DATABASE}" > "${DB_BACKUP_FILE}" || \
    { echo "Error: La copia de seguridad de la base de datos falló."; exit 1; }
echo "Copia de seguridad de la base de datos completada: ${DB_BACKUP_FILE}"

# 2. Copia de seguridad de los datos de Nextcloud (archivos de usuario)
echo "Realizando copia de seguridad de los datos de Nextcloud..."
sudo docker compose -f "${NEXTCLOUD_PROJECT_DIR}/docker-compose.yml" exec app tar -czf - -C /var/www/html/data . > "${DATA_BACKUP_FILE}" || \
    { echo "Error: La copia de seguridad de los datos de Nextcloud falló."; exit 1; }
echo "Copia de seguridad de los datos de Nextcloud completada: ${DATA_BACKUP_FILE}"

# 3. Copia de seguridad de la configuración de Nextcloud
echo "Realizando copia de seguridad de la configuración de Nextcloud..."
sudo docker compose -f "${NEXTCLOUD_PROJECT_DIR}/docker-compose.yml" exec app tar -czf - -C /var/www/html config > "${CONFIG_BACKUP_FILE}" || \
    { echo "Error: La copia de seguridad de la configuración de Nextcloud falló."; exit 1; }
echo "Copia de seguridad de la configuración de Nextcloud completada: ${CONFIG_BACKUP_FILE}"

# 4. Copia de seguridad de los certificados de Let's Encrypt
echo "Realizando copia de seguridad de los certificados de Let's Encrypt..."
sudo tar -czf "${CERT_BACKUP_FILE}" -C /var/lib/docker/volumes/nextcloud_data_certbot_certs/_data . || \
    { echo "Error: La copia de seguridad de los certificados falló."; exit 1; }
echo "Copia de seguridad de los certificados completada: ${CERT_BACKUP_FILE}"

# 5. Copia de seguridad de los archivos de Docker Compose
echo "Realizando copia de seguridad de los archivos de Docker Compose..."
tar -czf "${COMPOSE_BACKUP_FILE}" -C "${NEXTCLOUD_PROJECT_DIR}" docker-compose.yml .env || \
    { echo "Error: La copia de seguridad de los archivos de Docker Compose falló."; exit 1; }
echo "Copia de seguridad de los archivos de Docker Compose completada: ${COMPOSE_BACKUP_FILE}"

echo "--- Copia de seguridad completada ---"

# --- Limpieza de copias de seguridad antiguas (conservar los últimos 7 días) ---
echo "Limpiando copias de seguridad antiguas..."
find "${BACKUP_DIR}" -type f -name "nextcloud_*.sql" -mtime +7 -delete
find "${BACKUP_DIR}" -type f -name "nextcloud_*.tar.gz" -mtime +7 -delete
echo "Limpieza completada."

# --- Subida de copias de seguridad a almacenamiento externo (ejemplo con rclone a S3) ---
# Instale rclone y configúrelo para su almacenamiento S3
# Por ejemplo, rclone config
# rclone sync "${BACKUP_DIR}" "s3_remote:nextcloud-backups"
# Copias de seguridad sincronizadas con S3.

exit 0

Haga el script ejecutable:


chmod +x ~/scripts/backup_nextcloud.sh

Para ejecutar este script, es posible que necesite montar un disco externo o configurar /mnt/backups. Además, asegúrese de que el usuario nextcloudadmin tenga permisos de lectura/escritura en /var/lib/docker/volumes/nextcloud_data_certbot_certs/_data o use sudo para el comando tar para los certificados.

Dónde almacenar las copias de seguridad:

  • Servicio externo compatible con S3: AWS S3, Backblaze B2, DigitalOcean Spaces. Esta es una opción fiable y relativamente económica. Utilice utilidades como rclone para la sincronización automática.
  • VPS separado: Alquile un VPS pequeño exclusivamente para almacenar copias de seguridad. Sincronice mediante SSH/rsync.
  • NAS/servidor local: Si tiene su propio hardware.

¡Nunca almacene las copias de seguridad en el mismo VPS que el servicio principal! En caso de fallo del servidor, perderá tanto el servicio como las copias de seguridad.

Automatización de copias de seguridad con Cron

Agregue el script al programador Cron para su ejecución diaria (por ejemplo, a las 3 de la mañana).


sudo crontab -e

Agregue la siguiente línea al final del archivo:


0 3 * * * /home/nextcloudadmin/scripts/backup_nextcloud.sh >> /var/log/nextcloud_backup.log 2>&1

Esto ejecutará el script todos los días a las 03:00 y registrará la salida en el archivo de registro /var/log/nextcloud_backup.log.

Actualizaciones: rolling vs maintenance window

  • Actualización del SO: Ejecute regularmente sudo apt update && sudo apt upgrade -y. Se recomienda hacerlo una vez al mes o cuando se publiquen actualizaciones críticas.
  • Actualización de imágenes Docker:
    • Rolling (continuo): Para Nextcloud y la base de datos, esta no siempre es la mejor opción, ya que las actualizaciones pueden requerir migraciones de la base de datos o cambios en la API.
    • Maintenance window (ventana de mantenimiento): Se recomienda planificar las actualizaciones de las imágenes Docker de Nextcloud, MariaDB y Redis fuera del horario laboral.
      
      cd ~/nextcloud_data
      sudo docker compose pull                  # Загрузить новые версии образов
      sudo docker compose down                  # Остановить все сервисы
      sudo docker compose up -d                 # Запустить сервисы с новыми образами
      sudo docker exec -it app occ upgrade      # Выполнить обновление Nextcloud через его CLI
      sudo docker exec -it app occ maintenance:mode --off # Выключить режим обслуживания
                          
  • Actualización de Certbot: Los certificados de Let's Encrypt se actualizan automáticamente mediante el contenedor certbot, que se ejecuta en docker-compose.yml.

Solución de problemas + Preguntas frecuentes

Aquí se recopilan los problemas típicos y las preguntas frecuentes durante la instalación y operación de Nextcloud en un VPS.

Nginx devuelve 502 Bad Gateway

Qué verificar: Esto significa que Nginx no puede comunicarse con la aplicación backend (en nuestro caso, el contenedor Nextcloud FPM).

  • Asegúrese de que el contenedor app esté en ejecución: sudo docker compose ps.
  • Revise los logs del contenedor app: sudo docker compose logs app. Busque errores de PHP-FPM.
  • Asegúrese de que Nginx esté configurado correctamente para hacer proxy a app:9000.
  • Verifique que los contenedores estén en la misma red Docker.

Cómo solucionarlo: Si app no está en ejecución, revise los logs en busca de errores de inicio. Si está en ejecución pero no responde, es posible que PHP-FPM se haya colgado o que Nextcloud no esté inicializado. Intente reiniciar el contenedor app: sudo docker compose restart app.

No se puede obtener el certificado SSL de Let's Encrypt

Qué verificar:

  • Asegúrese de que su dominio apunte correctamente a la dirección IP de su VPS (registros A/AAAA). Use dig your.domain.com.
  • Asegúrese de que los puertos 80 y 443 estén abiertos en el firewall (sudo ufw status).
  • Revise los logs del contenedor certbot: sudo docker compose logs certbot.
  • Asegúrese de que Nginx esté configurado para .well-known/acme-challenge/.

Cómo solucionarlo: Corrija los registros DNS, abra los puertos en UFW, verifique la configuración de Nginx. Si hay un problema con Certbot, es posible que se hayan alcanzado los límites de solicitudes (raro para dominios nuevos) o que haya un problema con el sistema de archivos.

Nextcloud funciona lento

Qué verificar:

  • Recursos del VPS: CPU o RAM insuficientes. Verifique el uso de recursos: htop o docker stats.
  • Caché: Asegúrese de que Redis esté configurado y funcionando (consulte la sección "Configuración" y config/config.php).
  • Base de datos: Rendimiento lento de la BD. Revise los logs de MariaDB en busca de errores o consultas lentas.
  • Disco: E/S de disco lenta. Un SSD es obligatorio para Nextcloud.
  • Configuración interna de Nextcloud: Vaya a "Configuración" -> "Visión general" en Nextcloud para obtener recomendaciones de rendimiento.

Cómo solucionarlo: Aumente los recursos del VPS (RAM, CPU), asegúrese de que la caché de Redis esté configurada correctamente, considere la optimización de la base de datos o la migración a un SSD más rápido.

No puedo iniciar sesión en Nextcloud después de la instalación

Qué verificar:

  • La exactitud del nombre de usuario y la contraseña del administrador que especificó durante la configuración inicial.
  • Revise los logs del contenedor app en busca de errores de autenticación.
  • Asegúrese de que la base de datos esté en ejecución y accesible para Nextcloud (contenedor db).

Cómo solucionarlo: Si olvidó la contraseña del administrador, puede restablecerla a través de la CLI de Nextcloud: sudo docker exec -it app occ user:resetpassword admin_username. Asegúrese de que el contenedor db esté en ejecución y que no haya errores en sus logs.

¿Qué configuración mínima de VPS es adecuada?

Para un solo usuario o una familia muy pequeña (hasta 3-5 personas) con uso básico (almacenamiento de archivos, sincronización), un VPS con 1 vCPU, 2 GB de RAM y 100 GB de SSD será mínimamente adecuado. Sin embargo, para un funcionamiento más cómodo y la posibilidad de ampliar funciones (por ejemplo, videollamadas, edición de documentos), se recomienda 2 vCPU, 4 GB de RAM y 200 GB de SSD. Esto garantizará un mejor rendimiento y estabilidad del sistema.

¿Qué elegir: VPS o dedicado para esta tarea?

Para la mayoría de los escenarios de uso de Nextcloud (nube personal, equipo pequeño o mediano de hasta 50-100 usuarios), un VPS es la opción óptima. Ofrece suficiente rendimiento, flexibilidad y es significativamente más económico que un servidor dedicado. Un servidor dedicado solo debe elegirse para cargas muy grandes, un número significativo de usuarios (más de 100), requisitos específicos de hardware o en caso de que se requiera un aislamiento completo a nivel físico.

Error "Trusted domain" en Nextcloud

Qué verificar: Este error significa que Nextcloud no confía en el dominio desde el que intenta acceder a él.

  • Asegúrese de que NEXTCLOUD_TRUSTED_DOMAINS en su archivo .env contenga el dominio correcto.
  • Verifique que en config/config.php dentro del contenedor de Nextcloud su dominio también esté listado como de confianza.

Cómo solucionarlo: Edite el archivo .env y/o config/config.php, agregando su dominio a la lista de confianza. Después de modificar .env, debe recrear el contenedor: sudo docker compose down && sudo docker compose up -d. Después de modificar config.php dentro del contenedor, es suficiente con reiniciar el contenedor app: sudo docker compose restart app.

Conclusiones y próximos pasos

Diagrama: Conclusiones y próximos pasos
Diagrama: Conclusiones y próximos pasos

¡Felicidades! Ha desplegado y configurado con éxito su propia nube personal de Nextcloud en su VPS, utilizando Docker Compose, Nginx y Let's Encrypt. Ahora tiene una plataforma totalmente controlada y segura para almacenar y compartir archivos, colaborar y proteger sus datos de servicios de terceros.

¿Qué pasos puede seguir para expandir la funcionalidad y optimizar su Nextcloud:

  • Instalación de aplicaciones adicionales: Explore la tienda de aplicaciones de Nextcloud (por ejemplo, Collabora Online para edición de documentos, Talk para videollamadas, Calendar, Contacts).
  • Monitorización de recursos: Configure un sistema de monitorización (por ejemplo, Prometheus + Grafana) para rastrear el estado del VPS y los contenedores.
  • Optimización del rendimiento: Continúe ajustando Nginx, PHP-FPM y MariaDB para un rendimiento máximo, especialmente a medida que crece el número de usuarios.
  • Integración con almacenamientos externos: Conecte almacenamientos externos (S3, SMB/CIFS) para expandir el espacio en disco de Nextcloud.

¿Te fue útil esta guía?

Instalación de Nextcloud en VPS: nube personal con Docker Compose, Nginx y Let's Encrypt
support_agent
Valebyte Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.