Cómo desplegar aplicaciones en un VPS usando IA (Claude Code)
Hace un tiempo, tener tu propio servidor y desplegar tus aplicaciones era una tarea bastante compleja: tenías que aprender Linux, redes, herramientas de despliegue y mantener un orden para que todo funcione. Por eso los PaaS (Platform as a Service) se volvieron tan populares: te ahorran ese trabajo a cambio de un costo mayor.
Hoy en día tenemos una opción intermedia muy interesante: un VPS combinado con un agente de IA. Puedes pagar un servidor en blanco e instalar una IA que se encargue de configurarlo, clonar repositorios, instalar bases de datos y desplegar aplicaciones por ti.
En este artículo vamos a ver, paso a paso, cómo configurar un VPS desde cero usando Claude Code como agente, y desplegar tres aplicaciones distintas (Python, Node y React) con sus respectivas bases de datos PostgreSQL, e incluso una instancia de Supabase autoalojada.
💡 La idea no es solo replicar este flujo, sino entender qué hace un agente de IA en la nube por debajo, para que puedas adaptarlo a tu propio entorno o reemplazarlo por herramientas similares como OpenCode, Hermes o Dokploy.
1. ¿Qué es un VPS y por qué usar IA?
Un VPS (Virtual Private Server) es básicamente un computador en blanco, sin programas instalados, con un sistema operativo (típicamente Linux) recién inicializado. Te conectas a él mediante el protocolo SSH (Secure Shell) desde tu terminal.
La idea de este flujo es:
- Adquirir un VPS (en Hostinger, DigitalOcean, AWS, o incluso un Raspberry Pi).
- Conectarse vía SSH.
- Crear un usuario con permisos adecuados.
- Instalar Claude Code.
- Dejar que la IA instale los programas de producción y despliegue las aplicaciones.
Con un solo VPS puedes alojar múltiples aplicaciones de varios clientes, lo cual sale mucho más barato que pagar un PaaS por cada proyecto. Un VPS ronda los $5–$10 al mes fijos, mientras que en un PaaS suele empezar en $5 por aplicación.
2. Adquirir un VPS en Hostinger
Para este tutorial voy a usar Hostinger, pero puedes usar cualquier proveedor que te dé acceso SSH a un servidor Linux.
Recomiendo el plan KVM2 si planeas alojar varios proyectos:
- 2 vCPU
- 8 GB de RAM
- 100 GB de almacenamiento
Si recién empiezas o solo quieres un proyecto pequeño, el KVM1 también funciona perfectamente.
Pasos básicos
- Entra a hostinger.com/fazt y selecciona el plan junto con la cantidad de meses que quieras.
- Elige una región cercana a tus usuarios (Brasil, Alemania, EE.UU., etc.).
- Selecciona como sistema operativo Ubuntu 24.04 LTS (versión estable de soporte largo).
- Define una contraseña segura (puedes usar el botón de generar contraseña automática).
- Activa opcionalmente el escáner de malware y la administración de contenedores Docker.
- Finaliza la configuración. La instalación toma unos 3 minutos.
🔐 Aunque uso contraseña por simplicidad, lo recomendable es configurar una llave SSH una vez termines el tutorial.
3. Conexión inicial vía SSH
Hostinger te dará un comando como este para conectarte:
ssh root@TU_IP_DEL_SERVIDOR
Lo pegas en tu terminal (Windows, Linux o Mac), confirmas la huella digital y pegas tu contraseña. Cuando veas algo como root@srv-xxxxx:~#, significa que ya estás dentro del servidor.
Actualizar el sistema
Antes de cualquier instalación, actualiza el sistema:
sudo apt update && sudo apt upgrade -y
Con esto el SO está listo para recibir nuevos programas.
4. Instalar Claude Code
Vamos a instalar Claude Code para que sea nuestro agente. Visita claude.com/code y copia el comando de instalación para Mac/Linux/WSL:
curl -fsSL https://claude.ai/install.sh | bash
Una vez instalado, agrégalo al PATH si te lo pide:
# Ejemplo (el script te dará el comando exacto)
export PATH="$HOME/.local/bin:$PATH"
Verifica con:
claude --version
Para iniciarlo:
claude
Selecciona tu tema, elige el método de autenticación con suscripción y abre la URL que te genera en tu navegador para autorizarlo. Pega el código que te devuelve el navegador y listo, Claude Code estará listo en tu servidor.
5. Buenas prácticas de seguridad
5.1 Crear un usuario nuevo
Por defecto estás como root, lo cual es muy peligroso para usar con un agente de IA. Vamos a crear un usuario nuevo:
adduser fazt
Te pedirá una contraseña y datos opcionales (puedes presionar Enter para saltarlos).
Ahora le damos permisos de sudo:
usermod -aG sudo fazt
Cambia al nuevo usuario para verificar:
su - fazt
whoami # Debería decir "fazt"
5.2 Deshabilitar el login del usuario root vía SSH
Esta es una práctica de seguridad clave. Edita la configuración de SSH:
sudo nano /etc/ssh/sshd_config
Busca la línea PermitRootLogin (puedes presionar Ctrl+W para buscar) y cámbiala a:
PermitRootLogin no
Guarda con Ctrl+O, Enter, y sal con Ctrl+X.
Reinicia el servicio:
sudo systemctl restart ssh
⚠️ Si te da error con
sshd, prueba conssh. Algunos sistemas usan uno u otro nombre.
A partir de ahora, conéctate siempre con tu nuevo usuario:
ssh fazt@TU_IP_DEL_SERVIDOR
5.3 Configurar sudo sin contraseña (para Claude)
Cuando Claude Code intente ejecutar comandos con sudo, se quedará atascado pidiendo la contraseña porque no puede leerla. Solución: permitirle a tu usuario ejecutar sudo sin pedirla.
sudo visudo
Al final del archivo, añade:
fazt ALL=(ALL) NOPASSWD:ALL
Reemplaza
faztpor el nombre de tu usuario.
Guarda con Ctrl+O y sal con Ctrl+X. Verifica que ya no te pida la contraseña:
sudo visudo # No debería pedirte contraseña
5.4 Reinstalar Claude Code en el nuevo usuario
Como Claude Code lo instalamos como root, el nuevo usuario no lo tiene en su PATH. Vuelve a ejecutar el comando de instalación:
curl -fsSL https://claude.ai/install.sh | bash
Y ahora sí ejecuta:
claude --dangerously-skip-permissions
El flag
--dangerously-skip-permissionsevita que Claude te pida confirmación en cada comando. Úsalo solo en este servidor dedicado a despliegue.
6. Listado de programas necesarios
Ya con Claude Code corriendo, dale el siguiente prompt para que arme el plan:
"Dame un listado de programas que necesiten instalarse en este servidor (Nginx, Docker, Git, etc.). La idea es que este servidor sea para desplegar aplicaciones de clientes en paralelo (Node, Python, React) cada una con su base de datos."
Activa el modo plan con Shift + Tab para que primero te muestre qué hará antes de ejecutarlo.
Algunos de los programas que típicamente recomiendo instalar:
| Categoría | Programas |
|---|---|
| Reverse proxy | Nginx |
| Runtime | Node.js (con NVM), Bun, Python, pnpm |
| Gestor de procesos | PM2 |
| Bases de datos | PostgreSQL, MySQL, Redis |
| SSL | Certbot |
| Seguridad | Fail2ban, UFW (firewall) |
| Contenedores | Docker, Docker Compose |
| Testing / extras | Playwright, build-essential |
| Monitoreo | htop |
Para bases de datos puedes elegir entre instalación local o vía Docker. Si recién empiezas, lo más simple es instalación local. Si manejas múltiples versiones o aislamiento, Docker es mejor.
Confirma el plan y deja que Claude instale todo. Tarda solo unos minutos.
7. Instalar GitHub CLI para repos privados
Para clonar repositorios privados desde el servidor, instala GitHub CLI:
sudo mkdir -p -m 755 /etc/apt/keyrings \
&& wget -qO- https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg > /dev/null \
&& sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg \
&& echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null
sudo apt update
sudo apt install gh
Verifica:
gh --version
Autentícate con GitHub:
gh auth login
Selecciona github.com, HTTPS, autenticación con browser, copia el código que te da y pégalo en la URL que se abre. Una vez autorizado, presiona Enter en la terminal y verás "Authentication complete".
A partir de aquí, Claude Code puede clonar tus repositorios privados sin problema.
8. Mejorar la terminal con Zsh + Oh My Zsh (opcional)
Para tener autocompletado, historial mejorado y plugins útiles, instala Zsh y Oh My Zsh.
sudo apt install zsh
zsh --version
chsh -s $(which zsh)
Cierra la sesión SSH y vuelve a entrar. Selecciona la opción 2 cuando te aparezca el menú de configuración inicial de Zsh.
Instala Oh My Zsh:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
Migrar configuración de Bash a Zsh
Si después de cambiar a Zsh ves que claude, nvm o bun ya no se reconocen, es porque Zsh no carga .bashrc. Soluciónalo así:
echo 'source ~/.bashrc' >> ~/.zshrc
source ~/.zshrc
O bien, copia manualmente los export PATH=..., nvm, bun, etc. desde .bashrc al final de tu .zshrc:
nano ~/.zshrc
# Pega los exports al final
source ~/.zshrc
Plugins recomendados para Oh My Zsh
Puedes pedirle a Claude que los instale por ti:
"Instala los mejores plugins de Oh My Zsh para git, docker, docker-compose, pm2, ufw, además de zsh-autosuggestions y zsh-syntax-highlighting."
Y los configurará automáticamente.
9. Desplegar tres aplicaciones en paralelo
Aquí viene lo interesante. Vamos a desplegar tres proyectos distintos en el mismo servidor.
9.1 Aplicación 1: API en Node.js
Le pasamos a Claude el repositorio:
"Despliega esta API de Node:
https://github.com/usuario/mi-api-node. Necesita variables de entorno (JWT_SECRET, DATABASE_URL, etc.). Es un repo privado."
Claude usará gh repo clone, instalará dependencias, configurará las variables de entorno, levantará PostgreSQL local, ejecutará migraciones y lo dejará corriendo en PM2:
pm2 list
Te dará una URL como http://TU_IP:3000 y un endpoint /health para validar.
9.2 Aplicación 2: React + Supabase
Para el frontend con Supabase, vamos a usar Supabase CLI dentro del servidor para que Claude pueda crear el proyecto y configurar las llaves automáticamente.
Instalar Homebrew (necesario para el CLI de Supabase en Linux):
"Instala Homebrew" — pídeselo a Claude para que también lo configure en Zsh.
Luego:
brew install supabase/tap/supabase
supabase login
Te dará un enlace para autorizar desde el navegador.
Ahora le decimos a Claude:
"Conéctate a Supabase usando el CLI y termina de configurar el proyecto React. Crea un proyecto nuevo si hace falta."
Claude creará la organización, el proyecto, ejecutará las migraciones, obtendrá las llaves y las pondrá en el .env del frontend. Acto seguido, lo deja corriendo en una ruta como http://TU_IP/react-supabase-app.
9.3 Aplicación 3: Full stack Python + PostgreSQL + React
Para un proyecto que combina backend (Python con Uvicorn), base de datos (PostgreSQL en Docker) y frontend (React):
"Despliega este proyecto full-stack:
https://github.com/usuario/books-api. El backend está en Python, el frontend en React, usa PostgreSQL. Dame puertos adicionales para que no choque con los anteriores."
Claude configurará Docker para Postgres, Uvicorn para el backend Python, servirá el frontend con Nginx y te devolverá las URLs:
- Frontend:
http://TU_IP/react-supvis - Books API:
http://TU_IP/books-api - Otra app:
http://TU_IP:3080
10. Self-hosting Supabase con Docker
Si no quieres depender de la nube de Supabase, puedes autoalojarlo:
"Instala Supabase autoalojado localmente y conecta el proyecto React a esa instancia."
Como ya tenemos Docker, Claude levantará todos los contenedores de Supabase (Postgres, Studio, Kong, GoTrue, etc.) y te dará la URL del dashboard. A partir de ahí, ya no necesitas la cuenta externa.
⚠️ Para envío de correos en Supabase autoalojado necesitas un servicio SMTP externo (Resend, SendGrid, Brevo). En modo desarrollo usa Mailpit que viene incluido. Si tu autenticación es solo email/contraseña sin verificación, no necesitas correo.
11. Monitoreo con htop
Para ver qué está corriendo en tu servidor en tiempo real:
htop
Verás procesos de Claude, Node, Python (Uvicorn), instancias de Postgres, contenedores Docker, etc. Útil para detectar consumos altos de RAM o CPU.
También puedes pedirle a Claude un resumen:
"Dime qué aplicaciones están corriendo ahora mismo en este servidor y sus recursos."
12. Consideración crítica: bases de datos en producción
Los backends y frontends son fácilmente reemplazables: si se caen, los vuelves a levantar. Pero las bases de datos contienen datos del cliente, y si el servidor se corrompe, se pierden.
Tienes dos opciones:
Opción simple: backups automáticos
Crear un script que cada 6 o 24 horas haga un dump de las bases de datos a otro lugar (S3, otro servidor, Google Drive, etc.).
Opción recomendada para producción: BD externa gestionada
Usa un servicio dedicado a bases de datos:
- Neon (PostgreSQL serverless)
- Railway (incluye base de datos)
- AWS RDS
- Google Cloud SQL
- Azure Database
Tu servidor solo tendrá los backends y frontends, y la base de datos vivirá en un proveedor confiable con backups automáticos. Si tu VPS se cae, los datos siguen seguros.
💡 Otra alternativa: tener un segundo VPS dedicado solo a bases de datos, con backups y panel de control propio.
13. ¿Y si no quiero hacer todo esto a mano?
Existen herramientas que automatizan la mayor parte de este flujo:
- Dokploy: una alternativa open-source a Railway/Vercel que despliega tus apps en contenedores Docker con interfaz gráfica. Ideal si solo quieres una UI bonita encima de tu VPS.
- OpenCode / Hermes: agentes de IA pensados para vivir dentro del servidor y escuchar eventos. Más adecuados si quieres un entorno completo de desarrollo asistido por IA en la nube.
La diferencia con lo que hicimos hoy es que estas herramientas son opinionadas: te adaptas a sus reglas. El flujo manual te da control total para construir tu propio "Railway" personalizado, integrar facturación a clientes, reglas de despliegue propias, etc.
14. Conclusión
Con un solo VPS y un agente como Claude Code puedes:
- Desplegar múltiples aplicaciones de clientes en paralelo.
- Tener un entorno auto-administrado a un costo fijo (~$10/mes).
- Automatizar tareas que antes requerían horas de configuración manual.
- Aprender por el camino qué hace realmente un agente de IA en la nube.
Este flujo es la base. A partir de aquí puedes pedirle a Claude que construya:
- Una interfaz web para administrar todos los proyectos desplegados.
- Un sistema de facturación automática para tus clientes.
- Pipelines CI/CD que escuchen pushes en GitHub y desplieguen automáticamente.
- Tu propio chatbot personal alojado en el servidor.
Si tu cliente crece mucho y consume todos los recursos del servidor, simplemente lo migras a su propio VPS dedicado. Mientras tanto, este enfoque te da una flexibilidad enorme a un costo mínimo.
Recursos y comandos de referencia
| Herramienta | Comando de instalación |
|---|---|
| Claude Code | curl -fsSL https://claude.ai/install.sh | bash |
| GitHub CLI | sudo apt install gh |
| Zsh | sudo apt install zsh |
| Oh My Zsh | sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" |
| Supabase CLI | brew install supabase/tap/supabase |
| htop | sudo apt install htop |
¿Tienes alguna duda o has probado un flujo similar con otro agente de IA? Déjamelo en los comentarios. En un siguiente artículo voy a profundizar en Dokploy como alternativa visual a este flujo manual.