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
La placa base de la Raspberry Pi 5 antes del montaje
Raspberry Pi 5 con el disipador y ventilador instalados para mantener temperaturas óptimas durante cargas prolongadas
Raspberry Pi 5 instalada en la carcasa con acceso a los componentes internos
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 -4Nota: 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.118Nota: 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.20sudo apt update
sudo apt full-upgradesudo apt install nginxsudo systemctl status nginxsudo 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.localEditar 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 installDurante la instalación configuramos las credenciales de la cuenta No-IP
sudo nano /etc/systemd/system/noip2.serviceContenido 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.netDurante 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-runEsta 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 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