@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: Self-Hosting Intlayer
5
+ description: Jalankan instance Intlayer lengkap di infrastruktur Anda sendiri dengan satu perintah. Tidak memerlukan akun 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
+ # Self-Hosting Intlayer
21
+
22
+ Intlayer dapat berjalan sepenuhnya di infrastruktur Anda sendiri — tidak memerlukan akun Intlayer Cloud. Satu perintah akan mem-boot stack yang siap produksi:
23
+
24
+ ```sh
25
+ curl -fsSL https://intlayer.org/install.sh | sh
26
+ ```
27
+
28
+ Installer mengunduh `docker-compose.yml` dan `.env`, membuat secret yang diperlukan secara otomatis, dan memulai semua kontainer dengan `docker compose up -d`.
29
+
30
+ ## Daftar Isi
31
+
32
+ <TOC/>
33
+
34
+ ---
35
+
36
+ ## Arsitektur
37
+
38
+ ```
39
+ ┌─────────────────────────────┐
40
+ browser ──────▶ │ 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
+ (1-node RS) (S3 API) (SMTP) (in-image)
49
+ minio:9001 mailpit:8025
50
+ (console) (web UI)
51
+ ```
52
+
53
+ Chromium (digunakan untuk pembuatan screenshot Puppeteer) dibundel di dalam image backend — tidak diperlukan kontainer terpisah.
54
+
55
+ ---
56
+
57
+ ## Prasyarat
58
+
59
+ - **Docker** ≥ 24 dan **Docker Compose** ≥ v2. Jika salah satunya tidak ada, installer akan mencetak tautan instalasi dan keluar.
60
+ - Port `3000`, `3100`, `8025`, `9000`, dan `9001` tersedia di host.
61
+ - Host Linux atau macOS (atau WSL2 di Windows).
62
+
63
+ ---
64
+
65
+ ## Memulai Cepat
66
+
67
+ ```sh
68
+ curl -fsSL https://intlayer.org/install.sh | sh
69
+ ```
70
+
71
+ Apa yang dilakukan installer:
72
+
73
+ 1. Memeriksa bahwa `docker` dan `docker compose` ada.
74
+ 2. Mengunduh `docker-compose.yml` dan `.env.example` ke `./intlayer/`.
75
+ 3. Jika tidak ada `.env` yang ada, menyalin contoh dan menghasilkan secret acak untuk `BETTER_AUTH_SECRET`, `S3_ACCESS_KEY_ID`, dan `S3_SECRET_ACCESS_KEY` melalui `openssl rand`.
76
+ 4. Menjalankan `docker compose pull` + `docker compose up -d`.
77
+ 5. Mencetak URL: dashboard `:3000`, API `:3100`, UI email `:8025`, konsol MinIO `:9001`.
78
+
79
+ Setelah stack aktif, buka **http://localhost:3000** dan buat akun pertama Anda.
80
+
81
+ ---
82
+
83
+ ## Layanan
84
+
85
+ | Layanan | Image | Port Host | Tujuan |
86
+ | ----------- | ------------------------------------- | ------------------------------ | ----------------------------------------------------------------------- |
87
+ | **app** | dibuat dari `apps/app/Dockerfile` | `3000` | Dashboard TanStack Start (UI CMS) |
88
+ | **backend** | dibuat dari `apps/backend/Dockerfile` | `3100` | Fastify REST API (`/health` endpoint) |
89
+ | **mongo** | `mongo:7` | internal | Replika set node tunggal (`rs0`) |
90
+ | **redis** | `redis:7-alpine` | internal | Job queues (BullMQ) dan caching (ioredis) |
91
+ | **minio** | `minio/minio` | `9000` (S3), `9001` (konsol) | Penyimpanan objek yang kompatibel dengan S3 untuk avatar dan screenshot |
92
+ | **mailpit** | `axllent/mailpit` | `1025` (SMTP), `8025` (UI web) | Sink email transaksional lokal |
93
+
94
+ Port internal (mongo, redis) tidak terekspos ke host secara default.
95
+
96
+ > Port MinIO `9000` harus dapat dijangkau oleh browser karena aset yang diunggah (avatar, screenshot) dimuat langsung dari `S3_PUBLIC_URL=http://localhost:9000/intlayer`.
97
+
98
+ ---
99
+
100
+ ## Variabel Lingkungan
101
+
102
+ Installer menghasilkan `.env` yang siap pakai. Tabel di bawah ini menjelaskan setiap variabel.
103
+
104
+ ### Wajib (dibuat secara otomatis atau diminta)
105
+
106
+ | Variabel | Contoh | Deskripsi |
107
+ | ---------------------- | ----------------------------------------------- | ------------------------------------------------------- |
108
+ | `NODE_ENV` | `production` | Lingkungan runtime |
109
+ | `PORT` | `3100` | Port listen backend |
110
+ | `BACKEND_URL` | `http://localhost:3100` | URL publik API backend |
111
+ | `APP_URL` | `http://localhost:3000` | URL publik dashboard |
112
+ | `DOMAIN` | `localhost` | Domain cookie |
113
+ | `MONGODB_URI` | `mongodb://mongo:27017/intlayer?replicaSet=rs0` | URI koneksi MongoDB lengkap |
114
+ | `REDIS_URL` | `redis://redis:6379` | URL koneksi Redis |
115
+ | `BETTER_AUTH_SECRET` | _(dibuat)_ | Secret 32-byte untuk penandatanganan sesi |
116
+ | `MAIL_PROVIDER` | `smtp` | Transportasi mail: `smtp` atau `resend` |
117
+ | `MAIL_SMTP_HOST` | `mailpit` | Nama host SMTP (nama kontainer Mailpit) |
118
+ | `MAIL_SMTP_PORT` | `1025` | Port SMTP |
119
+ | `MAIL_FROM` | `Intlayer <no-reply@localhost>` | Alamat pengirim |
120
+ | `S3_ENDPOINT` | `http://minio:9000` | Endpoint yang kompatibel dengan S3 |
121
+ | `S3_PUBLIC_URL` | `http://localhost:9000/intlayer` | URL publik untuk pemuatan aset browser |
122
+ | `S3_BUCKET_NAME` | `intlayer` | Nama bucket |
123
+ | `S3_ACCESS_KEY_ID` | _(dibuat)_ | Kunci akses MinIO |
124
+ | `S3_SECRET_ACCESS_KEY` | _(dibuat)_ | Kunci secret MinIO |
125
+ | `VITE_BACKEND_URL` | `http://localhost:3100` | URL backend yang tertanam di dashboard pada waktu build |
126
+ | `VITE_DOMAIN` | `localhost` | Domain yang tertanam di dashboard pada waktu build |
127
+
128
+ ### Opsional (fitur akan menurun secara bertahap jika tidak ada)
129
+
130
+ | Variabel | Fitur |
131
+ | -------------------------------------------------------- | ------------------------------------------------------------- |
132
+ | `OPENAI_API_KEY` | Terjemahan berbantuan AI dan audit konten |
133
+ | `STRIPE_SECRET_KEY`, `STRIPE_WEBHOOK_SECRET`, `STRIPE_*` | Penagihan dan manajemen langganan |
134
+ | `RESEND_API_KEY` | Email transaksional via Resend (menimpa Mailpit jika disetel) |
135
+ | `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` | Login GitHub OAuth |
136
+ | `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` | Login Google OAuth |
137
+ | `GITLAB_CLIENT_ID`, `GITLAB_CLIENT_SECRET` | Login GitLab OAuth |
138
+ | `MICROSOFT_CLIENT_ID`, `MICROSOFT_CLIENT_SECRET` | Login Microsoft OAuth |
139
+ | `LINKEDIN_CLIENT_ID`, `LINKEDIN_CLIENT_SECRET` | Login LinkedIn OAuth |
140
+ | `ATLASSIAN_CLIENT_ID`, `ATLASSIAN_CLIENT_SECRET` | Login Atlassian OAuth |
141
+
142
+ ---
143
+
144
+ ## Menghubungkan proyek Intlayer Anda
145
+
146
+ Setelah stack berjalan, arahkan proyek Anda ke backend dan dashboard yang di-self-host, bukan ke `intlayer.org`.
147
+
148
+ ### Konfigurasi proyek
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 dashboard CMS yang di-self-host.
160
+ * Default: https://app.intlayer.org
161
+ */
162
+ cmsURL: process.env.INTLAYER_CMS_URL, // e.g. http://localhost:3000
163
+
164
+ /**
165
+ * URL API backend yang di-self-host.
166
+ * Default: 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
+ Setel variabel lingkungan di `.env` proyek Anda:
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
+ Buat kredensial akses di dashboard self-host Anda di bawah **Projects → Access keys** di `http://localhost:3000/projects`.
185
+
186
+ ### `@intlayer/api` SDK
187
+
188
+ Saat menggunakan `@intlayer/api` SDK secara terprogram, teruskan `backendURL` secara eksplisit:
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
+ ## Peningkatan
208
+
209
+ Menjalankan ulang installer pada deployment yang ada akan melakukan rolling upgrade:
210
+
211
+ ```sh
212
+ curl -fsSL https://intlayer.org/install.sh | sh
213
+ ```
214
+
215
+ Ini menarik image terbaru dan memulai ulang kontainer dengan `docker compose pull && docker compose up -d`. Volume yang sudah ada (`mongo-data`, `redis-data`, `minio-data`) dipertahankan — tidak ada kehilangan data.
216
+
217
+ Untuk meningkatkan secara manual dari dalam direktori `./intlayer/`:
218
+
219
+ ```sh
220
+ docker compose pull
221
+ docker compose up -d
222
+ ```
223
+
224
+ ---
225
+
226
+ ## Cadangkan dan pulihkan
227
+
228
+ Semua data persisten berada dalam tiga volume Docker bernama.
229
+
230
+ ### Cadangkan
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
+ ### Pulihkan
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
+ # Ulangi untuk redis-data dan minio-data
258
+ ```
259
+
260
+ ---
261
+
262
+ ## Menggunakan reverse proxy (Nginx / Caddy)
263
+
264
+ Untuk deployment produksi, letakkan reverse proxy di depan kontainer aplikasi dan backend daripada mengeksposnya secara langsung.
265
+
266
+ ### Contoh 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
+ Perbarui variabel `.env` berikut agar sesuai dengan domain publik Anda:
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
+ > Variabel `VITE_*` tertanam dalam image dashboard pada waktu build. Jika Anda mengubahnya setelah image dibuat, Anda perlu membangun ulang image `app` (`docker compose build app`) atau menggunakan injeksi konfigurasi runtime.
303
+
304
+ ---
305
+
306
+ ## Pemecahan Masalah
307
+
308
+ ### Backend crash-loops pada start pertama
309
+
310
+ MongoDB dan Redis harus sehat sebelum backend dimulai. File compose menggunakan `depends_on` dengan `condition: service_healthy`. Jika Anda melihat restart backend berulang, periksa apakah `healthchecks` `mongo` dan `redis` lulus:
311
+
312
+ ```sh
313
+ docker compose ps
314
+ docker compose logs mongo
315
+ docker compose logs redis
316
+ ```
317
+
318
+ ### Dashboard tidak dapat mencapai API
319
+
320
+ Verifikasi bahwa `VITE_BACKEND_URL` cocok dengan URL di mana backend dapat dijangkau dari **browser** (bukan jaringan Docker). Jika Anda mengubah port backend atau menambahkan reverse proxy, bangun ulang image dashboard:
321
+
322
+ ```sh
323
+ docker compose build app
324
+ docker compose up -d app
325
+ ```
326
+
327
+ ### Email tidak terkirim
328
+
329
+ Secara default, semua email keluar ditangkap oleh Mailpit. Buka `http://localhost:8025` untuk melihat pesan yang terkirim. Untuk mengirim email sungguhan, setel `MAIL_PROVIDER=resend` dan `RESEND_API_KEY=<your-key>` di `.env`, lalu restart backend:
330
+
331
+ ```sh
332
+ docker compose restart backend
333
+ ```
334
+
335
+ ### Bucket MinIO hilang
336
+
337
+ Jika layanan one-shot `minio-init` tidak berjalan (atau berjalan sebelum MinIO siap), buat bucket secara manual:
338
+
339
+ ```sh
340
+ docker compose run --rm minio-init
341
+ ```
342
+
343
+ ---
344
+
345
+ ## Tautan Berguna
346
+
347
+ - [Dokumentasi Intlayer CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/intlayer_CMS.md)
348
+ - [Referensi Konfigurasi](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/configuration.md)
349
+ - [SDK CMS — `@intlayer/api`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/intlayer_CMS.md#programmatic-access-with-the-intlayerapi-sdk)
@@ -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 | Esternalizza i tuoi contenuti nel CMS di Intlayer
5
5
  description: Esternalizza i tuoi contenuti nel CMS di Intlayer per delegare la gestione dei tuoi contenuti al tuo team.
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: "Aggiunta sezione Self-Hosting: bootstrap Docker Compose, inventario dei servizi, configurazione SDK, funzionalità opzionali e note di aggiornamento"
21
24
  - version: 6.0.1
22
25
  date: 2025-09-22
23
26
  changes: "Aggiunta documentazione sulla sincronizzazione live"
@@ -373,6 +376,119 @@ Note e vincoli:
373
376
  - Il flag `live` viene valutato per ogni dizionario al momento della build. Se il contenuto remoto non era contrassegnato come `live=true` durante la build, è necessario ricostruire per abilitare Live Sync per quel dizionario.
374
377
  - Il server di live sync deve poter scrivere nella cartella `.intlayer`. Nei container, assicurarsi che sia garantito l'accesso in scrittura a `/.intlayer`.
375
378
 
379
+ ## Self-Hosting
380
+
381
+ Intlayer può essere eseguito interamente sulla propria infrastruttura — nessun account Intlayer Cloud richiesto. Un singolo comando avvia l'intera pila (dashboard, API, database, archiviazione di oggetti ed e-mail) tramite Docker Compose:
382
+
383
+ ```sh
384
+ curl -fsSL https://intlayer.org/install.sh | sh
385
+ ```
386
+
387
+ Questo scarica un `docker-compose.yml` e un `.env`, genera automaticamente i secret necessari (`BETTER_AUTH_SECRET`, credenziali MinIO) e avvia tutti i container con `docker compose up -d`. Rieseguire lo stesso comando su un'installazione esistente esegue un aggiornamento progressivo senza perdita di dati.
388
+
389
+ ### Servizi avviati
390
+
391
+ | Servizio | Porta/e | Scopo |
392
+ | ------------------- | --------------------------------------- | ------------------------------------------------ |
393
+ | **app** (dashboard) | `3000` | Interfaccia CMS TanStack Start |
394
+ | **backend** (API) | `3100` | API REST Fastify |
395
+ | **MongoDB 7** | interno | Database principale (replica set a nodo singolo) |
396
+ | **Redis 7** | interno | Code di lavori e caching |
397
+ | **MinIO** | `9000` (S3), `9001` (console) | Archiviazione di oggetti compatibile S3 |
398
+ | **Mailpit** | `1025` (SMTP), `8025` (interfaccia web) | Sink locale per e-mail transazionali |
399
+
400
+ Chromium (per la generazione di screenshot con Puppeteer) è incluso nell'immagine del backend — non è necessario un container separato.
401
+
402
+ ### Connettere il tuo progetto a un'istanza self-hosted
403
+
404
+ Punta la tua configurazione Intlayer al tuo backend e dashboard invece di `intlayer.org`:
405
+
406
+ ```typescript fileName="intlayer.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
407
+ import type { IntlayerConfig } from "intlayer";
408
+
409
+ const config: IntlayerConfig = {
410
+ editor: {
411
+ clientId: process.env.INTLAYER_CLIENT_ID,
412
+ clientSecret: process.env.INTLAYER_CLIENT_SECRET,
413
+
414
+ /**
415
+ * URL del dashboard CMS self-hosted.
416
+ * Predefinito: https://app.intlayer.org
417
+ */
418
+ cmsURL: process.env.INTLAYER_CMS_URL, // es. http://localhost:3000
419
+
420
+ /**
421
+ * URL dell'API backend self-hosted.
422
+ * Predefinito: https://back.intlayer.org
423
+ */
424
+ backendURL: process.env.INTLAYER_BACKEND_URL, // es. http://localhost:3100
425
+ },
426
+ };
427
+
428
+ export default config;
429
+ ```
430
+
431
+ Imposta le variabili d'ambiente corrispondenti nel tuo progetto:
432
+
433
+ ```sh
434
+ INTLAYER_CMS_URL=http://localhost:3000
435
+ INTLAYER_BACKEND_URL=http://localhost:3100
436
+ INTLAYER_CLIENT_ID=<your-client-id>
437
+ INTLAYER_CLIENT_SECRET=<your-client-secret>
438
+ ```
439
+
440
+ Crea le credenziali di accesso nel tuo dashboard self-hosted su `http://localhost:3000/projects`.
441
+
442
+ ### SDK `@intlayer/api`: puntare a un backend self-hosted
443
+
444
+ Quando si utilizza l'SDK in modo programmatico, passa `backendURL` esplicitamente a `createIntlayerCMS`:
445
+
446
+ ```typescript fileName="cms.ts" codeFormat="typescript"
447
+ import { createIntlayerCMS } from "@intlayer/api";
448
+ import { dictionaryEndpoint } from "@intlayer/api/dictionary";
449
+
450
+ const cms = createIntlayerCMS({
451
+ editor: {
452
+ clientId: process.env.INTLAYER_CLIENT_ID,
453
+ clientSecret: process.env.INTLAYER_CLIENT_SECRET,
454
+ backendURL: process.env.INTLAYER_BACKEND_URL, // http://localhost:3100
455
+ },
456
+ });
457
+
458
+ const { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();
459
+ ```
460
+
461
+ ### Funzionalità opzionali
462
+
463
+ Queste funzionalità richiedono account esterni e funzionano correttamente anche quando le loro chiavi sono assenti dal `.env` self-hosted:
464
+
465
+ | Funzionalità | Variabile/i d'ambiente |
466
+ | ----------------------------------- | ----------------------------------------------- |
467
+ | Traduzione / audit con IA | `OPENAI_API_KEY` |
468
+ | Fatturazione | `STRIPE_SECRET_KEY`, `STRIPE_WEBHOOK_SECRET`, … |
469
+ | OAuth GitHub | `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` |
470
+ | OAuth Google | `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` |
471
+ | OAuth GitLab / Microsoft / LinkedIn | `GITLAB_*`, `MICROSOFT_*`, `LINKEDIN_*` |
472
+ | E-mail transazionale via Resend | `RESEND_API_KEY` (predefinito: Mailpit SMTP) |
473
+
474
+ ### Persistenza dei dati e aggiornamenti
475
+
476
+ Tre volumi Docker contengono tutto lo stato persistente: `mongo-data`, `redis-data` e `minio-data`. Sopravvivono ai riavvii e agli aggiornamenti dei container. Eseguire nuovamente il programma di installazione scarica le immagini più recenti ed esegue un `docker compose up -d` progressivo.
477
+
478
+ Porte esposte sull'host:
479
+
480
+ | Porta | Servizio |
481
+ | ------ | -------------------------------------------------------------------- |
482
+ | `3000` | Dashboard |
483
+ | `3100` | API Backend |
484
+ | `8025` | Interfaccia web e-mail Mailpit |
485
+ | `9000` | API S3 MinIO (necessaria per il caricamento degli asset nel browser) |
486
+ | `9001` | Console MinIO |
487
+
488
+ Per un riferimento completo di tutte le variabili d'ambiente disponibili e le opzioni avanzate (proxy inverso, domini personalizzati, backup/ripristino), consulta la [Guida al Self-Hosting](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/self_hosting.md).
489
+
490
+ ---
491
+
376
492
  ## Debug
377
493
 
378
494
  Se riscontri problemi con il CMS, verifica quanto segue:
@@ -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: Nuovo Intlayer v9 - Cosa c'è di nuovo?
5
5
  description: Scopri le novità di Intlayer v9. Introduzione di package di compatibilità drop-in per le più diffuse librerie i18n e supporto per Collections e Variants.
6
6
  keywords:
@@ -9,6 +9,9 @@ keywords:
9
9
  - Migrazione
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
@@ -299,13 +302,68 @@ npm install intlayer react-native-intlayer
299
302
 
300
303
  ---
301
304
 
305
+ ## SDK CMS: usa Intlayer come database di contenuti headless
306
+
307
+ Intlayer v9 include un SDK pulito e con autenticazione automatica in `@intlayer/api` per interagire con il CMS in modo programmatico — recuperare progetti, recuperare dizionari e inviarli o aggiornarli dal tuo server, script o CI. L'autenticazione (OAuth2 `client_credentials`) è gestita e rinnovata automaticamente.
308
+
309
+ L'SDK è suddiviso in **due import separati**, così il tuo bundle include solo i domini che usi davvero:
310
+
311
+ 1. `createIntlayerCMS` — un **autenticatore** leggero che custodisce le credenziali e il token gestito (nessun client di dominio incluso).
312
+ 2. `dictionaryEndpoint`, `projectEndpoint`, … — **binder di endpoint** per dominio, ciascuno importato dal proprio sottopercorso.
313
+
314
+ ```ts fileName="cms.ts"
315
+ import { createIntlayerCMS } from "@intlayer/api";
316
+ import { dictionaryEndpoint } from "@intlayer/api/dictionary";
317
+
318
+ // La configurazione è opzionale: le credenziali ricadono su INTLAYER_CLIENT_ID /
319
+ // INTLAYER_CLIENT_SECRET risolti da `@intlayer/config/built`.
320
+ const cms = createIntlayerCMS();
321
+
322
+ // Lettura
323
+ const { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();
324
+
325
+ // Scrittura — usa il CMS come un database
326
+ await dictionaryEndpoint(cms).pushDictionaries([myDictionary]);
327
+ ```
328
+
329
+ > Sicurezza: le credenziali del CMS concedono l'accesso in scrittura ai tuoi contenuti. Crea l'autenticatore sempre **lato server** — non inviare mai `clientId` / `clientSecret` al browser.
330
+
331
+ ---
332
+
333
+ ## Self-Hosting
334
+
335
+ Intlayer v9 offre supporto di prima classe per eseguire la propria istanza di Intlayer con un singolo comando — nessun account Intlayer Cloud richiesto.
336
+
337
+ ```sh
338
+ curl -fsSL https://intlayer.org/install.sh | sh
339
+ ```
340
+
341
+ Il programma di installazione scarica un `docker-compose.yml` e un `.env`, genera automaticamente i secret necessari ed esegue `docker compose up -d`. Tutto — il dashboard, l'API, il database, l'archiviazione di oggetti e le email transazionali — viene eseguito localmente nei container.
342
+
343
+ ### Servizi inclusi
344
+
345
+ | Servizio | Scopo |
346
+ | --------------------------------------- | ----------------------------------------------------------------------------- |
347
+ | **app** (TanStack Start) | Interfaccia del dashboard sulla porta `3000` |
348
+ | **backend** (Fastify/Bun) | API REST sulla porta `3100` |
349
+ | **MongoDB 7** (single-node replica set) | Database principale |
350
+ | **Redis 7** | Code di lavori e caching |
351
+ | **MinIO** | Archiviazione di oggetti compatibile S3 (avatar, screenshot) |
352
+ | **Mailpit** | Sink SMTP locale + interfaccia web per email transazionali sulla porta `8025` |
353
+
354
+ Chromium (utilizzato per la generazione di screenshot con Puppeteer) è incluso nell'immagine del backend — nessun container aggiuntivo necessario.
355
+
356
+ ---
357
+
302
358
  ## Note di migrazione da v8
303
359
 
304
360
  Se stai eseguendo l'aggiornamento da v8, nota che la v9 non include breaking changes. Ma ecco le modifiche chiave:
305
361
 
306
362
  - **Compilatore disabilitato per impostazione predefinita**: `compiler.enabled` ora ha come valore predefinito `false`. Se dipendi dall'estrazione dei tuoi file `.content.ts` in fase di build, imposta `compiler.enabled: true` nel tuo `intlayer.config.ts`.
363
+ - **Plugin Vite**: Il compilatore e il proxy di routing locale sono ora integrati in `intlayer()`. Se in precedenza hai registrato `intlayerCompiler()` o `intlayerProxy()` manualmente, puoi rimuoverli — vengono deduplicati automaticamente, quindi mantenerli è innocuo. Usa `routing.enableProxy: false` per disattivare il proxy.
307
364
  - **Locales & Dialects**: Se utilizzi dipendenze i18n esterne, aggiungi i rispettivi compat adapter plugin nella tua configurazione o setup del bundler per riscrivere automaticamente gli import.
308
365
  - **Custom Selectors**: Quando chiami `useIntlayer`, il secondo parametro è ora riservato a un oggetto di opzioni contenente `{ locale, item, variant }`. Se in precedenza passavi direttamente una stringa locale, puoi ancora farlo, ma l'utilizzo dell'oggetto di opzioni è consigliato per selezioni avanzate.
366
+ - **React Native**: `react-native-intlayer` ora riesporta l'intera API di `react-intlayer`. In un'app React Native, importa tutto da `react-native-intlayer` e rimuovi la dipendenza diretta da `react-intlayer`. Gli import esistenti di `react-intlayer` continuano a funzionare.
309
367
 
310
368
  ---
311
369
 
@@ -314,3 +372,5 @@ Se stai eseguendo l'aggiornamento da v8, nota che la v9 non include breaking cha
314
372
  - [Guida ai Compat Adapter Packages](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/compat/index.md)
315
373
  - [Dizionari Dinamici - Collections & Variants](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/dynamic_dictionaries/index.md)
316
374
  - [Riferimento alla Configurazione](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/configuration.md)
375
+ - [SDK CMS - Accesso programmatico con @intlayer/api](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/intlayer_CMS.md)
376
+ - [Guida al Self-Hosting](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/self_hosting.md)