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:
sudo systemctl status ssh
Si no está instalado:
sudo apt update
sudo apt install openssh-server -y
Habilitamos y levantamos el servicio:
sudo systemctl enable ssh
sudo systemctl start ssh
Obtenemos la IP del servidor:
ip aAquí 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:
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.
sudo apt install curl net-tools htop git -yConfiguració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:
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.
ip routeIngresamos al archivo de configuración Netplan:
Podemos hacer uso de TAB una vez colocada la ruta de esta forma /etc/netplan/.
sudo nano /etc/netplan/50-cloud-init.yamlDentro del archivo colocamos:
⚠️ ADVERTENCIA: Respetar tal cual los espacios en la configuración de este archivo, una mala indentación rompe Netplan. YAML no perdona.
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_gatewayAplicamos 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.
sudo netplan applyLuego verificamos conectividad:
ping google.comDespliegue 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
sudo apt install apache2 -yLuego verificamos su estado:
sudo systemctl status apache2
Instalación de PHP
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 -yPara verificar que PHP esta activo correctamente, creamos un archivo (info.php).
sudo nano /var/www/html/info.phpY luego colocamos:
<?php
phpinfo();
?>Visitamos la IP en el navegador (http://tu_ip/info.php) y veremos esto:

Instalación de MariaDB
sudo apt install mariadb-server -yAccedemos 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.
sudo mysql_secure_installationLuego 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:
sudo mysqlCreamos base y usuario:
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:
wget https://download.nextcloud.com/server/releases/latest.tar.bz2Instalar bzip2 para la descompresión:
sudo apt install bzip2Descomprimir el archivo:
tar -xfj latest.tar.bz2Movemos el archivo (nextcloud) al Servidor Apache:
sudo mv nextcloud/ /var/www/Luego vamos al directorio:
cd /var/www
Nextcloud requiere que los archivos sean propiedad de Apache:
sudo chown -R www-data:www-data /var/www/nextcloudAjustamos permisos:
sudo chmod -R 775 /var/www/nextcloudQuedaría tal como esto:

Creamos un archivo para configurar Nextcloud:
sudo nano /etc/apache2/sites-available/nextcloud.confLuego le colocamos el código:
No te olvides de colocar en (ServerName) tu IP del servidor.
<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:
sudo a2ensite nextcloud.confDeshabilitamos el sitio por defecto:
sudo a2dissite 000-default.confRecargamos Apache:
sudo systemctl reload apache2Luego hacemos un reseteo del servicio Apache para mostrar cambios:
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









