Nube Privada en Linux Server (NAS + Nextcloud)

por | Feb 5, 2026 | HomeLab, Infraestructura

Implementación real de un servidor NAS + nube privada desplegado sobre Ubuntu Server, pensado desde una mentalidad sysadmin y no como un simple experimento de laboratorio.

El objetivo no fue hacer que funcione, sino entender cada capa del sistema: hardware, red, sistema operativo y servicios. El resultado es un homelab estable, escalable y controlado, capaz de reemplazar soluciones comerciales cerradas manteniendo soberanía total sobre los datos.

Hardware utilizado

  • Motherboard: Asus Prime B460M‑A R2.0.
  • CPU: Intel Celeron G5925.
  • RAM: 16 GB (4×4 ADATA DDR4).
  • SSD: 240 GB (SO).
  • HDD: 2 TB (datos).
  • Fuente: Corsair CV450.

Decisión: Separar sistema y datos mejora mantenibilidad y reduce riesgos.

Objetivos técnicos

  • Comprender el funcionamiento del hardware.
  • Implementar un NAS funcional sobre Linux Server.
  • Administrar el sistema de forma remota.
  • Diseñar una red doméstica coherente.
  • Aplicar conceptos reales de TCP/IP, DHCP y OSI.
  • Desplegar una nube privada completamente propia.

Instalación del sistema operativo

Se inicia el servidor desde BIOS con un pendrive booteable de Ubuntu Server.

Una vez completada la instalación:

  • Se retira el USB.
  • El sistema queda funcionando de forma permanente.
  • Toda la administración se realiza en modo headless.

Acceso remoto seguro (SSH)

A primera vista, tener un monitor y un teclado conectados directamente a tu servidor (lo que llamamos acceso on-premise o local) parece la opción más segura y directa. Sin embargo, en el mundo de la administración de sistemas, el SSH (Secure Shell) no es solo una alternativa, es el estándar de oro por varias razones prácticas y de seguridad.

Verificamos si el servicio está activo:

Bash
sudo systemctl status ssh

Si no está instalado:

Bash
sudo apt update
sudo apt install openssh-server -y

Habilitamos y levantamos el servicio:

Bash
sudo systemctl enable ssh
sudo systemctl start ssh

Obtenemos la IP del servidor:

Bash
ip a

Aquí tenemos la IP de nuestro servidor que se representa de esta manera:

Y ahora nos conectamos remotamente, en este caso yo lo he hecho desde mi PC en la PowerShell:

Bash
ssh tu_user@tu_ip

A partir de este punto el servidor puede vivir en un rack, placard o cualquier lugar sin periféricos.

Instalación de herramientas base

Paquetes esenciales para administración:

  • Curl: Realiza solicitudes http/https.
  • Net-Tools: Incluyen comandos clásicos como (ifconfig, netstat, route, arp) permite configurar y administrar la red, permitiendo ver interfaces, tablas de enrutamiento, conexiones y estadísticas.
  • Htop: Es el monitor interactivo de los recursos de la CPU.
  • Git: Copia y Clona repositorios de código fuente.
Bash
sudo apt install curl net-tools htop git -y

Configuración de red (IP estática)

El protocolo de red DHCP asigna automáticamente direcciones IP dinámicas y de duración limitada a dispositivos que se conectan a una red. Para evitar que cambie la IP del Servidor haremos uso de IP estática.

Primero identificamos la interfaz de red:

Bash
ip link show

Aquí se verá la interfaz de red.

Antes de pasar a la siguiente configuración debemos saber nuestro (Gateway) que es la dirección IP de nuestro router, es decir, la puerta de enlace que actúa como punto de salida para el tráfico de datos.

Bash
ip route

Ingresamos al archivo de configuración Netplan:

Podemos hacer uso de TAB una vez colocada la ruta de esta forma /etc/netplan/.

Bash
sudo nano /etc/netplan/50-cloud-init.yaml

Dentro del archivo colocamos:

YAML
network:
  version: 2
  ethernets:
    ens33:
      dhcp4: no
      addresses:
        - tu_ip_de_red/24
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4
      routes:
        - to: 0.0.0.0/0
          via: tu_gateway

Aplicamos cambios:

Es posible que la conexión SSH se cierre luego de aplicar los cambios, si se cierra acceder nuevamente por SSH con la nueva IP asignada.

Bash
sudo netplan apply

Luego verificamos conectividad:

Bash
ping google.com

Despliegue de Nextcloud

Instalación de Apache, PHP y MariaDB.

  • Apache: Es un Servidor Web que entrega paginas web y contenido a los navegadores a través de internet, gestionando las peticiones HTTP.
  • PHP: Se encarga de autenticación, permisos, subida y descarga de archivos, Apps, encriptación, etc.
  • MariaDB: Guarda todo lo importante en la base de datos, usuarios, contraseñas (hasheadas), metadatos, actividad, etc.

💡 Podría usarse Nginx, pero Apache es suficiente y reduce complejidad en este escenario.

Instalación de Apache

Bash
sudo apt install apache2 -y

Luego verificamos su estado:

Bash
sudo systemctl status apache2

Instalación de PHP

Bash
sudo apt install php php-gd php-mysql php-curl php-mbstring php-intl php-gmp php-bcmath php-xml php-imagick php-zip php-apcu php-json -y

Para verificar que PHP esta activo correctamente, creamos un archivo (info.php).

Bash
sudo nano /var/www/html/info.php

Y luego colocamos:

PHP
<?php
phpinfo();
?>

Visitamos la IP en el navegador (http://tu_ip/info.php) y veremos esto:

Instalación de MariaDB

Bash
sudo apt install mariadb-server -y

Accedemos al asistente de seguridad. Su objetivo es eliminar configuraciones peligrosas por defecto que traen las instalaciones nuevas, especialmente si el servidor va a estar en producción o accesible por red.

Bash
sudo mysql_secure_installation

Luego marcamos estas opciones:

Enter current password for root (enter for none):

  • Te pide la contraseña actual del usuario root de MariaDB.
  • En instalaciones nuevas de Ubuntu/MariaDB (desde ~10.4 en adelante), no hay contraseña porque usa autenticación por socket Unix (solo el usuario root de Linux puede entrar con sudo mariadb sin password).

Switch to unix_socket authentication? [Y/n] n

  • Pregunta si querés cambiar a autenticación por socket Unix (la más segura para root local).
  • En este caso ya estaba activada (por eso dice: You already have your root account protected)
  • En Ubuntu 24.04+ ya viene así por defecto, no hace falta cambiar.

Change the root password? [Y/n] y

  • Te pregunta si querés cambiar/establecer una contraseña para el usuario root de MariaDB.
  • colocamos y (sí), ponemos una nueva contraseña fuerte y luego la confirmamos.
  • Importante: Ahora root tiene contraseña (además del socket). Esto es buena práctica si planeás conectarte remotamente alguna vez o desde scripts.

Remove anonymous users? [Y/n] y

  • Elimina usuarios anónimos (cuentas sin nombre de usuario, como @localhost o @%).
  • Por defecto existen para facilitar pruebas, pero permiten que cualquiera en la máquina (o red si no está bien bind) entre sin contraseña.
  • colocamos y → Eliminados. Excelente, elimina un vector de ataque común.

Disallow root login remotely? [Y/n] y

  • Prohíbe que el usuario root pueda conectarse desde fuera del servidor (solo desde localhost).
  • Por defecto, root puede intentar loguearse remotamente (root@%), lo cual es peligroso si alguien adivina la contraseña.
  • colocamos y → Ahora root solo puede conectarse localmente. nunca expongas root por red.

Remove test database and access to it? [Y/n] y

  • Borra la base de datos de prueba llamada test (y sus privilegios).
  • Viene por defecto y cualquiera (incluyendo anónimos) puede escribir/leer en ella.
  • colocamos y → Eliminada. Perfecto, quita otra puerta abierta innecesaria.

Reload privilege tables now? [Y/n] y

  • Recarga las tablas de privilegios para que todos los cambios (eliminaciones, contraseñas, etc.) se apliquen inmediatamente.
  • colocamos y → Cambios efectivos al instante.

Accedemos a MariaDB:

Bash
sudo mysql

Creamos base y usuario:

SQL
CREATE DATABASE nextcloud
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_general_ci;

CREATE USER 'nextclouduser'@'localhost'
  IDENTIFIED BY 'tu_contraseña';

GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextclouduser'@'localhost';

FLUSH PRIVILEGES;
EXIT;

Descarga e instalación de Nextcloud

Descargamos el paquete:

Bash
wget https://download.nextcloud.com/server/releases/latest.tar.bz2

Instalar bzip2 para la descompresión:

Bash
sudo apt install bzip2

Descomprimir el archivo:

Bash
tar -xfj latest.tar.bz2

Movemos el archivo (nextcloud) al Servidor Apache:

Bash
sudo mv nextcloud/ /var/www/

Luego vamos al directorio:

Bash
cd /var/www

Nextcloud requiere que los archivos sean propiedad de Apache:

Bash
sudo chown -R www-data:www-data /var/www/nextcloud

Ajustamos permisos:

Bash
sudo chmod -R 775 /var/www/nextcloud

Quedaría tal como esto:

Creamos un archivo para configurar Nextcloud:

Bash
sudo nano /etc/apache2/sites-available/nextcloud.conf

Luego le colocamos el código:

Apache
<VirtualHost *:80>
    ServerName IP_DEL_SERVIDOR
    DocumentRoot /var/www/nextcloud

    <Directory /var/www/nextcloud>
        Require all granted
        AllowOverride All
        Options FollowSymLinks MultiViews
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/nextcloud_error.log
    CustomLog ${APACHE_LOG_DIR}/nextcloud_access.log combined
</VirtualHost>

Este código que ves es un bloque de configuración de VirtualHost para el servidor web Apache. Específicamente, define cómo Apache debe servir tu instalación de Nextcloud cuando alguien accede al servidor por el puerto 80 (HTTP). En pocas palabras: le dice a Apache: Cuando llegue una petición HTTP al puerto 80, sirve los archivos de Nextcloud desde esta carpeta, aplica estas reglas de acceso y seguridad, y registra los logs aquí.

Habilitamos el sitio de NextCloud:

Bash
sudo a2ensite nextcloud.conf

Deshabilitamos el sitio por defecto:

Bash
sudo a2dissite 000-default.conf

Recargamos Apache:

Bash
sudo systemctl reload apache2

Luego hacemos un reseteo del servicio Apache para mostrar cambios:

Bash
sudo systemctl restart apache2

Visualización de Nextcloud

Colocamos la IP de nuestro Servidor en el navegador (http://tu_ip)

Visualizamos Nextcloud:

Conclusión

Este proyecto demuestra que con hardware accesible y software libre es posible construir una solución robusta, flexible y completamente bajo control propio.

Futuros Posts sobre Nextcloud y el Servidor:

  • HTTPS/TLS
  • DNS
  • Firewalls
  • Fail2ban
  • Monitoreo

Todo el proceso prioriza criterio sysadmin, entendimiento real y soberanía tecnológica.

GabrielGR

Categorías

Etiquetas

Te pueden interesar

Te pueden interesar

Categorías

Etiquetas