Guías
Despliegue con Docker Compose
Despliegue de producción en un solo host con los archivos docker-compose.prod.yml e install.sh incluidos.
¿Tienes un servidor potente y quieres tener AskAIs Customer Service funcionando en 10 minutos? Este es el camino. Adecuado para menos de ~500 visitantes simultáneos; para una escala mayor, salta a la guía de Kubernetes.
Requisitos previos
- Un host Linux con Docker 24+ y `docker compose` v2
- ≥ 2 vCPU, 4 GB de RAM (8 GB recomendados)
- Un dominio apuntando al host (para TLS mediante Caddy / Cloudflare / nginx)
Instalación en una línea
git clone https://github.com/singlink/singlink
cd singlink
APP_DOMAIN=chat.acme.com bash scripts/install.shEl script:
- Comprueba docker + openssl
- Genera
.env.prodcon secretos aleatorios fuertes (modo 600) - Construye las tres imágenes (web / ws / worker)
- Levanta toda la pila con
docker compose -f docker-compose.prod.yml up -d - Ejecuta
prisma migrate deploydentro del contenedor web
Qué se ejecuta
- postgres — pgvector PG16
- redis — pub/sub + cola (protegido con contraseña)
- minio — almacenamiento compatible con S3 para los adjuntos
- web / ws / worker — los tres procesos de la aplicación
- nginx — proxy inverso en el puerto 8080 con actualización de WS
Añadir TLS
El nginx incluido termina HTTP/1.1 en el puerto 8080. Coloca delante un proxy de terminación TLS:
Caddy (lo más fácil)
# /etc/caddy/Caddyfile
chat.acme.com {
reverse_proxy localhost:8080
}Cloudflare Tunnel (sin ningún puerto entrante)
cloudflared tunnel create singlink
cloudflared tunnel route dns singlink chat.acme.com
cloudflared tunnel run --url http://localhost:8080 singlinkOperaciones Day-2
# Logs
docker compose -f docker-compose.prod.yml logs -f
# Restart everything
docker compose -f docker-compose.prod.yml restart
# Stop (data persists in named volumes)
docker compose -f docker-compose.prod.yml down
# Upgrade
git pull
docker compose -f docker-compose.prod.yml pull
docker compose -f docker-compose.prod.yml up -d --build
docker compose -f docker-compose.prod.yml exec web pnpm db:deploy
# Backups (run from cron daily)
docker compose -f docker-compose.prod.yml exec -T postgres \
pg_dump -U singlink singlink | gzip > /backups/singlink-$(date +%F).sql.gzEscalar los workers
Ejecuta más réplicas del worker de IA (Redis BullMQ se encarga de la distribución):
docker compose -f docker-compose.prod.yml up -d --scale worker=4Cuándo dar el salto a Kubernetes
- Necesitas postgres / redis en alta disponibilidad (RDS / ElastiCache gestionados)
- Necesitas autoescalado ante picos de tráfico
- Lo ejecutas en varias regiones
- La caída de un host único es inaceptable para tu SLA
Entonces salta a Kubernetes / Helm.