Nextcloud en raid con ssl y dominio
Instalación de Nextcloud en un servidor con Debian 12, montaje de un raid 5 para almacenar los datos de forma segura y configuración del acceso desde el exterior de forma segura con un certificado SSL.
Introduccion
Este tutorial tiene como objetivo instalar Nextcloud desde cero en un servidor con Debian 12, montar un raid 5 para almacenar los datos de forma segura y configurar el acceso desde el exterior de forma segura con un certificado SSL. Cubriremos los siguientes puntos:
- Instalación y configuración de Debian 12
- Montaje de un raid 5 asegurar la integridad de los datos almacenados
- Configuración de un servidor web con Apache y PHP
- Instalación de Nextcloud
- Configuración de un DDNS para acceder desde el exterior
- Configuración de un certificado SSL con Let’s Encrypt para asegurar la conexión desde el exterior
- Configuración de un firewall para proteger el servidor
- Configuración de un sistema de caché para mejorar el rendimiento de Nextcloud
Este tipo de configuración es ideal para reemplazar servicios como Google Drive, Dropbox o OneDrive, ya que nos permite tener un control total sobre nuestros datos y asegurar su integridad y privacidad.
Requisitos
- Un ordenador viejo que vamos a usar como servidor que idealmente tenga:
- 4GB de RAM o más (mínimo 2gb + 1gb por cada usuario activo).
- 4 núcleos de CPU o más(mínimo recomendado 2).
- 1 disco duro para el sistema operativo (mínimo 15-20gb).
- 3 discos duros para el raid 5, tamaño a elección, que sean de la misma capacidad o similar, puedes calcular el tamaño ideal aquí.
- Acceso a la configuración del router.
- Otro ordenador desde el que acceder y configurar el servidor.
1. Instalar debian 12
1.1. Descargar la imagen de debian 12
Descargar la imagen de debian 12 netinstall desde la página oficial
1.2. Instalar debian 12
Grabar la imagen en un USB con balenaEtcher o Rufus
Instalación
Instalamos el sistema operativo con las opciones que prefiramos, en un disco distinto del que vamos a usar para el raid 5.
Por ultimo, debemos desmarcar la opción de instalar el entorno gráfico. Unicamente instalaremos el sistema base y el servidor SSH.
Una vez finalizada la instalación, reiniciamos el sistema y accedemos con el usuario y la contraseña que hayamos establecido.
2. Montar raid 5
2.1. Instalar mdadm
1
apt install mdadm
2.2. Crear raid 5
Listar los discos
1
fdisk -l
Miramos cuales son los discos que queremos usar para el raid 5, en este caso sda, sdb y sdc.º
1
mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sda /dev/sdb /dev/sdc
Verificar que se ha creado correctamente
1
sudo mdadm --detail /dev/md0
Crear un sistema de archivos
1
mkfs.ext4 /dev/md0
2.3. Montaje del raid 5
Montar el raid
1
2
sudo mkdir -p /mnt/raid
sudo mount /dev/md0 /mnt/raid
Configurar el montaje automático
1
sudo blkid /dev/md0
Nos dará un UUID, lo copiamos y editamos el archivo /etc/fstab
1
sudo nano /etc/fstab
Añadimos la siguiente línea
1
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /mnt/raid ext4 defaults 0 0
Guardar la configuración del raid
1
2
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
sudo update-initramfs -u
3. Asegurar el servidor
3.1. Cambiar el puerto ssh
1
sudo nano /etc/ssh/sshd_config
Y encontraremos la línea
1
# Port 22
La descomentamos y cambiamos el puerto 22 por el que queramos, por ejemplo 2222
1
Port 2222
Guardamos y reiniciamos el servicio
1
sudo systemctl restart sshd
3.2 instalar UFW
1
sudo apt install ufw
Configuramos el firewall, sustituyendo el puerto 2222 por el que hayamos elegido
1
2
3
4
5
6
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 2222/tcp comment 'SSH'
ufw allow http
ufw allow https
sudo ufw enable
Comprobamos que el firewall está activo
1
2
sudo ufw status
# ufw reload # para recargar la configuración en caso de cambios
3.3 Keygen para ssh
En el cliente ejecutamos el siguiente comando, sustituyendo <client_name>
por el nombre elijamos.
1
ssh-keygen -t rsa -b 4096 -C "<client_name>"
Vamos al archivo donde se ha guardado la clave pública y mandamos la clave al servidor
1
cat ~/.ssh/id_rsa.pub
Manda la clave al servidor
1
scp -P 2222 ~/.ssh/id_rsa.pub <user>@<server_ip>:/home/<user>/.ssh/authorized_keys
Nota: Si no existe el directorio .ssh en el servidor, lo creamos
Desde el servidor hacemos que solo se acepten conexiones ssh con clave
1
sudo nano /etc/ssh/sshd_config
Y cambiamos las siguientes líneas
1
2
#PasswordAuthentication yes
#PermitRootLogin yes
Por
1
2
PasswordAuthentication no
PermitRootLogin no
Reiniciamos el servicio
1
sudo systemctl restart sshd
Ahora cuando intentemos acceder al servidor por ssh, deberia localizar la clave privada y no pedirnos la contraseña.
4. Instalar Nextcloud
4.1 Apache, MariaDB y PHP
4.1.1 Instalar apache y mariadb
1
2
sudo apt update
sudo apt install apache2 mariadb-server
Hacemos una instalación segura de mariadb
1
sudo mariadb-secure-installation
A las preguntas respondemos
1
2
3
4
5
6
7
Enter current password for root (enter for none): <root_password>
Switch to unix_socket authentication [Y/n] n
change the root password? [Y/n] n
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y
4.1.2 Preparar la base de datos
1
sudo mariadb -u root
1
2
3
4
5
create database nextcloud;
create user 'nextcloud'@'localhost' identified by '<nextcloud_password>';
grant all privileges on nextcloud.* to 'nextcloud'@'localhost';
flush privileges;
quit
4.1.3 Instalar PHP y módulos necesarios
1
2
3
4
5
6
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt upgrade
sudo apt install php8.2
sudo apt-get install -y php8.2 libapache2-mod-php8.2 libmagickcore-6.q16-6-extra php8.2-mysql php8.2-common php8.2-bz2 php8.2-redis php8.2-dom php8.2-curl php8.2-exif php8.2-fileinfo php8.2-bcmath php8.2-gmp php8.2-imagick php8.2-mbstring php8.2-xml php8.2-zip php8.2-iconv php8.2-intl php8.2-simplexml php8.2-xmlreader php8.2-ftp php8.2-ssh2 php8.2-sockets php8.2-gd php8.2-imap php8.2-soap php8.2-xmlrpc php8.2-apcu php8.2-dev php8.2-cli
4.2 Instalar Nextcloud
4.2.1 Descargar Nextcloud
- Ve a la página de Nextcloud
- Click en COMMUNITY PROJECTS
- En la seccion de Archive click derecho en Get zip file y copia la dirección del enlace
- Descarga el archivo en el servidor
1
wget https://download.nextcloud.com/server/releases/latest.zip
Descomprime el archivo
1
unzip latest.zip -d /var/www
Nota: Si no tienes instalado unzip, instálalo con
sudo apt install unzip
Cambia los permisos
1
2
cd /var/www
sudo chown -R www-data:www-data nextcloud/
4.2.2 Configurar Apache
1
2
3
sudo a2enmod headers env dir mime rewrite
sudo service apache2 restart
systemctl restart apache2 # en caso de que no funcione el anterior
Edita el archivo de configuración de apache
1
sudo nano /etc/apache2/sites-available/000-default.conf
Y añade las siguientes líneas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<VirtualHost *:80>
ServerName tu_dominio.com
DocumentRoot /var/www/nextcloud
<Directory /var/www/nextcloud/>
Require all granted
AllowOverride All
Options FollowSymLinks MultiViews
<IfModule mod_dav.c>
Dav off
</IfModule>
RewriteEngine On
RewriteRule ^/\.well-known/carddav https://%{SERVER_NAME}/remote.php/dav/ [R=301,L]
RewriteRule ^/\.well-known/caldav https://%{SERVER_NAME}/remote.php/dav/ [R=301,L]
RewriteRule ^/\.well-known/host-meta https://%{SERVER_NAME}/public.php?service=host-meta [QSA,L]
RewriteRule ^/\.well-known/host-meta\.json https://%{SERVER_NAME}/public.php?service=host-meta-json [QSA,L]
RewriteRule ^/\.well-known/webfinger https://%{SERVER_NAME}/public.php?service=webfinger [QSA,L]
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Guarda y reinicia apache
1
2
sudo service apache2 restart
sudo systemctl restart apache2 # en caso de que no funcione el anterior
4.2.3 Configurar Nextcloud
4.2.3.1 Configuración del router
Primero recomiendo asignar una dirección IP estática al servidor, esto es posible hacerlo desde la configuración del router. Cada router es diferente, por lo que no puedo dar una guía exacta, pero en la mayoría de los casos se puede hacer desde la sección de DHCP.
4.2.3.2 Configuración de Nextcloud
Accede a la dirección IP del servidor desde un navegador y sigue los pasos de la instalación de Nextcloud.
- Establece el usuario y la contraseña administrador
- Establece la carpeta de datos
- Carpeta de datos: /mnt/raid/nextcloud/data
- Establece la base de datos
- Cuenta de base de datos: nextcloud
- Contraseña de la base de datos: la que hayas establecido
- Nombre de la base de datos: nextcloud
- Servidor: localhost
Nota, si no has creado la carpeta de datos, hazlo con
sudo mkdir -p /mnt/raid/nextcloud/data
y asegúrate de que el usuario www-data tiene permisos de escritura en la carpeta con el comandosudo chown -R www-data:www-data /mnt/raid/nextcloud/data
Una vez termine de cargar le decimos de instalar las aplicaciones recomendadas.
Cuando el proceso termine, podemos solucionar algunos errores que nos aparecerán en la sección de administración.
4.3 Solucionar errores
4.3.1 The PHP memory limit is below the recommended value of 512MB.
Edita el archivo de configuración de PHP
1
sudo nano /etc/php/8.2/apache2/php.ini
Y cambia la línea
1
memory_limit = 128M
Por
1
memory_limit = 512M
4.3.2 Set up Cronjob for Nextcloud
1
sudo crontab -u www-data -e
Y añade la siguiente línea
1
*/5 * * * * php -f /var/www/nextcloud/cron.php
4.3.3 No default phone region set
1
sudo nano /var/www/nextcloud/config/config.php
Y añade la siguiente línea con el código de tu país
1
'default_phone_region' => 'ES',
4.3.4 No memory cache has been configured.
Es muy recomendable configurar un sistema de caché, para ello vamos a usar Redis, que ya fue instalado durante el proceso de instalación de PHP.
Podemos compronbar que Redis está funcionando con el siguiente comando
1
ps ax | grep redis
Si no obtenemos un resultado similar a
1
2488834 ? Ssl 1:24 /usr/bin/redis-server 127.0.0.1:6379
Podemos instalar Redis con
1
sudo apt install redis-server php8.2-redis
Añadimos el usuario www-data al grupo redis y reiniciamos el servicio
1
2
sudo usermod -a -G redis www-data
sudo service apache2 restart
Editamos el archivo de configuración de Nextcloud
1
sudo nano /var/www/nextcloud/config/config.php
Añadimos las siguientes líneas
1
2
3
4
5
6
7
8
'filelocking.enabled' => true,
'memcache.local' => '\\OC\\Memcache\\APCu',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' =>
array (
'host' => '127.0.0.1',
'port' => 6379,
),
Nota: Si en un futuro tienes errores con la subida y edicion de archivos y obtienes errores como “file is locked” o similares, prueba a desactivar el bloqueo de archivos con la siguiente línea
'filelocking.enabled' => false,
Guardamos y reiniciamos apache
1
sudo service apache2 restart
4.3.5 Fix php-imagick warning.
1
2
3
sudo apt remove imagemagick-6-common php-imagick
sudo apt autoremove
sudo apt install imagemagick php-imagick
4.3.6 Fix the PHP module ‘apcu’ is not available.
1
sudo -u www-data php --define apc.enable_cli=1 /var/www/nextcloud/occ maintenance:repair
4.3.7 El servidor no tiene una ventana de mantenimiento configurada
1
sudo nano /var/www/nextcloud/config/config.php
Y añade la siguiente línea
1
'maintenance_window_start' => '4',
Esto hara que la ventana de mantenimiento sea de 4 a 5 de la mañana.
5. Acceso seguro desde el exterior
5.1 Configurar un DDNS
5.1.1 Crear un dominio en DynDNS
- Crear una cuenta en DynDNS
- En el menu DDNS, Dale a sign up
- Option 1: Use Our Domain Name
- Da un nombre a tu dominio
- Guarda el dominio
Añade una tarea a cron para que actualice la IP
1
crontab -e
Añade una linea como la siguiente
1
*/15 * * * * wget -O dynulog -4 "https://api.dynu.com/nic/update?hostname=example.dynu.com&myip=10.0.0.0&myipv6=no&username=someusername&password=somepassword"
Añade el dominio a la configuración de Nextcloud
1
sudo nano /var/www/nextcloud/config/config.php
Y añade la siguiente línea
1
2
3
4
5
6
'trusted_domains' =>
array (
0 => 'xxx.xxx.xxx.xxx',
1 => 'tu_dominio.com',
2 => 'subdominio.tu_dominio.com',
),
Guarda y reinicia apache
1
sudo service apache2 restart
5.2 Configurar un puerto en el router
Una vez has configurado el DDNS, debes configurar el router para permitir el acceso desde el exterior.
- Accede a la configuración del router
- Busca la sección de reenvío de puertos
- Añade una nueva regla
- Nombre: Nextcloud
- Protocolo: TCP
- Puerto externo: 443
- IP interna: la IP del servidor
- Puerto interno: 443
- Guarda la configuración
- Añade una segunda regla
- Nombre: Nextcloud
- Protocolo: TCP
- Puerto externo: 80
- IP interna: la IP del servidor
- Puerto interno: 80
- Guarda la configuración
- Opcionalmente, puedes añadir una regla para el puerto 2222 (o el que eligieras) para acceder por ssh desde el exterior
5.3 SSL (Let’s Encrypt)
Para poder acceder de forma segura a nuestro servidor desde el exterior, necesitamos un certificado SSL. Para ello vamos a usar Let’s Encrypt.
5.3.1 Instalar certbot
1
2
3
sudo apt install snapd
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
5.3.2 Obtener un certificado
Este comando realizara la configuracion necesaria en apache y obtendra un certificado SSL de forma automatica. Tambien configurara la renovacion automatica del certificado.
1
sudo certbot --apache
Si has seguido todo correctamente tu archivo /etc/apache2/sites-available/000-default.conf debería tener una configuración similar a esta
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<VirtualHost *:80>
ServerName your_domain.com
DocumentRoot /var/www/nextcloud
<Directory /var/www/nextcloud/>
Require all granted
AllowOverride All
Options FollowSymLinks MultiViews
<IfModule mod_dav.c>
Dav off
</IfModule>
RewriteEngine On
RewriteRule ^/\.well-known/carddav https://%{SERVER_NAME}/remote.php/dav/ [R=301,L]
RewriteRule ^/\.well-known/caldav https://%{SERVER_NAME}/remote.php/dav/ [R=301,L]
RewriteRule ^/\.well-known/host-meta https://%{SERVER_NAME}/public.php?service=host-meta [QSA,L]
RewriteRule ^/\.well-known/host-meta\.json https://%{SERVER_NAME}/public.php?service=host-meta-json [QSA,L]
RewriteRule ^/\.well-known/webfinger https://%{SERVER_NAME}/public.php?service=webfinger [QSA,L]
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteCond %{SERVER_NAME} =your_domain.com [OR]
RewriteCond %{SERVER_NAME} =your_domain.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
Comprobamos que el certificado se auto-renueva correctamente
1
sudo certbot renew --dry-run
y si todo esta correcto deberiamos ver un mensaje similar a
1
2
3
4
5
6
7
8
9
10
11
12
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/<your_domain>.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Account registered.
Simulating renewal of an existing certificate for <your_domain>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded:
/etc/letsencrypt/live/<your_domain>/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Y con el comando systemctl list-timers
deberiamos ver la siguiente linea
1
Tue 2024-07-23 00:03:00 CEST 9h left - - snap.certbot.renew.timer snap.certbot.renew.service
Que indica que se compronbará la renovación del certificado periodicamente.
6. Conclusiones
Con este tutorial hemos instalado Nextcloud en un servidor con Debian 12, montado un raid 5 para almacenar los datos de forma segura y hemos configurado el acceso desde el exterior de forma segura con un certificado SSL.
Por lo que ahora podemos acceder a nuestros archivos de forma segura desde cualquier lugar y tener la tranquilidad de que nuestros datos están seguros.