Un agente de IA rara vez es un solo proceso. Está el bucle del agente en sí, un almacén vectorial para la memoria, una caché, normalmente una base de datos para el estado, y quizás un pequeño panel. Correr cada uno a mano — arrancarlos, reiniciarlos tras un reboot, recordar qué puerto es cuál — cansa rápido. Docker Compose describe todo eso en un archivo y lo corre con un comando. Este es el stack copia-pega para poner un agente en un VPS de forma ordenada.
Si solo quieres la versión desplegada-sin-Docker, la guía de correr un agente de IA 24/7 cubre systemd en su lugar. Esta página es la versión nativa de contenedores.
El stack
Un agente autohospedado típico quiere cuatro cosas a su lado: el proceso del agente, Qdrant (memoria vectorial), Redis (caché / colas) y Postgres (estado). Aquí va un docker-compose.yml que corre todo eso, con los servicios internos mantenidos fuera de la internet pública:
# /opt/agent/docker-compose.yml
services:
agent:
build: . # your agent image (or image: your/agent:latest)
restart: unless-stopped
env_file: [.env] # OPENAI/ANTHROPIC keys etc. — never in this file
environment:
QDRANT_URL: http://qdrant:6333
REDIS_URL: redis://redis:6379
DATABASE_URL: postgres://agent:${DB_PASSWORD}@postgres:5432/agent
depends_on: [qdrant, redis, postgres]
# no ports: — this agent only makes outbound calls. Publish one only if it serves webhooks.
qdrant:
image: qdrant/qdrant:latest
restart: unless-stopped
volumes: ["qdrant:/qdrant/storage"] # internal only — not published
redis:
image: redis:7-alpine
restart: unless-stopped
command: ["redis-server", "--save", "60", "1"]
volumes: ["redis:/data"]
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: agent
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: agent
volumes: ["pg:/var/lib/postgresql/data"]
volumes: { qdrant: {}, redis: {}, pg: {} }
Los secretos viven en .env, no en el archivo compose:
# /opt/agent/.env (chmod 600, never committed)
ANTHROPIC_API_KEY=sk-ant-...
DB_PASSWORD=a-long-random-string
Levántalo:
apt update && apt install -y docker.io docker-compose-v2
systemctl enable --now docker
cd /opt/agent && docker compose up -d
docker compose logs -f agent
Cada servicio interno (Qdrant, Redis, Postgres) es accesible solo en la red compose por nombre de servicio — ninguno está publicado a internet. El agente habla con ellos por esa red privada, y nada en esos puertos da a la calle.
Los detalles que importan
restart: unless-stoppeden cada servicio — eso es lo que sobrevive a un reboot o una caída. Habilita Docker al arranque y todo el stack vuelve por sí solo.- Claves en
.env, no en YAML. Refiérete a ellas como variables env; mantén.envenchmod 600y fuera de git. Un archivo compose filtrado con una clave activa es el error clásico. - No publiques nada que no debas. Un agente que solo llama a APIs de modelos y a sus propios servicios no necesita ningún puerto entrante — así que un plan NAT sirve. Añade una IP dedicada solo si sirve webhooks o un panel.
- Dimensiona por memoria, no por núcleos. Los agentes respaldados por API son ligeros. Si el índice de Qdrant crece o añades un modelo local, ahí es cuando subes — consulta VPS de alta memoria para agentes.
La parte que sí es nuestra: el agente puede construir su propia máquina
Como EQVPS expone un servidor MCP, un agente que corre este stack puede aprovisionar otro VPS limpio por su cuenta — pedirlo, obtener root, destruirlo — pagando desde un saldo cripto prepagado. Un stack compose que necesita un sandbox nuevo puede levantar uno sin humano en el bucle.
Por qué EQVPS para un agente dockerizado
- Imágenes limpias, root en ~60 segundos. Ubuntu/Debian;
docker compose upy el stack está vivo. - Sin KYC, pago en cripto. Correo para registrarte, USDC/USDT para pagar — nada que ate la máquina a tu identidad.
- NVMe + 1 Gbit/s sin medir, UE (Alemania/Finlandia). Tirar imágenes y enviar logs no producirá una factura sorpresa.
VPS para agentes de IA (la visión general) → · VPS para Docker → · Alojar una base vectorial para la memoria del agente →
Comentarios
Aún no hay comentarios. Sé el primero.