Hetzner VPS Setup - Documentación Completa
Configuración profesional de un VPS en Hetzner Cloud con Docker, Nginx, SSL y subdominios
📋 Índice
Guías de Configuración
- 🔒 Seguridad - SSH, Firewalls, Fail2ban
- 🐳 Docker - Docker y Docker Compose
- ⚙️ Nginx - Proxy Reverso y Configuración
- 🔐 SSL y Cloudflare - Certificados con DNS-01
- 🌐 Subdominios - Despliegue de aplicaciones
- 🤖 Claude Code - CLI de IA + Skill VPS para gestión automatizada
- 📚 MkDocs - Sitio web de documentación
Referencias Rápidas
🚀 Quick Start
Acceso al VPS
Gestión con Claude Code (Recomendado) 🤖
Este VPS está configurado con Claude Code, una CLI de IA que permite gestionar el sistema usando lenguaje natural:
Luego puedes usar lenguaje natural para gestionar el VPS:
"Chequea el estado del VPS"
"Reinicia la app labs"
"Limpia los contenedores Docker no usados"
"¿Cuánta memoria tengo libre?"
Beneficios: - ✅ No necesitas recordar comandos complejos - ✅ Claude conoce toda la infraestructura del VPS - ✅ Diagnóstico automático de problemas - ✅ Ejecución segura con validaciones
Ver Guía completa de Claude Code para instalación y uso detallado.
Ver estado del sistema
docker ps # Contenedores activos
sudo systemctl status nginx # Estado de Nginx
sudo ufw status # Estado del firewall
free -h # Uso de memoria
Crear nuevo subdominio
📊 Arquitectura del Sistema
Internet
│
↓
Cloudflare DNS (proxy naranja)
│
↓
Hetzner Cloud Firewall (80, 443)
│
↓
VPS Ubuntu 24.04
│
├─→ UFW Firewall
│
├─→ Nginx (proxy reverso)
│ │
│ ├─→ :3000 → labs.josejordan.dev
│ ├─→ :3001 → app.josejordan.dev
│ └─→ :XXXX → otros subdominios
│
└─→ Docker Containers
├─→ labs (nginxdemos/hello)
└─→ otras apps
💻 Especificaciones del VPS
| Componente | Especificación |
|---|---|
| Proveedor | Hetzner Cloud |
| CPU | 2 vCPU |
| RAM | 4 GB |
| Swap | 2 GB (configurado) |
| Disco | 40 GB NVMe |
| Tráfico | 20 TB/mes |
| Precio | ~3-4€/mes |
| OS | Ubuntu 24.04 LTS |
✅ Estado de Configuración
Seguridad
- [x] Usuario no-root con sudo
- [x] Root login deshabilitado
- [x] SSH con claves (password auth deshabilitado)
- [x] SSH endurecido (MaxAuthTries 3, algoritmos cuánticos)
- [x] Hetzner Cloud Firewall configurado
- [x] UFW con políticas restrictivas
- [x] Fail2ban activo
- [x] Actualizaciones automáticas de seguridad
Infraestructura
- [x] Docker 28.2.2 instalado
- [x] Docker Compose v2.40.1 (moderno)
- [x] Docker Compose v1.29.2 (legacy - disponible)
- [x] Nginx como proxy reverso
- [x] Certbot con DNS-01 (Cloudflare)
- [x] Memoria Swap 2GB (swappiness=10)
- [x] Zona horaria: Europe/Madrid
Herramientas de Gestión
- [x] Claude Code CLI instalado
- [x] VPS Skill configurada (gestión automatizada con IA)
Aplicaciones
- [x] labs.josejordan.dev - Demo funcionando con HTTPS
- [ ] Otros subdominios (pendiente)
🎯 Stack Tecnológico
┌─────────────────────────────────────────┐
│ Cloudflare (DNS + CDN) │
└─────────────────┬───────────────────────┘
│
┌─────────────────▼───────────────────────┐
│ Nginx (Proxy Reverso) │
│ - SSL/TLS (Let's Encrypt DNS-01) │
│ - Virtual Hosts por subdominio │
└─────────────────┬───────────────────────┘
│
┌─────────────────▼───────────────────────┐
│ Docker + Docker Compose │
│ - Aislamiento de aplicaciones │
│ - Fácil despliegue y gestión │
└─────────────────────────────────────────┘
📚 Recursos Externos
- Hetzner Cloud Console
- Cloudflare Dashboard
- Docker Documentation
- Nginx Documentation
- Certbot
- Ubuntu Server Guide
🔄 Flujo de Trabajo Típico
Desplegar Nueva Aplicación
-
Preparar la aplicación
-
Configurar DNS en Cloudflare
- Crear registro A:
nombre-app.josejordan.dev→ IP del VPS -
Activar proxy naranja
-
Configurar Nginx
-
Obtener certificado SSL
-
Iniciar la aplicación
Tip: Usa el script
scripts/new-subdomain.shpara automatizar pasos 3-5
🆘 Problemas Comunes
Si tienes problemas, consulta la Guía de Troubleshooting.
Accesos rápidos: - No puedo conectar por SSH → Solución - Nginx no arranca → Solución - Docker sin permisos → Solución - SSL no funciona → Solución
📝 Notas Importantes
- Doble firewall: Siempre configurar puertos en Hetzner Cloud Y UFW
- Recursos limitados: 4GB RAM + 2GB Swap - no sobrecargar el VPS
- Backup: Considerar snapshots de Hetzner o scripts personalizados
- Monitoreo: Revisar regularmente con
htop,docker stats,free -h - Renovación SSL: Automática cada 60 días con
certbot.timer
📰 Historial de Cambios
Consulta el CHANGELOG.md para ver: - Historial completo de cambios - Versiones y fechas - Decisiones técnicas y migraciones - Actualizaciones de infraestructura
Versión actual: 2.0.0 (2025-11-02)
🤝 Contribuir
Este es un repositorio personal de documentación, pero las sugerencias son bienvenidas.
Para reportar errores o sugerir mejoras, crea un issue.
📄 Licencia
Documentación de uso personal.
Última actualización: Noviembre 2025 Mantenedor: @mundodigitalpro