Haz tu pregunta y obtén un resumen del documento referenciando esta página y el proveedor AI de tu elección
Este documento está desactualizado, la versión base se actualizó el 23 de agosto de 2026.
Ir a la documentación en inglésHistorial de versiones
El contenido de esta página ha sido traducido con una IA.
Ver la última versión del contenido original en inglésSi tienes una idea para mejorar esta documentación, no dudes en contribuir enviando una pull request en GitHub.
Enlace de GitHub a la documentaciónCopiar el Markdown del documento a la portapapeles
Autoalojamiento de Intlayer
Intlayer puede ejecutarse completamente en tu propia infraestructura, sin necesidad de una cuenta de Intlayer Cloud. Un solo comando inicia una pila lista para producción:
Un comando instala todo:
Copiar el código al portapapeles
El instalador descarga un docker-compose.yml y un .env, autogenera los secretos necesarios e inicia todos los contenedores con docker compose up -d.
La única dependencia externa es MongoDB: el backend se conecta a un cluster de MongoDB Atlas, que proporcionas. Todo lo demás se ejecuta dentro del contenedor.
Tabla de Contenidos
Arquitectura
Copiar el código al portapapeles
Chromium (utilizado para la generación de capturas de pantalla de Puppeteer) se incluye dentro de la imagen del backend, no se necesita un contenedor separado.
Requisitos previos
- Docker ≥ 24 y Docker Compose ≥ v2. Si falta alguno, el instalador imprimirá el enlace de instalación y saldrá.
- Puertos
3000,3100,8025,9000y9001disponibles en el host. - Un host Linux o macOS (o WSL2 en Windows).
Todo lo demás — Bun, Redis, MinIO, Chromium — se incluye dentro de la imagen.
Inicio rápido
1. Ejecutar el instalador
Copiar el código al portapapeles
Verifica que Docker esté instalado y en ejecución, escribe ./intlayer.env con BETTER_AUTH_SECRET y S3_SECRET_ACCESS_KEY ya generadas, y descarga la imagen. No inicia el contenedor — el backend no puede arrancar sin tus credenciales de base de datos.
Ejecutar nuevamente el instalador es seguro: un intlayer.env existente nunca se sobrescribe, por lo que también sirve como ruta de actualización.
2. Rellena tus credenciales
Abre intlayer.env y completa los valores marcados como TODO:
Copiar el código al portapapeles
El archivo también contiene bloques comentados para las características opcionales — SMTP mailer, OPENAI_API_KEY y los proveedores de OAuth. Descomenta lo que necesites.
El archivo se lee mediantedocker run --env-file, que no elimina las comillas y trata todo después de=como el valor. Escribe valores sin comillas y mantén los comentarios en sus propias líneas.
3. Inicia el container
Este es el comando que el instalador imprime cuando finaliza:
Copiar el código al portapapeles
Luego abre http://localhost:3000. El primer inicio inicializa los almacenes de datos, así que espera un minuto.
El panel de control se sirve en localhost. Ver Limitaciones — los dominios personalizados no son compatibles con la imagen publicada.
Configuración del instalador
El instalador lee algunas variables de entorno. Dado que se canaliza en sh, pásalas al shell en lugar de a curl:
Copiar el código al portapapeles
Abrir la tabla en una ventana flotante para ver todo el contenido claramente
| Variable | Default | Descripción |
|---|---|---|
INTLAYER_IMAGE | ghcr.io/aymericzip/intlayer-selfhost:latest | Imagen a descargar |
INTLAYER_ENV_FILE | ./intlayer.env | Dónde escribir el archivo env |
INTLAYER_CONTAINER_NAME | intlayer | Nombre del contenedor |
INTLAYER_DATA_VOLUME | intlayer-data | Volumen nombrado montado en /data |
INTLAYER_APP_PORT | 3000 | Puerto del host para el dashboard |
INTLAYER_API_PORT | 3100 | Puerto del host para la API |
INTLAYER_S3_PORT | 9000 | Puerto del host para la API MinIO S3 |
INTLAYER_CONSOLE_PORT | 9001 | Puerto del host para la consola MinIO |
Las cuatro variables de puerto solo cambian el lado del host del mapeo impreso en el comandodocker run. La imagen publicada tienehttp://localhost:3000,http://localhost:3100yhttp://localhost:9000compilados en el bundle del dashboard en el momento de la compilación, por lo que reasignarlos deja el navegador apuntando a los puertos antiguos. Mantén los valores predeterminados a menos que estés construyendo tu propia imagen — consulta Limitaciones.
Configuración inicial
En una instancia nueva (base de datos vacía), abrir el dashboard te redirige a la página /init:
- Crea la primera cuenta. Como la colección de usuarios está vacía, esta cuenta se promociona automáticamente a super admin.
- Se envía un email de verificación (vía Resend). La verificación de email es obligatoria — por eso
RESEND_API_KEYdebe estar configurado antes de empezar. - Haz clic en el enlace del email e inicia sesión.
Una vez que existe un admin, /init redirige a la página estándar de inicio de sesión.
Servicios
Abrir la tabla en una ventana flotante para ver todo el contenido claramente
| Servicio | Imagen | Puerto(s) del host | Propósito |
|---|---|---|---|
| app | construido desde apps/app/Dockerfile | 3000 | Dashboard de TanStack Start (UI del CMS) |
| backend | construido desde apps/backend/Dockerfile | 3100 | API REST de Fastify (endpoint /health) |
| mongo | mongo:7 | interno | Conjunto de réplicas de un solo nodo (rs0) |
| redis | redis:7-alpine | interno | Colas de trabajos (BullMQ) y almacenamiento en caché (ioredis) |
| minio | minio/minio | 9000 (S3), 9001 (consola) | Almacenamiento de objetos compatible con S3 para avatares y capturas de pantalla |
| mailpit | axllent/mailpit | 1025 (SMTP), 8025 (interfaz web) | Receptor local de correos electrónicos transaccionales |
El puerto9000de MinIO debe ser accesible desde el navegador porque los activos cargados (avatares, capturas de pantalla) se cargan directamente desdeS3_PUBLIC_URL=http://localhost:9000/intlayer.
Variables de entorno
Requerido
Abrir la tabla en una ventana flotante para ver todo el contenido claramente
| Variable | Ejemplo | Descripción |
|---|---|---|
DB_ID | intlayer | Usuario de MongoDB Atlas |
DB_MDP | (tu contraseña) | Contraseña de MongoDB Atlas |
DB_CLUSTER | cluster0.xxxxx.mongodb.net | Host del cluster de MongoDB Atlas (utilizado en el URI mongodb+srv://) |
BETTER_AUTH_SECRET | (generado) | Secret de 32 bytes para la firma de sesiones |
S3_SECRET_ACCESS_KEY | (generado) | Secret para el MinIO incluido |
RESEND_API_KEY | (tu clave) | Email transaccional a través de Resend. Requerido para la configuración inicial a menos que configures un mailer SMTP global (ver Global mailer) |
Requeridas (autogeneradas o solicitadas)
Abrir la tabla en una ventana flotante para ver todo el contenido claramente
| Variable | Ejemplo | Descripción |
|---|---|---|
NODE_ENV | production | Entorno de ejecución |
PORT | 3100 | Puerto de escucha del backend |
BACKEND_URL | http://localhost:3100 | URL pública de la API del backend |
APP_URL | http://localhost:3000 | URL pública del dashboard |
DOMAIN | localhost | Dominio de la cookie |
MONGODB_URI | mongodb://mongo:27017/intlayer?replicaSet=rs0 | URI de conexión completa de MongoDB |
REDIS_URL | redis://redis:6379 | URL de conexión de Redis |
BETTER_AUTH_SECRET | (generado) | Secreto de 32 bytes para la firma de sesiones |
MAIL_PROVIDER | smtp | Transporte de correo: smtp o resend |
MAIL_SMTP_HOST | mailpit | Nombre de host SMTP (nombre del contenedor de Mailpit) |
MAIL_SMTP_PORT | 1025 | Puerto SMTP |
MAIL_FROM | Intlayer <no-reply@localhost> | Dirección del remitente |
S3_ENDPOINT | http://minio:9000 | Endpoint compatible con S3 |
S3_PUBLIC_URL | http://localhost:9000/intlayer | URL pública para la carga de activos del navegador |
S3_BUCKET_NAME | intlayer | Nombre del bucket |
S3_ACCESS_KEY_ID | (generado) | Clave de acceso de MinIO |
S3_SECRET_ACCESS_KEY | (generado) | Clave secreta de MinIO |
VITE_BACKEND_URL | http://localhost:3100 | URL del backend integrada en el dashboard en tiempo de construcción |
VITE_DOMAIN | localhost | Dominio integrado en el dashboard en tiempo de construcción |
Opcionales (las características se degradan elegantemente cuando están ausentes)
Abrir la tabla en una ventana flotante para ver todo el contenido claramente
| Variable | Característica |
|---|---|
OPENAI_API_KEY | Traducción asistida por IA y auditoría de contenido |
STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, STRIPE_* | Gestión de facturación y suscripciones |
RESEND_API_KEY | Correo electrónico transaccional a través de Resend (anula Mailpit cuando se configura) |
GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET | Inicio de sesión GitHub OAuth |
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET | Inicio de sesión Google OAuth |
GITLAB_CLIENT_ID, GITLAB_CLIENT_SECRET | Inicio de sesión GitLab OAuth |
MICROSOFT_CLIENT_ID, MICROSOFT_CLIENT_SECRET | Inicio de sesión Microsoft OAuth |
LINKEDIN_CLIENT_ID, LINKEDIN_CLIENT_SECRET | Inicio de sesión LinkedIn OAuth |
ATLASSIAN_CLIENT_ID, ATLASSIAN_CLIENT_SECRET | Inicio de sesión Atlassian OAuth |
Servicio de correo global
De forma predeterminada, todos los correos electrónicos transaccionales se envían a través de Resend utilizando RESEND_API_KEY. Los despliegues auto-hospedados pueden enrutar todos los correos electrónicos — incluyendo correos no organizacionales como restablecimiento de contraseña y enlaces mágicos — a través de un servicio de correo global configurado con variables de entorno.
Establece MAIL_PROVIDER para activarlo. Cuando no está configurado, se utiliza el servicio de correo Resend predeterminado.
Abrir la tabla en una ventana flotante para ver todo el contenido claramente
| Variable | Ejemplo | Descripción |
|---|---|---|
MAIL_PROVIDER | smtp | Transporte global: smtp o resend. Déjalo sin configurar para usar los valores predeterminados |
MAIL_FROM | Intlayer <no-reply@acme.com> | Encabezado del remitente. Acepta una dirección simple o formato Name <email> |
MAIL_SMTP_HOST | smtp.acme.com | Host SMTP (requerido cuando MAIL_PROVIDER=smtp) |
MAIL_SMTP_PORT | 587 | Puerto SMTP (por defecto 587) |
MAIL_SMTP_SECURE | false | TLS implícito. Establece true para el puerto 465 |
MAIL_SMTP_USER | (tu usuario) | Usuario SMTP (opcional; omitir para relés sin autenticar) |
MAIL_SMTP_PASSWORD | (tu contraseña) | Contraseña SMTP |
Precedencia: el servicio de correo propio de una organización (configurado desde el panel de control de Organization) tiene prioridad sobre el servicio de correo global, que a su vez tiene prioridad sobre la clave Resend predeterminada.
Conectando tu proyecto Intlayer
Una vez que la pila esté en funcionamiento, apunta tu proyecto al backend y dashboard autoalojados en lugar de intlayer.org.
Configuración del proyecto
Copiar el código al portapapeles
import type { IntlayerConfig } from "intlayer";
const config: IntlayerConfig = {
editor: {
clientId: process.env.INTLAYER_CLIENT_ID,
clientSecret: process.env.INTLAYER_CLIENT_SECRET,
/**
* URL del dashboard CMS autoalojado.
* Por defecto: https://app.intlayer.org
*/
cmsURL: process.env.INTLAYER_CMS_URL, // e.g. http://localhost:3000
/**
* URL de la API del backend autoalojado.
* Por defecto: https://back.intlayer.org
*/
backendURL: process.env.INTLAYER_BACKEND_URL, // e.g. http://localhost:3100
},
};
export default config;
Establece las variables de entorno en el .env de tu proyecto:
Copiar el código al portapapeles
Crea credenciales de acceso en tu dashboard autoalojado en Proyectos → Claves de acceso en http://localhost:3000/projects.
SDK de @intlayer/api
Al usar el SDK de @intlayer/api programáticamente, pasa backendURL explícitamente:
Copiar el código al portapapeles
Actualización
Esto descarga las últimas imágenes y reinicia los contenedores con docker compose pull && docker compose up -d. Los volúmenes existentes (mongo-data, redis-data, minio-data) se conservan, sin pérdida de datos.
Copiar el código al portapapeles
Copia de seguridad y restauración
Todos los datos persistentes residen en tres volúmenes de Docker con nombre.
Copia de seguridad
Copiar el código al portapapeles
Restauración
Copiar el código al portapapeles
Limitaciones
- MongoDB debe ser externo (Atlas). El backend se conecta solo a través de
mongodb+srv://(construido desdeDB_ID/DB_MDP/DB_CLUSTER), por lo que un simplemongodb://host:27017— incluyendo elmongodincluido en el contenedor — no se puede usar. Proporciona un cluster de MongoDB Atlas. - Sin dominio personalizado. Todas las URLs
VITE_*que enfrenta el navegador se insertan en línea en la aplicación en tiempo de compilación, y la imagen publicada se envía con valores delocalhost. El dashboard debe accederse enhttp://localhost:3000; servirlo en un dominio público requeriría reconstruir la imagen con las URLs de destino incorporadas y no es compatible de forma predeterminada. - El correo electrónico requiere un mailer que funcione. La configuración de primera ejecución obliga a la verificación de correo electrónico, por lo que se debe configurar
RESEND_API_KEYo un mailer SMTP global (MAIL_PROVIDER=smtp+MAIL_SMTP_*). Después de que el primer administrador inicie sesión, cada organización también puede configurar su propio mailer SMTP o Resend desde el dashboard.
Solución de problemas
Reinicios del backend en bucle al inicio
MongoDB y Redis deben estar saludables antes de que el backend se inicie. El archivo compose utiliza depends_on con condition: service_healthy. Si ves reinicios repetidos del backend, verifica que los healthchecks de mongo y redis pasen:
Copiar el código al portapapeles
Busca MongoDB connection error cerca de la parte superior del log.
El dashboard no puede conectar con la API
Verifica que VITE_BACKEND_URL coincida con la URL donde el backend es accesible desde el navegador (no desde la red de Docker). Si cambiaste el puerto del backend o añadiste un proxy inverso, reconstruye la imagen del dashboard:
Falta el bucket de MinIO
Si el servicio de un solo uso minio-init no se ejecutó (o se ejecutó antes de que MinIO estuviera listo), crea el bucket manualmente:
Copiar el código al portapapeles
