Hoy te traigo un paso a paso súper práctico para que tengas un VPS con Ubuntu listo para recibir tu app en contenedores, servida por Nginx y con SSL de Let’s Encrypt. Lo armé porque me cansé de los deploys eternos: cuando estás iterando un producto, querés que salir a producción sea un trámite, no una odisea.
Acá vas a ver el flujo que uso cuando levanto algo rápido en Hetzner y lo quiero online en minutos, sin plataformas caras ni magia negra.
Lo que hacemos en el video
1) Ubuntu + Docker listo en 5 minutos
- Actualizá y prepará el server:
- sudo apt update && sudo apt upgrade -y
- Instalá Docker (sigo la guía oficial):
- curl -fsSL https://get.docker.com | sh
- sudo usermod -aG docker $USER # para usar docker sin sudo
- Cerrar y volver a entrar en la sesión
- Opcional pero recomendado: Compose plugin
- sudo apt install -y docker-compose-plugin
- docker compose version
Tip: dejá tu app escuchando en localhost (por ejemplo 127.0.0.1:3000) para que después Nginx la proxyee hacia afuera.
2) Tu app detrás de Nginx (reverse proxy)
- Instalá Nginx:
- sudo apt install -y nginx
- Abrí el firewall de forma segura (si usás UFW):
- sudo ufw allow OpenSSH
- sudo ufw allow 'Nginx Full'
- sudo ufw enable
- Apuntá tu dominio al VPS con un registro A (dominio → IP de tu server).
-
Config básico de Nginx (ejemplo):
- sudo nano /etc/nginx/sites-available/tu-dominio.com
server {
listen 80;
server_name tu-dominio.com www.tu-dominio.com;location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}- sudo ln -s /etc/nginx/sites-available/tu-dominio.com /etc/nginx/sites-enabled/
- sudo nginx -t && sudo systemctl reload nginx
3) SSL gratis con Certbot (Let’s Encrypt)
- Instalá Certbot y el plugin de Nginx:
- sudo apt install -y certbot python3-certbot-nginx
- Emití y configurá el certificado en un paso:
- sudo certbot --nginx -d tu-dominio.com -d www.tu-dominio.com
- Auto-renew:
- sudo systemctl status certbot.timer # suele venir activado
- Podés probar renovación en seco con: sudo certbot renew --dry-run
Con eso, ya tenés HTTPS, redirecciones automáticas a 443 y tu app segura hacia el mundo.
4) Un toque de orden con Docker Compose
-
docker-compose.yml minimal para una app web:
services:
web:
image: tuusuario/tuapp:latest
restart: unless-stopped
ports:- "127.0.0.1:3000:3000" # expone solo en localhost
env_file: - .env
- "127.0.0.1:3000:3000" # expone solo en localhost
-
Levantar:
- docker compose up -d
-
Logs:
- docker compose logs -f
5) Gotchas comunes
- DNS: puede tardar unos minutos en propagar; si Certbot falla, revisá que el dominio apunte bien.
- Puertos: asegurate de tener 80 y 443 abiertos para la validación y el certificado.
- Healthchecks: agregá healthchecks a tus servicios, te ahorran dolores de cabeza cuando se caen.
- Renovación: Let’s Encrypt vence cada 90 días; dejá el timer andando y dormí tranquilo.
Video
Recursos que menciono
- Cómo instalar Docker (oficial): https://docs.docker.com/engine/install/ubuntu/
- Instalar y configurar Nginx (Ubuntu): https://ubuntu.com/tutorials/install-and-configure-nginx#2-installing-nginx
- Certbot + Let’s Encrypt en Ubuntu: https://www.inmotionhosting.com/support/website/ssl/lets-encrypt-ssl-ubuntu-with-certbot/
- Hetzner (20€ de regalo): https://hetzner.cloud/?ref=Sswaf20wbckq
Cierre
La idea es que no dependas de nadie para sacar tu app. Un VPS barato, Docker para empaquetar, Nginx para exponer y Let’s Encrypt para el candadito verde. Con este combo podés iterar rápido, escalar cuando haga falta y aprender de tu propia infraestructura.
Si te sirve, probalo hoy mismo. Y si tenés dudas o querés que agregue automatización con Ansible o scripts, decímelo en los comentarios. Nos vemos en el próximo mate.
![]()

