@intlayer/docs 9.0.0-canary.10 → 9.0.0-canary.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/cjs/generated/docs.entry.cjs +20 -0
  2. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  3. package/dist/esm/generated/docs.entry.mjs +20 -0
  4. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  5. package/dist/types/generated/docs.entry.d.ts +1 -0
  6. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  7. package/docs/ar/intlayer_CMS.md +16 -1
  8. package/docs/ar/releases/v9.md +58 -1
  9. package/docs/ar/self_hosting.md +349 -0
  10. package/docs/bn/intlayer_CMS.md +570 -0
  11. package/docs/bn/releases/v9.md +358 -0
  12. package/docs/cs/releases/v9.md +358 -0
  13. package/docs/de/intlayer_CMS.md +117 -1
  14. package/docs/de/releases/v9.md +61 -1
  15. package/docs/de/self_hosting.md +349 -0
  16. package/docs/en/intlayer_CMS.md +171 -1
  17. package/docs/en/releases/v9.md +45 -2
  18. package/docs/en/self_hosting.md +349 -0
  19. package/docs/en-GB/intlayer_CMS.md +16 -1
  20. package/docs/en-GB/releases/v9.md +47 -2
  21. package/docs/en-GB/self_hosting.md +349 -0
  22. package/docs/es/intlayer_CMS.md +117 -1
  23. package/docs/es/releases/v9.md +61 -1
  24. package/docs/es/self_hosting.md +349 -0
  25. package/docs/fr/intlayer_CMS.md +117 -1
  26. package/docs/fr/releases/v9.md +61 -1
  27. package/docs/fr/self_hosting.md +349 -0
  28. package/docs/hi/intlayer_CMS.md +16 -1
  29. package/docs/hi/releases/v9.md +59 -1
  30. package/docs/hi/self_hosting.md +349 -0
  31. package/docs/id/releases/v9.md +31 -1
  32. package/docs/id/self_hosting.md +349 -0
  33. package/docs/it/intlayer_CMS.md +117 -1
  34. package/docs/it/releases/v9.md +61 -1
  35. package/docs/it/self_hosting.md +349 -0
  36. package/docs/ja/intlayer_CMS.md +191 -10
  37. package/docs/ja/releases/v9.md +31 -1
  38. package/docs/ja/self_hosting.md +349 -0
  39. package/docs/ko/intlayer_CMS.md +189 -6
  40. package/docs/ko/releases/v9.md +30 -1
  41. package/docs/ko/self_hosting.md +349 -0
  42. package/docs/nl/releases/v9.md +358 -0
  43. package/docs/pl/intlayer_CMS.md +16 -1
  44. package/docs/pl/releases/v9.md +58 -1
  45. package/docs/pl/self_hosting.md +349 -0
  46. package/docs/pt/intlayer_CMS.md +117 -1
  47. package/docs/pt/releases/v9.md +61 -1
  48. package/docs/pt/self_hosting.md +349 -0
  49. package/docs/ru/intlayer_CMS.md +196 -15
  50. package/docs/ru/releases/v9.md +59 -1
  51. package/docs/ru/self_hosting.md +349 -0
  52. package/docs/tr/intlayer_CMS.md +16 -1
  53. package/docs/tr/releases/v9.md +46 -1
  54. package/docs/tr/self_hosting.md +349 -0
  55. package/docs/uk/intlayer_CMS.md +16 -1
  56. package/docs/uk/releases/v9.md +58 -1
  57. package/docs/uk/self_hosting.md +349 -0
  58. package/docs/vi/releases/v9.md +31 -1
  59. package/docs/vi/self_hosting.md +349 -0
  60. package/docs/zh/releases/v9.md +31 -1
  61. package/docs/zh/self_hosting.md +349 -0
  62. package/package.json +6 -6
  63. package/src/generated/docs.entry.ts +20 -0
@@ -0,0 +1,349 @@
1
+ ---
2
+ createdAt: 2026-06-30
3
+ updatedAt: 2026-06-30
4
+ title: Autoalojamiento de Intlayer
5
+ description: Ejecuta una instancia completa de Intlayer en tu propia infraestructura con un solo comando. No se requiere una cuenta de Intlayer Cloud.
6
+ keywords:
7
+ - Self-Hosting
8
+ - Docker
9
+ - Docker Compose
10
+ - Intlayer
11
+ - CMS
12
+ - Installation
13
+ - Infrastructure
14
+ slugs:
15
+ - doc
16
+ - self-hosting
17
+ author: aymericzip
18
+ ---
19
+
20
+ # Autoalojamiento de Intlayer
21
+
22
+ 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:
23
+
24
+ ```sh
25
+ curl -fsSL https://intlayer.org/install.sh | sh
26
+ ```
27
+
28
+ El instalador descarga un `docker-compose.yml` y un `.env`, autogenera los secretos necesarios e inicia todos los contenedores con `docker compose up -d`.
29
+
30
+ ## Tabla de Contenidos
31
+
32
+ <TOC/>
33
+
34
+ ---
35
+
36
+ ## Arquitectura
37
+
38
+ ```
39
+ ┌─────────────────────────────┐
40
+ navegador ──────▶ │ app (TanStack Start) :3000│ ──┐
41
+ └─────────────────────────────┘ │ VITE_BACKEND_URL
42
+ ┌─────────────────────────────┐ │
43
+ │ backend (Fastify/Bun) :3100│ ◀─┘
44
+ └──────────────┬──────────────┘
45
+ ┌──────────┬─────────┼──────────┬───────────┐
46
+ ▼ ▼ ▼ ▼ ▼
47
+ mongo:27017 redis:6379 minio:9000 mailpit:1025 Chromium
48
+ (RS de 1 nodo) (API de S3) (SMTP) (en-imagen)
49
+ minio:9001 mailpit:8025
50
+ (consola) (interfaz web)
51
+ ```
52
+
53
+ 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.
54
+
55
+ ---
56
+
57
+ ## Requisitos previos
58
+
59
+ - **Docker** ≥ 24 y **Docker Compose** ≥ v2. Si falta alguno, el instalador imprimirá el enlace de instalación y saldrá.
60
+ - Puertos `3000`, `3100`, `8025`, `9000` y `9001` disponibles en el host.
61
+ - Un host Linux o macOS (o WSL2 en Windows).
62
+
63
+ ---
64
+
65
+ ## Inicio rápido
66
+
67
+ ```sh
68
+ curl -fsSL https://intlayer.org/install.sh | sh
69
+ ```
70
+
71
+ Lo que hace el instalador:
72
+
73
+ 1. Verifica que `docker` y `docker compose` estén presentes.
74
+ 2. Descarga `docker-compose.yml` y `.env.example` en `./intlayer/`.
75
+ 3. Si no existe un `.env`, copia el ejemplo y genera secretos aleatorios para `BETTER_AUTH_SECRET`, `S3_ACCESS_KEY_ID` y `S3_SECRET_ACCESS_KEY` a través de `openssl rand`.
76
+ 4. Ejecuta `docker compose pull` + `docker compose up -d`.
77
+ 5. Imprime las URLs: dashboard `:3000`, API `:3100`, interfaz de usuario de correo electrónico `:8025`, consola de MinIO `:9001`.
78
+
79
+ Una vez que la pila esté en funcionamiento, abre **http://localhost:3000** y crea tu primera cuenta.
80
+
81
+ ---
82
+
83
+ ## Servicios
84
+
85
+ | Servicio | Imagen | Puerto(s) del host | Propósito |
86
+ | :---------- | :----------------------------------------- | :----------------------------------- | :------------------------------------------------------------------------------- |
87
+ | **app** | construido desde `apps/app/Dockerfile` | `3000` | Dashboard de TanStack Start (UI del CMS) |
88
+ | **backend** | construido desde `apps/backend/Dockerfile` | `3100` | API REST de Fastify (endpoint `/health`) |
89
+ | **mongo** | `mongo:7` | interno | Conjunto de réplicas de un solo nodo (`rs0`) |
90
+ | **redis** | `redis:7-alpine` | interno | Colas de trabajos (BullMQ) y almacenamiento en caché (ioredis) |
91
+ | **minio** | `minio/minio` | `9000` (S3), `9001` (consola) | Almacenamiento de objetos compatible con S3 para avatares y capturas de pantalla |
92
+ | **mailpit** | `axllent/mailpit` | `1025` (SMTP), `8025` (interfaz web) | Receptor local de correos electrónicos transaccionales |
93
+
94
+ Los puertos internos (mongo, redis) no se exponen al host por defecto.
95
+
96
+ > El puerto `9000` de MinIO debe ser accesible desde el navegador porque los activos cargados (avatares, capturas de pantalla) se cargan directamente desde `S3_PUBLIC_URL=http://localhost:9000/intlayer`.
97
+
98
+ ---
99
+
100
+ ## Variables de entorno
101
+
102
+ El instalador genera un archivo `.env` listo para usar. La siguiente tabla describe cada variable.
103
+
104
+ ### Requeridas (autogeneradas o solicitadas)
105
+
106
+ | Variable | Ejemplo | Descripción |
107
+ | :--------------------- | :---------------------------------------------- | :------------------------------------------------------------------ |
108
+ | `NODE_ENV` | `production` | Entorno de ejecución |
109
+ | `PORT` | `3100` | Puerto de escucha del backend |
110
+ | `BACKEND_URL` | `http://localhost:3100` | URL pública de la API del backend |
111
+ | `APP_URL` | `http://localhost:3000` | URL pública del dashboard |
112
+ | `DOMAIN` | `localhost` | Dominio de la cookie |
113
+ | `MONGODB_URI` | `mongodb://mongo:27017/intlayer?replicaSet=rs0` | URI de conexión completa de MongoDB |
114
+ | `REDIS_URL` | `redis://redis:6379` | URL de conexión de Redis |
115
+ | `BETTER_AUTH_SECRET` | _(generado)_ | Secreto de 32 bytes para la firma de sesiones |
116
+ | `MAIL_PROVIDER` | `smtp` | Transporte de correo: `smtp` o `resend` |
117
+ | `MAIL_SMTP_HOST` | `mailpit` | Nombre de host SMTP (nombre del contenedor de Mailpit) |
118
+ | `MAIL_SMTP_PORT` | `1025` | Puerto SMTP |
119
+ | `MAIL_FROM` | `Intlayer <no-reply@localhost>` | Dirección del remitente |
120
+ | `S3_ENDPOINT` | `http://minio:9000` | Endpoint compatible con S3 |
121
+ | `S3_PUBLIC_URL` | `http://localhost:9000/intlayer` | URL pública para la carga de activos del navegador |
122
+ | `S3_BUCKET_NAME` | `intlayer` | Nombre del bucket |
123
+ | `S3_ACCESS_KEY_ID` | _(generado)_ | Clave de acceso de MinIO |
124
+ | `S3_SECRET_ACCESS_KEY` | _(generado)_ | Clave secreta de MinIO |
125
+ | `VITE_BACKEND_URL` | `http://localhost:3100` | URL del backend integrada en el dashboard en tiempo de construcción |
126
+ | `VITE_DOMAIN` | `localhost` | Dominio integrado en el dashboard en tiempo de construcción |
127
+
128
+ ### Opcionales (las características se degradan elegantemente cuando están ausentes)
129
+
130
+ | Variable | Característica |
131
+ | :------------------------------------------------------- | :-------------------------------------------------------------------------------------- |
132
+ | `OPENAI_API_KEY` | Traducción asistida por IA y auditoría de contenido |
133
+ | `STRIPE_SECRET_KEY`, `STRIPE_WEBHOOK_SECRET`, `STRIPE_*` | Gestión de facturación y suscripciones |
134
+ | `RESEND_API_KEY` | Correo electrónico transaccional a través de Resend (anula Mailpit cuando se configura) |
135
+ | `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` | Inicio de sesión GitHub OAuth |
136
+ | `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` | Inicio de sesión Google OAuth |
137
+ | `GITLAB_CLIENT_ID`, `GITLAB_CLIENT_SECRET` | Inicio de sesión GitLab OAuth |
138
+ | `MICROSOFT_CLIENT_ID`, `MICROSOFT_CLIENT_SECRET` | Inicio de sesión Microsoft OAuth |
139
+ | `LINKEDIN_CLIENT_ID`, `LINKEDIN_CLIENT_SECRET` | Inicio de sesión LinkedIn OAuth |
140
+ | `ATLASSIAN_CLIENT_ID`, `ATLASSIAN_CLIENT_SECRET` | Inicio de sesión Atlassian OAuth |
141
+
142
+ ---
143
+
144
+ ## Conectando tu proyecto Intlayer
145
+
146
+ Una vez que la pila esté en funcionamiento, apunta tu proyecto al backend y dashboard autoalojados en lugar de `intlayer.org`.
147
+
148
+ ### Configuración del proyecto
149
+
150
+ ```typescript fileName="intlayer.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
151
+ import type { IntlayerConfig } from "intlayer";
152
+
153
+ const config: IntlayerConfig = {
154
+ editor: {
155
+ clientId: process.env.INTLAYER_CLIENT_ID,
156
+ clientSecret: process.env.INTLAYER_CLIENT_SECRET,
157
+
158
+ /**
159
+ * URL del dashboard CMS autoalojado.
160
+ * Por defecto: https://app.intlayer.org
161
+ */
162
+ cmsURL: process.env.INTLAYER_CMS_URL, // e.g. http://localhost:3000
163
+
164
+ /**
165
+ * URL de la API del backend autoalojado.
166
+ * Por defecto: https://back.intlayer.org
167
+ */
168
+ backendURL: process.env.INTLAYER_BACKEND_URL, // e.g. http://localhost:3100
169
+ },
170
+ };
171
+
172
+ export default config;
173
+ ```
174
+
175
+ Establece las variables de entorno en el `.env` de tu proyecto:
176
+
177
+ ```sh
178
+ INTLAYER_CMS_URL=http://localhost:3000
179
+ INTLAYER_BACKEND_URL=http://localhost:3100
180
+ INTLAYER_CLIENT_ID=<your-client-id>
181
+ INTLAYER_CLIENT_SECRET=<your-client-secret>
182
+ ```
183
+
184
+ Crea credenciales de acceso en tu dashboard autoalojado en **Proyectos → Claves de acceso** en `http://localhost:3000/projects`.
185
+
186
+ ### SDK de `@intlayer/api`
187
+
188
+ Al usar el SDK de `@intlayer/api` programáticamente, pasa `backendURL` explícitamente:
189
+
190
+ ```typescript fileName="cms.ts" codeFormat="typescript"
191
+ import { createIntlayerCMS } from "@intlayer/api";
192
+ import { dictionaryEndpoint } from "@intlayer/api/dictionary";
193
+
194
+ const cms = createIntlayerCMS({
195
+ editor: {
196
+ clientId: process.env.INTLAYER_CLIENT_ID,
197
+ clientSecret: process.env.INTLAYER_CLIENT_SECRET,
198
+ backendURL: process.env.INTLAYER_BACKEND_URL, // http://localhost:3100
199
+ },
200
+ });
201
+
202
+ const { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();
203
+ ```
204
+
205
+ ---
206
+
207
+ ## Actualización
208
+
209
+ Volver a ejecutar el instalador en un despliegue existente realiza una actualización continua:
210
+
211
+ ```sh
212
+ curl -fsSL https://intlayer.org/install.sh | sh
213
+ ```
214
+
215
+ 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.
216
+
217
+ Para actualizar manualmente desde el directorio `./intlayer/`:
218
+
219
+ ```sh
220
+ docker compose pull
221
+ docker compose up -d
222
+ ```
223
+
224
+ ---
225
+
226
+ ## Copia de seguridad y restauración
227
+
228
+ Todos los datos persistentes residen en tres volúmenes de Docker con nombre.
229
+
230
+ ### Copia de seguridad
231
+
232
+ ```sh
233
+ docker run --rm \
234
+ -v intlayer_mongo-data:/data \
235
+ -v "$(pwd)":/backup \
236
+ busybox tar czf /backup/mongo-data.tar.gz /data
237
+
238
+ docker run --rm \
239
+ -v intlayer_redis-data:/data \
240
+ -v "$(pwd)":/backup \
241
+ busybox tar czf /backup/redis-data.tar.gz /data
242
+
243
+ docker run --rm \
244
+ -v intlayer_minio-data:/data \
245
+ -v "$(pwd)":/backup \
246
+ busybox tar czf /backup/minio-data.tar.gz /data
247
+ ```
248
+
249
+ ### Restauración
250
+
251
+ ```sh
252
+ docker run --rm \
253
+ -v intlayer_mongo-data:/data \
254
+ -v "$(pwd)":/backup \
255
+ busybox tar xzf /backup/mongo-data.tar.gz -C /
256
+
257
+ # Repetir para redis-data y minio-data
258
+ ```
259
+
260
+ ---
261
+
262
+ ## Uso de un proxy inverso (Nginx / Caddy)
263
+
264
+ 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.
265
+
266
+ ### Ejemplo de Nginx
267
+
268
+ ```nginx
269
+ server {
270
+ listen 80;
271
+ server_name cms.example.com;
272
+
273
+ location / {
274
+ proxy_pass http://localhost:3000;
275
+ proxy_set_header Host $host;
276
+ proxy_set_header X-Real-IP $remote_addr;
277
+ }
278
+ }
279
+
280
+ server {
281
+ listen 80;
282
+ server_name api.example.com;
283
+
284
+ location / {
285
+ proxy_pass http://localhost:3100;
286
+ proxy_set_header Host $host;
287
+ proxy_set_header X-Real-IP $remote_addr;
288
+ }
289
+ }
290
+ ```
291
+
292
+ Actualiza las siguientes variables `.env` para que coincidan con tus dominios públicos:
293
+
294
+ ```sh
295
+ BACKEND_URL=https://api.example.com
296
+ APP_URL=https://cms.example.com
297
+ DOMAIN=example.com
298
+ VITE_BACKEND_URL=https://api.example.com
299
+ VITE_DOMAIN=example.com
300
+ ```
301
+
302
+ > Las variables `VITE_*` 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 la `app` (`docker compose build app`) o usar la inyección de configuración en tiempo de ejecución.
303
+
304
+ ---
305
+
306
+ ## Solución de problemas
307
+
308
+ ### Reinicios del backend en bucle al inicio
309
+
310
+ 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:
311
+
312
+ ```sh
313
+ docker compose ps
314
+ docker compose logs mongo
315
+ docker compose logs redis
316
+ ```
317
+
318
+ ### El dashboard no puede conectar con la API
319
+
320
+ 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:
321
+
322
+ ```sh
323
+ docker compose build app
324
+ docker compose up -d app
325
+ ```
326
+
327
+ ### El correo electrónico no se envía
328
+
329
+ 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:
330
+
331
+ ```sh
332
+ docker compose restart backend
333
+ ```
334
+
335
+ ### Falta el bucket de MinIO
336
+
337
+ 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:
338
+
339
+ ```sh
340
+ docker compose run --rm minio-init
341
+ ```
342
+
343
+ ---
344
+
345
+ ## Enlaces útiles
346
+
347
+ - [Documentación del CMS de Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/intlayer_CMS.md)
348
+ - [Referencia de configuración](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/configuration.md)
349
+ - [SDK del CMS — `@intlayer/api`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/intlayer_CMS.md#programmatic-access-con-el-sdk-intlayerapi)
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2025-08-23
3
- updatedAt: 2025-08-23
3
+ updatedAt: 2026-06-30
4
4
  title: Intlayer CMS | Externalisez votre contenu dans le CMS Intlayer
5
5
  description: Externalisez votre contenu dans le CMS Intlayer pour déléguer la gestion de votre contenu à votre équipe.
6
6
  keywords:
@@ -18,6 +18,9 @@ slugs:
18
18
  - cms
19
19
  youtubeVideo: https://www.youtube.com/watch?v=UDDTnirwi_4
20
20
  history:
21
+ - version: 9.0.0
22
+ date: 2026-06-30
23
+ changes: "Ajout de la section Auto-hébergement : bootstrap Docker Compose, inventaire des services, configuration SDK, fonctionnalités optionnelles et notes de mise à niveau"
21
24
  - version: 6.0.1
22
25
  date: 2025-09-22
23
26
  changes: "Ajout de la documentation sur la synchronisation en direct"
@@ -380,6 +383,119 @@ Notes et contraintes :
380
383
  - L'indicateur `live` est évalué pour chaque dictionnaire au moment de la compilation. Si le contenu distant n'était pas marqué `live=true` lors de la compilation, vous devez recompiler pour activer la synchronisation en direct pour ce dictionnaire.
381
384
  - Le serveur de synchronisation en direct doit pouvoir écrire dans `.intlayer`. Dans les conteneurs, assurez-vous d'avoir un accès en écriture à `/.intlayer`.
382
385
 
386
+ ## Auto-hébergement
387
+
388
+ Intlayer peut fonctionner entièrement sur votre propre infrastructure — aucun compte Intlayer Cloud requis. Une seule commande amorce l'ensemble de la pile (tableau de bord, API, base de données, stockage d'objets et e-mail) avec Docker Compose :
389
+
390
+ ```sh
391
+ curl -fsSL https://intlayer.org/install.sh | sh
392
+ ```
393
+
394
+ Cela télécharge un `docker-compose.yml` et un `.env`, génère automatiquement les secrets requis (`BETTER_AUTH_SECRET`, identifiants MinIO) et démarre tous les conteneurs avec `docker compose up -d`. Relancer la même commande sur une installation existante effectue une mise à niveau progressive sans perte de données.
395
+
396
+ ### Services démarrés
397
+
398
+ | Service | Port(s) | Objectif |
399
+ | ------------------------- | ------------------------------------- | -------------------------------------------------- |
400
+ | **app** (tableau de bord) | `3000` | Interface CMS TanStack Start |
401
+ | **backend** (API) | `3100` | API REST Fastify |
402
+ | **MongoDB 7** | interne | Base de données principale (replica set mono-nœud) |
403
+ | **Redis 7** | interne | Files d'attente de tâches et mise en cache |
404
+ | **MinIO** | `9000` (S3), `9001` (console) | Stockage d'objets compatible S3 |
405
+ | **Mailpit** | `1025` (SMTP), `8025` (interface web) | Puits d'e-mails transactionnels local |
406
+
407
+ Chromium (pour la génération de captures d'écran Puppeteer) est intégré dans l'image du backend — aucun conteneur séparé n'est nécessaire.
408
+
409
+ ### Connecter votre projet à une instance auto-hébergée
410
+
411
+ Pointez votre configuration Intlayer vers votre propre backend et tableau de bord au lieu de `intlayer.org` :
412
+
413
+ ```typescript fileName="intlayer.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
414
+ import type { IntlayerConfig } from "intlayer";
415
+
416
+ const config: IntlayerConfig = {
417
+ editor: {
418
+ clientId: process.env.INTLAYER_CLIENT_ID,
419
+ clientSecret: process.env.INTLAYER_CLIENT_SECRET,
420
+
421
+ /**
422
+ * URL du tableau de bord CMS auto-hébergé.
423
+ * Par défaut : https://app.intlayer.org
424
+ */
425
+ cmsURL: process.env.INTLAYER_CMS_URL, // ex. http://localhost:3000
426
+
427
+ /**
428
+ * URL de l'API backend auto-hébergée.
429
+ * Par défaut : https://back.intlayer.org
430
+ */
431
+ backendURL: process.env.INTLAYER_BACKEND_URL, // ex. http://localhost:3100
432
+ },
433
+ };
434
+
435
+ export default config;
436
+ ```
437
+
438
+ Définissez les variables d'environnement correspondantes dans votre projet :
439
+
440
+ ```sh
441
+ INTLAYER_CMS_URL=http://localhost:3000
442
+ INTLAYER_BACKEND_URL=http://localhost:3100
443
+ INTLAYER_CLIENT_ID=<your-client-id>
444
+ INTLAYER_CLIENT_SECRET=<your-client-secret>
445
+ ```
446
+
447
+ Créez des identifiants d'accès dans votre tableau de bord auto-hébergé à `http://localhost:3000/projects`.
448
+
449
+ ### SDK `@intlayer/api` : pointer vers un backend auto-hébergé
450
+
451
+ Lors de l'utilisation du SDK de manière programmatique, passez `backendURL` explicitement à `createIntlayerCMS` :
452
+
453
+ ```typescript fileName="cms.ts" codeFormat="typescript"
454
+ import { createIntlayerCMS } from "@intlayer/api";
455
+ import { dictionaryEndpoint } from "@intlayer/api/dictionary";
456
+
457
+ const cms = createIntlayerCMS({
458
+ editor: {
459
+ clientId: process.env.INTLAYER_CLIENT_ID,
460
+ clientSecret: process.env.INTLAYER_CLIENT_SECRET,
461
+ backendURL: process.env.INTLAYER_BACKEND_URL, // http://localhost:3100
462
+ },
463
+ });
464
+
465
+ const { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();
466
+ ```
467
+
468
+ ### Fonctionnalités optionnelles
469
+
470
+ Ces fonctionnalités nécessitent des comptes externes et fonctionnent normalement même sans leurs clés dans le fichier `.env` auto-hébergé :
471
+
472
+ | Fonctionnalité | Variable(s) d'environnement |
473
+ | ----------------------------------- | ----------------------------------------------- |
474
+ | Traduction / audit par IA | `OPENAI_API_KEY` |
475
+ | Facturation | `STRIPE_SECRET_KEY`, `STRIPE_WEBHOOK_SECRET`, … |
476
+ | OAuth GitHub | `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` |
477
+ | OAuth Google | `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` |
478
+ | OAuth GitLab / Microsoft / LinkedIn | `GITLAB_*`, `MICROSOFT_*`, `LINKEDIN_*` |
479
+ | E-mail transactionnel via Resend | `RESEND_API_KEY` (par défaut : Mailpit SMTP) |
480
+
481
+ ### Persistance des données et mises à niveau
482
+
483
+ Trois volumes Docker contiennent tout l'état persistant : `mongo-data`, `redis-data` et `minio-data`. Ils survivent aux redémarrages et aux mises à niveau des conteneurs. Relancer le programme d'installation télécharge les dernières images et effectue un `docker compose up -d` progressif.
484
+
485
+ Ports exposés sur l'hôte :
486
+
487
+ | Port | Service |
488
+ | ------ | ----------------------------------------------------------------------- |
489
+ | `3000` | Tableau de bord |
490
+ | `3100` | API Backend |
491
+ | `8025` | Interface web Mailpit |
492
+ | `9000` | API S3 MinIO (requise pour le chargement des assets dans le navigateur) |
493
+ | `9001` | Console MinIO |
494
+
495
+ Pour une référence complète de toutes les variables d'environnement disponibles et des options avancées (proxy inverse, domaines personnalisés, sauvegarde/restauration), consultez le [Guide d'auto-hébergement](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/self_hosting.md).
496
+
497
+ ---
498
+
383
499
  ## Débogage
384
500
 
385
501
  Si vous rencontrez des problèmes avec le CMS, vérifiez les points suivants :
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2026-06-14
3
- updatedAt: 2026-06-26
3
+ updatedAt: 2026-06-30
4
4
  title: Nouvel Intlayer v9 - Quoi de neuf ?
5
5
  description: Découvrez les nouveautés d'Intlayer v9. Présentation des packages de compatibilité prêts à l'emploi pour les bibliothèques i18n populaires et prise en charge des Collections et Variants.
6
6
  keywords:
@@ -9,6 +9,9 @@ keywords:
9
9
  - Migration
10
10
  - Collections
11
11
  - Variants
12
+ - CMS SDK
13
+ - Self-Hosting
14
+ - Docker
12
15
  - i18next
13
16
  - next-intl
14
17
  - vue-i18n
@@ -295,13 +298,68 @@ npm install intlayer react-native-intlayer
295
298
 
296
299
  ---
297
300
 
301
+ ## SDK CMS : utilisez Intlayer comme une base de données de contenu headless
302
+
303
+ Intlayer v9 fournit un SDK clair et auto-authentifié dans `@intlayer/api` pour interagir avec le CMS de manière programmatique — récupérer des projets, récupérer des dictionnaires, et les pousser ou les mettre à jour depuis votre propre serveur, vos scripts ou votre CI. L'authentification (OAuth2 `client_credentials`) est gérée et rafraîchie pour vous.
304
+
305
+ Le SDK est divisé en **deux imports distincts** afin que votre bundle n'inclue que les domaines que vous utilisez réellement :
306
+
307
+ 1. `createIntlayerCMS` — un **authentificateur** léger qui détient les identifiants et le jeton géré (aucun client de domaine n'est inclus).
308
+ 2. `dictionaryEndpoint`, `projectEndpoint`, … — des **lieurs d'endpoint** par domaine, chacun importé depuis son propre sous-chemin.
309
+
310
+ ```ts fileName="cms.ts"
311
+ import { createIntlayerCMS } from "@intlayer/api";
312
+ import { dictionaryEndpoint } from "@intlayer/api/dictionary";
313
+
314
+ // La configuration est optionnelle : les identifiants reviennent à INTLAYER_CLIENT_ID /
315
+ // INTLAYER_CLIENT_SECRET résolus par `@intlayer/config/built`.
316
+ const cms = createIntlayerCMS();
317
+
318
+ // Lecture
319
+ const { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();
320
+
321
+ // Écriture — utilisez le CMS comme une base de données
322
+ await dictionaryEndpoint(cms).pushDictionaries([myDictionary]);
323
+ ```
324
+
325
+ > Sécurité : les identifiants du CMS accordent un accès en écriture à votre contenu. Créez toujours l'authentificateur **côté serveur** uniquement — n'envoyez jamais `clientId` / `clientSecret` au navigateur.
326
+
327
+ ---
328
+
329
+ ## Auto-hébergement
330
+
331
+ Intlayer v9 offre une prise en charge de première classe pour exécuter votre propre instance Intlayer avec une seule commande — aucun compte Intlayer Cloud requis.
332
+
333
+ ```sh
334
+ curl -fsSL https://intlayer.org/install.sh | sh
335
+ ```
336
+
337
+ Le programme d'installation télécharge un `docker-compose.yml` et un `.env`, génère automatiquement les secrets requis et exécute `docker compose up -d`. Tout — le tableau de bord, l'API, la base de données, le stockage d'objets et les e-mails transactionnels — s'exécute localement dans des conteneurs.
338
+
339
+ ### Services inclus
340
+
341
+ | Service | Objectif |
342
+ | --------------------------------------- | ------------------------------------------------------------------------------------ |
343
+ | **app** (TanStack Start) | Interface du tableau de bord sur le port `3000` |
344
+ | **backend** (Fastify/Bun) | API REST sur le port `3100` |
345
+ | **MongoDB 7** (single-node replica set) | Base de données principale |
346
+ | **Redis 7** | Files d'attente de tâches et mise en cache |
347
+ | **MinIO** | Stockage d'objets compatible S3 (avatars, captures d'écran) |
348
+ | **Mailpit** | Puits SMTP local + interface web pour les e-mails transactionnels sur le port `8025` |
349
+
350
+ Chromium (utilisé pour la génération de captures d'écran Puppeteer) est intégré dans l'image du backend — aucun conteneur supplémentaire n'est nécessaire.
351
+
352
+ ---
353
+
298
354
  ## Notes de migration depuis la v8
299
355
 
300
356
  Si vous effectuez une mise à niveau depuis la v8, notez que la v9 n'inclut pas de changements majeurs (breaking changes). Voici cependant les changements clés :
301
357
 
302
358
  - **Compilateur désactivé par défaut** : `compiler.enabled` vaut désormais `false` par défaut. Si vous dépendez de l'extraction de vos fichiers `.content.ts` au build, définissez `compiler.enabled: true` dans votre `intlayer.config.ts`.
359
+ - **Plugin Vite** : Le compilateur et le proxy de routage de locale sont désormais intégrés dans `intlayer()`. Si vous avez précédemment enregistré `intlayerCompiler()` ou `intlayerProxy()` manuellement, vous pouvez les supprimer — ils sont dédupliqués automatiquement, donc les conserver est sans danger. Utilisez `routing.enableProxy: false` pour désactiver le proxy.
303
360
  - **Locales et dialectes** : Si vous utilisez des dépendances i18n externes, ajoutez leurs plugins d'adaptateur de compatibilité respectifs dans votre configuration ou votre setup de bundler pour réécrire automatiquement les imports.
304
361
  - **Sélecteurs personnalisés** : Lors de l'appel de `useIntlayer`, le deuxième paramètre est désormais réservé à un objet d'options contenant `{ locale, item, variant }`. Si vous passiez auparavant une chaîne de caractères de locale directement, vous pouvez toujours le faire, mais l'utilisation de l'objet d'options est recommandée pour les sélections avancées.
362
+ - **React Native** : `react-native-intlayer` réexporte désormais l'intégralité de l'API `react-intlayer`. Dans une application React Native, importez tout depuis `react-native-intlayer` et supprimez la dépendance directe à `react-intlayer`. Les imports `react-intlayer` existants continuent de fonctionner.
305
363
 
306
364
  ---
307
365
 
@@ -310,3 +368,5 @@ Si vous effectuez une mise à niveau depuis la v8, notez que la v9 n'inclut pas
310
368
  - [Guide des packages d'adaptateurs de compatibilité](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/compat/index.md)
311
369
  - [Dictionnaires dynamiques - Collections & Variants](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/dynamic_dictionaries/index.md)
312
370
  - [Référence de configuration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/configuration.md)
371
+ - [SDK CMS - Accès programmatique avec @intlayer/api](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/intlayer_CMS.md)
372
+ - [Guide d'auto-hébergement](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/self_hosting.md)