Documentando el self hosting: Episodio 1
Hace años, si querías tener tu propio servidor en casa, necesitabas una habitación entera, un suministro eléctrico trifásico y unos conocimientos de redes que no estaban al alcance de cualquiera. Hoy, con una Raspberry Pi 5 (o un mini PC de 150€) y un poco de paciencia, puedes tener corriendo más servicios de los que usarías en tu día a día.
Y sin embargo, la mayoría de la gente prefiere pagar una suscripción mensual por servicios que podrían tener gratis en su propia casa. No les culpo: configurar un servidor no es trivial y mantenerlo requiere tiempo. Pero para los que disfrutamos cacharreando, el self-hosting es una droga de la que no quieres salir.
Por qué empecé con esto
Corría 2019. Estaba harto de Google, harto de que mis datos estuvieran en manos de empresas cuyo modelo de negocio es venderme, harto de que un servicio que usaba a diario cerrase porque "no era rentable". Así que empecé a mudarme a mis propios servidores.
Empecé con lo básico: un Nextcloud para reemplazar Google Drive, un Bitwarden (Vaultwarden, para ser exactos) para contraseñas, y un Jitsi para videollamadas (qué tiempos aquellos del confinamiento). Todo en una Raspberry Pi 4 con 4GB de RAM, metida en una esquina de mi despacho en Bergen, conectada por Ethernet a un router cutre de Telia.
La experiencia fue... instructiva. La primera semana fue genial. La segunda, cuando la SD card de la Raspberry dijo basta y se corrompió, aprendí la importancia de los backups y de usar un SSD en lugar de una SD card. La tercera semana, cuando Telia me cambió la IP sin previo aviso y me quedé sin acceso remoto, aprendí sobre DDNS. La cuarta, lo aprendí sobre rate limiting cuando mi dominio acabó en varias listas negras de spam porque mi servidor de correo estaba mal configurado.
Cada problema me enseñaba algo nuevo. Y lo mejor: cada vez que solucionaba uno, mi infraestructura se volvía un poquito más robusta.
El setup actual
Hoy, cinco años después, mi infraestructura de self-hosting ha evolucionado bastante. Esto es lo que tengo corriendo:
Hardware
Servidor principal: Mini PC Beelink SER5 (Ryzen 7 5800H, 32GB RAM, 1TB NVMe)
→ Consumo: ~25W en idle, ~45W en carga
→ Coste: 380€ (Amazon, 2023)
→ SO: Arch Linux (porque soy un glotonas del dolor)
Servidor secundario: VPS en Hetzner (2 vCPU, 4GB RAM, 80GB SSD)
→ Coste: 5.90€/mes
→ SO: Debian 12
→ Función: DNS, email, túneles WireGuard, monitoring
NAS: Synology DS220+ (2x 4TB en RAID 1)
→ Backup frío y almacenamiento multimedia
Software (los servicios que realmente uso)
| Servicio | Función | Contenedor? |
|---|---|---|
| Vaultwarden | Gestor de contraseñas | Sí |
| Nextcloud | Sincronización de archivos | Sí |
| Jellyfin | Servidor multimedia | Sí |
| Gitea | Git self-hosted | Sí |
| Miniflux | Lector RSS | Sí |
| FreshRSS | Lector RSS (alternativo) | Sí |
| Nginx Proxy Manager | Reverse proxy + SSL | Sí |
| Pi-hole | DNS sinkhole (en red local) | No (bare metal) |
| Uptime Kuma | Monitorización | Sí |
| Homepage | Dashboard de servicios | Sí |
| Grafana + Prometheus | Métricas del sistema | Sí |
| Paperless-ngx | Digitalización de documentos | Sí |
Sí, son muchos servicios. Pero cada uno lo he ido añadiendo cuando lo necesitaba, no por tener el servidor lleno de cosas que no uso. El truco está en no caer en la trampa de instalar servicios "por si acaso" — eso solo añade superficie de ataque y mantenimiento.
La arquitectura: Docker compose es tu amigo (y tu enemigo)
Todo corre en Docker, orquestado con Docker Compose. La estructura de directorios es simple:
/docker/
├── compose/
│ ├── vaultwarden/
│ │ ├── docker-compose.yml
│ │ ├── .env
│ │ └── data/
│ ├── nextcloud/
│ ├── jellyfin/
│ ├── gitea/
│ └── ...
├── networks/
│ ├── proxy.yml # Red compartida para el reverse proxy
│ └── internal.yml # Red interna para servicios que no necesitan internet
└── proxy/
└── docker-compose.yml # Nginx Proxy Manager
Cada servicio tiene su propio directorio con su docker-compose.yml y su .env. Esto hace que sea fácil añadir, quitar o actualizar servicios sin afectar al resto.
La red proxy es compartida: todos los servicios que necesitan ser accesibles desde fuera se conectan a ella, y Nginx Proxy Manager les hace de puerta de entrada con SSL automático.
# docker-compose.yml de ejemplo: Vaultwarden
version: '3.8'
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
volumes:
- ./data:/data
environment:
- DOMAIN=https://pass.midominio.com
- SIGNUPS_ALLOWED=false
- ADMIN_TOKEN=${ADMIN_TOKEN}
networks:
- proxy
- internal
networks:
proxy:
external: true
internal:
external: true
El problema del email (y por qué casi tiro la toalla)
Si hay algo que odio del self-hosting es el email. Configurar un servidor de correo tú mismo en 2024 es una pesadilla. Los grandes proveedores (Gmail, Outlook, Yahoo) tienen políticas antispam tan agresivas que acabas en listas negras aunque tus correos sean legítimos.
Lo intenté. Configuré Postfix + Dovecot, configuré DKIM, SPF, DMARC, reverse DNS... y aun así, los correos de mi servidor acababan en spam el 60% de las veces. Pasé más tiempo debugueando deliverabilidad de correos que desarrollando mis proyectos.
Solución: rendirme y usar un servicio de email transaccional. Ahora uso SendGrid para correos transaccionales (registros, notificaciones) y tengo una cuenta de ProtonMail para mi correo personal. No es self-hosting puro, pero es un compromiso que merece la pena.
Lo que he aprendido (y lo que me hubiera gustado saber antes)
1. La seguridad es responsabilidad tuya
Cuando self-hosteas, tú eres el CISO, el DevOps, el admin de sistemas y el desarrollador. Una vulnerabilidad en tu servidor expone tus datos y los de cualquiera que use tus servicios. Esto significa:
- Mantén todo actualizado. No duermas con actualizaciones pendientes.
- Usa contenedores con non-root users. No ejecutes nada como root dentro del contenedor.
- Segmenta las redes. Los servicios que no necesitan internet no deberían tener acceso a ella.
- Rate limiting y fail2ban. Asume que te van a escanear. Bloquea a los que insisten.
- Backups, backups, backups. 3-2-1: tres copias, dos soportes diferentes, una fuera del sitio.
2. La electricidad no es gratis
Un mini PC de 25W funcionando 24/7 cuesta unos 2-3€ al mes en electricidad (en Noruega, que tenemos precios... volátiles). Suma el VPS, el NAS, el router, el switch, y al final tienes 15-20€/mes en infraestructura. No es caro comparado con suscripciones, pero no es cero.
3. La fiabilidad de tu conexión importa
Si tu internet de casa se cae, te quedas sin acceso a todo. Por eso tengo el VPS en Hetzner: hace de punto de entrada con WireGuard, y si mi conexión de casa falla, al menos el email y el DNS siguen funcionando.
Además, el VPS me permite tener una IP pública fija (mi ISP usa CG-NAT, así que no tengo IP pública en casa) y absorbe el tráfico antes de que llegue a mi servidor.
4. Documenta TODO
Te prometo que dentro de 6 meses no vas a recordar por qué configuraste ese parámetro en ese servicio. Llevo un wiki personal (en Obsidian, sincronizado con el servidor vía WebDAV) donde apunto:
- Comandos útiles
- Configuraciones que me costaron encontrar
- Errores y sus soluciones
- Topología de red
- Contraseñas de servicios internos (en Vaultwarden, obviamente)
5. No todo tiene que ser self-hosted
Y esto es importante. No caigas en el purismo. Hay servicios que simplemente funcionan mejor como SaaS y no merece la pena replicarlos:
- Email transaccional (SendGrid, Mailgun, Resend)
- Monitorización externa (Better Uptime, Pingdom)
- CDN (Cloudflare)
- DNS (si no quieres complicarte con tu propio bind9)
Lo importante no es hostearlo todo, sino hostear aquello que te da control real sobre tus datos. El resto, que lo hagan otros.
Vale, ¿y cómo empiezo?
Si estás leyendo esto y te pica el gusanillo del self-hosting, mi recomendación es:
- Consíguete un VPS barato. Hetzner, Netcup, o incluso un Oracle Cloud free tier (si consigues que te acepten la tarjeta de crédito). 5-10€/mes es suficiente para empezar.
- Instala Docker y Docker Compose. La documentación oficial es buena, no hace falta que reinventes la rueda.
- Empieza con UN servicio. Vaultwarden es un gran candidato: útil, fácil de configurar, y te da una victoria rápida.
- Configura el reverse proxy. Nginx Proxy Manager o Caddy. Que tenga SSL desde el día 1.
- Añade monitorización. Uptime Kuma te avisará si algo deja de funcionar.
- Documenta lo que haces. Antes de que se te olvide.
Servicios específicos: configuración real
Ya que estoy en plan documentación, voy a dejar aquí la configuración de los servicios que más uso, por si a alguien le sirve de referencia.
Vaultwarden: el que nunca debería fallar
Vaultwarden es, para mí, el servicio más crítico de todo mi ecosistema. Si cae Jellyfin, veo series en Netflix. Si cae Nextcloud, uso SyncThing temporalmente. Pero si cae Vaultwarden, no puedo entrar a nada. Todas mis contraseñas están ahí.
Por eso lo tengo configurado con redundancia extra:
version: '3.8'
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
volumes:
- ./data:/data
environment:
- DOMAIN=https://pass.midominio.com
- SIGNUPS_ALLOWED=false
- ADMIN_TOKEN=${ADMIN_TOKEN}
- LOGIN_RATELIMIT_MAX_BURST=5
- LOGIN_RATELIMIT_SECONDS=60
- SENDS_ALLOWED=false
- EMERGENCY_ACCESS_ALLOWED=true
deploy:
resources:
limits:
memory: 256M
networks:
- proxy
- internal
networks:
proxy:
external: true
internal:
external: true
El truco: SIGNUPS_ALLOWED=false para que nadie pueda registrarse aunque descubran la URL. Solo yo puedo crear usuarios desde el panel de admin. Y LOGIN_RATELIMIT_MAX_BURST=5 para que si alguien intenta fuerza bruta, se quede bloqueado a los 5 intentos.
Miniflux: el lector RSS que no sabías que necesitabas
Miniflux es minimalista, rápido, y tiene una API excelente. Lo uso como reemplazo de Feedly (que valía dinero y encima quería mis datos).
services:
miniflux:
image: miniflux/miniflux:latest
container_name: miniflux
restart: unless-stopped
ports:
- "127.0.0.1:8088:8080"
environment:
- DATABASE_URL=postgres://miniflux:${DB_PASSWORD}@miniflux-db/miniflux?sslmode=disable
- POLLING_FREQUENCY=60
- BATCH_SIZE=20
- POLLING_PARSING_ERROR_LIMIT=0
- CLEANUP_ARCHIVE_UNREAD_DAYS=180
- CLEANUP_ARCHIVE_READ_DAYS=30
depends_on:
- miniflux-db
miniflux-db:
image: postgres:16-alpine
container_name: miniflux-db
restart: unless-stopped
volumes:
- ./db:/var/lib/postgresql/data
environment:
- POSTGRES_DB=miniflux
- POSTGRES_USER=miniflux
- POSTGRES_PASSWORD=${DB_PASSWORD}
deploy:
resources:
limits:
memory: 128M
Lo configuré para que limpie artículos leídos de más de 30 días y no leídos de más de 180. Así la base de datos no crece indefinidamente. Y el polling cada 60 minutos es suficiente para mi consumo.
Lo que me hubiera gustado saber desde el día 1
Si pudiera volver atrás y darme consejos a mi yo de 2019, esto es lo que le diría:
-
No necesitas un servidor potente para empezar. Con 2GB de RAM y 2 CPUs te sobra para los primeros 5-10 servicios. Mi error fue comprar un NUC de 600€ cuando una Raspberry Pi 5 de 80€ habría sido suficiente durante el primer año.
-
Compra un SSD, no uses SD card. Las SD cards se corrompen con el tiempo, especialmente si tienes bases de datos escribiendo constantemente. Un SSD externo USB 3.0 vale 30€ y te ahorra el dolor de cabeza.
-
Aprende Docker Compose antes que Kubernetes. Mucha gente salta directa a Kubernetes sin entender los fundamentos. Docker Compose es suficiente para el 99% de los casos de self-hosting. Cuando de verdad necesites Kubernetes, lo sabrás.
-
No expongas servicios innecesariamente. Si un servicio solo lo usas tú desde casa, no lo publiques en internet. Usa WireGuard para acceder a tu red local cuando estés fuera. Menos superficie de ataque.
-
Las actualizaciones no son opcionales. Un servicio sin actualizar es una bomba de relojería. Automatiza lo que puedas y revisa manualmente una vez al mes.
El impacto real: ¿cuánto he ahorrado?
Voy a ser honesto: no me he hecho rico con el self-hosting. Pero he dejado de pagar:
- Google Drive (10€/mes) → Nextcloud en mi servidor
- LastPass (4€/mes) → Vaultwarden
- Feedly (6€/mes) → Miniflux
- Netflix (12€/mes) → Jellyfin + Radarr/Sonarr (vale, esto no es legal, pero es mi setup)
- Servicio de backup fotos (3€/mes) → Immich en mi NAS
Total: ~35€/mes ahorrados. En un año son ~420€. En los 5 años que llevo con esto, unos 2.100€. Suficiente para pagar el hardware inicial (380€ del mini PC + 300€ del NAS) y aún me sobra.
Pero el ahorro real no es económico: es no depender de terceros para mis datos. Eso no tiene precio.
El self-hosting es un viaje, no un destino. Cada servicio que añades te enseña algo nuevo sobre redes, sistemas, seguridad... y sobre ti mismo. Disfruta del proceso.
En el próximo episodio: cómo monté mi propio mirror de Git con Gitea + Act Runner para CI/CD, y por qué al final casi vuelvo a GitHub.
Comentarios