Despliegue en producción
Para producción usa docker-compose.prod.yml. Añade:
- Caddy como proxy inverso con TLS automático vía Let's Encrypt
- Cabeceras de seguridad — HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy
- PostgreSQL y Ollama no están expuestos al host — solo accesibles dentro de la red Docker
- Healthcheck de la app (
GET /api/health) conectado a la política de reinicio de Docker
Requisitos
- Un servidor con Docker y Docker Compose
- Un nombre de dominio apuntando a tu servidor (registro A)
- Puertos 80 y 443 abiertos en tu firewall
Paso a paso
1. Configurar .env
bash
cp .env.example .envEdita .env y rellena todos los valores CHANGE_ME:
env
# PostgreSQL — usa valores aleatorios fuertes
POSTGRES_USER=rag
POSTGRES_PASSWORD=una_contraseña_aleatoria_fuerte
POSTGRES_DB=rag_db
# Caddy — tu dominio público
DOMAIN=rag.tudominio.com
# LLM — llama3.1:8b soporta tool calling
OLLAMA_LLM_MODEL=llama3.1:8b
# Embeddings — Google es gratuito, recomendado
GOOGLE_API_KEY=tu_google_api_key
# Admin API — protege los endpoints /api/admin/*
ADMIN_API_KEY=otro_secreto_aleatorio2. Iniciar
bash
docker compose -f docker-compose.prod.yml up -d --buildCaddy obtendrá automáticamente un certificado TLS para tu dominio. El primer arranque tarda un par de minutos mientras Caddy negocia con Let's Encrypt y Ollama descarga sus modelos.
3. Verificar
bash
# La app está activa y la base de datos es accesible
curl https://rag.tudominio.com/api/health
# → {"status":"ok","checks":{"db":true,"embedding":true},"ts":"..."}
# Estado de los contenedores
docker compose -f docker-compose.prod.yml psArquitectura en producción
Internet
│ :443 / :80
▼
┌──────────┐
│ Caddy │ TLS automático, gzip, cabeceras de seguridad
└──────────┘
│ :3000 (solo interno)
▼
┌──────────┐ ┌──────────────┐ ┌────────┐
│ app │──▶│ postgres │ │ ollama │
└──────────┘ └──────────────┘ └────────┘
Sin puertos al host Sin puertos al hostLogs
bash
docker compose -f docker-compose.prod.yml logs -f app
docker compose -f docker-compose.prod.yml logs -f caddyBackup
bash
# Volcado de la base de datos a un archivo local
docker compose -f docker-compose.prod.yml exec postgres \
pg_dump -U $POSTGRES_USER $POSTGRES_DB > backup_$(date +%Y%m%d).sqlActualizar
bash
git pull
docker compose -f docker-compose.prod.yml up -d --buildLas migraciones de Prisma se ejecutan automáticamente al arrancar.
Usar una base de datos gestionada
Para usar un servicio PostgreSQL gestionado (Railway, Supabase, Neon) en lugar del contenedor Docker:
- Elimina el servicio
postgresdedocker-compose.prod.yml - Establece
DATABASE_URLen.envcon la cadena de conexión proporcionada por tu servicio - El servicio
appmigrará y se conectará al arrancar
Personalizar Caddy
Edita Caddyfile para añadir rate limiting, basic auth o una página de error personalizada:
{$DOMAIN} {
reverse_proxy app:3000
encode gzip
# Ejemplo: basic auth en endpoints de admin
# basicauth /api/admin/* {
# admin JDJhJDE0...
# }
}Tras editar, recarga Caddy sin reiniciar:
bash
docker compose -f docker-compose.prod.yml exec caddy caddy reload --config /etc/caddy/Caddyfile