@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: "Samodzielne hostowanie Intlayer"
5
+ description: "Uruchom kompletną instancję Intlayer na własnej infrastrukturze za pomocą jednego polecenia. Konto Intlayer Cloud nie jest wymagane."
6
+ keywords:
7
+ - Samodzielne hostowanie
8
+ - Docker
9
+ - Docker Compose
10
+ - Intlayer
11
+ - CMS
12
+ - Instalacja
13
+ - Infrastruktura
14
+ slugs:
15
+ - doc
16
+ - self-hosting
17
+ author: aymericzip
18
+ ---
19
+
20
+ # Samodzielne hostowanie Intlayer
21
+
22
+ Intlayer może działać w całości na Twojej własnej infrastrukturze — konto Intlayer Cloud nie jest wymagane. Jedno polecenie uruchamia gotowy do produkcji stos:
23
+
24
+ ```sh
25
+ curl -fsSL https://intlayer.org/install.sh | sh
26
+ ```
27
+
28
+ Instalator pobiera plik `docker-compose.yml` oraz `.env`, automatycznie generuje wymagane sekrety i uruchamia wszystkie kontenery za pomocą `docker compose up -d`.
29
+
30
+ ## Spis treści
31
+
32
+ <TOC/>
33
+
34
+ ---
35
+
36
+ ## Architektura
37
+
38
+ ```
39
+ ┌─────────────────────────────┐
40
+ przeglądarka ──────▶ │ aplikacja (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 z 1 węzłem) (API S3) (SMTP) (w obrazie)
49
+ minio:9001 mailpit:8025
50
+ (konsola) (interfejs webowy)
51
+ ```
52
+
53
+ Chromium (używany do generowania zrzutów ekranu przez Puppeteer) jest dołączony do obrazu backendu — nie jest potrzebny oddzielny kontener.
54
+
55
+ ---
56
+
57
+ ## Wymagania wstępne
58
+
59
+ - **Docker** ≥ 24 i **Docker Compose** ≥ v2. Jeśli którykolwiek z nich jest brakujący, instalator wyświetli link do instalacji i zakończy działanie.
60
+ - Porty `3000`, `3100`, `8025`, `9000` i `9001` dostępne na hoście.
61
+ - Host Linux lub macOS (lub WSL2 na Windows).
62
+
63
+ ---
64
+
65
+ ## Szybki start
66
+
67
+ ```sh
68
+ curl -fsSL https://intlayer.org/install.sh | sh
69
+ ```
70
+
71
+ Co robi instalator:
72
+
73
+ 1. Sprawdza, czy `docker` i `docker compose` są obecne.
74
+ 2. Pobiera `docker-compose.yml` i `.env.example` do `./intlayer/`.
75
+ 3. Jeśli plik `.env` nie istnieje, kopiuje przykład i generuje losowe sekrety dla `BETTER_AUTH_SECRET`, `S3_ACCESS_KEY_ID` i `S3_SECRET_ACCESS_KEY` za pomocą `openssl rand`.
76
+ 4. Uruchamia `docker compose pull` + `docker compose up -d`.
77
+ 5. Wyświetla adresy URL: pulpit nawigacyjny `:3000`, API `:3100`, interfejs e-mail `:8025`, konsola MinIO `:9001`.
78
+
79
+ Po uruchomieniu stosu, otwórz **http://localhost:3000** i utwórz swoje pierwsze konto.
80
+
81
+ ---
82
+
83
+ ## Usługi
84
+
85
+ | Usługa | Obraz | Port(y) hosta | Cel |
86
+ | :------------ | :------------------------------------ | :--------------------------------------- | :---------------------------------------------------------------- |
87
+ | **aplikacja** | zbudowana z `apps/app/Dockerfile` | `3000` | Pulpit nawigacyjny TanStack Start (interfejs użytkownika CMS) |
88
+ | **backend** | zbudowany z `apps/backend/Dockerfile` | `3100` | Fastify REST API (punkt końcowy `/health`) |
89
+ | **mongo** | `mongo:7` | wewnętrzny | Zestaw replikacji z jednym węzłem (`rs0`) |
90
+ | **redis** | `redis:7-alpine` | wewnętrzny | Kolejki zadań (BullMQ) i buforowanie (ioredis) |
91
+ | **minio** | `minio/minio` | `9000` (S3), `9001` (konsola) | Przechowywanie obiektów zgodne z S3 dla awatarów i zrzutów ekranu |
92
+ | **mailpit** | `axllent/mailpit` | `1025` (SMTP), `8025` (interfejs webowy) | Lokalny odbiornik transakcyjnych wiadomości e-mail |
93
+
94
+ Wewnętrzne porty (mongo, redis) nie są domyślnie udostępniane na hoście.
95
+
96
+ > Port MinIO `9000` musi być osiągalny przez przeglądarkę, ponieważ przesłane zasoby (awatary, zrzuty ekranu) są ładowane bezpośrednio z `S3_PUBLIC_URL=http://localhost:9000/intlayer`.
97
+
98
+ ---
99
+
100
+ ## Zmienne środowiskowe
101
+
102
+ Instalator generuje gotowy do użycia plik `.env`. Poniższa tabela opisuje każdą zmienną.
103
+
104
+ ### Wymagane (generowane automatycznie lub monitowane)
105
+
106
+ | Zmienna | Przykład | Opis |
107
+ | :--------------------- | :---------------------------------------------- | :-------------------------------------------------------------- |
108
+ | `NODE_ENV` | `production` | Środowisko uruchomieniowe |
109
+ | `PORT` | `3100` | Port nasłuchiwania backendu |
110
+ | `BACKEND_URL` | `http://localhost:3100` | Publiczny URL API backendu |
111
+ | `APP_URL` | `http://localhost:3000` | Publiczny URL pulpitu nawigacyjnego |
112
+ | `DOMAIN` | `localhost` | Domena plików cookie |
113
+ | `MONGODB_URI` | `mongodb://mongo:27017/intlayer?replicaSet=rs0` | Pełny URI połączenia z MongoDB |
114
+ | `REDIS_URL` | `redis://redis:6379` | URL połączenia z Redis |
115
+ | `BETTER_AUTH_SECRET` | _(generated)_ | 32-bajtowy sekret do podpisywania sesji |
116
+ | `MAIL_PROVIDER` | `smtp` | Transport poczty: `smtp` lub `resend` |
117
+ | `MAIL_SMTP_HOST` | `mailpit` | Nazwa hosta SMTP (nazwa kontenera Mailpit) |
118
+ | `MAIL_SMTP_PORT` | `1025` | Port SMTP |
119
+ | `MAIL_FROM` | `Intlayer <no-reply@localhost>` | Adres nadawcy |
120
+ | `S3_ENDPOINT` | `http://minio:9000` | Punkt końcowy zgodny z S3 |
121
+ | `S3_PUBLIC_URL` | `http://localhost:9000/intlayer` | Publiczny URL do ładowania zasobów przez przeglądarkę |
122
+ | `S3_BUCKET_NAME` | `intlayer` | Nazwa zasobnika (bucket) |
123
+ | `S3_ACCESS_KEY_ID` | _(generated)_ | Klucz dostępu MinIO |
124
+ | `S3_SECRET_ACCESS_KEY` | _(generated)_ | Tajny klucz MinIO |
125
+ | `VITE_BACKEND_URL` | `http://localhost:3100` | URL backendu wbudowany w pulpit nawigacyjny w czasie kompilacji |
126
+ | `VITE_DOMAIN` | `localhost` | Domena wbudowana w pulpit nawigacyjny w czasie kompilacji |
127
+
128
+ ### Opcjonalne (funkcje działają z ograniczoną funkcjonalnością, gdy ich brakuje)
129
+
130
+ | Zmienna | Funkcja |
131
+ | :------------------------------------------------------- | :---------------------------------------------------------------------------------------------- |
132
+ | `OPENAI_API_KEY` | Tłumaczenie wspomagane AI i audyt treści |
133
+ | `STRIPE_SECRET_KEY`, `STRIPE_WEBHOOK_SECRET`, `STRIPE_*` | Zarządzanie płatnościami i subskrypcjami |
134
+ | `RESEND_API_KEY` | Transakcyjne wiadomości e-mail za pośrednictwem Resend (przesłania Mailpit, gdy jest ustawione) |
135
+ | `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` | Logowanie GitHub OAuth |
136
+ | `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` | Logowanie Google OAuth |
137
+ | `GITLAB_CLIENT_ID`, `GITLAB_CLIENT_SECRET` | Logowanie GitLab OAuth |
138
+ | `MICROSOFT_CLIENT_ID`, `MICROSOFT_CLIENT_SECRET` | Logowanie Microsoft OAuth |
139
+ | `LINKEDIN_CLIENT_ID`, `LINKEDIN_CLIENT_SECRET` | Logowanie LinkedIn OAuth |
140
+ | `ATLASSIAN_CLIENT_ID`, `ATLASSIAN_CLIENT_SECRET` | Logowanie Atlassian OAuth |
141
+
142
+ ---
143
+
144
+ ## Łączenie Twojego projektu Intlayer
145
+
146
+ Po uruchomieniu stosu, skieruj swój projekt na samodzielnie hostowany backend i pulpit nawigacyjny zamiast na `intlayer.org`.
147
+
148
+ ### Konfiguracja projektu
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 samodzielnie hostowanego pulpitu nawigacyjnego CMS.
160
+ * Domyślnie: https://app.intlayer.org
161
+ */
162
+ cmsURL: process.env.INTLAYER_CMS_URL, // np. http://localhost:3000
163
+
164
+ /**
165
+ * URL samodzielnie hostowanego API backendu.
166
+ * Domyślnie: https://back.intlayer.org
167
+ */
168
+ backendURL: process.env.INTLAYER_BACKEND_URL, // np. http://localhost:3100
169
+ },
170
+ };
171
+
172
+ export default config;
173
+ ```
174
+
175
+ Ustaw zmienne środowiskowe w pliku `.env` Twojego projektu:
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
+ Utwórz dane uwierzytelniające dostęp w swoim samodzielnie hostowanym pulpicie nawigacyjnym w sekcji **Projects → Access keys** pod adresem `http://localhost:3000/projects`.
185
+
186
+ ### SDK `@intlayer/api`
187
+
188
+ Używając SDK `@intlayer/api` programowo, przekaż `backendURL` jawnie:
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
+ ## Aktualizacja
208
+
209
+ Ponowne uruchomienie instalatora na istniejącym wdrożeniu wykonuje aktualizację krokową:
210
+
211
+ ```sh
212
+ curl -fsSL https://intlayer.org/install.sh | sh
213
+ ```
214
+
215
+ Spowoduje to pobranie najnowszych obrazów i ponowne uruchomienie kontenerów za pomocą `docker compose pull && docker compose up -d`. Istniejące woluminy (`mongo-data`, `redis-data`, `minio-data`) zostaną zachowane — brak utraty danych.
216
+
217
+ Aby ręcznie zaktualizować z poziomu katalogu `./intlayer/`:
218
+
219
+ ```sh
220
+ docker compose pull
221
+ docker compose up -d
222
+ ```
223
+
224
+ ---
225
+
226
+ ## Kopia zapasowa i przywracanie
227
+
228
+ Wszystkie trwałe dane znajdują się w trzech nazwach woluminów Docker.
229
+
230
+ ### Kopia zapasowa
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
+ ### Przywracanie
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
+ # Powtórz dla redis-data i minio-data
258
+ ```
259
+
260
+ ---
261
+
262
+ ## Używanie reverse proxy (Nginx / Caddy)
263
+
264
+ W przypadku wdrożeń produkcyjnych, umieść reverse proxy przed kontenerami aplikacji i backendu, zamiast udostępniać je bezpośrednio.
265
+
266
+ ### Przykład 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
+ Zaktualizuj poniższe zmienne `.env`, aby odpowiadały Twoim publicznym domenom:
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
+ > Zmienne `VITE_*` są wbudowywane w obraz pulpitu nawigacyjnego podczas kompilacji. Jeśli zmienisz je po zbudowaniu obrazu, musisz ponownie zbudować obraz `app` (`docker compose build app`) lub użyć wstrzykiwania konfiguracji w czasie uruchomienia.
303
+
304
+ ---
305
+
306
+ ## Rozwiązywanie problemów
307
+
308
+ ### Backend w pętli awarii przy pierwszym uruchomieniu
309
+
310
+ MongoDB i Redis muszą być sprawne przed uruchomieniem backendu. Plik compose używa `depends_on` z `condition: service_healthy`. Jeśli widzisz powtarzające się restarty backendu, sprawdź, czy testy kondycji `mongo` i `redis` przechodzą pomyślnie:
311
+
312
+ ```sh
313
+ docker compose ps
314
+ docker compose logs mongo
315
+ docker compose logs redis
316
+ ```
317
+
318
+ ### Pulpit nawigacyjny nie może dotrzeć do API
319
+
320
+ Sprawdź, czy `VITE_BACKEND_URL` odpowiada adresowi URL, pod którym backend jest osiągalny z **przeglądarki** (nie z sieci Docker). Jeśli zmieniłeś port backendu lub dodałeś reverse proxy, ponownie zbuduj obraz pulpitu nawigacyjnego:
321
+
322
+ ```sh
323
+ docker compose build app
324
+ docker compose up -d app
325
+ ```
326
+
327
+ ### E-mail nie jest wysyłany
328
+
329
+ Domyślnie wszystkie wychodzące wiadomości e-mail są przechwytywane przez Mailpit. Otwórz `http://localhost:8025`, aby zobaczyć wysłane wiadomości. Aby wysyłać prawdziwe wiadomości e-mail, ustaw `MAIL_PROVIDER=resend` i `RESEND_API_KEY=<your-key>` w `.env`, a następnie zrestartuj backend:
330
+
331
+ ```sh
332
+ docker compose restart backend
333
+ ```
334
+
335
+ ### Brak zasobnika MinIO
336
+
337
+ Jeśli jednorazowa usługa `minio-init` nie uruchomiła się (lub uruchomiła się, zanim MinIO było gotowe), utwórz zasobnik ręcznie:
338
+
339
+ ```sh
340
+ docker compose run --rm minio-init
341
+ ```
342
+
343
+ ---
344
+
345
+ ## Przydatne linki
346
+
347
+ - [Dokumentacja Intlayer CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/intlayer_CMS.md)
348
+ - [Referencje konfiguracji](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/configuration.md)
349
+ - [SDK CMS — `@intlayer/api`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/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 | Externalize seu conteúdo no Intlayer CMS
5
5
  description: Externalize seu conteúdo no Intlayer CMS para delegar a gestão do seu conteúdo para sua equipe.
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: "Adicionada seção de Auto-hospedagem: bootstrap Docker Compose, inventário de serviços, configuração SDK, recursos opcionais e notas de atualização"
21
24
  - version: 6.0.1
22
25
  date: 2025-09-22
23
26
  changes: "Adiciona documentação sobre live sync"
@@ -388,6 +391,119 @@ Notas e restrições:
388
391
 
389
392
  - O editor visual usa um iframe para exibir seu site. Certifique-se de que a Política de Segurança de Conteúdo (CSP) do seu site permita a URL do CMS como `frame-ancestors` ('https://app.intlayer.org' por padrão). Verifique o console do editor para qualquer erro.
390
393
 
394
+ ## Auto-hospedagem
395
+
396
+ O Intlayer pode ser executado inteiramente na sua própria infraestrutura — sem necessidade de conta no Intlayer Cloud. Um único comando inicializa toda a pilha (dashboard, API, banco de dados, armazenamento de objetos e e-mail) usando Docker Compose:
397
+
398
+ ```sh
399
+ curl -fsSL https://intlayer.org/install.sh | sh
400
+ ```
401
+
402
+ Isso baixa um `docker-compose.yml` e um `.env`, gera automaticamente os secrets necessários (`BETTER_AUTH_SECRET`, credenciais do MinIO) e inicia todos os contêineres com `docker compose up -d`. Executar o mesmo comando novamente em uma instalação existente realiza uma atualização gradual sem perda de dados.
403
+
404
+ ### Serviços iniciados
405
+
406
+ | Serviço | Porta(s) | Finalidade |
407
+ | ------------------- | ------------------------------------- | -------------------------------------------------- |
408
+ | **app** (dashboard) | `3000` | Interface CMS TanStack Start |
409
+ | **backend** (API) | `3100` | API REST Fastify |
410
+ | **MongoDB 7** | interno | Banco de dados principal (replica set de nó único) |
411
+ | **Redis 7** | interno | Filas de tarefas e cache |
412
+ | **MinIO** | `9000` (S3), `9001` (console) | Armazenamento de objetos compatível com S3 |
413
+ | **Mailpit** | `1025` (SMTP), `8025` (interface web) | Sumidouro local de e-mail transacional |
414
+
415
+ O Chromium (para geração de capturas de tela com Puppeteer) está incluído na imagem do backend — nenhum contêiner adicional é necessário.
416
+
417
+ ### Conectando seu projeto a uma instância auto-hospedada
418
+
419
+ Aponte sua configuração do Intlayer para seu próprio backend e dashboard em vez de `intlayer.org`:
420
+
421
+ ```typescript fileName="intlayer.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
422
+ import type { IntlayerConfig } from "intlayer";
423
+
424
+ const config: IntlayerConfig = {
425
+ editor: {
426
+ clientId: process.env.INTLAYER_CLIENT_ID,
427
+ clientSecret: process.env.INTLAYER_CLIENT_SECRET,
428
+
429
+ /**
430
+ * URL do dashboard CMS auto-hospedado.
431
+ * Padrão: https://app.intlayer.org
432
+ */
433
+ cmsURL: process.env.INTLAYER_CMS_URL, // ex. http://localhost:3000
434
+
435
+ /**
436
+ * URL da API backend auto-hospedada.
437
+ * Padrão: https://back.intlayer.org
438
+ */
439
+ backendURL: process.env.INTLAYER_BACKEND_URL, // ex. http://localhost:3100
440
+ },
441
+ };
442
+
443
+ export default config;
444
+ ```
445
+
446
+ Defina as variáveis de ambiente correspondentes no seu projeto:
447
+
448
+ ```sh
449
+ INTLAYER_CMS_URL=http://localhost:3000
450
+ INTLAYER_BACKEND_URL=http://localhost:3100
451
+ INTLAYER_CLIENT_ID=<your-client-id>
452
+ INTLAYER_CLIENT_SECRET=<your-client-secret>
453
+ ```
454
+
455
+ Crie credenciais de acesso no seu dashboard auto-hospedado em `http://localhost:3000/projects`.
456
+
457
+ ### SDK `@intlayer/api`: apontando para um backend auto-hospedado
458
+
459
+ Ao usar o SDK de forma programática, passe `backendURL` explicitamente para `createIntlayerCMS`:
460
+
461
+ ```typescript fileName="cms.ts" codeFormat="typescript"
462
+ import { createIntlayerCMS } from "@intlayer/api";
463
+ import { dictionaryEndpoint } from "@intlayer/api/dictionary";
464
+
465
+ const cms = createIntlayerCMS({
466
+ editor: {
467
+ clientId: process.env.INTLAYER_CLIENT_ID,
468
+ clientSecret: process.env.INTLAYER_CLIENT_SECRET,
469
+ backendURL: process.env.INTLAYER_BACKEND_URL, // http://localhost:3100
470
+ },
471
+ });
472
+
473
+ const { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();
474
+ ```
475
+
476
+ ### Recursos opcionais
477
+
478
+ Estes recursos requerem contas externas e funcionam corretamente quando suas chaves estão ausentes do `.env` auto-hospedado:
479
+
480
+ | Recurso | Variável(is) de ambiente |
481
+ | -------------------------------------- | ----------------------------------------------- |
482
+ | Tradução / auditoria com IA | `OPENAI_API_KEY` |
483
+ | Faturamento | `STRIPE_SECRET_KEY`, `STRIPE_WEBHOOK_SECRET`, … |
484
+ | OAuth do GitHub | `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` |
485
+ | OAuth do Google | `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` |
486
+ | OAuth do GitLab / Microsoft / LinkedIn | `GITLAB_*`, `MICROSOFT_*`, `LINKEDIN_*` |
487
+ | E-mail transacional via Resend | `RESEND_API_KEY` (padrão: Mailpit SMTP) |
488
+
489
+ ### Persistência de dados e atualizações
490
+
491
+ Três volumes do Docker contêm todo o estado persistente: `mongo-data`, `redis-data` e `minio-data`. Eles sobrevivem a reinicializações e atualizações de contêineres. Executar o instalador novamente baixa as imagens mais recentes e realiza um `docker compose up -d` gradual.
492
+
493
+ Portas expostas no host:
494
+
495
+ | Porta | Serviço |
496
+ | ------ | --------------------------------------------------------------------- |
497
+ | `3000` | Dashboard |
498
+ | `3100` | API Backend |
499
+ | `8025` | Interface web de e-mail Mailpit |
500
+ | `9000` | API S3 do MinIO (necessária para carregamento de assets no navegador) |
501
+ | `9001` | Console do MinIO |
502
+
503
+ Para uma referência completa de todas as variáveis de ambiente disponíveis e opções avançadas (proxy reverso, domínios personalizados, backup/restauração), consulte o [Guia de Auto-hospedagem](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/self_hosting.md).
504
+
505
+ ---
506
+
391
507
  ## Depuração
392
508
 
393
509
  Se encontrar problemas com o CMS, verifique o seguinte:
@@ -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: Novo Intlayer v9 - O que há de novo?
5
5
  description: Descubra o que há de novo no Intlayer v9. Apresentando pacotes de compatibilidade drop-in para bibliotecas i18n populares e suporte para Collections e 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
@@ -299,13 +302,68 @@ npm install intlayer react-native-intlayer
299
302
 
300
303
  ---
301
304
 
305
+ ## SDK do CMS: use o Intlayer como um banco de dados de conteúdo headless
306
+
307
+ O Intlayer v9 traz um SDK limpo e com autenticação automática em `@intlayer/api` para interagir com o CMS de forma programática — buscar projetos, buscar dicionários e enviá-los ou atualizá-los a partir do seu próprio servidor, scripts ou CI. A autenticação (OAuth2 `client_credentials`) é tratada e renovada para você.
308
+
309
+ O SDK é dividido em **duas importações separadas**, para que seu bundle inclua apenas os domínios que você realmente usa:
310
+
311
+ 1. `createIntlayerCMS` — um **autenticador** leve que guarda as credenciais e o token gerenciado (nenhum cliente de domínio incluído).
312
+ 2. `dictionaryEndpoint`, `projectEndpoint`, … — **vinculadores de endpoint** por domínio, cada um importado de seu próprio subcaminho.
313
+
314
+ ```ts fileName="cms.ts"
315
+ import { createIntlayerCMS } from "@intlayer/api";
316
+ import { dictionaryEndpoint } from "@intlayer/api/dictionary";
317
+
318
+ // A configuração é opcional: as credenciais recorrem a INTLAYER_CLIENT_ID /
319
+ // INTLAYER_CLIENT_SECRET resolvidos por `@intlayer/config/built`.
320
+ const cms = createIntlayerCMS();
321
+
322
+ // Leitura
323
+ const { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();
324
+
325
+ // Escrita — use o CMS como um banco de dados
326
+ await dictionaryEndpoint(cms).pushDictionaries([myDictionary]);
327
+ ```
328
+
329
+ > Segurança: as credenciais do CMS concedem acesso de escrita ao seu conteúdo. Crie o autenticador sempre **no lado do servidor** — nunca envie `clientId` / `clientSecret` para o navegador.
330
+
331
+ ---
332
+
333
+ ## Auto-hospedagem
334
+
335
+ O Intlayer v9 traz suporte de primeira classe para executar sua própria instância do Intlayer com um único comando — sem necessidade de conta no Intlayer Cloud.
336
+
337
+ ```sh
338
+ curl -fsSL https://intlayer.org/install.sh | sh
339
+ ```
340
+
341
+ O instalador baixa um `docker-compose.yml` e um `.env`, gera automaticamente os secrets necessários e executa `docker compose up -d`. Tudo — o dashboard, a API, o banco de dados, o armazenamento de objetos e o e-mail transacional — roda localmente em contêineres.
342
+
343
+ ### Serviços incluídos
344
+
345
+ | Serviço | Finalidade |
346
+ | --------------------------------------- | ------------------------------------------------------------------------------- |
347
+ | **app** (TanStack Start) | Interface do dashboard na porta `3000` |
348
+ | **backend** (Fastify/Bun) | API REST na porta `3100` |
349
+ | **MongoDB 7** (single-node replica set) | Banco de dados principal |
350
+ | **Redis 7** | Filas de tarefas e cache |
351
+ | **MinIO** | Armazenamento de objetos compatível com S3 (avatares, capturas de tela) |
352
+ | **Mailpit** | Sumidouro SMTP local + interface web para e-mails transacionais na porta `8025` |
353
+
354
+ O Chromium (usado para geração de capturas de tela com Puppeteer) está incluído na imagem do backend — nenhum contêiner adicional é necessário.
355
+
356
+ ---
357
+
302
358
  ## Notas de migração da v8
303
359
 
304
360
  Se você estiver atualizando da v8, observe que a v9 não inclui breaking changes. Mas aqui estão as principais mudanças:
305
361
 
306
362
  - **Compilador desativado por padrão**: `compiler.enabled` agora tem o valor padrão `false`. Se você depende da extração dos seus arquivos `.content.ts` em tempo de build, defina `compiler.enabled: true` no seu `intlayer.config.ts`.
363
+ - **Plugin Vite**: O compilador e o proxy de roteamento de locale agora estão integrados em `intlayer()`. Se você registrou anteriormente `intlayerCompiler()` ou `intlayerProxy()` manualmente, pode removê-los — eles são deduplicados automaticamente, então mantê-los não causa problemas. Use `routing.enableProxy: false` para desativar o proxy.
307
364
  - **Locales & Dialects**: Se estiver usando dependências externas de i18n, adicione seus respectivos plugins de compatibilidade na sua configuração ou setup do bundler para reescrever os imports automaticamente.
308
365
  - **Custom Selectors**: Ao chamar `useIntlayer`, o segundo parâmetro agora é reservado para um objeto de opções contendo `{ locale, item, variant }`. Se você passava anteriormente uma string de locale diretamente, ainda pode fazer isso, mas o uso do objeto de opções é recomendado para seleções avançadas.
366
+ - **React Native**: `react-native-intlayer` agora reexporta toda a API do `react-intlayer`. Em um aplicativo React Native, importe tudo de `react-native-intlayer` e remova a dependência direta de `react-intlayer`. Os imports existentes de `react-intlayer` continuam funcionando.
309
367
 
310
368
  ---
311
369
 
@@ -314,3 +372,5 @@ Se você estiver atualizando da v8, observe que a v9 não inclui breaking change
314
372
  - [Guia de Compat Adapter Packages](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/compat/index.md)
315
373
  - [Dicionários Dinâmicos - Collections & Variants](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/dynamic_dictionaries/index.md)
316
374
  - [Referência de Configuração](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/configuration.md)
375
+ - [SDK do CMS - Acesso programático com @intlayer/api](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/intlayer_CMS.md)
376
+ - [Guia de Auto-hospedagem](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/self_hosting.md)