@intlayer/docs 9.5.6 → 9.5.7

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 (601) hide show
  1. package/blog/ar/i18next_vs_intlayer-i18next.md +122 -15
  2. package/blog/ar/i18next_vs_intlayer.md +130 -16
  3. package/blog/ar/lingui_vs_intlayer.md +122 -15
  4. package/blog/ar/next-intl_vs_intlayer-next-intl.md +124 -15
  5. package/blog/ar/next-intl_vs_intlayer.md +136 -20
  6. package/blog/ar/vue-i18n_vs_intlayer-vue-i18n.md +119 -17
  7. package/blog/ar/vue-i18n_vs_intlayer.md +193 -31
  8. package/blog/ar/vue-i18n_vs_intlayer_benchmark.md +361 -0
  9. package/blog/de/i18next_vs_intlayer-i18next.md +122 -15
  10. package/blog/de/i18next_vs_intlayer.md +128 -14
  11. package/blog/de/lingui_vs_intlayer.md +122 -15
  12. package/blog/de/next-intl_vs_intlayer-next-intl.md +124 -15
  13. package/blog/de/next-intl_vs_intlayer.md +125 -15
  14. package/blog/de/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  15. package/blog/de/vue-i18n_vs_intlayer.md +193 -31
  16. package/blog/en/i18next_vs_intlayer-i18next.md +121 -14
  17. package/blog/en/i18next_vs_intlayer.md +128 -14
  18. package/blog/en/lingui_vs_intlayer.md +124 -15
  19. package/blog/en/next-intl_vs_intlayer-next-intl.md +123 -14
  20. package/blog/en/next-intl_vs_intlayer.md +125 -13
  21. package/blog/en/vue-i18n_vs_intlayer-vue-i18n.md +115 -15
  22. package/blog/en/vue-i18n_vs_intlayer.md +188 -27
  23. package/blog/en-GB/i18next_vs_intlayer-i18next.md +121 -14
  24. package/blog/en-GB/i18next_vs_intlayer.md +128 -14
  25. package/blog/en-GB/lingui_vs_intlayer.md +122 -15
  26. package/blog/en-GB/next-intl_vs_intlayer-next-intl.md +124 -15
  27. package/blog/en-GB/next-intl_vs_intlayer.md +125 -15
  28. package/blog/en-GB/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  29. package/blog/en-GB/vue-i18n_vs_intlayer.md +187 -25
  30. package/blog/en-GB/vue-i18n_vs_intlayer_benchmark.md +116 -0
  31. package/blog/es/i18next_vs_intlayer-i18next.md +122 -15
  32. package/blog/es/i18next_vs_intlayer.md +128 -14
  33. package/blog/es/lingui_vs_intlayer.md +122 -15
  34. package/blog/es/next-intl_vs_intlayer-next-intl.md +124 -15
  35. package/blog/es/next-intl_vs_intlayer.md +125 -15
  36. package/blog/es/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  37. package/blog/es/vue-i18n_vs_intlayer.md +193 -31
  38. package/blog/fr/i18next_vs_intlayer-i18next.md +122 -15
  39. package/blog/fr/i18next_vs_intlayer.md +128 -14
  40. package/blog/fr/lingui_vs_intlayer.md +122 -15
  41. package/blog/fr/next-intl_vs_intlayer-next-intl.md +124 -15
  42. package/blog/fr/next-intl_vs_intlayer.md +127 -15
  43. package/blog/fr/vue-i18n_vs_intlayer-vue-i18n.md +118 -17
  44. package/blog/fr/vue-i18n_vs_intlayer.md +192 -31
  45. package/blog/fr/vue-i18n_vs_intlayer_benchmark.md +329 -7
  46. package/blog/hi/i18next_vs_intlayer-i18next.md +122 -15
  47. package/blog/hi/i18next_vs_intlayer.md +130 -16
  48. package/blog/hi/lingui_vs_intlayer.md +122 -15
  49. package/blog/hi/next-intl_vs_intlayer-next-intl.md +124 -15
  50. package/blog/hi/next-intl_vs_intlayer.md +135 -19
  51. package/blog/hi/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  52. package/blog/hi/vue-i18n_vs_intlayer.md +193 -31
  53. package/blog/hi/vue-i18n_vs_intlayer_benchmark.md +361 -0
  54. package/blog/id/i18next_vs_intlayer-i18next.md +122 -15
  55. package/blog/id/i18next_vs_intlayer.md +128 -14
  56. package/blog/id/lingui_vs_intlayer.md +122 -15
  57. package/blog/id/next-intl_vs_intlayer-next-intl.md +124 -15
  58. package/blog/id/next-intl_vs_intlayer.md +135 -19
  59. package/blog/id/vue-i18n_vs_intlayer-vue-i18n.md +354 -2
  60. package/blog/id/vue-i18n_vs_intlayer.md +188 -26
  61. package/blog/id/vue-i18n_vs_intlayer_benchmark.md +327 -7
  62. package/blog/it/i18next_vs_intlayer-i18next.md +122 -15
  63. package/blog/it/i18next_vs_intlayer.md +128 -14
  64. package/blog/it/lingui_vs_intlayer.md +122 -15
  65. package/blog/it/next-intl_vs_intlayer-next-intl.md +124 -15
  66. package/blog/it/next-intl_vs_intlayer.md +125 -15
  67. package/blog/it/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  68. package/blog/it/vue-i18n_vs_intlayer.md +191 -31
  69. package/blog/it/vue-i18n_vs_intlayer_benchmark.md +332 -5
  70. package/blog/ja/i18next_vs_intlayer-i18next.md +122 -15
  71. package/blog/ja/i18next_vs_intlayer.md +129 -17
  72. package/blog/ja/lingui_vs_intlayer.md +122 -15
  73. package/blog/ja/next-intl_vs_intlayer-next-intl.md +124 -15
  74. package/blog/ja/next-intl_vs_intlayer.md +124 -14
  75. package/blog/ja/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  76. package/blog/ja/vue-i18n_vs_intlayer.md +193 -31
  77. package/blog/ja/vue-i18n_vs_intlayer_benchmark.md +361 -0
  78. package/blog/ko/i18next_vs_intlayer-i18next.md +122 -15
  79. package/blog/ko/i18next_vs_intlayer.md +129 -17
  80. package/blog/ko/lingui_vs_intlayer.md +122 -15
  81. package/blog/ko/next-intl_vs_intlayer-next-intl.md +124 -15
  82. package/blog/ko/next-intl_vs_intlayer.md +134 -18
  83. package/blog/ko/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  84. package/blog/ko/vue-i18n_vs_intlayer.md +193 -31
  85. package/blog/pl/i18next_vs_intlayer-i18next.md +122 -15
  86. package/blog/pl/i18next_vs_intlayer.md +128 -14
  87. package/blog/pl/lingui_vs_intlayer.md +122 -15
  88. package/blog/pl/next-intl_vs_intlayer-next-intl.md +124 -15
  89. package/blog/pl/next-intl_vs_intlayer.md +134 -18
  90. package/blog/pl/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  91. package/blog/pl/vue-i18n_vs_intlayer.md +188 -26
  92. package/blog/pl/vue-i18n_vs_intlayer_benchmark.md +361 -0
  93. package/blog/pt/i18next_vs_intlayer-i18next.md +122 -15
  94. package/blog/pt/i18next_vs_intlayer.md +128 -14
  95. package/blog/pt/lingui_vs_intlayer.md +122 -15
  96. package/blog/pt/next-intl_vs_intlayer-next-intl.md +124 -15
  97. package/blog/pt/next-intl_vs_intlayer.md +131 -15
  98. package/blog/pt/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  99. package/blog/pt/vue-i18n_vs_intlayer.md +193 -31
  100. package/blog/pt/vue-i18n_vs_intlayer_benchmark.md +361 -0
  101. package/blog/ru/i18next_vs_intlayer-i18next.md +122 -15
  102. package/blog/ru/i18next_vs_intlayer.md +130 -16
  103. package/blog/ru/lingui_vs_intlayer.md +122 -15
  104. package/blog/ru/next-intl_vs_intlayer-next-intl.md +125 -16
  105. package/blog/ru/next-intl_vs_intlayer.md +123 -13
  106. package/blog/ru/vue-i18n_vs_intlayer-vue-i18n.md +127 -27
  107. package/blog/ru/vue-i18n_vs_intlayer.md +193 -31
  108. package/blog/ru/vue-i18n_vs_intlayer_benchmark.md +326 -19
  109. package/blog/tr/i18next_vs_intlayer-i18next.md +122 -15
  110. package/blog/tr/i18next_vs_intlayer.md +128 -14
  111. package/blog/tr/lingui_vs_intlayer.md +122 -15
  112. package/blog/tr/next-intl_vs_intlayer-next-intl.md +124 -15
  113. package/blog/tr/next-intl_vs_intlayer.md +136 -20
  114. package/blog/tr/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  115. package/blog/tr/vue-i18n_vs_intlayer.md +188 -26
  116. package/blog/tr/vue-i18n_vs_intlayer_benchmark.md +361 -0
  117. package/blog/uk/i18next_vs_intlayer-i18next.md +122 -15
  118. package/blog/uk/i18next_vs_intlayer.md +130 -16
  119. package/blog/uk/lingui_vs_intlayer.md +122 -15
  120. package/blog/uk/next-intl_vs_intlayer-next-intl.md +124 -15
  121. package/blog/uk/next-intl_vs_intlayer.md +135 -19
  122. package/blog/uk/vue-i18n_vs_intlayer-vue-i18n.md +135 -17
  123. package/blog/uk/vue-i18n_vs_intlayer.md +188 -27
  124. package/blog/uk/vue-i18n_vs_intlayer_benchmark.md +361 -0
  125. package/blog/vi/i18next_vs_intlayer-i18next.md +122 -15
  126. package/blog/vi/i18next_vs_intlayer.md +128 -14
  127. package/blog/vi/lingui_vs_intlayer.md +122 -15
  128. package/blog/vi/next-intl_vs_intlayer-next-intl.md +124 -15
  129. package/blog/vi/next-intl_vs_intlayer.md +135 -19
  130. package/blog/vi/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  131. package/blog/vi/vue-i18n_vs_intlayer.md +188 -26
  132. package/blog/vi/vue-i18n_vs_intlayer_benchmark.md +361 -0
  133. package/blog/zh/i18next_vs_intlayer-i18next.md +122 -15
  134. package/blog/zh/i18next_vs_intlayer.md +128 -14
  135. package/blog/zh/lingui_vs_intlayer.md +122 -15
  136. package/blog/zh/next-intl_vs_intlayer-next-intl.md +124 -15
  137. package/blog/zh/next-intl_vs_intlayer.md +125 -15
  138. package/blog/zh/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  139. package/blog/zh/vue-i18n_vs_intlayer.md +192 -31
  140. package/blog/zh/vue-i18n_vs_intlayer_benchmark.md +340 -9
  141. package/dist/cjs/generated/docs.entry.cjs +40 -40
  142. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  143. package/dist/cjs/index.cjs +2 -2
  144. package/dist/esm/generated/docs.entry.mjs +40 -40
  145. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  146. package/dist/esm/index.mjs +2 -2
  147. package/dist/types/generated/docs.entry.d.ts +2 -2
  148. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  149. package/docs/ar/benchmark/nextjs.md +13 -13
  150. package/docs/ar/benchmark/solid.md +5 -5
  151. package/docs/ar/benchmark/svelte.md +4 -4
  152. package/docs/ar/benchmark/tanstack.md +14 -13
  153. package/docs/ar/benchmark/vue.md +5 -5
  154. package/docs/ar/chrome_extension.md +130 -0
  155. package/docs/ar/cli/index.md +6 -1
  156. package/docs/ar/cli/infra.md +162 -0
  157. package/docs/ar/cli/init.md +24 -1
  158. package/docs/ar/dictionary/html.md +173 -5
  159. package/docs/ar/dictionary/markdown.md +263 -1
  160. package/docs/ar/intlayer_with_analog.md +23 -1
  161. package/docs/ar/intlayer_with_angular_19.md +24 -1
  162. package/docs/ar/intlayer_with_angular_21.md +24 -1
  163. package/docs/ar/intlayer_with_astro.md +24 -1
  164. package/docs/ar/intlayer_with_astro_lit.md +25 -1
  165. package/docs/ar/intlayer_with_astro_preact.md +26 -1
  166. package/docs/ar/intlayer_with_astro_react.md +26 -1
  167. package/docs/ar/intlayer_with_astro_solid.md +26 -1
  168. package/docs/ar/intlayer_with_astro_svelte.md +25 -1
  169. package/docs/ar/intlayer_with_astro_vue.md +25 -1
  170. package/docs/ar/intlayer_with_remix_3.md +22 -1
  171. package/docs/ar/self_hosting.md +406 -231
  172. package/docs/de/benchmark/nextjs.md +13 -13
  173. package/docs/de/benchmark/solid.md +5 -5
  174. package/docs/de/benchmark/svelte.md +4 -4
  175. package/docs/de/benchmark/tanstack.md +14 -13
  176. package/docs/de/benchmark/vue.md +5 -5
  177. package/docs/de/chrome_extension.md +130 -0
  178. package/docs/de/cli/index.md +6 -1
  179. package/docs/de/cli/infra.md +162 -0
  180. package/docs/de/cli/init.md +24 -1
  181. package/docs/de/dictionary/html.md +173 -5
  182. package/docs/de/dictionary/markdown.md +263 -1
  183. package/docs/de/intlayer_with_analog.md +23 -1
  184. package/docs/de/intlayer_with_angular_19.md +24 -1
  185. package/docs/de/intlayer_with_angular_21.md +24 -1
  186. package/docs/de/intlayer_with_astro.md +24 -1
  187. package/docs/de/intlayer_with_astro_lit.md +25 -1
  188. package/docs/de/intlayer_with_astro_preact.md +26 -1
  189. package/docs/de/intlayer_with_astro_react.md +26 -1
  190. package/docs/de/intlayer_with_astro_solid.md +26 -1
  191. package/docs/de/intlayer_with_astro_svelte.md +25 -1
  192. package/docs/de/intlayer_with_astro_vue.md +25 -1
  193. package/docs/de/intlayer_with_remix_3.md +22 -1
  194. package/docs/de/self_hosting.md +404 -227
  195. package/docs/en/benchmark/nextjs.md +13 -13
  196. package/docs/en/benchmark/solid.md +5 -5
  197. package/docs/en/benchmark/svelte.md +4 -4
  198. package/docs/en/benchmark/tanstack.md +14 -13
  199. package/docs/en/benchmark/vue.md +5 -5
  200. package/docs/en/chrome_extension.md +130 -0
  201. package/docs/en/cli/index.md +6 -1
  202. package/docs/en/cli/infra.md +175 -0
  203. package/docs/en/cli/init.md +25 -1
  204. package/docs/en/dictionary/html.md +173 -5
  205. package/docs/en/dictionary/markdown.md +263 -1
  206. package/docs/en/intlayer_with_analog.md +23 -1
  207. package/docs/en/intlayer_with_angular_19.md +24 -1
  208. package/docs/en/intlayer_with_angular_21.md +24 -1
  209. package/docs/en/intlayer_with_astro.md +24 -1
  210. package/docs/en/intlayer_with_astro_lit.md +25 -1
  211. package/docs/en/intlayer_with_astro_preact.md +26 -1
  212. package/docs/en/intlayer_with_astro_react.md +26 -1
  213. package/docs/en/intlayer_with_astro_solid.md +26 -1
  214. package/docs/en/intlayer_with_astro_svelte.md +25 -1
  215. package/docs/en/intlayer_with_astro_vue.md +25 -1
  216. package/docs/en/intlayer_with_remix_3.md +22 -1
  217. package/docs/en/self_hosting.md +418 -176
  218. package/docs/en-GB/benchmark/nextjs.md +13 -13
  219. package/docs/en-GB/benchmark/solid.md +5 -5
  220. package/docs/en-GB/benchmark/svelte.md +4 -4
  221. package/docs/en-GB/benchmark/tanstack.md +14 -13
  222. package/docs/en-GB/benchmark/vue.md +5 -5
  223. package/docs/en-GB/chrome_extension.md +130 -0
  224. package/docs/en-GB/cli/index.md +6 -1
  225. package/docs/en-GB/cli/infra.md +162 -0
  226. package/docs/en-GB/cli/init.md +24 -1
  227. package/docs/en-GB/dictionary/html.md +173 -5
  228. package/docs/en-GB/dictionary/markdown.md +263 -1
  229. package/docs/en-GB/intlayer_with_analog.md +23 -1
  230. package/docs/en-GB/intlayer_with_angular_19.md +24 -1
  231. package/docs/en-GB/intlayer_with_angular_21.md +24 -1
  232. package/docs/en-GB/intlayer_with_astro.md +24 -1
  233. package/docs/en-GB/intlayer_with_astro_lit.md +25 -1
  234. package/docs/en-GB/intlayer_with_astro_preact.md +26 -1
  235. package/docs/en-GB/intlayer_with_astro_react.md +26 -1
  236. package/docs/en-GB/intlayer_with_astro_solid.md +26 -1
  237. package/docs/en-GB/intlayer_with_astro_svelte.md +25 -1
  238. package/docs/en-GB/intlayer_with_astro_vue.md +25 -1
  239. package/docs/en-GB/intlayer_with_remix_3.md +22 -1
  240. package/docs/en-GB/self_hosting.md +381 -206
  241. package/docs/es/benchmark/nextjs.md +13 -13
  242. package/docs/es/benchmark/solid.md +5 -5
  243. package/docs/es/benchmark/svelte.md +4 -4
  244. package/docs/es/benchmark/tanstack.md +14 -13
  245. package/docs/es/benchmark/vue.md +5 -5
  246. package/docs/es/chrome_extension.md +130 -0
  247. package/docs/es/cli/index.md +6 -1
  248. package/docs/es/cli/infra.md +162 -0
  249. package/docs/es/cli/init.md +24 -1
  250. package/docs/es/dictionary/html.md +173 -5
  251. package/docs/es/dictionary/markdown.md +263 -1
  252. package/docs/es/intlayer_with_analog.md +23 -1
  253. package/docs/es/intlayer_with_angular_19.md +24 -1
  254. package/docs/es/intlayer_with_angular_21.md +24 -1
  255. package/docs/es/intlayer_with_astro.md +24 -1
  256. package/docs/es/intlayer_with_astro_lit.md +25 -1
  257. package/docs/es/intlayer_with_astro_preact.md +26 -1
  258. package/docs/es/intlayer_with_astro_react.md +26 -1
  259. package/docs/es/intlayer_with_astro_solid.md +26 -1
  260. package/docs/es/intlayer_with_astro_svelte.md +25 -1
  261. package/docs/es/intlayer_with_astro_vue.md +25 -1
  262. package/docs/es/intlayer_with_remix_3.md +22 -1
  263. package/docs/es/self_hosting.md +400 -223
  264. package/docs/fr/benchmark/nextjs.md +13 -13
  265. package/docs/fr/benchmark/solid.md +5 -5
  266. package/docs/fr/benchmark/svelte.md +4 -4
  267. package/docs/fr/benchmark/tanstack.md +14 -13
  268. package/docs/fr/benchmark/vue.md +5 -5
  269. package/docs/fr/chrome_extension.md +130 -0
  270. package/docs/fr/cli/index.md +6 -1
  271. package/docs/fr/cli/infra.md +162 -0
  272. package/docs/fr/cli/init.md +24 -1
  273. package/docs/fr/dictionary/html.md +173 -5
  274. package/docs/fr/dictionary/markdown.md +265 -4
  275. package/docs/fr/intlayer_with_analog.md +23 -1
  276. package/docs/fr/intlayer_with_angular_19.md +24 -1
  277. package/docs/fr/intlayer_with_angular_21.md +24 -1
  278. package/docs/fr/intlayer_with_astro.md +24 -1
  279. package/docs/fr/intlayer_with_astro_lit.md +25 -1
  280. package/docs/fr/intlayer_with_astro_preact.md +26 -1
  281. package/docs/fr/intlayer_with_astro_react.md +26 -1
  282. package/docs/fr/intlayer_with_astro_solid.md +26 -1
  283. package/docs/fr/intlayer_with_astro_svelte.md +25 -1
  284. package/docs/fr/intlayer_with_astro_vue.md +25 -1
  285. package/docs/fr/intlayer_with_remix_3.md +22 -1
  286. package/docs/fr/self_hosting.md +401 -224
  287. package/docs/hi/benchmark/nextjs.md +13 -13
  288. package/docs/hi/benchmark/solid.md +5 -5
  289. package/docs/hi/benchmark/svelte.md +4 -4
  290. package/docs/hi/benchmark/tanstack.md +14 -13
  291. package/docs/hi/benchmark/vue.md +5 -5
  292. package/docs/hi/chrome_extension.md +130 -0
  293. package/docs/hi/cli/index.md +6 -1
  294. package/docs/hi/cli/infra.md +162 -0
  295. package/docs/hi/cli/init.md +24 -1
  296. package/docs/hi/dictionary/html.md +173 -5
  297. package/docs/hi/dictionary/markdown.md +263 -1
  298. package/docs/hi/intlayer_with_analog.md +23 -1
  299. package/docs/hi/intlayer_with_angular_19.md +24 -1
  300. package/docs/hi/intlayer_with_angular_21.md +24 -1
  301. package/docs/hi/intlayer_with_astro.md +24 -1
  302. package/docs/hi/intlayer_with_astro_lit.md +25 -1
  303. package/docs/hi/intlayer_with_astro_preact.md +26 -1
  304. package/docs/hi/intlayer_with_astro_react.md +26 -1
  305. package/docs/hi/intlayer_with_astro_solid.md +26 -1
  306. package/docs/hi/intlayer_with_astro_svelte.md +25 -1
  307. package/docs/hi/intlayer_with_astro_vue.md +25 -1
  308. package/docs/hi/intlayer_with_remix_3.md +22 -1
  309. package/docs/hi/self_hosting.md +409 -235
  310. package/docs/id/benchmark/nextjs.md +13 -13
  311. package/docs/id/benchmark/solid.md +5 -5
  312. package/docs/id/benchmark/svelte.md +4 -4
  313. package/docs/id/benchmark/tanstack.md +14 -13
  314. package/docs/id/benchmark/vue.md +5 -5
  315. package/docs/id/chrome_extension.md +130 -0
  316. package/docs/id/cli/index.md +6 -1
  317. package/docs/id/cli/infra.md +162 -0
  318. package/docs/id/cli/init.md +24 -1
  319. package/docs/id/dictionary/html.md +173 -5
  320. package/docs/id/dictionary/markdown.md +263 -1
  321. package/docs/id/intlayer_with_analog.md +23 -1
  322. package/docs/id/intlayer_with_angular_19.md +24 -1
  323. package/docs/id/intlayer_with_angular_21.md +24 -1
  324. package/docs/id/intlayer_with_astro.md +24 -1
  325. package/docs/id/intlayer_with_astro_lit.md +25 -1
  326. package/docs/id/intlayer_with_astro_preact.md +26 -1
  327. package/docs/id/intlayer_with_astro_react.md +26 -1
  328. package/docs/id/intlayer_with_astro_solid.md +26 -1
  329. package/docs/id/intlayer_with_astro_svelte.md +25 -1
  330. package/docs/id/intlayer_with_astro_vue.md +25 -1
  331. package/docs/id/intlayer_with_remix_3.md +22 -1
  332. package/docs/id/self_hosting.md +416 -243
  333. package/docs/it/benchmark/nextjs.md +13 -13
  334. package/docs/it/benchmark/solid.md +5 -5
  335. package/docs/it/benchmark/svelte.md +4 -4
  336. package/docs/it/benchmark/tanstack.md +14 -13
  337. package/docs/it/benchmark/vue.md +5 -5
  338. package/docs/it/chrome_extension.md +130 -0
  339. package/docs/it/cli/index.md +6 -1
  340. package/docs/it/cli/infra.md +162 -0
  341. package/docs/it/cli/init.md +24 -1
  342. package/docs/it/dictionary/html.md +173 -5
  343. package/docs/it/dictionary/markdown.md +263 -1
  344. package/docs/it/intlayer_with_analog.md +23 -1
  345. package/docs/it/intlayer_with_angular_19.md +24 -1
  346. package/docs/it/intlayer_with_angular_21.md +24 -1
  347. package/docs/it/intlayer_with_astro.md +24 -1
  348. package/docs/it/intlayer_with_astro_lit.md +25 -1
  349. package/docs/it/intlayer_with_astro_preact.md +26 -1
  350. package/docs/it/intlayer_with_astro_react.md +26 -1
  351. package/docs/it/intlayer_with_astro_solid.md +26 -1
  352. package/docs/it/intlayer_with_astro_svelte.md +25 -1
  353. package/docs/it/intlayer_with_astro_vue.md +25 -1
  354. package/docs/it/intlayer_with_remix_3.md +22 -1
  355. package/docs/it/self_hosting.md +412 -237
  356. package/docs/ja/benchmark/nextjs.md +13 -13
  357. package/docs/ja/benchmark/solid.md +5 -5
  358. package/docs/ja/benchmark/svelte.md +4 -4
  359. package/docs/ja/benchmark/tanstack.md +13 -12
  360. package/docs/ja/benchmark/vue.md +5 -5
  361. package/docs/ja/chrome_extension.md +130 -0
  362. package/docs/ja/cli/index.md +6 -1
  363. package/docs/ja/cli/infra.md +162 -0
  364. package/docs/ja/cli/init.md +24 -1
  365. package/docs/ja/dictionary/html.md +173 -5
  366. package/docs/ja/dictionary/markdown.md +263 -1
  367. package/docs/ja/intlayer_with_analog.md +23 -1
  368. package/docs/ja/intlayer_with_angular_19.md +24 -1
  369. package/docs/ja/intlayer_with_angular_21.md +24 -1
  370. package/docs/ja/intlayer_with_astro.md +24 -1
  371. package/docs/ja/intlayer_with_astro_lit.md +25 -1
  372. package/docs/ja/intlayer_with_astro_preact.md +26 -1
  373. package/docs/ja/intlayer_with_astro_react.md +26 -1
  374. package/docs/ja/intlayer_with_astro_solid.md +26 -1
  375. package/docs/ja/intlayer_with_astro_svelte.md +25 -1
  376. package/docs/ja/intlayer_with_astro_vue.md +25 -1
  377. package/docs/ja/intlayer_with_remix_3.md +22 -1
  378. package/docs/ja/self_hosting.md +398 -223
  379. package/docs/ko/benchmark/nextjs.md +13 -13
  380. package/docs/ko/benchmark/solid.md +5 -5
  381. package/docs/ko/benchmark/svelte.md +4 -4
  382. package/docs/ko/benchmark/tanstack.md +14 -13
  383. package/docs/ko/benchmark/vue.md +5 -5
  384. package/docs/ko/chrome_extension.md +130 -0
  385. package/docs/ko/cli/index.md +6 -1
  386. package/docs/ko/cli/infra.md +162 -0
  387. package/docs/ko/cli/init.md +24 -1
  388. package/docs/ko/dictionary/html.md +173 -5
  389. package/docs/ko/dictionary/markdown.md +263 -1
  390. package/docs/ko/intlayer_with_analog.md +23 -1
  391. package/docs/ko/intlayer_with_angular_19.md +24 -1
  392. package/docs/ko/intlayer_with_angular_21.md +24 -1
  393. package/docs/ko/intlayer_with_astro.md +24 -1
  394. package/docs/ko/intlayer_with_astro_lit.md +25 -1
  395. package/docs/ko/intlayer_with_astro_preact.md +26 -1
  396. package/docs/ko/intlayer_with_astro_react.md +26 -1
  397. package/docs/ko/intlayer_with_astro_solid.md +26 -1
  398. package/docs/ko/intlayer_with_astro_svelte.md +25 -1
  399. package/docs/ko/intlayer_with_astro_vue.md +25 -1
  400. package/docs/ko/intlayer_with_remix_3.md +22 -1
  401. package/docs/ko/self_hosting.md +411 -238
  402. package/docs/pl/benchmark/nextjs.md +13 -13
  403. package/docs/pl/benchmark/solid.md +5 -5
  404. package/docs/pl/benchmark/svelte.md +4 -4
  405. package/docs/pl/benchmark/tanstack.md +14 -13
  406. package/docs/pl/benchmark/vue.md +5 -5
  407. package/docs/pl/chrome_extension.md +130 -0
  408. package/docs/pl/cli/index.md +6 -1
  409. package/docs/pl/cli/infra.md +162 -0
  410. package/docs/pl/cli/init.md +24 -1
  411. package/docs/pl/dictionary/html.md +173 -5
  412. package/docs/pl/dictionary/markdown.md +263 -1
  413. package/docs/pl/intlayer_with_analog.md +23 -1
  414. package/docs/pl/intlayer_with_angular_19.md +24 -1
  415. package/docs/pl/intlayer_with_angular_21.md +24 -1
  416. package/docs/pl/intlayer_with_astro.md +24 -1
  417. package/docs/pl/intlayer_with_astro_lit.md +25 -1
  418. package/docs/pl/intlayer_with_astro_preact.md +26 -1
  419. package/docs/pl/intlayer_with_astro_react.md +26 -1
  420. package/docs/pl/intlayer_with_astro_solid.md +26 -1
  421. package/docs/pl/intlayer_with_astro_svelte.md +25 -1
  422. package/docs/pl/intlayer_with_astro_vue.md +25 -1
  423. package/docs/pl/intlayer_with_remix_3.md +22 -1
  424. package/docs/pl/self_hosting.md +408 -233
  425. package/docs/pt/benchmark/nextjs.md +13 -13
  426. package/docs/pt/benchmark/solid.md +5 -5
  427. package/docs/pt/benchmark/svelte.md +4 -4
  428. package/docs/pt/benchmark/tanstack.md +14 -13
  429. package/docs/pt/benchmark/vue.md +5 -5
  430. package/docs/pt/chrome_extension.md +130 -0
  431. package/docs/pt/cli/index.md +6 -1
  432. package/docs/pt/cli/infra.md +162 -0
  433. package/docs/pt/cli/init.md +24 -1
  434. package/docs/pt/dictionary/html.md +173 -5
  435. package/docs/pt/dictionary/markdown.md +263 -1
  436. package/docs/pt/intlayer_with_analog.md +23 -1
  437. package/docs/pt/intlayer_with_angular_19.md +24 -1
  438. package/docs/pt/intlayer_with_angular_21.md +24 -1
  439. package/docs/pt/intlayer_with_astro.md +24 -1
  440. package/docs/pt/intlayer_with_astro_lit.md +25 -1
  441. package/docs/pt/intlayer_with_astro_preact.md +26 -1
  442. package/docs/pt/intlayer_with_astro_react.md +26 -1
  443. package/docs/pt/intlayer_with_astro_solid.md +26 -1
  444. package/docs/pt/intlayer_with_astro_svelte.md +25 -1
  445. package/docs/pt/intlayer_with_astro_vue.md +25 -1
  446. package/docs/pt/intlayer_with_remix_3.md +22 -1
  447. package/docs/pt/self_hosting.md +399 -224
  448. package/docs/ru/benchmark/nextjs.md +13 -13
  449. package/docs/ru/benchmark/solid.md +5 -5
  450. package/docs/ru/benchmark/svelte.md +4 -4
  451. package/docs/ru/benchmark/tanstack.md +14 -13
  452. package/docs/ru/benchmark/vue.md +5 -5
  453. package/docs/ru/chrome_extension.md +130 -0
  454. package/docs/ru/cli/index.md +6 -1
  455. package/docs/ru/cli/infra.md +162 -0
  456. package/docs/ru/cli/init.md +24 -1
  457. package/docs/ru/dictionary/html.md +173 -5
  458. package/docs/ru/dictionary/markdown.md +263 -1
  459. package/docs/ru/intlayer_with_analog.md +23 -1
  460. package/docs/ru/intlayer_with_angular_19.md +24 -1
  461. package/docs/ru/intlayer_with_angular_21.md +24 -1
  462. package/docs/ru/intlayer_with_astro.md +24 -1
  463. package/docs/ru/intlayer_with_astro_lit.md +25 -1
  464. package/docs/ru/intlayer_with_astro_preact.md +26 -1
  465. package/docs/ru/intlayer_with_astro_react.md +26 -1
  466. package/docs/ru/intlayer_with_astro_solid.md +26 -1
  467. package/docs/ru/intlayer_with_astro_svelte.md +25 -1
  468. package/docs/ru/intlayer_with_astro_vue.md +25 -1
  469. package/docs/ru/intlayer_with_remix_3.md +22 -1
  470. package/docs/ru/self_hosting.md +403 -228
  471. package/docs/tr/benchmark/nextjs.md +13 -13
  472. package/docs/tr/benchmark/solid.md +5 -5
  473. package/docs/tr/benchmark/svelte.md +4 -4
  474. package/docs/tr/benchmark/tanstack.md +14 -13
  475. package/docs/tr/benchmark/vue.md +5 -5
  476. package/docs/tr/chrome_extension.md +130 -0
  477. package/docs/tr/cli/index.md +6 -1
  478. package/docs/tr/cli/infra.md +162 -0
  479. package/docs/tr/cli/init.md +24 -1
  480. package/docs/tr/dictionary/html.md +173 -5
  481. package/docs/tr/dictionary/markdown.md +263 -1
  482. package/docs/tr/intlayer_with_analog.md +23 -1
  483. package/docs/tr/intlayer_with_angular_19.md +24 -1
  484. package/docs/tr/intlayer_with_angular_21.md +24 -1
  485. package/docs/tr/intlayer_with_astro.md +24 -1
  486. package/docs/tr/intlayer_with_astro_lit.md +25 -1
  487. package/docs/tr/intlayer_with_astro_preact.md +26 -1
  488. package/docs/tr/intlayer_with_astro_react.md +26 -1
  489. package/docs/tr/intlayer_with_astro_solid.md +26 -1
  490. package/docs/tr/intlayer_with_astro_svelte.md +25 -1
  491. package/docs/tr/intlayer_with_astro_vue.md +25 -1
  492. package/docs/tr/intlayer_with_remix_3.md +22 -1
  493. package/docs/tr/self_hosting.md +410 -234
  494. package/docs/uk/benchmark/nextjs.md +13 -13
  495. package/docs/uk/benchmark/solid.md +5 -5
  496. package/docs/uk/benchmark/svelte.md +4 -4
  497. package/docs/uk/benchmark/tanstack.md +14 -13
  498. package/docs/uk/benchmark/vue.md +5 -5
  499. package/docs/uk/chrome_extension.md +130 -0
  500. package/docs/uk/cli/index.md +6 -1
  501. package/docs/uk/cli/infra.md +162 -0
  502. package/docs/uk/cli/init.md +24 -1
  503. package/docs/uk/dictionary/html.md +173 -5
  504. package/docs/uk/dictionary/markdown.md +263 -1
  505. package/docs/uk/intlayer_with_analog.md +23 -1
  506. package/docs/uk/intlayer_with_angular_19.md +24 -1
  507. package/docs/uk/intlayer_with_angular_21.md +24 -1
  508. package/docs/uk/intlayer_with_astro.md +24 -1
  509. package/docs/uk/intlayer_with_astro_lit.md +25 -1
  510. package/docs/uk/intlayer_with_astro_preact.md +26 -1
  511. package/docs/uk/intlayer_with_astro_react.md +26 -1
  512. package/docs/uk/intlayer_with_astro_solid.md +26 -1
  513. package/docs/uk/intlayer_with_astro_svelte.md +25 -1
  514. package/docs/uk/intlayer_with_astro_vue.md +25 -1
  515. package/docs/uk/intlayer_with_remix_3.md +22 -1
  516. package/docs/uk/self_hosting.md +413 -238
  517. package/docs/vi/benchmark/nextjs.md +13 -13
  518. package/docs/vi/benchmark/solid.md +5 -5
  519. package/docs/vi/benchmark/svelte.md +4 -4
  520. package/docs/vi/benchmark/tanstack.md +14 -13
  521. package/docs/vi/benchmark/vue.md +5 -5
  522. package/docs/vi/chrome_extension.md +130 -0
  523. package/docs/vi/cli/index.md +6 -1
  524. package/docs/vi/cli/infra.md +162 -0
  525. package/docs/vi/cli/init.md +24 -1
  526. package/docs/vi/dictionary/html.md +173 -5
  527. package/docs/vi/dictionary/markdown.md +263 -1
  528. package/docs/vi/intlayer_with_analog.md +23 -1
  529. package/docs/vi/intlayer_with_angular_19.md +24 -1
  530. package/docs/vi/intlayer_with_angular_21.md +24 -1
  531. package/docs/vi/intlayer_with_astro.md +24 -1
  532. package/docs/vi/intlayer_with_astro_lit.md +25 -1
  533. package/docs/vi/intlayer_with_astro_preact.md +26 -1
  534. package/docs/vi/intlayer_with_astro_react.md +26 -1
  535. package/docs/vi/intlayer_with_astro_solid.md +26 -1
  536. package/docs/vi/intlayer_with_astro_svelte.md +25 -1
  537. package/docs/vi/intlayer_with_astro_vue.md +25 -1
  538. package/docs/vi/intlayer_with_remix_3.md +22 -1
  539. package/docs/vi/self_hosting.md +408 -234
  540. package/docs/zh/benchmark/nextjs.md +13 -13
  541. package/docs/zh/benchmark/solid.md +5 -5
  542. package/docs/zh/benchmark/svelte.md +4 -4
  543. package/docs/zh/benchmark/tanstack.md +14 -13
  544. package/docs/zh/benchmark/vue.md +5 -5
  545. package/docs/zh/chrome_extension.md +130 -0
  546. package/docs/zh/cli/index.md +6 -1
  547. package/docs/zh/cli/infra.md +162 -0
  548. package/docs/zh/cli/init.md +24 -1
  549. package/docs/zh/dictionary/html.md +172 -5
  550. package/docs/zh/dictionary/markdown.md +262 -1
  551. package/docs/zh/intlayer_with_analog.md +23 -1
  552. package/docs/zh/intlayer_with_angular_19.md +24 -1
  553. package/docs/zh/intlayer_with_angular_21.md +24 -1
  554. package/docs/zh/intlayer_with_astro.md +24 -1
  555. package/docs/zh/intlayer_with_astro_lit.md +25 -1
  556. package/docs/zh/intlayer_with_astro_preact.md +26 -1
  557. package/docs/zh/intlayer_with_astro_react.md +26 -1
  558. package/docs/zh/intlayer_with_astro_solid.md +26 -1
  559. package/docs/zh/intlayer_with_astro_svelte.md +25 -1
  560. package/docs/zh/intlayer_with_astro_vue.md +25 -1
  561. package/docs/zh/intlayer_with_remix_3.md +22 -1
  562. package/docs/zh/self_hosting.md +410 -237
  563. package/legal/ar/privacy_notice.md +9 -3
  564. package/legal/de/privacy_notice.md +9 -3
  565. package/legal/en/privacy_notice.md +10 -3
  566. package/legal/en-GB/privacy_notice.md +9 -3
  567. package/legal/es/privacy_notice.md +9 -3
  568. package/legal/fr/privacy_notice.md +9 -3
  569. package/legal/hi/privacy_notice.md +9 -3
  570. package/legal/id/privacy_notice.md +9 -3
  571. package/legal/it/privacy_notice.md +9 -3
  572. package/legal/ja/privacy_notice.md +9 -3
  573. package/legal/ko/privacy_notice.md +9 -3
  574. package/legal/pl/privacy_notice.md +9 -3
  575. package/legal/pt/privacy_notice.md +9 -3
  576. package/legal/ru/privacy_notice.md +9 -3
  577. package/legal/tr/privacy_notice.md +9 -3
  578. package/legal/uk/privacy_notice.md +9 -3
  579. package/legal/vi/privacy_notice.md +9 -3
  580. package/legal/zh/privacy_notice.md +9 -3
  581. package/package.json +1 -1
  582. package/src/generated/docs.entry.ts +40 -40
  583. package/docs/ar/roadmap.md +0 -321
  584. package/docs/de/roadmap.md +0 -322
  585. package/docs/en/intlayer_with_astro_vanilla.md +0 -713
  586. package/docs/en/roadmap.md +0 -325
  587. package/docs/en-GB/roadmap.md +0 -322
  588. package/docs/es/roadmap.md +0 -322
  589. package/docs/fr/roadmap.md +0 -322
  590. package/docs/hi/roadmap.md +0 -322
  591. package/docs/id/roadmap.md +0 -325
  592. package/docs/it/roadmap.md +0 -322
  593. package/docs/ja/roadmap.md +0 -322
  594. package/docs/ko/roadmap.md +0 -322
  595. package/docs/pl/roadmap.md +0 -325
  596. package/docs/pt/roadmap.md +0 -322
  597. package/docs/ru/roadmap.md +0 -322
  598. package/docs/tr/roadmap.md +0 -325
  599. package/docs/uk/roadmap.md +0 -325
  600. package/docs/vi/roadmap.md +0 -325
  601. package/docs/zh/roadmap.md +0 -322
@@ -1,12 +1,13 @@
1
1
  ---
2
2
  createdAt: 2026-06-30
3
- updatedAt: 2026-06-30
4
- title: Intlayer 자체 호스팅
5
- description: 단일 명령으로 자신만의 인프라에서 완벽한 Intlayer 인스턴스를 실행하세요. Intlayer Cloud 계정이 필요하지 않습니다.
3
+ updatedAt: 2026-09-21
4
+ title: Intlayer 셀프 호스팅
5
+ description: "자체 인프라에서 Intlayer를 실행하세요: 데스크톱 앱, 단일 올인원 Docker 컨테이너 또는 확장 가능한 Docker Compose 스택. Intlayer Cloud 계정이 필요하지 않습니다."
6
6
  keywords:
7
- - 자체 호스팅
7
+ - 셀프 호스팅
8
8
  - Docker
9
9
  - Docker Compose
10
+ - 데스크톱 앱
10
11
  - Intlayer
11
12
  - CMS
12
13
  - 설치
@@ -17,218 +18,457 @@ slugs:
17
18
  author: aymericzip
18
19
  ---
19
20
 
20
- # Intlayer 자체 호스팅
21
+ # Intlayer 셀프 호스팅
21
22
 
22
- Intlayer는 자신의 인프라에서 실행할 수 있습니다. Intlayer Cloud 계정이 필요하지 않습니다. 단일 올인원 Docker 이미지는 대시보드, API 및 필요한 로컬 데이터스토어(Redis 및 MinIO)를 번들로 제공하며, [s6-overlay](https://github.com/just-containers/s6-overlay)로 감독됩니다.
23
+ Intlayer는 자체 인프라에서 실행할 수 있으며, Intlayer Cloud 계정이 필요하지 않습니다. 동일한 설치 프로그램(`install.sh`, Windows의 경우 `install.ps1` 또는 `npx intlayer init infra`)으로 설정할 수 있는 세 가지 구성이 제공됩니다:
23
24
 
24
- Intlayer는 Intlayer Cloud 계정 없이도 자체 인프라에서 완전히 실행될 수 있습니다. 단일 명령으로 프로덕션 준비 스택을 부팅합니다:
25
+ | Setup | What it is | Pick it for |
26
+ | ------------------ | -------------------------------------------------------------------------- | ------------------------------------- |
27
+ | **데스크톱 앱** | macOS, Linux 및 Windows용 네이티브 대시보드 | 로컬 클라이언트, 호스팅할 필요 없음 |
28
+ | **올인원 Docker** | 대시보드, API, MongoDB, Redis, MinIO가 **단일 컨테이너**에 포함됨 | 테스트 및 소규모 단일 머신 설치 |
29
+ | **Docker Compose** | **서비스당 하나의 컨테이너**, 각 데이터 저장소를 관리형 서비스로 대체 가능 | 프로덕션, 확장성, 관리형 데이터베이스 |
30
+
31
+ ## Table of Contents
32
+
33
+ <TOC/>
34
+
35
+ ## 게시된 이미지 및 패키지
36
+
37
+ | Artifact | Docker Hub | GHCR mirror | Contents |
38
+ | -------------------- | ------------------------------------------------------------------------- | ------------------------------------------ | -------------------------------------------------------------------------------- |
39
+ | All-in-one container | [`intlayer/cms-all`](https://hub.docker.com/r/intlayer/cms-all) | `ghcr.io/aymericzip/intlayer/cms-all` | app + backend + MongoDB 8 + Redis + MinIO + Chromium |
40
+ | Dashboard (frontend) | [`intlayer/cms-frontend`](https://hub.docker.com/r/intlayer/cms-frontend) | `ghcr.io/aymericzip/intlayer/cms-frontend` | TanStack Start dashboard on Bun |
41
+ | API (backend) | [`intlayer/cms-backend`](https://hub.docker.com/r/intlayer/cms-backend) | `ghcr.io/aymericzip/intlayer/cms-backend` | Fastify REST API on Bun + Chromium |
42
+ | Desktop app | [GitHub releases](https://github.com/aymericzip/intlayer/releases/latest) | n/a | `.dmg` (macOS), `.deb` / `.rpm` / `.AppImage` (Linux), `.exe` / `.msi` (Windows) |
43
+
44
+ 세 가지 이미지는 모두 동일한 [`docker/selfhost/Dockerfile`](https://github.com/aymericzip/intlayer/tree/main/docker/selfhost)에서 빌드되며 매 릴리스마다 게시됩니다. Compose 스택은 공식 `mongo:8`, `redis:8-alpine`, `quay.io/minio/minio` 이미지도 가져옵니다.
45
+
46
+ ## 설정
47
+
48
+ 설치 프로그램은 원하는 설정을 묻고 사전 요구 사항을 확인한 후(Docker 설치 제안), 이미 생성된 시크릿과 함께 환경 파일을 작성하고 이미지를 가져옵니다. 자체적으로 아무것도 시작하지 않습니다: Docker 모드는 먼저 메일러가 필요하므로 실행할 명령어를 출력하고 종료됩니다. 재실행해도 안전합니다: 기존 환경 파일은 절대 덮어쓰지 않으므로 업그레이드 경로로도 사용됩니다.
49
+
50
+ <Tabs group="mode">
51
+ <Tab label="데스크톱 앱" value="desktop">
52
+
53
+ Tauri로 구축된 네이티브 애플리케이션 형태의 Intlayer 대시보드입니다. Intlayer Cloud(`https://app.intlayer.org`)에 로그인하므로 호스팅할 필요가 없습니다. 브라우저 탭 대신 로컬 클라이언트를 원할 때 최적의 선택입니다.
54
+
55
+ ### 설치
56
+
57
+ 설치 프로그램은 사용 중인 OS 및 CPU에 맞는 패키지를 다운로드한 후 열거나(macOS), 설치하거나(Linux의 경우 `dpkg` / `rpm`), 설정 마법사를 시작합니다(Windows). [릴리스 페이지](https://github.com/aymericzip/intlayer/releases/latest)에서 수동으로 다운로드할 수도 있습니다.
58
+
59
+ <Tabs group="os">
60
+ <Tab label="macOS / Linux" value="unix">
25
61
 
26
62
  ```sh
27
- curl -fsSL https://intlayer.org/install.sh | sh
63
+ curl -fsSL https://intlayer.org/install.sh | sh -s -- --mode desktop
28
64
  ```
29
65
 
30
- 설치 프로그램은 `docker-compose.yml` 및 `.env` 파일을 다운로드하고, 필요한 비밀을 자동으로 생성하며, `docker compose up -d` 명령으로 모든 컨테이너를 시작합니다.
66
+ </Tab>
67
+ <Tab label="Windows" value="windows">
31
68
 
32
- 유일한 외부 종속성은 **MongoDB**입니다: 백엔드는 사용자가 제공하는 MongoDB **Atlas** 클러스터에 연결됩니다. 그 외 모든 것은 컨테이너 내부에서 실행됩니다.
69
+ In PowerShell:
33
70
 
34
- ## 목차
71
+ ```powershell
72
+ $env:INTLAYER_MODE = "desktop"; irm https://intlayer.org/install.ps1 | iex
73
+ ```
35
74
 
36
- <TOC/>
75
+ </Tab>
76
+ <Tab label="Intlayer CLI" value="cli">
77
+
78
+ ```bash
79
+ npx intlayer init infra --mode desktop
80
+ ```
81
+
82
+ </Tab>
83
+ </Tabs>
84
+
85
+ ### 요구 사항
37
86
 
38
- ## 아키텍처
87
+ - **Node.js**: 앱은 대시보드 서버를 내장하고 있으며 머신의 `node` 바이너리로 시작합니다. 앱이 시작되지 않으면 [nodejs.org](https://nodejs.org)에서 설치하세요.
88
+
89
+ > 게시된 데스크톱 빌드는 Intlayer Cloud 백엔드와 통신합니다. 자체 호스팅 백엔드로 지정하려면 API를 가리키는 `VITE_BACKEND_URL`로 앱을 다시 빌드해야 합니다. [제한 사항](#limitations)을 참조하세요.
90
+
91
+ </Tab>
92
+ <Tab label="올인원 Docker" value="docker">
93
+
94
+ 모든 것이 [s6-overlay](https://github.com/just-containers/s6-overlay)에 의해 감독되는 단일 `intlayer/cms-all` 컨테이너 내부에서 실행되며, 모든 데이터 저장소는 단일 볼륨에 유지됩니다.
39
95
 
40
96
  ```
41
97
  ┌─────────────────────────────┐
42
- 브라우저 ──────▶ │ 앱 (TanStack Start) :3000│ ──┐
43
- └─────────────────────────────┘ │ VITE_BACKEND_URL
98
+ browser ──────▶ │ app (TanStack Start) :3000│ ──┐
99
+ (localhost) └─────────────────────────────┘ │ VITE_BACKEND_URL (baked at build)
44
100
  ┌─────────────────────────────┐ │
45
- │ 백엔드 (Fastify/Bun) :3100│ ◀─┘
101
+ │ backend (Fastify/Bun) :3100│ ◀─┘
46
102
  └──────────────┬──────────────┘
47
- ┌──────────┬─────────┼──────────┬───────────┐
48
- ▼ ▼ ▼ ▼ ▼
49
- mongo:27017 redis:6379 minio:9000 mailpit:1025 Chromium
50
- (1-노드 RS) (S3 API) (SMTP) (이미지 내)
51
- minio:9001 mailpit:8025
52
- (콘솔) (웹 UI)
103
+ ┌──────────┬─────────┼──────────────┐
104
+ ▼ ▼ ▼ ▼
105
+ mongo:27017 redis:6379 minio:9000 Chromium
106
+ /data/mongo /data/redis /data/minio (in-image)
107
+ (1-node RS) minio:9001
53
108
  ```
54
109
 
55
- Chromium (Puppeteer 스크린샷 생성에 사용됨)은 백엔드 이미지 내부에 번들로 제공되므로 별도의 컨테이너가 필요하지 않습니다.
110
+ | 서비스 | 호스트 포트 | 용도 |
111
+ | ----------- | -------------------------- | ------------------------------------------ |
112
+ | **app** | `3000` | 대시보드 (CMS UI) |
113
+ | **backend** | `3100` | REST API (`/health` 엔드포인트) |
114
+ | **mongo** | 내부 | MongoDB 8, 단일 노드 복제본 세트 `rs0` |
115
+ | **redis** | 내부 | 작업 큐 (BullMQ) 및 캐싱 |
116
+ | **minio** | `9000` (S3), `9001` (콘솔) | 아바타 및 스크린샷용 S3 호환 객체 스토리지 |
56
117
 
57
- ## 사전 요구 사항
118
+ 부팅 순서는 s6 종속성(`mongod` → replica-set 초기화, `minio` → 버킷 생성, 그다음 `backend`, 그다음 `app`)에 의해 제어되며, 서비스 종료 시 자동으로 재시작하므로 첫 번째 부팅이 스스로 복구됩니다.
58
119
 
59
- - **Docker** ≥ 24 및 **Docker Compose** ≥ v2. 둘 중 하나라도 없으면 설치 프로그램이 설치 링크를 출력하고 종료됩니다.
60
- - 호스트에서 포트 `3000`, `3100`, `8025`, `9000`, `9001`이 사용 가능해야 합니다.
61
- - Linux 또는 macOS 호스트 (또는 Windows의 WSL2).
120
+ ### 사전 요구 사항
62
121
 
63
- 나머지 모든 것 — Bun, Redis, MinIO, Chromium — 은 이미지 내에 포함되어 있습니다.
122
+ - **Docker** ≥ 24: 설치 프로그램에서 설치를 제안합니다(Linux는 [get.docker.com](https://get.docker.com), macOS는 Homebrew). Windows에서는 먼저 [Docker Desktop](https://docs.docker.com/desktop/setup/install/windows-install/)(WSL 2 백엔드)을 설치하세요.
123
+ - 호스트에서 `3000`, `3100`, `9000`, `9001` 포트 사용 가능. MinIO `9000`은 브라우저가 `S3_PUBLIC_URL`에서 에셋을 직접 로드하므로 브라우저에서 연결 가능해야 합니다.
124
+ - 메일러: [Resend](https://resend.com) API 키 또는 SMTP 릴레이.
64
125
 
65
- ## 빠른 시작
126
+ ### 1. 설치
66
127
 
67
- ### 1. 설치 프로그램 실행
128
+ `BETTER_AUTH_SECRET` 및 `S3_SECRET_ACCESS_KEY`가 생성된 `./intlayer.env`를 작성하고 `intlayer/cms-all:latest`를 가져옵니다.
129
+
130
+ <Tabs group="os">
131
+ <Tab label="macOS / Linux" value="unix">
68
132
 
69
133
  ```sh
70
- curl -fsSL https://intlayer.org/install.sh | sh
134
+ curl -fsSL https://intlayer.org/install.sh | sh -s -- --mode docker
71
135
  ```
72
136
 
73
- Docker가 설치되어 있고 실행 중인지 확인하고, `BETTER_AUTH_SECRET`과 `S3_SECRET_ACCESS_KEY`가 이미 생성된 상태로 `./intlayer.env`를 작성하며, 이미지를 가져옵니다. 컨테이너를 시작하지는 않습니다 — 백엔드는 데이터베이스 자격 증명 없이는 부팅할 수 없습니다.
137
+ </Tab>
138
+ <Tab label="Windows" value="windows">
139
+
140
+ In PowerShell:
141
+
142
+ ```powershell
143
+ $env:INTLAYER_MODE = "docker"; irm https://intlayer.org/install.ps1 | iex
144
+ ```
145
+
146
+ </Tab>
147
+ <Tab label="Intlayer CLI" value="cli">
148
+
149
+ CLI가 설치 프로그램을 실행하고 다른 탭에 표시된 `docker run …` 명령을 출력합니다. 메일러가 구성되면 터미널에 복사하여 실행하세요.
74
150
 
75
- 설치 프로그램을 다시 실행해도 안전합니다: 기존 `intlayer.env`는 절대 덮어씌워지지 않으므로, 업그레이드 경로로도 작동합니다.
151
+ </Tab>
152
+ </Tabs>
76
153
 
77
- ### 2. 자격 증명 입력
154
+ ### 2. 메일러 구성
78
155
 
79
- `intlayer.env`를 열고 `TODO`로 표시된 값들을 완성하세요:
156
+ `intlayer.env`를 열고 Resend **또는** SMTP를 구성합니다(자세한 내용은 [글로벌 메일러](#global-mailer) 참조):
80
157
 
81
158
  ```sh fileName="intlayer.env"
82
- DB_ID=<atlas-user>
83
- DB_MDP=<atlas-password>
84
- DB_CLUSTER=<cluster>.xxxxx.mongodb.net
159
+ # Option A: Resend
85
160
  RESEND_API_KEY=<your-resend-key>
86
- ```
87
161
 
88
- 이 파일에는 선택적 기능들을 위한 주석 처리된 블록들도 포함되어 있습니다 — [SMTP mailer](#global-mailer), `OPENAI_API_KEY`, OAuth 제공자들. 필요한 것들의 주석을 제거하세요.
162
+ # Option B: SMTP (takes over from Resend as soon as MAIL_SMTP_HOST is set)
163
+ MAIL_SMTP_HOST=smtp.example.com
164
+ MAIL_SMTP_PORT=587
165
+ MAIL_SMTP_USER=<user>
166
+ MAIL_SMTP_PASSWORD=<password>
167
+ MAIL_FROM=Intlayer <no-reply@example.com>
168
+ ```
89
169
 
90
- > 이 파일은 `docker run --env-file`로 읽혀지며, 따옴표를 제거하지 않고 `=` 이후의 모든 것을 값으로 처리합니다. 따옴표 없는 값을 작성하고, 주석은 별도의 줄에 유지하세요.
170
+ ### 3. 시작
91
171
 
92
- ### 3. 컨테이너 시작
172
+ 설치 프로그램이 출력하는 명령어입니다:
93
173
 
94
- 설치 프로그램이 완료될 때 인쇄하는 명령어입니다:
174
+ <Tabs group="os">
175
+ <Tab label="macOS / Linux" value="unix">
95
176
 
96
177
  ```sh
97
178
  docker run -d --name intlayer \
98
179
  --restart unless-stopped \
99
- -p 3000:3000 \
100
- -p 3100:3100 \
101
- -p 9000:9000 \
102
- -p 9001:9001 \
180
+ -p 3000:3000 -p 3100:3100 -p 9000:9000 -p 9001:9001 \
103
181
  -v intlayer-data:/data \
104
182
  --env-file ./intlayer.env \
105
- ghcr.io/aymericzip/intlayer-selfhost:latest
183
+ intlayer/cms-all:latest
106
184
  ```
107
185
 
108
- 그러면 **http://localhost:3000**을 엽니다. 첫 부팅 시 데이터스토어를 초기화하므로 1분 정도 기다려주세요.
186
+ </Tab>
187
+ <Tab label="Windows" value="windows">
109
188
 
110
- > 대시보드는 `localhost`에서 제공됩니다. [제한 사항](#limitations)을 참조하세요 — 게시된 이미지는 사용자 정의 도메인을 지원하지 않습니다.
189
+ ```powershell
190
+ docker run -d --name intlayer `
191
+ --restart unless-stopped `
192
+ -p 3000:3000 -p 3100:3100 -p 9000:9000 -p 9001:9001 `
193
+ -v intlayer-data:/data `
194
+ --env-file ./intlayer.env `
195
+ intlayer/cms-all:latest
196
+ ```
111
197
 
112
- ### 설치 프로그램 설정
198
+ </Tab>
199
+ <Tab label="Intlayer CLI" value="cli">
200
+
201
+ CLI가 설치 프로그램을 실행하고 다른 탭에 표시된 `docker run …` 명령을 출력합니다. 메일러가 구성되면 터미널에 복사하여 실행하세요.
202
+
203
+ </Tab>
204
+ </Tabs>
205
+
206
+ **http://localhost:3000**을 열고 [초기 설정](#first-run-setup)을 따릅니다. 첫 번째 부팅 시 복제본 세트와 버킷이 초기화되므로 1분 정도 기다려 주세요.
207
+
208
+ ### 백업 및 업그레이드
209
+
210
+ 모든 상태는 `intlayer-data` 볼륨(`/data/mongo`, `/data/redis`, `/data/minio`)에 저장됩니다.
211
+
212
+ ```sh
213
+ # Backup (stop the container first so MongoDB's files are consistent)
214
+ docker stop intlayer
215
+ docker run --rm -v intlayer-data:/data -v "$(pwd)":/backup busybox tar czf /backup/intlayer-data.tar.gz /data
216
+ docker start intlayer
217
+
218
+ # Restore
219
+ docker run --rm -v intlayer-data:/data -v "$(pwd)":/backup busybox tar xzf /backup/intlayer-data.tar.gz -C /
220
+ ```
221
+
222
+ 업그레이드하려면 설치 프로그램을 다시 실행하고(최신 이미지를 가져오고 `intlayer.env`를 유지함) `docker rm -f intlayer`를 실행한 후 시작 명령을 다시 실행하세요. 번들된 항목 대신 관리형 MongoDB를 사용하려면 `intlayer.env`에 `MONGODB_URI`를 설정하세요.
223
+
224
+ </Tab>
225
+ <Tab label="Docker Compose" value="compose">
226
+
227
+ 비공개 Compose 네트워크에서 서비스당 하나의 컨테이너를 실행합니다. 대시보드와 API는 게시된 `intlayer/cms-frontend` 및 `intlayer/cms-backend` 이미지를 사용하고, 데이터 저장소는 공식 `mongo`, `redis`, `minio` 이미지를 사용합니다.
228
+
229
+ ```
230
+ ┌───────────────────┐
231
+ browser ──────▶ │ app :3000 │ ── SSR ──▶ http://backend:3100
232
+ (localhost) └───────────────────┘
233
+ ┌───────────────────┐
234
+ browser ──────▶ │ backend :3100 │
235
+ (localhost) └─────────┬─────────┘
236
+ ┌───────────────┼───────────────┐
237
+ ▼ ▼ ▼
238
+ mongo:27017 redis:6379 minio:9000 ◀── browser (assets)
239
+ (1-node RS) minio:9001
240
+ ```
241
+
242
+ | 서비스 | 이미지 | 역할 |
243
+ | ------------ | ----------------------- | -------------------------------------------------------------- |
244
+ | `app` | `intlayer/cms-frontend` | `:3000`의 대시보드. 백엔드가 정상 상태가 될 때까지 대기 |
245
+ | `backend` | `intlayer/cms-backend` | Chromium이 포함된 `:3100`의 API. Mongo, Redis, MinIO 버킷 대기 |
246
+ | `mongo` | `mongo:8` | 자체 헬스체크로 시작되는 단일 노드 복제본 세트 `rs0` |
247
+ | `redis` | `redis:8-alpine` | 큐 및 캐싱, 추가 전용(append-only) 지속성 |
248
+ | `minio` | `quay.io/minio/minio` | `:9000`의 S3 스토리지, `:9001`의 콘솔 |
249
+ | `minio-init` | `quay.io/minio/mc` | 단발성 실행: 버킷 및 익명 다운로드 정책 생성 |
250
+
251
+ 데이터는 `intlayer_mongo-data`, `intlayer_redis-data`, `intlayer_minio-data` 볼륨에 유지됩니다. 서비스 연결(`MONGODB_URI`, `REDIS_URL`, `S3_ENDPOINT`, 서버 측 렌더링에 사용되는 내부 백엔드 URL)은 compose 파일에 고정되어 있으며 비밀 및 선택적 통합만 포함하는 `.env`보다 우선합니다.
252
+
253
+ ### 사전 요구 사항
254
+
255
+ - **Docker** ≥ 24(Compose 플러그인 포함): 설치 프로그램에서 Linux 및 macOS 설치를 제안합니다. Windows에서는 먼저 [Docker Desktop](https://docs.docker.com/desktop/setup/install/windows-install/)(WSL 2 백엔드)을 설치하세요.
256
+ - 호스트에서 `3000`, `3100`, `9000`, `9001` 포트 사용 가능.
257
+ - 메일러: [Resend](https://resend.com) API 키 또는 SMTP 릴레이.
258
+
259
+ ### 1. 설치
260
+
261
+ `docker-compose.yml` 및 생성된 비밀이 포함된 `.env`를 `./intlayer/`에 작성하고 이미지를 가져옵니다.
262
+
263
+ <Tabs group="os">
264
+ <Tab label="macOS / Linux" value="unix">
265
+
266
+ ```sh
267
+ curl -fsSL https://intlayer.org/install.sh | sh -s -- --mode compose
268
+ ```
269
+
270
+ Or by hand:
271
+
272
+ ```sh
273
+ mkdir intlayer && cd intlayer
274
+ curl -fsSLO https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/docker-compose.yml
275
+ curl -fsSL https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/.env.template -o .env
276
+ # fill in BETTER_AUTH_SECRET and S3_SECRET_ACCESS_KEY (openssl rand -hex 32)
277
+ ```
278
+
279
+ </Tab>
280
+ <Tab label="Windows" value="windows">
281
+
282
+ In PowerShell:
283
+
284
+ ```powershell
285
+ $env:INTLAYER_MODE = "compose"; irm https://intlayer.org/install.ps1 | iex
286
+ ```
287
+
288
+ Or by hand:
289
+
290
+ ```powershell
291
+ mkdir intlayer; cd intlayer
292
+ irm https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/docker-compose.yml -OutFile docker-compose.yml
293
+ irm https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/.env.template -OutFile .env
294
+ # fill in BETTER_AUTH_SECRET and S3_SECRET_ACCESS_KEY
295
+ ```
296
+
297
+ </Tab>
298
+ <Tab label="Intlayer CLI" value="cli">
299
+
300
+ ```bash
301
+ npx intlayer init infra --mode compose
302
+ ```
303
+
304
+ </Tab>
305
+ </Tabs>
306
+
307
+ ### 2. 메일러 구성
113
308
 
114
- 설치 프로그램은 몇 가지 환경 변수를 읽습니다. `sh`로 파이프되기 때문에 `curl`이 아닌 쉘에 전달하세요:
309
+ 올인원 설정과 마찬가지로 `intlayer/.env`에 Resend **또는** SMTP를 채웁니다([글로벌 메일러](#global-mailer) 참조).
310
+
311
+ ### 3. 시작
115
312
 
116
313
  ```sh
117
- curl -fsSL https://intlayer.org/install.sh | INTLAYER_ENV_FILE=./config/intlayer.env sh
314
+ cd intlayer && docker compose up -d
315
+ ```
316
+
317
+ **http://localhost:3000**을 열고 [초기 설정](#first-run-setup)을 따릅니다.
318
+
319
+ ### 관리형 데이터 저장소
320
+
321
+ 교체하려는 서비스를 compose 파일(및 `backend`의 `depends_on` 항목)에서 삭제한 다음 일치하는 변수를 재정의합니다:
322
+
323
+ ```yaml fileName="docker-compose.yml"
324
+ services:
325
+ backend:
326
+ environment:
327
+ MONGODB_URI: mongodb+srv://user:password@cluster0.xxxxx.mongodb.net/intlayer
328
+ REDIS_URL: rediss://default:password@redis.example.com:6380
329
+ S3_ENDPOINT: https://s3.eu-west-1.amazonaws.com
330
+ S3_PUBLIC_URL: https://intlayer-assets.s3.eu-west-1.amazonaws.com
118
331
  ```
119
332
 
120
- | Variable | Default | Description |
121
- | ------------------------- | --------------------------------------------- | ------------------------------ |
122
- | `INTLAYER_IMAGE` | `ghcr.io/aymericzip/intlayer-selfhost:latest` | 풀할 이미지 |
123
- | `INTLAYER_ENV_FILE` | `./intlayer.env` | env 파일을 작성할 위치 |
124
- | `INTLAYER_CONTAINER_NAME` | `intlayer` | 컨테이너 이름 |
125
- | `INTLAYER_DATA_VOLUME` | `intlayer-data` | `/data`에 마운트된 명명된 볼륨 |
126
- | `INTLAYER_APP_PORT` | `3000` | 대시보드용 호스트 포트 |
127
- | `INTLAYER_API_PORT` | `3100` | API용 호스트 포트 |
128
- | `INTLAYER_S3_PORT` | `9000` | MinIO S3 API용 호스트 포트 |
129
- | `INTLAYER_CONSOLE_PORT` | `9001` | MinIO 콘솔용 호스트 포트 |
333
+ `S3_ACCESS_KEY_ID` / `S3_SECRET_ACCESS_KEY` / `S3_BUCKET_NAME`은 모든 S3 호환 공급자에 대해 동일한 의미를 유지합니다.
130
334
 
131
- > 네 개의 포트 변수는 `docker run` 명령에 인쇄된 매핑의 **호스트** 측만 변경합니다. 발행된 이미지는 빌드 시간에 `http://localhost:3000`, `http://localhost:3100` 및 `http://localhost:9000`이 대시보드 번들에 컴파일되어 있으므로, 이들을 다시 매핑하면 브라우저가 이전 포트를 가리키게 됩니다. 자신의 이미지를 빌드하지 않는 한 기본값을 유지하세요 — [제한 사항](#limitations)을 참조하세요.
335
+ ### 확장성
132
336
 
133
- ## 빠른 시작
337
+ `app`과 `backend`는 무상태(stateless)입니다. 로드 밸런서 뒤에서 고정 호스트 포트 매핑을 제거하고 프록시가 이름으로 서비스를 처리하도록 하면 `docker compose up -d --scale backend=3`이 작동합니다. 백그라운드 작업은 Redis (BullMQ)를 통해 조정되므로 여러 백엔드 복제본이 큐를 안전하게 공유합니다.
134
338
 
135
- 설치 프로그램의 기능:
339
+ ### 소스에서 빌드
136
340
 
137
- 1. `docker` 및 `docker compose`가 설치되어 있는지 확인합니다.
138
- 2. `docker-compose.yml` 및 `.env.example`을 `./intlayer/` 디렉토리에 다운로드합니다.
139
- 3. `.env` 파일이 없으면 예제 파일을 복사하고 `openssl rand`를 통해 `BETTER_AUTH_SECRET`, `S3_ACCESS_KEY_ID`, `S3_SECRET_ACCESS_KEY`에 대한 임의의 비밀을 생성합니다.
140
- 4. `docker compose pull` + `docker compose up -d`를 실행합니다.
141
- 5. 다음 URL을 출력합니다: 대시보드 `:3000`, API `:3100`, 이메일 UI `:8025`, MinIO 콘솔 `:9001`.
341
+ 저장소 클론에서 재정의 설정을 통해 두 Intlayer 서비스를 `image:`에서 `build:`로 전환합니다:
142
342
 
143
- 스택이 실행되면 **http://localhost:3000**을 열고 첫 번째 계정을 생성하세요.
343
+ ```sh
344
+ cd docker/selfhost
345
+ docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build
346
+ ```
144
347
 
145
- ## 서비스
348
+ 사용자 지정 도메인용 이미지를 생성하는 방법도 이와 같습니다: `VITE_*` 값을 빌드 인수로 전달합니다([제한 사항](#limitations) 참조).
146
349
 
147
- | 서비스 | 이미지 | 호스트 포트 | 목적 |
148
- | ----------- | ---------------------------------- | ----------------------------- | ----------------------------------------------- |
149
- | **앱** | `apps/app/Dockerfile`에서 빌드 | `3000` | TanStack Start 대시보드 (CMS UI) |
150
- | **백엔드** | `apps/backend/Dockerfile`에서 빌드 | `3100` | Fastify REST API (`/health` 엔드포인트) |
151
- | **mongo** | `mongo:7` | 내부 | 단일 노드 복제본 세트 (`rs0`) |
152
- | **redis** | `redis:7-alpine` | 내부 | 작업 큐 (BullMQ) 및 캐싱 (ioredis) |
153
- | **minio** | `minio/minio` | `9000` (S3), `9001` (콘솔) | 아바타 및 스크린샷을 위한 S3 호환 객체 스토리지 |
154
- | **mailpit** | `axllent/mailpit` | `1025` (SMTP), `8025` (웹 UI) | 로컬 트랜잭션 이메일 싱크 |
350
+ ### 백업 및 업그레이드
155
351
 
156
- > MinIO 포트 `9000`은 브라우저에서 접근할 수 있어야 합니다. 업로드된 자산(아바타, 스크린샷)은 `S3_PUBLIC_URL=http://localhost:9000/intlayer`에서 직접 로드되기 때문입니다.
352
+ ```sh
353
+ # Backup one volume (repeat for intlayer_redis-data and intlayer_minio-data)
354
+ docker compose stop
355
+ docker run --rm -v intlayer_mongo-data:/data -v "$(pwd)":/backup busybox tar czf /backup/mongo-data.tar.gz /data
356
+ docker compose start
357
+
358
+ # Upgrade, volumes are kept
359
+ docker compose pull && docker compose up -d
360
+ ```
361
+
362
+ </Tab>
363
+ </Tabs>
364
+
365
+ ### 설치 프로그램 설정
366
+
367
+ `--mode`(또는 `INTLAYER_MODE`)가 없으면 설치 프로그램에 메뉴가 표시됩니다: `desktop`, `docker`(올인원) 또는 `compose`. 또한 몇 가지 환경 변수를 읽습니다. 셸로 파이프되므로 `curl`이 아닌 셸에 전달하세요:
368
+
369
+ ```sh
370
+ curl -fsSL https://intlayer.org/install.sh | INTLAYER_COMPOSE_DIR=./cms sh -s -- --mode compose
371
+ ```
372
+
373
+ ```powershell
374
+ $env:INTLAYER_MODE = "compose"; $env:INTLAYER_COMPOSE_DIR = ".\cms"; irm https://intlayer.org/install.ps1 | iex
375
+ ```
376
+
377
+ | Variable | Default | Applies to | Description |
378
+ | ------------------------- | ------------------------- | ---------- | ---------------------------------------------------------- |
379
+ | `INTLAYER_MODE` | _(asked)_ | all | `desktop`, `docker` or `compose`, same as `--mode` |
380
+ | `INTLAYER_DOWNLOAD_DIR` | `~/Downloads` | desktop | Where the app installer is saved |
381
+ | `INTLAYER_IMAGE` | `intlayer/cms-all:latest` | docker | All-in-one image to pull |
382
+ | `INTLAYER_ENV_FILE` | `./intlayer.env` | docker | Where to write the environment file |
383
+ | `INTLAYER_CONTAINER_NAME` | `intlayer` | docker | Container name |
384
+ | `INTLAYER_DATA_VOLUME` | `intlayer-data` | docker | Named volume mounted at `/data` |
385
+ | `INTLAYER_APP_PORT` | `3000` | docker | Host port for the dashboard |
386
+ | `INTLAYER_API_PORT` | `3100` | docker | Host port for the API |
387
+ | `INTLAYER_S3_PORT` | `9000` | docker | Host port for the MinIO S3 API |
388
+ | `INTLAYER_CONSOLE_PORT` | `9001` | docker | Host port for the MinIO console |
389
+ | `INTLAYER_COMPOSE_DIR` | `./intlayer` | compose | Where `docker-compose.yml` and `.env` are written |
390
+ | `INTLAYER_SELFHOST_REF` | `main` | both | Git ref the compose file and env template are fetched from |
391
+
392
+ > 포트 변수는 매핑의 **호스트** 측만 변경합니다. 게시된 이미지에는 `http://localhost:3000`, `http://localhost:3100`, `http://localhost:9000`이 대시보드 번들에 컴파일되어 있으므로 자체 이미지를 빌드하지 않는 한 기본값을 유지하세요. [제한 사항](#limitations)을 참조하세요.
393
+
394
+ ## 초기 설정
395
+
396
+ 새 인스턴스(빈 데이터베이스)에서 대시보드를 열면 **`/init`** 페이지로 리디렉션됩니다:
397
+
398
+ 1. 첫 번째 계정을 만듭니다. 사용자 컬렉션이 비어 있으므로 이 계정은 자동으로 **최고 관리자(super admin)** 로 승격됩니다.
399
+ 2. Resend 또는 SMTP 릴레이를 통해 인증 이메일이 전송됩니다. 이메일 인증은 **필수**이므로 시작하기 전에 메일러를 구성해야 합니다.
400
+ 3. 이메일의 링크를 클릭한 다음 로그인합니다.
401
+
402
+ 관리자가 존재하면 `/init`은 표준 로그인 페이지로 리디렉션됩니다.
157
403
 
158
404
  ## 환경 변수
159
405
 
160
- ### 필수
161
-
162
- | Variable | Example | Description |
163
- | ---------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
164
- | `DB_ID` | `intlayer` | MongoDB Atlas user |
165
- | `DB_MDP` | _(your password)_ | MongoDB Atlas password |
166
- | `DB_CLUSTER` | `cluster0.xxxxx.mongodb.net` | MongoDB Atlas cluster host (used in the `mongodb+srv://` URI) |
167
- | `BETTER_AUTH_SECRET` | _(generated)_ | 32-byte secret for session signing |
168
- | `S3_SECRET_ACCESS_KEY` | _(generated)_ | Secret for the bundled MinIO |
169
- | `RESEND_API_KEY` | _(your key)_ | Transactional email via Resend. Required for first-run setup unless you configure a global SMTP mailer (see [Global mailer](#global-mailer)) |
170
-
171
- ### 필수 (자동 생성 또는 프롬프트)
172
-
173
- | 변수 | 예시 | 설명 |
174
- | ---------------------- | ----------------------------------------------- | -------------------------------------- |
175
- | `NODE_ENV` | `production` | 런타임 환경 |
176
- | `PORT` | `3100` | 백엔드 리스닝 포트 |
177
- | `BACKEND_URL` | `http://localhost:3100` | 백엔드 API의 공개 URL |
178
- | `APP_URL` | `http://localhost:3000` | 대시보드의 공개 URL |
179
- | `DOMAIN` | `localhost` | 쿠키 도메인 |
180
- | `MONGODB_URI` | `mongodb://mongo:27017/intlayer?replicaSet=rs0` | 전체 MongoDB 연결 URI |
181
- | `REDIS_URL` | `redis://redis:6379` | Redis 연결 URL |
182
- | `BETTER_AUTH_SECRET` | _(생성됨)_ | 세션 서명을 위한 32바이트 비밀 키 |
183
- | `MAIL_PROVIDER` | `smtp` | 메일 전송 방식: `smtp` 또는 `resend` |
184
- | `MAIL_SMTP_HOST` | `mailpit` | SMTP 호스트명 (Mailpit 컨테이너 이름) |
185
- | `MAIL_SMTP_PORT` | `1025` | SMTP 포트 |
186
- | `MAIL_FROM` | `Intlayer <no-reply@localhost>` | 발신자 주소 |
187
- | `S3_ENDPOINT` | `http://minio:9000` | S3 호환 엔드포인트 |
188
- | `S3_PUBLIC_URL` | `http://localhost:9000/intlayer` | 브라우저 자산 로딩을 위한 공개 URL |
189
- | `S3_BUCKET_NAME` | `intlayer` | 버킷 이름 |
190
- | `S3_ACCESS_KEY_ID` | _(생성됨)_ | MinIO 접근 키 |
191
- | `S3_SECRET_ACCESS_KEY` | _(생성됨)_ | MinIO 비밀 키 |
192
- | `VITE_BACKEND_URL` | `http://localhost:3100` | 빌드 시 대시보드에 내장되는 백엔드 URL |
193
- | `VITE_DOMAIN` | `localhost` | 빌드 시 대시보드에 내장되는 도메인 |
194
-
195
- ### 선택 사항 (누락 시 기능이 점진적으로 저하됨)
196
-
197
- | 변수 | 기능 |
198
- | -------------------------------------------------------- | ------------------------------------------------------ |
199
- | `OPENAI_API_KEY` | AI 기반 번역 및 콘텐츠 감사 |
200
- | `STRIPE_SECRET_KEY`, `STRIPE_WEBHOOK_SECRET`, `STRIPE_*` | 결제 및 구독 관리 |
201
- | `RESEND_API_KEY` | Resend를 통한 트랜잭션 이메일 (설정 시 Mailpit 재정의) |
202
- | `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` | GitHub OAuth 로그인 |
203
- | `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` | Google OAuth 로그인 |
204
- | `GITLAB_CLIENT_ID`, `GITLAB_CLIENT_SECRET` | GitLab OAuth 로그인 |
205
- | `MICROSOFT_CLIENT_ID`, `MICROSOFT_CLIENT_SECRET` | Microsoft OAuth 로그인 |
206
- | `LINKEDIN_CLIENT_ID`, `LINKEDIN_CLIENT_SECRET` | LinkedIn OAuth 로그인 |
207
- | `ATLASSIAN_CLIENT_ID`, `ATLASSIAN_CLIENT_SECRET` | Atlassian OAuth 로그인 |
208
-
209
- ### Global mailer
210
-
211
- 기본적으로 모든 트랜잭션 이메일은 `RESEND_API_KEY`를 사용하여 Resend를 통해 전송됩니다. Self-hosted 배포는 대신 환경 변수로 구성된 global mailer를 통해 비조직 이메일(예: 비밀번호 재설정 및 magic link)을 포함한 **모든** 이메일을 라우팅할 수 있습니다.
212
-
213
- `MAIL_PROVIDER`를 설정하여 활성화합니다. 설정하지 않으면 기본 Resend mailer가 사용됩니다.
214
-
215
- | Variable | Example | Description |
216
- | -------------------- | ------------------------------ | ------------------------------------------------------------------------- |
217
- | `MAIL_PROVIDER` | `smtp` | Global transport: `smtp` 또는 `resend`. 기본값을 사용하려면 설정하지 않음 |
218
- | `MAIL_FROM` | `Intlayer <no-reply@acme.com>` | Sender header. 단순 주소 또는 `Name <email>` 형식 허용 |
219
- | `MAIL_SMTP_HOST` | `smtp.acme.com` | SMTP host (`MAIL_PROVIDER=smtp`일 때 필수) |
220
- | `MAIL_SMTP_PORT` | `587` | SMTP port (기본값: `587`) |
221
- | `MAIL_SMTP_SECURE` | `false` | Implicit TLS. port `465`에서는 `true`로 설정 |
222
- | `MAIL_SMTP_USER` | _(your user)_ | SMTP username (선택사항; unauthenticated relay의 경우 생략) |
223
- | `MAIL_SMTP_PASSWORD` | _(your password)_ | SMTP password |
224
-
225
- > Precedence: 조직의 자체 mailer (**Organization** dashboard에서 구성)가 global mailer보다 우선하며, global mailer는 기본 Resend key보다 우선합니다.
226
-
227
- ## Intlayer 프로젝트 연결하기
228
-
229
- 스택이 실행되면 프로젝트가 `intlayer.org` 대신 자체 호스팅된 백엔드 및 대시보드를 가리키도록 설정하세요.
230
-
231
- ### 프로젝트 설정
406
+ 두 Docker 모드 모두 [`docker/selfhost/.env.template`](https://github.com/aymericzip/intlayer/blob/main/docker/selfhost/.env.template)에서 생성된 동일한 파일(컨테이너의 경우 `intlayer.env`, Compose의 경우 `.env`)을 읽습니다.
407
+
408
+ ### 필수 항목
409
+
410
+ | Variable | Example | Description |
411
+ | ---------------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
412
+ | `BETTER_AUTH_SECRET` | _(generated)_ | 32-byte secret for session signing |
413
+ | `S3_SECRET_ACCESS_KEY` | _(generated)_ | Secret for the bundled MinIO |
414
+ | `RESEND_API_KEY` | _(your key)_ | Transactional email via Resend. Required for first-run setup unless an SMTP relay is configured instead (see [Global mailer](#global-mailer)) |
415
+
416
+ ### 배포에 의해 고정됨
417
+
418
+ These are set by the image (all-in-one) or by the compose file, and only need overriding for a non-standard topology.
419
+
420
+ | Variable | All-in-one | Docker Compose | Description |
421
+ | ------------------ | --------------------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------- |
422
+ | `PORT` | `3100` | `3100` | Backend listening port |
423
+ | `APP_URL` | `http://localhost:3000` | `http://localhost:3000` | Public URL of the dashboard |
424
+ | `BACKEND_URL` | `http://localhost:3100` | `http://localhost:3100` | Public URL of the backend API |
425
+ | `DOMAIN` | `localhost` | `localhost` | Cookie domain |
426
+ | `SELF_HOSTED` | `true` | `true` | Disables the cloud-only API endpoints (billing, subscriptions, marketplace) |
427
+ | `MONGODB_URI` | `mongodb://127.0.0.1:27017/intlayer?replicaSet=rs0` | `mongodb://mongo:27017/…` | MongoDB connection string, any `mongodb://` or `mongodb+srv://` cluster works |
428
+ | `REDIS_URL` | `redis://127.0.0.1:6379` | `redis://redis:6379` | Redis |
429
+ | `S3_ENDPOINT` | `http://127.0.0.1:9000` | `http://minio:9000` | MinIO (server-to-server) |
430
+ | `S3_PUBLIC_URL` | `http://localhost:9000/intlayer` | `http://localhost:9000/intlayer` | Public URL for browser asset loading |
431
+ | `S3_BUCKET_NAME` | `intlayer` | `intlayer` | Bucket name |
432
+ | `S3_ACCESS_KEY_ID` | `intlayer` | `intlayer` | MinIO access key |
433
+
434
+ Compose `app` 서비스는 추가로 `INTLAYER_BACKEND_INTERNAL_URL=http://backend:3100`을 받습니다: 브라우저는 `localhost:3100`에서 API에 연결하지만 서버 측 렌더링은 Compose 네트워크 내부에서 실행되므로 서비스 이름을 사용해야 합니다.
435
+
436
+ ### 선택 항목 (누락 시 기능이 점진적으로 저하됨)
437
+
438
+ | Variable | Feature |
439
+ | ------------------------------------------------ | ----------------------------------------- |
440
+ | `OPENAI_API_KEY` | AI-assisted translation and content audit |
441
+ | `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` | GitHub OAuth login |
442
+ | `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` | Google OAuth login |
443
+ | `GITLAB_CLIENT_ID`, `GITLAB_CLIENT_SECRET` | GitLab OAuth login |
444
+ | `MICROSOFT_CLIENT_ID`, `MICROSOFT_CLIENT_SECRET` | Microsoft OAuth login |
445
+
446
+ ### 글로벌 메일러
447
+
448
+ 비조직 이메일(비밀번호 재설정 및 매직 링크)을 포함한 모든 트랜잭션 이메일은 두 가지 글로벌 전송 방식 중 하나를 거칩니다:
449
+
450
+ - **Resend**: `RESEND_API_KEY` 사용.
451
+ - **SMTP**: `MAIL_SMTP_*` 변수 사용. `MAIL_SMTP_HOST`가 설정되면 즉시 SMTP가 사용되며 `RESEND_API_KEY`는 무시됩니다.
452
+
453
+ `MAIL_PROVIDER`는 둘 다 구성된 경우 하나의 전송 방식을 강제하는 데만 필요합니다(예: SMTP 호스트가 있는 상태에서 Resend를 유지하기 위해 `MAIL_PROVIDER=resend`).
454
+
455
+ | Variable | Example | Description |
456
+ | -------------------- | ------------------------------ | ---------------------------------------------------------------------------- |
457
+ | `MAIL_FROM` | `Intlayer <no-reply@acme.com>` | Sender header for either transport. Accepts a bare address or `Name <email>` |
458
+ | `MAIL_SMTP_HOST` | `smtp.acme.com` | SMTP host. Setting it selects the SMTP transport |
459
+ | `MAIL_SMTP_PORT` | `587` | SMTP port (defaults to `587`) |
460
+ | `MAIL_SMTP_SECURE` | `false` | Implicit TLS. Set `true` for port `465` |
461
+ | `MAIL_SMTP_USER` | _(your user)_ | SMTP username (optional; omit for unauthenticated relays) |
462
+ | `MAIL_SMTP_PASSWORD` | _(your password)_ | SMTP password |
463
+ | `MAIL_PROVIDER` | `resend` | Optional override: `smtp` or `resend`. Leave unset to auto-select |
464
+
465
+ > 우선순위: 조직 자체 메일러(**조직** 대시보드에서 구성)가 글로벌 메일러보다 우선하며, 글로벌 메일러는 기본 Resend 키보다 우선합니다.
466
+
467
+ ## Intlayer 프로젝트 연결
468
+
469
+ 스택이 실행되면 `intlayer.org` 대신 자체 호스팅된 백엔드 및 대시보드를 가리키도록 프로젝트를 설정합니다.
470
+
471
+ ### 프로젝트 구성
232
472
 
233
473
  ```typescript fileName="intlayer.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
234
474
  import type { IntlayerConfig } from "intlayer";
@@ -239,23 +479,23 @@ const config: IntlayerConfig = {
239
479
  clientSecret: process.env.INTLAYER_CLIENT_SECRET,
240
480
 
241
481
  /**
242
- * 자체 호스팅 CMS 대시보드의 URL.
243
- * 기본값: https://app.intlayer.org
482
+ * URL of the self-hosted CMS dashboard.
483
+ * Default: https://app.intlayer.org
244
484
  */
245
- cmsURL: process.env.INTLAYER_CMS_URL, // 예: http://localhost:3000
485
+ cmsURL: process.env.INTLAYER_CMS_URL, // e.g. http://localhost:3000
246
486
 
247
487
  /**
248
- * 자체 호스팅 백엔드 API의 URL.
249
- * 기본값: https://back.intlayer.org
488
+ * URL of the self-hosted backend API.
489
+ * Default: https://back.intlayer.org
250
490
  */
251
- backendURL: process.env.INTLAYER_BACKEND_URL, // 예: http://localhost:3100
491
+ backendURL: process.env.INTLAYER_BACKEND_URL, // e.g. http://localhost:3100
252
492
  },
253
493
  };
254
494
 
255
495
  export default config;
256
496
  ```
257
497
 
258
- 프로젝트의 `.env` 파일에 환경 변수를 설정하세요:
498
+ Set the environment variables in your project's `.env`:
259
499
 
260
500
  ```sh
261
501
  INTLAYER_CMS_URL=http://localhost:3000
@@ -264,11 +504,11 @@ INTLAYER_CLIENT_ID=<your-client-id>
264
504
  INTLAYER_CLIENT_SECRET=<your-client-secret>
265
505
  ```
266
506
 
267
- `http://localhost:3000/projects`의 자체 호스팅 대시보드 **프로젝트 → 접근 키**에서 접근 자격 증명을 생성하세요.
507
+ `http://localhost:3000/projects`의 자체 호스팅 대시보드에서 **Projects → Access keys** 아래에 액세스 자격 증명을 만듭니다.
268
508
 
269
509
  ### `@intlayer/api` SDK
270
510
 
271
- `@intlayer/api` SDK를 프로그래밍 방식으로 사용할 때, `backendURL`을 명시적으로 전달하세요:
511
+ 프로그래밍 방식으로 `@intlayer/api` SDK를 사용할 때 `backendURL`을 명시적으로 전달합니다:
272
512
 
273
513
  ```typescript fileName="cms.ts" codeFormat="typescript"
274
514
  import { createIntlayerCMS } from "@intlayer/api";
@@ -285,84 +525,17 @@ const cms = createIntlayerCMS({
285
525
  const { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();
286
526
  ```
287
527
 
288
- ## 업그레이드
289
-
290
- 이는 최신 이미지를 가져오고 `docker compose pull && docker compose up -d`를 사용하여 컨테이너를 다시 시작합니다. 기존 볼륨(`mongo-data`, `redis-data`, `minio-data`)은 보존되므로 데이터 손실이 없습니다.
291
-
292
- ```sh
293
- docker compose pull
294
- docker compose up -d
295
- ```
296
-
297
- ## 백업 및 복원
298
-
299
- 모든 영구 데이터는 세 개의 명명된 Docker 볼륨에 저장됩니다.
300
-
301
- ### 백업
302
-
303
- ```sh
304
- docker run --rm \
305
- -v intlayer_mongo-data:/data \
306
- -v "$(pwd)":/backup \
307
- busybox tar czf /backup/mongo-data.tar.gz /data
308
-
309
- docker run --rm \
310
- -v intlayer_redis-data:/data \
311
- -v "$(pwd)":/backup \
312
- busybox tar czf /backup/redis-data.tar.gz /data
313
-
314
- docker run --rm \
315
- -v intlayer_minio-data:/data \
316
- -v "$(pwd)":/backup \
317
- busybox tar czf /backup/minio-data.tar.gz /data
318
- ```
319
-
320
- ### 복원
321
-
322
- ```sh
323
- docker run --rm \
324
- -v intlayer_mongo-data:/data \
325
- -v "$(pwd)":/backup \
326
- busybox tar xzf /backup/mongo-data.tar.gz -C /
327
-
328
- # redis-data 및 minio-data에 대해서도 반복합니다.
329
- ```
330
-
331
528
  ## 제한 사항
332
529
 
333
- - **MongoDB는 외부(Atlas)여야 합니다.** 백엔드는 `mongodb+srv://`로만 연결되며(`DB_ID` / `DB_MDP` / `DB_CLUSTER`로 구성됨), 일반 `mongodb://host:27017` — 컨테이너의 자체 번들 `mongod` 포함 — 은 사용할 수 없습니다. MongoDB Atlas 클러스터를 제공하세요.
334
- - **사용자 정의 도메인 없음.** 모든 브라우저 대면 `VITE_*` URL은 빌드 시 앱에 인라인되며, 게시된 이미지는 `localhost` 값으로 제공됩니다. 대시보드는 `http://localhost:3000`에서 액세스해야 합니다. 공개 도메인에서 제공하려면 대상 URL을 포함하여 이미지를 다시 빌드해야 하며 기본적으로 지원되지 않습니다.
335
- - **이메일에는 작동하는 메일러가 필요합니다.** 초기 실행 설정은 이메일 확인을 강제하므로 `RESEND_API_KEY` 또는 [글로벌 SMTP 메일러](#global-mailer)(`MAIL_PROVIDER=smtp` + `MAIL_SMTP_*`)를 구성해야 합니다. 첫 번째 관리자가 로그인한 후 각 조직은 대시보드에서 자신의 SMTP 또는 Resend 메일러를 구성할 수도 있습니다.
336
-
337
- ## 문제 해결
338
-
339
- ### 첫 시작 시 백엔드 충돌 반복
340
-
341
- 백엔드가 시작되기 전에 MongoDB와 Redis가 정상 상태여야 합니다. compose 파일은 `condition: service_healthy`와 함께 `depends_on`을 사용합니다. 백엔드 재시작이 반복적으로 발생하면 `mongo` 및 `redis` 헬스체크가 통과하는지 확인하세요:
342
-
343
- ```sh
344
- docker compose ps
345
- docker compose logs mongo
346
- docker compose logs redis
347
- ```
348
-
349
- 로그의 상단 근처에서 `MongoDB connection error`를 찾아보세요.
350
-
351
- ### 대시보드가 API에 연결할 수 없음
352
-
353
- `VITE_BACKEND_URL`이 **브라우저**에서 백엔드에 접근 가능한 URL(Docker 네트워크가 아님)과 일치하는지 확인하세요. 백엔드 포트를 변경했거나 리버스 프록시를 추가했다면, 대시보드 이미지를 다시 빌드해야 합니다:
354
-
355
- ### MinIO 버킷 누락
356
-
357
- `minio-init` 일회성 서비스가 실행되지 않았거나(또는 MinIO가 준비되기 전에 실행된 경우), 수동으로 버킷을 생성하세요:
358
-
359
- ```sh
360
- docker compose run --rm minio-init
361
- ```
530
+ - **사용자 지정 도메인 및 포트 재매핑 미지원.** 브라우저용 모든 `VITE_*` URL은 빌드 시 대시보드에 번들링되며 게시된 이미지(및 데스크톱 앱)는 `localhost` / Intlayer Cloud 값과 함께 제공됩니다. 대시보드는 `http://localhost:3000`, API는 `:3100`, MinIO는 `:9000`에서 액세스해야 합니다. 공개 도메인에서 제공하거나 데스크톱 앱을 자체 호스팅 백엔드로 지정하려면 대상 URL이 포함된 상태로 다시 빌드해야 하며(`docker/selfhost/Dockerfile` 또는 `docker-compose.build.yml`에서 `--build-arg VITE_BACKEND_URL=… VITE_SITE_URL=… VITE_DOMAIN=…`), 기본적으로 지원되지 않습니다.
531
+ - **이메일 전송을 위해 작동하는 메일러가 필요합니다.** 초기 설정에서는 이메일 인증이 강제되므로 `RESEND_API_KEY` 또는 [SMTP 릴레이](#global-mailer)(`MAIL_SMTP_*`)를 구성해야 합니다. 첫 번째 관리자가 로그인한 후 각 조직은 대시보드에서 자체 SMTP 또는 Resend 메일러를 구성할 수도 있습니다.
532
+ - **데스크톱 앱은 임베디드 서버를 시작하기 위해 머신에 Node.js가 필요합니다.**
362
533
 
363
534
  ## 유용한 링크
364
535
 
365
536
  - [Intlayer CMS 문서](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/intlayer_CMS.md)
366
- - [설정 참조](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/configuration.md)
367
- - [CMS SDK — `@intlayer/api`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/intlayer_CMS.md#programmatic-access-with-the-intlayerapi-sdk)
368
- - [Docker Image (aymercizip/intlayer-selfhost)](https://hub.docker.com/repository/docker/aymercizip/intlayer-selfhost/general)
537
+ - [구성 레퍼런스](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/configuration.md)
538
+ - [CMS SDK: `@intlayer/api`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/intlayer_CMS.md#programmatic-access-with-the-intlayerapi-sdk)
539
+ - [데스크톱 앱 릴리스](https://github.com/aymericzip/intlayer/releases/latest)
540
+ - Docker Hub: [`intlayer/cms-all`](https://hub.docker.com/r/intlayer/cms-all), [`intlayer/cms-frontend`](https://hub.docker.com/r/intlayer/cms-frontend), [`intlayer/cms-backend`](https://hub.docker.com/r/intlayer/cms-backend), GHCR 미러: `ghcr.io/aymericzip/intlayer/`
541
+ - [`docker/selfhost/`](https://github.com/aymericzip/intlayer/tree/main/docker/selfhost): Dockerfile, `docker-compose.yml` 및 `.env.template`