Ejecutar Claude Code en un VPS: instalar, asegurar y persistir sesiones

11 min de lectura·Matthieu|

Configura Claude Code en un servidor Linux remoto con autenticación headless, persistencia de sesión con tmux y refuerzo de seguridad. Cada comando verificado.

Ejecutar Claude Code en un VPS

Claude Code es un agente de codificación basado en terminal. Lee tu código fuente, edita archivos, ejecuta comandos y construye funcionalidades a partir de descripciones en lenguaje natural. Ejecutarlo en un VPS te da un agente de codificación persistente que funciona 24/7, accesible desde cualquier dispositivo por SSH.

Esta guía te lleva desde un VPS Ubuntu nuevo hasta una instalación funcional de Claude Code con persistencia de sesión. Cada paso incluye un comando de verificación para confirmar que funcionó.

¿Qué necesita Claude Code de un VPS?

Claude Code envía tus prompts a los servidores de Anthropic para la inferencia. Tu VPS solo almacena los archivos del proyecto, las herramientas de desarrollo y el proceso de Claude Code. Esto significa que no necesitas GPU ni hardware de gama alta.

Requisito Mínimo Recomendado
OS Ubuntu 20.04 LTS Ubuntu 24.04 LTS
RAM 4 GB 8 GB
Disco 20 GB SSD 40 GB NVMe
CPU 2 vCPUs 4 vCPUs
Red Internet estable Conexión de baja latencia
Dependencias Ninguna (instalador nativo) git, ripgrep (incluidos)

El instalador nativo incluye ripgrep y no requiere dependencias de ejecución como Node.js. Un VPS de 4 GB maneja Claude Code y un proyecto de tamaño medio. Si trabajas con monorepos grandes o ejecutas servicios adicionales, elige 8 GB.

Requisito de cuenta: Claude Code requiere una cuenta Claude Pro, Max, Teams, Enterprise o Console. El plan gratuito de Claude.ai no incluye acceso a Claude Code.

¿Cómo asegurar un VPS antes de instalar Claude Code?

Bloquea tu servidor antes de instalar nada. Un VPS recibe ataques de fuerza bruta automatizados minutos después de estar en línea. Estos pasos crean un usuario no root, imponen autenticación por clave SSH, configuran un firewall y activan actualizaciones de seguridad automáticas.

Si ya tienes un servidor reforzado, salta a ¿Cómo instalar Claude Code en un servidor Linux?. Para un recorrido más detallado de cada paso de seguridad, consulta .

Crear un usuario no root

Conéctate por SSH a tu servidor como root y luego crea un usuario con privilegios sudo:

ssh root@YOUR_SERVER_IP
adduser claude
usermod -aG sudo claude

Copia tu clave SSH al nuevo usuario para poder iniciar sesión sin contraseña:

mkdir -p /home/claude/.ssh
cp /root/.ssh/authorized_keys /home/claude/.ssh/authorized_keys
chown -R claude:claude /home/claude/.ssh
chmod 700 /home/claude/.ssh
chmod 600 /home/claude/.ssh/authorized_keys

Verifica que puedes iniciar sesión con el nuevo usuario desde un segundo terminal antes de continuar. No cierres tu sesión root todavía:

ssh claude@YOUR_SERVER_IP

Deberías obtener un prompt de shell como claude@yourserver. Si funciona, continúa.

Desactivar la autenticación por contraseña

Edita la configuración SSH para bloquear los inicios de sesión por contraseña:

sudo sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config

Reinicia SSH y verifica que los ajustes se aplicaron:

sudo systemctl restart ssh
sudo sshd -T | grep -E 'passwordauthentication|permitrootlogin'

Salida esperada (el orden puede variar):

permitrootlogin no
passwordauthentication no

Configurar el firewall

UFW (Uncomplicated Firewall) bloquea todo el tráfico entrante excepto lo que permitas. En algunas imágenes VPS mínimas, puede que necesites instalarlo primero con sudo apt install -y ufw.

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw enable

Verifica las reglas:

sudo ufw status

Salida esperada:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Instalar fail2ban

fail2ban bloquea direcciones IP después de intentos fallidos repetidos de inicio de sesión SSH:

sudo apt update && sudo apt install -y fail2ban

Crea una configuración local para que tus ajustes sobrevivan a las actualizaciones del paquete:

sudo tee /etc/fail2ban/jail.local > /dev/null << 'EOF'
[sshd]
enabled = true
port = ssh
filter = sshd
maxretry = 5
bantime = 3600
findtime = 600
EOF

Activa y verifica:

sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban

Fíjate bien: la salida debe mostrar active (running). El flag enable --now inicia fail2ban de inmediato y lo hace sobrevivir a reinicios.

sudo fail2ban-client status sshd

Esto muestra que la jail está activa con 0 IPs bloqueadas actualmente (esperado en una instalación nueva).

Activar las actualizaciones de seguridad automáticas

Unattended-upgrades corrige vulnerabilidades de seguridad sin intervención manual:

sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades

Selecciona "Yes" cuando se te solicite. Verifica que está activo:

sudo systemctl status unattended-upgrades

La salida debe mostrar active (running).

¿Cómo instalar Claude Code en un servidor Linux?

El instalador nativo es el método recomendado. No requiere dependencias, se actualiza automáticamente en segundo plano y funciona en cualquier distribución Linux compatible. El método de instalación por npm está obsoleto.

Ejecuta el instalador como tu usuario no root (no como root):

curl -fsSL https://claude.ai/install.sh | bash

Este es el instalador oficial de Anthropic. Si prefieres verificar antes de ejecutar, puedes consultar la documentación de instalación para sumas de verificación SHA256 y detalles de firma de código.

El instalador coloca el binario en ~/.local/bin/claude y lo añade a tu PATH. Abre un nuevo shell o recarga tu perfil para aplicar el cambio:

source ~/.bashrc

Verifica la instalación:

claude --version

Deberías ver un número de versión como 2.x.x. Ejecuta el diagnóstico integrado para verificar tu configuración:

claude doctor

Esto verifica la configuración del sistema, la conectividad de red y el estado de autenticación. En este punto, la autenticación aparecerá como incompleta. Eso es esperado.

¿Cómo autenticar Claude Code en un VPS headless?

Claude Code normalmente abre una ventana del navegador para el inicio de sesión OAuth. En un servidor headless sin interfaz gráfica, necesitas un enfoque diferente. Tienes dos opciones dependiendo de tu tipo de cuenta.

Opción A: clave API desde Claude Console

Si tienes una cuenta Claude Console (facturación basada en API), define la variable de entorno ANTHROPIC_API_KEY. Es el método más simple para servidores headless.

Genera una clave API en console.anthropic.com. Luego almacénala de forma segura en tu VPS:

sudo mkdir -p /etc/claude-code
sudo tee /etc/claude-code/env > /dev/null << 'EOF'
ANTHROPIC_API_KEY=sk-ant-api03-your-key-here
EOF
sudo chmod 600 /etc/claude-code/env
sudo chown claude:claude /etc/claude-code/env

Qué hace esto: crea un archivo dedicado con permisos restringidos (solo tu usuario puede leerlo) en lugar de poner secretos en .bashrc donde aparecen en el historial del shell y son legibles por otros procesos.

Cárgalo en tu perfil de shell. Añade esta línea a ~/.bashrc:

echo 'set -a; source /etc/claude-code/env; set +a' >> ~/.bashrc
source ~/.bashrc

Verifica que la clave está cargada:

echo $ANTHROPIC_API_KEY | head -c 15

Deberías ver sk-ant-api03-xx (los primeros 15 caracteres de tu clave).

Opción B: token OAuth desde una suscripción Claude

Si usas una suscripción Claude Pro o Max (no Console), genera un token OAuth en una máquina con navegador y luego transfiérelo al VPS.

En tu máquina local (la que tiene navegador):

claude setup-token

Esto abre un navegador para autenticación OAuth y genera un token de larga duración que empieza con sk-ant-oat01-. El token es válido durante un año.

Copia el token. Luego en tu VPS, almacénalo de la misma forma:

sudo tee /etc/claude-code/env > /dev/null << 'EOF'
CLAUDE_CODE_OAUTH_TOKEN=sk-ant-oat01-your-token-here
EOF
sudo chmod 600 /etc/claude-code/env
sudo chown claude:claude /etc/claude-code/env

También necesitas crear ~/.claude.json para saltar el asistente de configuración:

cat > ~/.claude.json << 'EOF'
{
  "hasCompletedOnboarding": true
}
EOF
chmod 600 ~/.claude.json

Cárgalo en tu perfil de shell:

echo 'set -a; source /etc/claude-code/env; set +a' >> ~/.bashrc
source ~/.bashrc

Verificar la autenticación

Prueba que Claude Code puede comunicarse con los servidores de Anthropic:

claude -p "Say hello in exactly 5 words"

El flag -p ejecuta un prompt único sin entrar en modo interactivo. Si ves un saludo de cinco palabras, la autenticación funciona. Si obtienes un error de autenticación, verifica que tu variable de entorno está correctamente definida con env | grep -E 'ANTHROPIC_API_KEY|CLAUDE_CODE_OAUTH_TOKEN'.

¿Cómo mantener Claude Code ejecutándose tras desconectar SSH?

Usa tmux. Crea sesiones de terminal que persisten en el servidor independientemente de tu conexión SSH. Cierra tu laptop, vuela a otro país, reconéctate por SSH desde tu teléfono. La sesión sigue ahí, exactamente donde la dejaste.

Instalar tmux

sudo apt install -y tmux

Verificación:

tmux -V

Configurar tmux para Claude Code

Crea un .tmux.conf con ajustes optimizados para sesiones largas de codificación:

cat > ~/.tmux.conf << 'EOF'
# Increase scrollback buffer (default is 2000 lines)
set -g history-limit 50000

# Enable mouse support for scrolling and pane selection
set -g mouse on

# Start window numbering at 1
set -g base-index 1

# Reduce escape time for faster key response
set -sg escape-time 10

# Status bar with session name and time
set -g status-right '%H:%M %d-%b'

# Keep sessions alive if the shell exits unexpectedly
set -g remain-on-exit on
EOF

Iniciar una sesión de Claude Code

Crea una sesión tmux con nombre y lanza Claude Code dentro:

tmux new -s claude

Ahora estás dentro de una sesión tmux llamada "claude". Inicia Claude Code:

cd ~/your-project
claude

Claude Code está ejecutándose. Para separarte de la sesión (dejarla ejecutándose en segundo plano), presiona:

Ctrl+B, luego D

Estás de vuelta en tu prompt SSH normal. Claude Code sigue ejecutándose dentro de tmux.

Referencia rápida de tmux

Acción Comando
Crear sesión con nombre tmux new -s claude
Separarse de la sesión Ctrl+B, luego D
Listar sesiones tmux ls
Reconectarse a una sesión tmux attach -t claude
Eliminar sesión tmux kill-session -t claude
Desplazarse hacia arriba Ctrl+B, luego [, luego flechas
Salir del modo desplazamiento q

¿Cómo reconectarse a una sesión de Claude Code desde otro dispositivo?

Conéctate por SSH a tu VPS desde cualquier dispositivo y reconéctate:

ssh claude@YOUR_SERVER_IP
tmux attach -t claude

Tu sesión de Claude Code está exactamente donde la dejaste. El historial de conversación, el contexto de archivos y las tareas en ejecución se conservan. Funciona desde un laptop, teléfono (usando una app SSH como Termius) u otro servidor.

Si la sesión se cayó o fue terminada, tmux attach fallará. Inicia una nueva:

tmux ls

Si no hay sesiones listadas, crea una nueva con tmux new -s claude.

¿Cómo restringir lo que Claude Code puede hacer en tu servidor?

Claude Code tiene un sistema de permisos que controla qué herramientas puede usar. Por defecto, pide confirmación antes de ejecutar comandos bash o editar archivos. Puedes pre-aprobar comandos seguros y bloquear los peligrosos usando .claude/settings.json en el directorio de tu proyecto.

Nunca uses --dangerously-skip-permissions en un servidor real. Esto omite todas las protecciones y permite a Claude Code ejecutar cualquier comando sin preguntar.

Configurar una lista blanca de permisos

Crea un archivo de configuración a nivel de proyecto:

cd ~/your-project
mkdir -p .claude
cat > .claude/settings.json << 'EOF'
{
  "permissions": {
    "allow": [
      "Bash(npm run *)",
      "Bash(npm test *)",
      "Bash(git status)",
      "Bash(git diff *)",
      "Bash(git log *)",
      "Bash(git add *)",
      "Bash(git commit *)",
      "Bash(ls *)",
      "Bash(cat *)",
      "Read",
      "Bash(grep *)"
    ],
    "deny": [
      "Bash(rm -rf *)",
      "Bash(git push --force *)",
      "Bash(chmod 777 *)",
      "Bash(curl * | bash)",
      "Read(./.env)",
      "Read(./.env.*)"
    ]
  }
}
EOF

Qué hace esto: el array allow permite a Claude Code ejecutar esos comandos sin preguntar cada vez. El array deny bloquea los comandos peligrosos por completo. Las reglas siguen una precedencia deny-first: si un comando coincide con allow y deny, el deny gana.

Verifica que el archivo fue creado con los permisos correctos:

ls -la .claude/settings.json

El archivo debe ser legible por tu usuario. Como este archivo se commitea en git, se aplica a todos los que clonen el proyecto. Para sobrescrituras personales, usa .claude/settings.local.json (automáticamente ignorado por git).

¿Cómo monitorear los recursos de tu VPS?

Claude Code en un VPS de 4 GB usa entre 200-400 MB de RAM durante operación normal. Proyectos grandes o múltiples tareas concurrentes aumentan este valor. Configurar espacio de swap previene que el sistema mate procesos por falta de memoria.

Añadir espacio de swap

Verifica si ya existe swap:

sudo swapon --show

Si la salida está vacía, crea un archivo swap de 2 GB:

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

Hazlo persistente tras reinicios añadiéndolo a /etc/fstab:

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

Verificación:

free -h

Deberías ver tu espacio de swap listado. Fíjate bien: busca la fila Swap: mostrando 2.0Gi total.

Verificar el uso de recursos

Monitorea memoria y CPU mientras Claude Code está ejecutándose:

htop

Si htop no está instalado: sudo apt install -y htop. Observa la barra de memoria. Claude Code debería mantenerse alrededor de 200-400 MB. Si alcanza consistentemente el 80 %+ de la RAM total, considera actualizar tu VPS o cerrar otros servicios.

Verifica el uso de disco:

df -h /

Claude Code en sí usa mínimo disco. Tus archivos de proyecto y el historial de git son los principales consumidores.

¿Cuánto cuesta ejecutar Claude Code en un VPS?

Claude Code funciona con tu suscripción Claude existente sin coste adicional. Tu coste mensual total es el VPS más el plan Claude.

Tier VPS Coste mensual Plan Claude Coste del plan Total
2 vCPU, 4 GB RAM ~5-10 $ Pro 20 $/mes 25-30 $/mes
4 vCPU, 8 GB RAM ~10-20 $ Max 100 $/mes 110-120 $/mes
4 vCPU, 8 GB RAM ~10-20 $ Console (API) Pago por token 10-20 $ + uso

El plan Pro incluye uso limitado de Claude Code. El plan Max tiene límites de tasa más altos para uso intensivo. La facturación Console (API) cobra por token y es adecuada para equipos que necesitan control detallado de costes.

Para un agente de codificación persistente que funciona las 24 horas, el VPS de 4 GB + plan Pro a unos 25 $/mes es el punto de entrada.

¿Algo salió mal?

Claude Code no se autentica

Verifica que tu variable de entorno está definida:

env | grep -E 'ANTHROPIC_API_KEY|CLAUDE_CODE_OAUTH_TOKEN'

Si está vacía, recarga tu perfil: source ~/.bashrc. Si la variable está definida pero la autenticación falla, verifica que la clave sea válida. Los tokens OAuth expiran después de un año. Las claves API pueden revocarse desde la Console.

La sesión tmux desapareció

Las sesiones tmux se pierden cuando el servidor se reinicia. Después de un reinicio, inicia una nueva sesión:

tmux new -s claude

Para verificar si el servidor se reinició recientemente:

uptime

Claude Code está lento o no responde

Verifica la memoria disponible:

free -h

Si la RAM está casi llena y el swap se usa mucho, Claude Code se ralentizará. Mata procesos no utilizados o actualiza tu VPS. También verifica la latencia de red hacia los servidores de Anthropic:

curl -o /dev/null -s -w '%{time_total}\n' https://api.anthropic.com

Cualquier valor bajo 1 segundo es normal. Valores más altos sugieren problemas de red entre tu VPS y Anthropic.

Errores de permiso denegado

Si Claude Code no puede leer o escribir archivos, verifica la propiedad:

ls -la ~/your-project

Los archivos deben pertenecer a tu usuario (claude:claude si seguiste esta guía). Corrige la propiedad:

sudo chown -R claude:claude ~/your-project

Consulta los logs para más detalle:

journalctl -u ssh -f

Esto muestra los logs de SSH en tiempo real. Útil para depurar problemas de conexión.

Copyright 2026 Virtua.Cloud. Todos los derechos reservados. Este contenido es una obra original del equipo de Virtua.Cloud. La reproducción, republicación o redistribución sin permiso escrito está prohibida.

¿Listo para probarlo?

Despliega tu propio servidor en segundos. Linux, Windows o FreeBSD.

Ver planes VPS