@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: Intlayer 자체 호스팅
5
+ description: 단일 명령으로 자신만의 인프라에서 완벽한 Intlayer 인스턴스를 실행하세요. Intlayer Cloud 계정이 필요하지 않습니다.
6
+ keywords:
7
+ - 자체 호스팅
8
+ - Docker
9
+ - Docker Compose
10
+ - Intlayer
11
+ - CMS
12
+ - 설치
13
+ - 인프라
14
+ slugs:
15
+ - doc
16
+ - self-hosting
17
+ author: aymericzip
18
+ ---
19
+
20
+ # Intlayer 자체 호스팅
21
+
22
+ Intlayer는 Intlayer Cloud 계정 없이도 자체 인프라에서 완전히 실행될 수 있습니다. 단일 명령으로 프로덕션 준비 스택을 부팅합니다:
23
+
24
+ ```sh
25
+ curl -fsSL https://intlayer.org/install.sh | sh
26
+ ```
27
+
28
+ 설치 프로그램은 `docker-compose.yml` 및 `.env` 파일을 다운로드하고, 필요한 비밀을 자동으로 생성하며, `docker compose up -d` 명령으로 모든 컨테이너를 시작합니다.
29
+
30
+ ## 목차
31
+
32
+ <TOC/>
33
+
34
+ ---
35
+
36
+ ## 아키텍처
37
+
38
+ ```
39
+ ┌─────────────────────────────┐
40
+ 브라우저 ──────▶ │ 앱 (TanStack Start) :3000│ ──┐
41
+ └─────────────────────────────┘ │ VITE_BACKEND_URL
42
+ ┌─────────────────────────────┐ │
43
+ │ 백엔드 (Fastify/Bun) :3100│ ◀─┘
44
+ └──────────────┬──────────────┘
45
+ ┌──────────┬─────────┼──────────┬───────────┐
46
+ ▼ ▼ ▼ ▼ ▼
47
+ mongo:27017 redis:6379 minio:9000 mailpit:1025 Chromium
48
+ (1-노드 RS) (S3 API) (SMTP) (이미지 내)
49
+ minio:9001 mailpit:8025
50
+ (콘솔) (웹 UI)
51
+ ```
52
+
53
+ Chromium (Puppeteer 스크린샷 생성에 사용됨)은 백엔드 이미지 내부에 번들로 제공되므로 별도의 컨테이너가 필요하지 않습니다.
54
+
55
+ ---
56
+
57
+ ## 사전 요구 사항
58
+
59
+ - **Docker** ≥ 24 및 **Docker Compose** ≥ v2. 둘 중 하나라도 없으면 설치 프로그램이 설치 링크를 출력하고 종료됩니다.
60
+ - 호스트에서 포트 `3000`, `3100`, `8025`, `9000`, `9001`이 사용 가능해야 합니다.
61
+ - Linux 또는 macOS 호스트 (또는 Windows의 WSL2).
62
+
63
+ ---
64
+
65
+ ## 빠른 시작
66
+
67
+ ```sh
68
+ curl -fsSL https://intlayer.org/install.sh | sh
69
+ ```
70
+
71
+ 설치 프로그램의 기능:
72
+
73
+ 1. `docker` 및 `docker compose`가 설치되어 있는지 확인합니다.
74
+ 2. `docker-compose.yml` 및 `.env.example`을 `./intlayer/` 디렉토리에 다운로드합니다.
75
+ 3. `.env` 파일이 없으면 예제 파일을 복사하고 `openssl rand`를 통해 `BETTER_AUTH_SECRET`, `S3_ACCESS_KEY_ID`, `S3_SECRET_ACCESS_KEY`에 대한 임의의 비밀을 생성합니다.
76
+ 4. `docker compose pull` + `docker compose up -d`를 실행합니다.
77
+ 5. 다음 URL을 출력합니다: 대시보드 `:3000`, API `:3100`, 이메일 UI `:8025`, MinIO 콘솔 `:9001`.
78
+
79
+ 스택이 실행되면 **http://localhost:3000**을 열고 첫 번째 계정을 생성하세요.
80
+
81
+ ---
82
+
83
+ ## 서비스
84
+
85
+ | 서비스 | 이미지 | 호스트 포트 | 목적 |
86
+ | ----------- | ---------------------------------- | ----------------------------- | ----------------------------------------------- |
87
+ | **앱** | `apps/app/Dockerfile`에서 빌드 | `3000` | TanStack Start 대시보드 (CMS UI) |
88
+ | **백엔드** | `apps/backend/Dockerfile`에서 빌드 | `3100` | Fastify REST API (`/health` 엔드포인트) |
89
+ | **mongo** | `mongo:7` | 내부 | 단일 노드 복제본 세트 (`rs0`) |
90
+ | **redis** | `redis:7-alpine` | 내부 | 작업 큐 (BullMQ) 및 캐싱 (ioredis) |
91
+ | **minio** | `minio/minio` | `9000` (S3), `9001` (콘솔) | 아바타 및 스크린샷을 위한 S3 호환 객체 스토리지 |
92
+ | **mailpit** | `axllent/mailpit` | `1025` (SMTP), `8025` (웹 UI) | 로컬 트랜잭션 이메일 싱크 |
93
+
94
+ 내부 포트(mongo, redis)는 기본적으로 호스트에 노출되지 않습니다.
95
+
96
+ > MinIO 포트 `9000`은 브라우저에서 접근할 수 있어야 합니다. 업로드된 자산(아바타, 스크린샷)은 `S3_PUBLIC_URL=http://localhost:9000/intlayer`에서 직접 로드되기 때문입니다.
97
+
98
+ ---
99
+
100
+ ## 환경 변수
101
+
102
+ 설치 프로그램은 즉시 사용할 수 있는 `.env` 파일을 생성합니다. 아래 표는 모든 변수를 설명합니다.
103
+
104
+ ### 필수 (자동 생성 또는 프롬프트)
105
+
106
+ | 변수 | 예시 | 설명 |
107
+ | ---------------------- | ----------------------------------------------- | -------------------------------------- |
108
+ | `NODE_ENV` | `production` | 런타임 환경 |
109
+ | `PORT` | `3100` | 백엔드 리스닝 포트 |
110
+ | `BACKEND_URL` | `http://localhost:3100` | 백엔드 API의 공개 URL |
111
+ | `APP_URL` | `http://localhost:3000` | 대시보드의 공개 URL |
112
+ | `DOMAIN` | `localhost` | 쿠키 도메인 |
113
+ | `MONGODB_URI` | `mongodb://mongo:27017/intlayer?replicaSet=rs0` | 전체 MongoDB 연결 URI |
114
+ | `REDIS_URL` | `redis://redis:6379` | Redis 연결 URL |
115
+ | `BETTER_AUTH_SECRET` | _(생성됨)_ | 세션 서명을 위한 32바이트 비밀 키 |
116
+ | `MAIL_PROVIDER` | `smtp` | 메일 전송 방식: `smtp` 또는 `resend` |
117
+ | `MAIL_SMTP_HOST` | `mailpit` | SMTP 호스트명 (Mailpit 컨테이너 이름) |
118
+ | `MAIL_SMTP_PORT` | `1025` | SMTP 포트 |
119
+ | `MAIL_FROM` | `Intlayer <no-reply@localhost>` | 발신자 주소 |
120
+ | `S3_ENDPOINT` | `http://minio:9000` | S3 호환 엔드포인트 |
121
+ | `S3_PUBLIC_URL` | `http://localhost:9000/intlayer` | 브라우저 자산 로딩을 위한 공개 URL |
122
+ | `S3_BUCKET_NAME` | `intlayer` | 버킷 이름 |
123
+ | `S3_ACCESS_KEY_ID` | _(생성됨)_ | MinIO 접근 키 |
124
+ | `S3_SECRET_ACCESS_KEY` | _(생성됨)_ | MinIO 비밀 키 |
125
+ | `VITE_BACKEND_URL` | `http://localhost:3100` | 빌드 시 대시보드에 내장되는 백엔드 URL |
126
+ | `VITE_DOMAIN` | `localhost` | 빌드 시 대시보드에 내장되는 도메인 |
127
+
128
+ ### 선택 사항 (누락 시 기능이 점진적으로 저하됨)
129
+
130
+ | 변수 | 기능 |
131
+ | -------------------------------------------------------- | ------------------------------------------------------ |
132
+ | `OPENAI_API_KEY` | AI 기반 번역 및 콘텐츠 감사 |
133
+ | `STRIPE_SECRET_KEY`, `STRIPE_WEBHOOK_SECRET`, `STRIPE_*` | 결제 및 구독 관리 |
134
+ | `RESEND_API_KEY` | Resend를 통한 트랜잭션 이메일 (설정 시 Mailpit 재정의) |
135
+ | `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` | GitHub OAuth 로그인 |
136
+ | `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` | Google OAuth 로그인 |
137
+ | `GITLAB_CLIENT_ID`, `GITLAB_CLIENT_SECRET` | GitLab OAuth 로그인 |
138
+ | `MICROSOFT_CLIENT_ID`, `MICROSOFT_CLIENT_SECRET` | Microsoft OAuth 로그인 |
139
+ | `LINKEDIN_CLIENT_ID`, `LINKEDIN_CLIENT_SECRET` | LinkedIn OAuth 로그인 |
140
+ | `ATLASSIAN_CLIENT_ID`, `ATLASSIAN_CLIENT_SECRET` | Atlassian OAuth 로그인 |
141
+
142
+ ---
143
+
144
+ ## Intlayer 프로젝트 연결하기
145
+
146
+ 스택이 실행되면 프로젝트가 `intlayer.org` 대신 자체 호스팅된 백엔드 및 대시보드를 가리키도록 설정하세요.
147
+
148
+ ### 프로젝트 설정
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
+ * 자체 호스팅 CMS 대시보드의 URL.
160
+ * 기본값: https://app.intlayer.org
161
+ */
162
+ cmsURL: process.env.INTLAYER_CMS_URL, // 예: http://localhost:3000
163
+
164
+ /**
165
+ * 자체 호스팅 백엔드 API의 URL.
166
+ * 기본값: https://back.intlayer.org
167
+ */
168
+ backendURL: process.env.INTLAYER_BACKEND_URL, // 예: http://localhost:3100
169
+ },
170
+ };
171
+
172
+ export default config;
173
+ ```
174
+
175
+ 프로젝트의 `.env` 파일에 환경 변수를 설정하세요:
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
+ `http://localhost:3000/projects`의 자체 호스팅 대시보드 **프로젝트 → 접근 키**에서 접근 자격 증명을 생성하세요.
185
+
186
+ ### `@intlayer/api` SDK
187
+
188
+ `@intlayer/api` SDK를 프로그래밍 방식으로 사용할 때, `backendURL`을 명시적으로 전달하세요:
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
+ ## 업그레이드
208
+
209
+ 기존 배포에서 설치 프로그램을 다시 실행하면 롤링 업그레이드가 수행됩니다:
210
+
211
+ ```sh
212
+ curl -fsSL https://intlayer.org/install.sh | sh
213
+ ```
214
+
215
+ 이는 최신 이미지를 가져오고 `docker compose pull && docker compose up -d`를 사용하여 컨테이너를 다시 시작합니다. 기존 볼륨(`mongo-data`, `redis-data`, `minio-data`)은 보존되므로 데이터 손실이 없습니다.
216
+
217
+ `./intlayer/` 디렉토리 내부에서 수동으로 업그레이드하려면:
218
+
219
+ ```sh
220
+ docker compose pull
221
+ docker compose up -d
222
+ ```
223
+
224
+ ---
225
+
226
+ ## 백업 및 복원
227
+
228
+ 모든 영구 데이터는 세 개의 명명된 Docker 볼륨에 저장됩니다.
229
+
230
+ ### 백업
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
+ ### 복원
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
+ # redis-data 및 minio-data에 대해서도 반복합니다.
258
+ ```
259
+
260
+ ---
261
+
262
+ ## 리버스 프록시 사용 (Nginx / Caddy)
263
+
264
+ 프로덕션 배포의 경우, 앱 및 백엔드 컨테이너를 직접 노출하는 대신 리버스 프록시를 앞에 배치하세요.
265
+
266
+ ### 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
+ 공개 도메인과 일치하도록 다음 `.env` 변수를 업데이트하세요:
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
+ > `VITE_*` 변수는 빌드 시 대시보드 이미지에 내장됩니다. 이미지가 빌드된 후 이를 변경하는 경우, `app` 이미지를 다시 빌드(`docker compose build app`)하거나 런타임 구성 주입을 사용해야 합니다.
303
+
304
+ ---
305
+
306
+ ## 문제 해결
307
+
308
+ ### 첫 시작 시 백엔드 충돌 반복
309
+
310
+ 백엔드가 시작되기 전에 MongoDB와 Redis가 정상 상태여야 합니다. compose 파일은 `condition: service_healthy`와 함께 `depends_on`을 사용합니다. 백엔드 재시작이 반복적으로 발생하면 `mongo` 및 `redis` 헬스체크가 통과하는지 확인하세요:
311
+
312
+ ```sh
313
+ docker compose ps
314
+ docker compose logs mongo
315
+ docker compose logs redis
316
+ ```
317
+
318
+ ### 대시보드가 API에 연결할 수 없음
319
+
320
+ `VITE_BACKEND_URL`이 **브라우저**에서 백엔드에 접근 가능한 URL(Docker 네트워크가 아님)과 일치하는지 확인하세요. 백엔드 포트를 변경했거나 리버스 프록시를 추가했다면, 대시보드 이미지를 다시 빌드해야 합니다:
321
+
322
+ ```sh
323
+ docker compose build app
324
+ docker compose up -d app
325
+ ```
326
+
327
+ ### 이메일이 전송되지 않음
328
+
329
+ 기본적으로 모든 발신 이메일은 Mailpit에 의해 캡처됩니다. `http://localhost:8025`를 열어 전송된 메시지를 확인하세요. 실제 이메일을 보내려면 `.env` 파일에 `MAIL_PROVIDER=resend` 및 `RESEND_API_KEY=<your-key>`를 설정한 다음 백엔드를 다시 시작하세요:
330
+
331
+ ```sh
332
+ docker compose restart backend
333
+ ```
334
+
335
+ ### MinIO 버킷 누락
336
+
337
+ `minio-init` 일회성 서비스가 실행되지 않았거나(또는 MinIO가 준비되기 전에 실행된 경우), 수동으로 버킷을 생성하세요:
338
+
339
+ ```sh
340
+ docker compose run --rm minio-init
341
+ ```
342
+
343
+ ---
344
+
345
+ ## 유용한 링크
346
+
347
+ - [Intlayer CMS 문서](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/intlayer_CMS.md)
348
+ - [설정 참조](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/configuration.md)
349
+ - [CMS SDK — `@intlayer/api`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/intlayer_CMS.md#programmatic-access-with-the-intlayerapi-sdk)