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 2 de julio 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ésIf you have an idea for improving this documentation, please feel free to contribute by submitting a pull request on GitHub.
GitHub link to the documentationCopy doc Markdown to clipboard
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:
Copiar el código al portapapeles
curl -fsSL https://intlayer.org/install.sh | shEl instalador descarga un docker-compose.yml y un .env, autogenera los secretos necesarios e inicia todos los contenedores con docker compose up -d.
Tabla de Contenidos
Arquitectura
Copiar el código al portapapeles
┌─────────────────────────────┐ navegador ──────▶ │ app (TanStack Start) :3000│ ──┐ └─────────────────────────────┘ │ VITE_BACKEND_URL ┌─────────────────────────────┐ │ │ backend (Fastify/Bun) :3100│ ◀─┘ └──────────────┬──────────────┘ ┌──────────┬─────────┼──────────┬───────────┐ ▼ ▼ ▼ ▼ ▼ mongo:27017 redis:6379 minio:9000 mailpit:1025 Chromium (RS de 1 nodo) (API de S3) (SMTP) (en-imagen) minio:9001 mailpit:8025 (consola) (interfaz web)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).
Inicio rápido
Copiar el código al portapapeles
curl -fsSL https://intlayer.org/install.sh | shLo que hace el instalador:
- Verifica que
dockerydocker composeestén presentes. - Descarga
docker-compose.ymly.env.exampleen./intlayer/. - Si no existe un
.env, copia el ejemplo y genera secretos aleatorios paraBETTER_AUTH_SECRET,S3_ACCESS_KEY_IDyS3_SECRET_ACCESS_KEYa través deopenssl rand. - Ejecuta
docker compose pull+docker compose up -d. - Imprime las URLs: dashboard
:3000, API:3100, interfaz de usuario de correo electrónico:8025, consola de MinIO:9001.
Una vez que la pila esté en funcionamiento, abre http://localhost:3000 y crea tu primera cuenta.
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 |
Los puertos internos (mongo, redis) no se exponen al host por defecto.
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
INTLAYER_CMS_URL=http://localhost:3000INTLAYER_BACKEND_URL=http://localhost:3100INTLAYER_CLIENT_ID=<your-client-id>INTLAYER_CLIENT_SECRET=<your-client-secret>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
import { createIntlayerCMS } from "@intlayer/api";import { dictionaryEndpoint } from "@intlayer/api/dictionary";const cms = createIntlayerCMS({ editor: { clientId: process.env.INTLAYER_CLIENT_ID, clientSecret: process.env.INTLAYER_CLIENT_SECRET, backendURL: process.env.INTLAYER_BACKEND_URL, // http://localhost:3100 },});const { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();Actualización
Volver a ejecutar el instalador en un despliegue existente realiza una actualización continua:
Copiar el código al portapapeles
curl -fsSL https://intlayer.org/install.sh | shEsto 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.
Para actualizar manualmente desde el directorio ./intlayer/:
Copiar el código al portapapeles
docker compose pulldocker compose up -dCopia 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
docker run --rm \ -v intlayer_mongo-data:/data \ -v "$(pwd)":/backup \ busybox tar czf /backup/mongo-data.tar.gz /datadocker run --rm \ -v intlayer_redis-data:/data \ -v "$(pwd)":/backup \ busybox tar czf /backup/redis-data.tar.gz /datadocker run --rm \ -v intlayer_minio-data:/data \ -v "$(pwd)":/backup \ busybox tar czf /backup/minio-data.tar.gz /dataRestauración
Copiar el código al portapapeles
docker run --rm \ -v intlayer_mongo-data:/data \ -v "$(pwd)":/backup \ busybox tar xzf /backup/mongo-data.tar.gz -C /# Repetir para redis-data y minio-dataLimitaciones
- 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
docker compose psdocker compose logs mongodocker compose logs redisEl 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:
Copiar el código al portapapeles
docker compose build appdocker compose up -d appFalta 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
docker compose run --rm minio-init