@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.
- package/dist/cjs/generated/docs.entry.cjs +20 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +20 -0
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +1 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/intlayer_CMS.md +16 -1
- package/docs/ar/releases/v9.md +58 -1
- package/docs/ar/self_hosting.md +349 -0
- package/docs/bn/intlayer_CMS.md +570 -0
- package/docs/bn/releases/v9.md +358 -0
- package/docs/cs/releases/v9.md +358 -0
- package/docs/de/intlayer_CMS.md +117 -1
- package/docs/de/releases/v9.md +61 -1
- package/docs/de/self_hosting.md +349 -0
- package/docs/en/intlayer_CMS.md +171 -1
- package/docs/en/releases/v9.md +45 -2
- package/docs/en/self_hosting.md +349 -0
- package/docs/en-GB/intlayer_CMS.md +16 -1
- package/docs/en-GB/releases/v9.md +47 -2
- package/docs/en-GB/self_hosting.md +349 -0
- package/docs/es/intlayer_CMS.md +117 -1
- package/docs/es/releases/v9.md +61 -1
- package/docs/es/self_hosting.md +349 -0
- package/docs/fr/intlayer_CMS.md +117 -1
- package/docs/fr/releases/v9.md +61 -1
- package/docs/fr/self_hosting.md +349 -0
- package/docs/hi/intlayer_CMS.md +16 -1
- package/docs/hi/releases/v9.md +59 -1
- package/docs/hi/self_hosting.md +349 -0
- package/docs/id/releases/v9.md +31 -1
- package/docs/id/self_hosting.md +349 -0
- package/docs/it/intlayer_CMS.md +117 -1
- package/docs/it/releases/v9.md +61 -1
- package/docs/it/self_hosting.md +349 -0
- package/docs/ja/intlayer_CMS.md +191 -10
- package/docs/ja/releases/v9.md +31 -1
- package/docs/ja/self_hosting.md +349 -0
- package/docs/ko/intlayer_CMS.md +189 -6
- package/docs/ko/releases/v9.md +30 -1
- package/docs/ko/self_hosting.md +349 -0
- package/docs/nl/releases/v9.md +358 -0
- package/docs/pl/intlayer_CMS.md +16 -1
- package/docs/pl/releases/v9.md +58 -1
- package/docs/pl/self_hosting.md +349 -0
- package/docs/pt/intlayer_CMS.md +117 -1
- package/docs/pt/releases/v9.md +61 -1
- package/docs/pt/self_hosting.md +349 -0
- package/docs/ru/intlayer_CMS.md +196 -15
- package/docs/ru/releases/v9.md +59 -1
- package/docs/ru/self_hosting.md +349 -0
- package/docs/tr/intlayer_CMS.md +16 -1
- package/docs/tr/releases/v9.md +46 -1
- package/docs/tr/self_hosting.md +349 -0
- package/docs/uk/intlayer_CMS.md +16 -1
- package/docs/uk/releases/v9.md +58 -1
- package/docs/uk/self_hosting.md +349 -0
- package/docs/vi/releases/v9.md +31 -1
- package/docs/vi/self_hosting.md +349 -0
- package/docs/zh/releases/v9.md +31 -1
- package/docs/zh/self_hosting.md +349 -0
- package/package.json +6 -6
- 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)
|
package/docs/pt/intlayer_CMS.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-08-23
|
|
3
|
-
updatedAt:
|
|
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:
|
package/docs/pt/releases/v9.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-06-14
|
|
3
|
-
updatedAt: 2026-06-
|
|
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)
|