Nota: Este documento muestra la evolución del proyecto. La primera parte describe la configuración inicial. La sección "Actualización - Diciembre 2025" al final muestra la configuración actual.
Servidor self-hosting (autoalojado) usando una Raspberry Pi 5, diseñado como laboratorio de desarrollo y pruebas. El proyecto combina hardware optimizado (SSD, refrigeración activa) con una arquitectura de software moderna y segura (Nginx, Docker, Cloudflare Tunnel), creando una infraestructura flexible para alojar aplicaciones web Python tanto para acceso público (vía Internet) como privado (red local).
Características principales:
- Alto rendimiento con SSD y 8GB RAM
- Seguridad avanzada sin puertos expuestos
- Acceso público mediante Cloudflare Tunnel
- Acceso local en red doméstica
- Despliegue simplificado con Docker
- SSL/HTTPS automático
- Capacidad para múltiples aplicaciones simultáneas
- Entorno de laboratorio para experimentación
Esta configuración proporciona un entorno de self-hosting completo, escalable y seguro para desarrollar, probar y desplegar aplicaciones web desde casa, con la flexibilidad de ejecutar servicios tanto públicos como privados según las necesidades.
-
Raspberry Pi 5 (8GB RAM)
- Procesador Broadcom BCM2712 Quad-Core Cortex-A76 a 2.4GHz
- 8GB de memoria RAM LPDDR4X
- Wi-Fi 802.11ac de doble banda
- Bluetooth 5.0
- 2 puertos USB 3.0 y 2 puertos USB 2.0
- 2 puertos micro-HDMI
- Puerto Gigabit Ethernet
- Conector GPIO de 40 pines
-
Sistema de refrigeración
- Disipador de calor oficial Raspberry Pi Active Cooler
- Disipador térmico de aluminio anodizado de una sola pieza
- Ventilador controlado por temperatura
- Almohadillas térmicas preaplicadas para óptima transferencia de calor
-
Almacenamiento
- Tarjeta microSD A1 de 256GB con velocidad de transferencia de 150MB/s
-
Carcasa protectora
- Carcasa específica para Raspberry Pi 5 con acceso a todos los puertos
- Aberturas para ventilación adecuada
-
Alimentación
- Cargador oficial Raspberry Pi de 27W (USB-C, 5.1V/5A)
- Cable USB-C de alta calidad para asegurar alimentación estable
Raspberry Pi 5 - Placa base La placa base de la Raspberry Pi 5 antes del montaje
Raspberry Pi 5 con sistema de refrigeración Raspberry Pi 5 con el disipador y ventilador instalados para mantener temperaturas óptimas durante cargas prolongadas
Raspberry Pi 5 en carcasa (abierta) Raspberry Pi 5 instalada en la carcasa con acceso a los componentes internos
Raspberry Pi 5 - Montaje completo Montaje finalizado con la carcasa cerrada, lista para funcionar como servidor
- Descargamos el Raspberry Pi Imager desde la página oficial
- Utilizamos esta herramienta para instalar Raspberry Pi OS en la tarjeta SD de 256GB
- Durante la configuración en el imager, configuramos:
- Usuario y contraseña
- Conexión WiFi (opcional)
- Habilitamos SSH
- Configuramos zona horaria y teclado
- Conectamos la Raspberry Pi a la red mediante cable Ethernet
- Primero localizamos la Raspberry Pi en nuestra red local usando:
ping raspberrypi.local -4
Nota: Este comando nos mostrará la IP dinámica asignada por DHCP (en nuestro caso fue 192.168.1.118). Alternativamente, podemos usar aplicaciones como IP Scanner para Windows.
- Nos conectamos por SSH usando la IP obtenida:
ssh [TU-USUARIO]@192.168.1.118
Nota: En la primera conexión nos pedirá confirmar la autenticidad del host (escribimos 'yes') y luego introducimos nuestra contraseña. Una vez conectados, tendremos acceso remoto a la terminal de la Raspberry Pi desde nuestro ordenador.
sudo raspi-config
- Expandimos el sistema de archivos para usar toda la capacidad de la SD
- Configuramos el autologin para escritorio
- Habilitamos SSH y VNC para acceso remoto
- Configuramos idioma (es_ES.UTF-8), zona horaria (Europa/Madrid) y teclado español
- Configuramos el país (España) para WiFi
sudo nmtui
- Cambiamos la configuración IP de automático a manual
- Configuramos la IP estática fuera del rango DHCP del router (100-200):
- IP: 192.168.1.20/24 (elegimos .20 por estar fuera del rango DHCP del router)
Nota: El /24 indica que usamos una máscara de subred 255.255.255.0, lo que permite 254 dispositivos en nuestra red local
- Puerta de enlace: 192.168.1.1
- DNS: 8.8.8.8, 8.8.4.4
- IP: 192.168.1.20/24 (elegimos .20 por estar fuera del rango DHCP del router)
- Reiniciamos la Raspberry:
sudo reboot
- Verificamos la nueva IP:
ping 192.168.1.20
- Nos conectamos por SSH a la nueva IP estática:
ssh [TU-USUARIO]@192.168.1.20
sudo apt update sudo apt full-upgrade
sudo apt install nginx
sudo systemctl status nginx
sudo apt install ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enablesudo apt install fail2ban sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local sudo nano /etc/fail2ban/jail.local
Editar el archivo con la siguiente configuración:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
Activar el servicio:
sudo systemctl enable fail2ban
sudo systemctl start fail2ban- Creamos una cuenta en No-IP.com (usamos la versión gratuita)
- Configuramos un hostname: [TU-DOMINIO].ddns.net
Nota: Con la cuenta gratuita:
- Puedes usar dominios gratuitos como
.ddns.net,.hopto.org,.sytes.net, etc. - Tienes un límite de 3 hostnames activos
- Debes confirmar cada hostname cada 30 días para mantenerlos activos
- Los dominios personalizados requieren una suscripción de pago
- Puedes usar dominios gratuitos como
cd /usr/local/src sudo wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz sudo tar xzf noip-duc-linux.tar.gz cd noip-* sudo make sudo make install
Durante la instalación configuramos las credenciales de la cuenta No-IP
sudo nano /etc/systemd/system/noip2.service
Contenido del archivo:
[Unit]
Description=No-IP Dynamic DNS Update Client
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/noip2
Restart=always
[Install]
WantedBy=multi-user.target
Activar el servicio:
sudo systemctl daemon-reload
sudo systemctl enable noip2
sudo systemctl start noip2- Accedemos a la interfaz del router
- Configuramos en IPv4 Port Mapping:
- Puerto 80 (HTTP): Redirigido a la IP local del servidor
- Puerto 443 (HTTPS): Redirigido a la IP local del servidor
Verificamos que el servidor es accesible desde Internet visitando:
- http://[TU-DOMINIO].ddns.net
- https://[TU-DOMINIO].ddns.net (después de configurar SSL)
# Instalación de Certbot y el plugin para Nginx sudo apt install certbot python3-certbot-nginx # Obtención del certificado SSL y configuración automática de Nginx sudo certbot --nginx -d [TU-DOMINIO].ddns.net
Durante el proceso de configuración:
- Proporcionamos una dirección de correo electrónico para notificaciones importantes
- Aceptamos los términos de servicio de Let's Encrypt
- El certificado se genera correctamente y se guarda en /etc/letsencrypt/live/[TU-DOMINIO].ddns.net/
- Certbot configura automáticamente Nginx para usar HTTPS
Para comprobar la configuración de renovación automática:
sudo certbot renew --dry-run
Esta configuración proporciona un servidor web básico con Nginx. En futuros documentos o actualizaciones se detallará cómo:
- Configurar entornos virtuales para proyectos Python
- Instalar y configurar frameworks como Django o FastAPI
- Configurar servidores de aplicación como Gunicorn o Uvicorn
- Configurar Nginx como proxy inverso para estas aplicaciones
Esta primera fase se centra en tener un servidor web funcional y seguro con capacidad de servir contenido estático.
sudo apt install unattended-upgrades sudo dpkg-reconfigure unattended-upgrades
- La Raspberry Pi 5 con 8GB de RAM puede manejar entre 6-8 aplicaciones web simultáneamente
- Se accede mediante SSH usando la IP local configurada
- El nombre de dominio configurado en No-IP apunta siempre a nuestra IP pública actual
Almacenamiento: microSD 256GB → SSD Lexar SL300 1TB (USB 3.0)
- 10x más rápido (150 MB/s → 400-500 MB/s)
- Mayor durabilidad y capacidad
Raspberry Pi 5 con SSD externo Raspberry Pi 5 con SSD Lexar SL300 1TB conectado vía USB 3.0
ANTES:
Internet → Router (puertos 80/443 abiertos) → No-IP → Nginx
AHORA:
Internet → Cloudflare Tunnel (cifrado) → Nginx → Docker
| Aspecto | Antes | Ahora |
|---|---|---|
| Almacenamiento | microSD 256GB | SSD Lexar 1TB |
| Dominio | No-IP (gratis) | Dominio propio |
| Puertos abiertos | 80, 443 | Ninguno |
| SSL | Let's Encrypt manual | Automático (Cloudflare) |
| Contenedores | No | Docker + Compose |
| Protección DDoS | No | Sí (Cloudflare) |
- Más seguro: Sin puertos expuestos en el router
- Más rápido: SSD 10x más veloz que microSD
- Más escalable: Docker facilita despliegue de aplicaciones
- SSL automático: Sin configuración manual de certificados
- Protección incluida: DDoS y firewall de Cloudflare
Acceso SSH: ssh [TU-USUARIO]@192.168.1.20
Servicios activos:
- Nginx (puerto 80 interno)
- Docker y Docker Compose
- Cloudflare Tunnel
- UFW Firewall (solo SSH abierto)
- Fail2ban