Haz tu pregunta y obtén un resumen del documento referenciando esta página y el proveedor AI de tu elección
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.
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
El instalador genera un archivo .env listo para usar. La siguiente tabla describe cada variable.
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 |
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-dataUso de un proxy inverso (Nginx / Caddy)
Para despliegues de producción, coloca un proxy inverso delante de los contenedores de la aplicación y del backend en lugar de exponerlos directamente.
Ejemplo de Nginx
Copiar el código al portapapeles
server { listen 80; server_name cms.example.com; location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }}server { listen 80; server_name api.example.com; location / { proxy_pass http://localhost:3100; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }}Actualiza las siguientes variables .env para que coincidan con tus dominios públicos:
Copiar el código al portapapeles
BACKEND_URL=https://api.example.comAPP_URL=https://cms.example.comDOMAIN=example.comVITE_BACKEND_URL=https://api.example.comVITE_DOMAIN=example.comLas variablesVITE_*se integran en la imagen del dashboard en el momento de la construcción. Si las cambias después de que se construya la imagen, necesitas reconstruir la imagen de laapp(docker compose build app) o usar la inyección de configuración en tiempo de ejecución.
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 appEl correo electrónico no se envía
Por defecto, todos los correos electrónicos salientes son capturados por Mailpit. Abre http://localhost:8025 para ver los mensajes enviados. Para enviar correos electrónicos reales, establece MAIL_PROVIDER=resend y RESEND_API_KEY=<tu-clave> en .env, luego reinicia el backend:
Copiar el código al portapapeles
docker compose restart backendFalta 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