@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: 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)
|
package/docs/it/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 | 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:
|
package/docs/it/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: 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)
|