@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,16 +1,17 @@
1
1
  ---
2
2
  createdAt: 2026-06-30
3
- updatedAt: 2026-06-30
3
+ updatedAt: 2026-09-21
4
4
  title: Self-Hosting Intlayer
5
- description: Jalankan instance Intlayer lengkap di infrastruktur Anda sendiri dengan satu perintah. Tidak memerlukan akun Intlayer Cloud.
5
+ description: "Jalankan Intlayer di infrastruktur Anda sendiri: aplikasi desktop, kontainer Docker all-in-one tunggal, atau stack Docker Compose yang dapat diskalakan. Tidak memerlukan akun Intlayer Cloud."
6
6
  keywords:
7
7
  - Self-Hosting
8
8
  - Docker
9
9
  - Docker Compose
10
+ - Aplikasi Desktop
10
11
  - Intlayer
11
12
  - CMS
12
- - Installation
13
- - Infrastructure
13
+ - Instalasi
14
+ - Infrastruktur
14
15
  slugs:
15
16
  - doc
16
17
  - self-hosting
@@ -19,216 +20,455 @@ author: aymericzip
19
20
 
20
21
  # Self-Hosting Intlayer
21
22
 
22
- Intlayer dapat berjalan sepenuhnya di infrastruktur Anda sendiri — tidak memerlukan akun Intlayer Cloud. Satu perintah akan mem-boot stack yang siap produksi:
23
+ Intlayer dapat dijalankan di infrastruktur Anda sendiri tanpa memerlukan akun Intlayer Cloud. Tiga konfigurasi disediakan, semuanya dapat diatur menggunakan penginstal yang sama (`install.sh`, `install.ps1` di Windows, atau `npx intlayer init infra`):
23
24
 
24
- Satu perintah menginstal semuanya:
25
+ | Setup | What it is | Pick it for |
26
+ | --------------------- | ---------------------------------------------------------------------------------------------- | ----------------------------------------------- |
27
+ | **Aplikasi Desktop** | Dasbor native untuk macOS, Linux, dan Windows | Klien lokal, tidak ada yang perlu di-host |
28
+ | **Docker All-in-One** | Dasbor, API, MongoDB, Redis, dan MinIO dalam **satu kontainer** | Pengujian dan instalasi box tunggal skala kecil |
29
+ | **Docker Compose** | **Satu kontainer per layanan**, setiap penyimpanan data dapat diganti dengan layanan terkelola | Produksi, penskalaan, basis data terkelola |
30
+
31
+ ## Table of Contents
32
+
33
+ <TOC/>
34
+
35
+ ## Image dan Paket yang Diterbitkan
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
+ Ketiga image dibuat dari [`docker/selfhost/Dockerfile`](https://github.com/aymericzip/intlayer/tree/main/docker/selfhost) yang sama dan diterbitkan pada setiap rilis. Stack Compose juga menarik image resmi `mongo:8`, `redis:8-alpine`, dan `quay.io/minio/minio`.
45
+
46
+ ## Pengaturan
47
+
48
+ Penginstal akan menanyakan pengaturan yang diinginkan, memeriksa prasyarat (menawarkan untuk menginstal Docker), menulis file lingkungan dengan secret yang telah dibuat sebelumnya, dan menarik image. Penginstal tidak memulai apa pun dengan sendirinya: mode Docker memerlukan pengirim email terlebih dahulu, sehingga proses diakhiri dengan mencetak perintah yang harus dijalankan. Menjalankan ulang aman dilakukan: file lingkungan yang ada tidak akan pernah ditimpa, yang juga menjadikannya jalur pembaruan.
49
+
50
+ <Tabs group="mode">
51
+ <Tab label="Aplikasi Desktop" value="desktop">
52
+
53
+ Dasbor Intlayer sebagai aplikasi native yang dibangun dengan Tauri. Masuk ke Intlayer Cloud (`https://app.intlayer.org`), sehingga tidak ada yang perlu di-host. Pilihan yang tepat ketika Anda menginginkan klien lokal daripada tab browser.
54
+
55
+ ### Instalasi
56
+
57
+ Penginstal mengunduh paket yang sesuai untuk OS dan CPU Anda dan membukanya (macOS), menginstalnya (`dpkg` / `rpm` di Linux), atau meluncurkan wizard pengaturan (Windows). Anda juga dapat mengunduhnya secara manual dari [halaman Rilis](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
- Installer mengunduh `docker-compose.yml` dan `.env`, membuat secret yang diperlukan secara otomatis, dan memulai semua kontainer dengan `docker compose up -d`.
66
+ </Tab>
67
+ <Tab label="Windows" value="windows">
31
68
 
32
- Satu-satunya dependensi eksternal adalah **MongoDB**: backend terhubung ke cluster MongoDB **Atlas**, yang Anda sediakan. Semua yang lain berjalan di dalam container.
69
+ In PowerShell:
33
70
 
34
- ## Daftar Isi
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
+ ### Persyaratan
86
+
87
+ - **Node.js**: Aplikasi menyematkan server dasbor dan memulainya dengan biner `node` mesin. Instal dari [nodejs.org](https://nodejs.org) jika aplikasi tidak dapat dibuka.
37
88
 
38
- ## Arsitektur
89
+ > Build desktop yang diterbitkan berkomunikasi dengan backend Intlayer Cloud. Mengarahkannya ke backend self-hosted memerlukan pembuatan ulang aplikasi dengan `VITE_BACKEND_URL` yang disetel ke API Anda, lihat [Batasan](#limitations).
90
+
91
+ </Tab>
92
+ <Tab label="Docker All-in-One" value="docker">
93
+
94
+ Semuanya berjalan di dalam satu kontainer `intlayer/cms-all`, diawasi oleh [s6-overlay](https://github.com/just-containers/s6-overlay), dengan setiap penyimpanan data dipertahankan pada satu volume.
39
95
 
40
96
  ```
41
97
  ┌─────────────────────────────┐
42
98
  browser ──────▶ │ app (TanStack Start) :3000│ ──┐
43
- └─────────────────────────────┘ │ VITE_BACKEND_URL
99
+ (localhost) └─────────────────────────────┘ │ VITE_BACKEND_URL (baked at build)
44
100
  ┌─────────────────────────────┐ │
45
101
  │ backend (Fastify/Bun) :3100│ ◀─┘
46
102
  └──────────────┬──────────────┘
47
- ┌──────────┬─────────┼──────────┬───────────┐
48
- ▼ ▼ ▼ ▼ ▼
49
- mongo:27017 redis:6379 minio:9000 mailpit:1025 Chromium
50
- (1-node RS) (S3 API) (SMTP) (in-image)
51
- minio:9001 mailpit:8025
52
- (console) (web 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 (digunakan untuk pembuatan screenshot Puppeteer) dibundel di dalam image backend — tidak diperlukan kontainer terpisah.
110
+ | Layanan | Port Host | Tujuan |
111
+ | ----------- | ---------------------------- | ---------------------------------------------------------------------------- |
112
+ | **app** | `3000` | Dasbor (UI CMS) |
113
+ | **backend** | `3100` | REST API (endpoint `/health`) |
114
+ | **mongo** | internal | MongoDB 8, replica-set node tunggal `rs0` |
115
+ | **redis** | internal | Antrean pekerjaan (BullMQ) dan caching |
116
+ | **minio** | `9000` (S3), `9001` (konsol) | Penyimpanan objek yang kompatibel dengan S3 untuk avatar dan tangkapan layar |
117
+
118
+ Urutan booting dikelola oleh dependensi s6 (`mongod` → inisialisasi replica-set, `minio` → pembuatan bucket, kemudian `backend`, lalu `app`), dan layanan akan dimulai ulang jika berhenti, sehingga booting pertama akan pulih dengan sendirinya.
56
119
 
57
- ## Prasyarat
120
+ ### Prasyarat
58
121
 
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).
122
+ - **Docker** ≥ 24: Penginstal menawarkan untuk menginstalnya (melalui [get.docker.com](https://get.docker.com) di Linux, Homebrew di macOS). Di Windows, instal [Docker Desktop](https://docs.docker.com/desktop/setup/install/windows-install/) (backend WSL 2) terlebih dahulu.
123
+ - Port `3000`, `3100`, `9000`, dan `9001` bebas di host. MinIO `9000` harus tetap dapat dijangkau oleh browser karena aset dimuat langsung dari `S3_PUBLIC_URL`.
124
+ - Pengirim email: Kunci API [Resend](https://resend.com) atau relay SMTP.
62
125
 
63
- Semuanya — Bun, Redis, MinIO, Chromium — dikirimkan di dalam image.
126
+ ### 1. Instalasi
64
127
 
65
- ## Memulai dengan cepat
128
+ Menulis `./intlayer.env` dengan `BETTER_AUTH_SECRET` dan `S3_SECRET_ACCESS_KEY` yang telah dibuat, lalu menarik `intlayer/cms-all:latest`.
66
129
 
67
- ### 1. Jalankan installer
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
135
+ ```
136
+
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
71
144
  ```
72
145
 
73
- Installer memverifikasi bahwa Docker terinstall dan berjalan, menulis `./intlayer.env` dengan `BETTER_AUTH_SECRET` dan `S3_SECRET_ACCESS_KEY` yang sudah digenerate, dan menarik image. Installer tidak memulai container — backend tidak dapat boot tanpa kredensial database Anda.
146
+ </Tab>
147
+ <Tab label="Intlayer CLI" value="cli">
148
+
149
+ CLI menjalankan penginstal yang mencetak perintah `docker run …` yang ditunjukkan pada tab lain. Tempel ke terminal Anda setelah mengonfigurasi mailer.
74
150
 
75
- Menjalankan installer kembali aman: `intlayer.env` yang sudah ada tidak akan pernah ditimpa, jadi ini juga berfungsi sebagai jalur upgrade.
151
+ </Tab>
152
+ </Tabs>
76
153
 
77
- ### 2. Isi kredensial Anda
154
+ ### 2. Konfigurasi Mailer
78
155
 
79
- Buka `intlayer.env` dan lengkapi nilai-nilai yang ditandai `TODO`:
156
+ Buka `intlayer.env` dan isi Resend **atau** SMTP (lihat [Mailer global](#global-mailer) untuk detailnya):
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
- File ini juga berisi blok yang dikomentari untuk fitur-fitur opsional — [SMTP mailer](#global-mailer), `OPENAI_API_KEY`, dan penyedia OAuth. Uncomment yang Anda butuhkan.
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
- > File dibaca oleh `docker run --env-file`, yang tidak menghapus tanda kutip dan menganggap semua yang setelah `=` sebagai nilai. Tulis nilai tanpa tanda kutip, dan simpan komentar di baris terpisah.
170
+ ### 3. Jalankan
91
171
 
92
- ### 3. Mulai container
172
+ Ini adalah perintah eksekusi yang dicetak oleh penginstal:
93
173
 
94
- Ini adalah perintah yang dicetak oleh installer ketika selesai:
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
184
+ ```
185
+
186
+ </Tab>
187
+ <Tab label="Windows" value="windows">
188
+
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
+ ```
197
+
198
+ </Tab>
199
+ <Tab label="Intlayer CLI" value="cli">
200
+
201
+ CLI menjalankan penginstal yang mencetak perintah `docker run …` yang ditunjukkan pada tab lain. Tempel ke terminal Anda setelah mengonfigurasi mailer.
202
+
203
+ </Tab>
204
+ </Tabs>
205
+
206
+ Buka **http://localhost:3000** dan ikuti [Pengaturan Pertama Kali](#first-run-setup). Booting pertama menginisialisasi replica-set dan bucket, jadi berikan waktu sekitar satu menit.
207
+
208
+ ### Cadangan dan Peningkatan
209
+
210
+ Semua status disimpan dalam volume `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
+ Untuk meningkatkan (upgrade), jalankan kembali penginstal (akan menarik image terbaru dan mempertahankan `intlayer.env`), lalu jalankan `docker rm -f intlayer` dan jalankan kembali perintah mulai. Untuk menggunakan MongoDB terkelola alih-alih yang disertakan, setel `MONGODB_URI` di `intlayer.env`.
223
+
224
+ </Tab>
225
+ <Tab label="Docker Compose" value="compose">
226
+
227
+ Satu kontainer per layanan di jaringan Compose privat. Dasbor dan API menggunakan image `intlayer/cms-frontend` dan `intlayer/cms-backend` yang diterbitkan; penyimpanan data menggunakan image resmi `mongo`, `redis`, dan `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
+ | Layanan | Image | Peran |
243
+ | ------------ | ----------------------- | ------------------------------------------------------------------------------------ |
244
+ | `app` | `intlayer/cms-frontend` | Dasbor pada `:3000`; menunggu backend sehat |
245
+ | `backend` | `intlayer/cms-backend` | API pada `:3100` dengan Chromium; menunggu Mongo, Redis, dan bucket MinIO |
246
+ | `mongo` | `mongo:8` | Replica-set node tunggal `rs0`, diinisialisasi oleh pemeriksaan kesehatannya sendiri |
247
+ | `redis` | `redis:8-alpine` | Antrean dan caching, persistensi append-only |
248
+ | `minio` | `quay.io/minio/minio` | Penyimpanan S3 pada `:9000`, konsol pada `:9001` |
249
+ | `minio-init` | `quay.io/minio/mc` | Sekali jalan: membuat bucket dan kebijakan unduhan anonimnya |
250
+
251
+ Data disimpan dalam volume `intlayer_mongo-data`, `intlayer_redis-data`, dan `intlayer_minio-data`. Sambungan layanan (`MONGODB_URI`, `REDIS_URL`, `S3_ENDPOINT`, URL backend internal untuk server-side rendering) telah ditentukan dalam file compose dan lebih diutamakan daripada `.env`, yang hanya menyimpan secret dan integrasi opsional.
252
+
253
+ ### Prasyarat
254
+
255
+ - **Docker** ≥ 24 dengan plugin Compose: Penginstal menawarkan untuk menginstalnya di Linux dan macOS. Di Windows, instal [Docker Desktop](https://docs.docker.com/desktop/setup/install/windows-install/) (backend WSL 2) terlebih dahulu.
256
+ - Port `3000`, `3100`, `9000`, dan `9001` bebas di host.
257
+ - Pengirim email: Kunci API [Resend](https://resend.com) atau relay SMTP.
258
+
259
+ ### 1. Instalasi
260
+
261
+ Menulis `docker-compose.yml` dan `.env` dengan secret yang dihasilkan ke `./intlayer/` dan menarik image.
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. Konfigurasi Mailer
308
+
309
+ Isi Resend **atau** SMTP di `intlayer/.env`, persis seperti kontainer all-in-one (lihat [Mailer global](#global-mailer)).
310
+
311
+ ### 3. Jalankan
312
+
313
+ ```sh
314
+ cd intlayer && docker compose up -d
315
+ ```
316
+
317
+ Buka **http://localhost:3000** dan ikuti [Pengaturan Pertama Kali](#first-run-setup).
318
+
319
+ ### Penyimpanan Data Terkelola
320
+
321
+ Hapus layanan yang Anda ganti dari file compose (bersama dengan entri `depends_on` di `backend`), dan timpa variabel yang sesuai:
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
106
331
  ```
107
332
 
108
- Kemudian buka **http://localhost:3000**. Boot pertama menginisialisasi datastores, jadi tunggu sebentar.
333
+ `S3_ACCESS_KEY_ID` / `S3_SECRET_ACCESS_KEY` / `S3_BUCKET_NAME` berfungsi langsung terhadap penyedia mana pun yang kompatibel dengan S3.
334
+
335
+ ### Penskalaan
336
+
337
+ `app` dan `backend` bersifat stateless. Di balik penyeimbang beban (load balancer), jika pemetaan port host tetap dihapus dan proksi merutekan berdasarkan nama layanan, `docker compose up -d --scale backend=3` akan berfungsi. Pekerjaan latar belakang dikoordinasikan melalui Redis (BullMQ), sehingga beberapa replika backend dapat berbagi antrean dengan aman.
109
338
 
110
- > Dashboard disajikan di `localhost`. Lihat [Limitations](#limitations) — domain kustom tidak didukung oleh image yang dipublikasikan.
339
+ ### Membangun dari Sumber
111
340
 
112
- ### Pengaturan Installer
341
+ Dari hasil kloning repositori, ganti dua layanan Intlayer dari `image:` ke `build:` dengan override:
113
342
 
114
- Installer membaca beberapa variabel environment. Karena di-pipe ke `sh`, teruskan ke shell daripada ke `curl`:
343
+ ```sh
344
+ cd docker/selfhost
345
+ docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build
346
+ ```
347
+
348
+ Gunakan ini juga saat membuat image untuk domain kustom: berikan nilai `VITE_*` sebagai argumen build (lihat [Batasan](#limitations)).
349
+
350
+ ### Cadangan dan Peningkatan
115
351
 
116
352
  ```sh
117
- curl -fsSL https://intlayer.org/install.sh | INTLAYER_ENV_FILE=./config/intlayer.env 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
118
360
  ```
119
361
 
120
- | Variable | Default | Description |
121
- | ------------------------- | --------------------------------------------- | ------------------------------- |
122
- | `INTLAYER_IMAGE` | `ghcr.io/aymericzip/intlayer-selfhost:latest` | Image to pull |
123
- | `INTLAYER_ENV_FILE` | `./intlayer.env` | Where to write the env file |
124
- | `INTLAYER_CONTAINER_NAME` | `intlayer` | Container name |
125
- | `INTLAYER_DATA_VOLUME` | `intlayer-data` | Named volume mounted at `/data` |
126
- | `INTLAYER_APP_PORT` | `3000` | Host port for the dashboard |
127
- | `INTLAYER_API_PORT` | `3100` | Host port for the API |
128
- | `INTLAYER_S3_PORT` | `9000` | Host port for the MinIO S3 API |
129
- | `INTLAYER_CONSOLE_PORT` | `9001` | Host port for the MinIO console |
130
-
131
- > Keempat variabel port hanya mengubah sisi **host** dari mapping yang dicetak dalam perintah `docker run`. Image yang dipublikasikan memiliki `http://localhost:3000`, `http://localhost:3100` dan `http://localhost:9000` dikompilasi ke dalam bundle dashboard pada saat build, jadi remapping mereka membuat browser tetap menunjuk ke port lama. Pertahankan default kecuali Anda membangun image Anda sendiri — lihat [Limitations](#limitations).
132
-
133
- ## Memulai Cepat
134
-
135
- Apa yang dilakukan installer:
136
-
137
- 1. Memeriksa bahwa `docker` dan `docker compose` ada.
138
- 2. Mengunduh `docker-compose.yml` dan `.env.example` ke `./intlayer/`.
139
- 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`.
140
- 4. Menjalankan `docker compose pull` + `docker compose up -d`.
141
- 5. Mencetak URL: dashboard `:3000`, API `:3100`, UI email `:8025`, konsol MinIO `:9001`.
142
-
143
- Setelah stack aktif, buka **http://localhost:3000** dan buat akun pertama Anda.
144
-
145
- ## Layanan
146
-
147
- | Layanan | Image | Port Host | Tujuan |
148
- | ----------- | ------------------------------------- | ------------------------------ | ----------------------------------------------------------------------- |
149
- | **app** | dibuat dari `apps/app/Dockerfile` | `3000` | Dashboard TanStack Start (UI CMS) |
150
- | **backend** | dibuat dari `apps/backend/Dockerfile` | `3100` | Fastify REST API (`/health` endpoint) |
151
- | **mongo** | `mongo:7` | internal | Replika set node tunggal (`rs0`) |
152
- | **redis** | `redis:7-alpine` | internal | Job queues (BullMQ) dan caching (ioredis) |
153
- | **minio** | `minio/minio` | `9000` (S3), `9001` (konsol) | Penyimpanan objek yang kompatibel dengan S3 untuk avatar dan screenshot |
154
- | **mailpit** | `axllent/mailpit` | `1025` (SMTP), `8025` (UI web) | Sink email transaksional lokal |
155
-
156
- > Port MinIO `9000` harus dapat dijangkau oleh browser karena aset yang diunggah (avatar, screenshot) dimuat langsung dari `S3_PUBLIC_URL=http://localhost:9000/intlayer`.
157
-
158
- ## Variabel lingkungan
159
-
160
- ### Diperlukan
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
- ### Wajib (dibuat secara otomatis atau diminta)
172
-
173
- | Variabel | Contoh | Deskripsi |
174
- | ---------------------- | ----------------------------------------------- | ------------------------------------------------------- |
175
- | `NODE_ENV` | `production` | Lingkungan runtime |
176
- | `PORT` | `3100` | Port listen backend |
177
- | `BACKEND_URL` | `http://localhost:3100` | URL publik API backend |
178
- | `APP_URL` | `http://localhost:3000` | URL publik dashboard |
179
- | `DOMAIN` | `localhost` | Domain cookie |
180
- | `MONGODB_URI` | `mongodb://mongo:27017/intlayer?replicaSet=rs0` | URI koneksi MongoDB lengkap |
181
- | `REDIS_URL` | `redis://redis:6379` | URL koneksi Redis |
182
- | `BETTER_AUTH_SECRET` | _(dibuat)_ | Secret 32-byte untuk penandatanganan sesi |
183
- | `MAIL_PROVIDER` | `smtp` | Transportasi mail: `smtp` atau `resend` |
184
- | `MAIL_SMTP_HOST` | `mailpit` | Nama host SMTP (nama kontainer Mailpit) |
185
- | `MAIL_SMTP_PORT` | `1025` | Port SMTP |
186
- | `MAIL_FROM` | `Intlayer <no-reply@localhost>` | Alamat pengirim |
187
- | `S3_ENDPOINT` | `http://minio:9000` | Endpoint yang kompatibel dengan S3 |
188
- | `S3_PUBLIC_URL` | `http://localhost:9000/intlayer` | URL publik untuk pemuatan aset browser |
189
- | `S3_BUCKET_NAME` | `intlayer` | Nama bucket |
190
- | `S3_ACCESS_KEY_ID` | _(dibuat)_ | Kunci akses MinIO |
191
- | `S3_SECRET_ACCESS_KEY` | _(dibuat)_ | Kunci secret MinIO |
192
- | `VITE_BACKEND_URL` | `http://localhost:3100` | URL backend yang tertanam di dashboard pada waktu build |
193
- | `VITE_DOMAIN` | `localhost` | Domain yang tertanam di dashboard pada waktu build |
194
-
195
- ### Opsional (fitur akan menurun secara bertahap jika tidak ada)
196
-
197
- | Variabel | Fitur |
198
- | -------------------------------------------------------- | ------------------------------------------------------------- |
199
- | `OPENAI_API_KEY` | Terjemahan berbantuan AI dan audit konten |
200
- | `STRIPE_SECRET_KEY`, `STRIPE_WEBHOOK_SECRET`, `STRIPE_*` | Penagihan dan manajemen langganan |
201
- | `RESEND_API_KEY` | Email transaksional via Resend (menimpa Mailpit jika disetel) |
202
- | `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` | Login GitHub OAuth |
203
- | `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` | Login Google OAuth |
204
- | `GITLAB_CLIENT_ID`, `GITLAB_CLIENT_SECRET` | Login GitLab OAuth |
205
- | `MICROSOFT_CLIENT_ID`, `MICROSOFT_CLIENT_SECRET` | Login Microsoft OAuth |
206
- | `LINKEDIN_CLIENT_ID`, `LINKEDIN_CLIENT_SECRET` | Login LinkedIn OAuth |
207
- | `ATLASSIAN_CLIENT_ID`, `ATLASSIAN_CLIENT_SECRET` | Login Atlassian OAuth |
208
-
209
- ### Global mailer
210
-
211
- Secara default, semua email transaksional dikirim melalui Resend menggunakan `RESEND_API_KEY`. Deployment yang self-hosted dapat mengarahkan **setiap** email — termasuk email non-organisasi seperti reset password dan magic links — melalui global mailer yang dikonfigurasi dengan environment variables.
212
-
213
- Atur `MAIL_PROVIDER` untuk mengaktifkannya. Ketika tidak diatur, mailer Resend default digunakan.
214
-
215
- | Variable | Example | Description |
216
- | -------------------- | ------------------------------ | -------------------------------------------------------------------------------------- |
217
- | `MAIL_PROVIDER` | `smtp` | Global transport: `smtp` atau `resend`. Biarkan tidak diatur untuk menggunakan default |
218
- | `MAIL_FROM` | `Intlayer <no-reply@acme.com>` | Sender header. Menerima alamat bare atau format `Name <email>` |
219
- | `MAIL_SMTP_HOST` | `smtp.acme.com` | SMTP host (diperlukan ketika `MAIL_PROVIDER=smtp`) |
220
- | `MAIL_SMTP_PORT` | `587` | SMTP port (default ke `587`) |
221
- | `MAIL_SMTP_SECURE` | `false` | Implicit TLS. Atur `true` untuk port `465` |
222
- | `MAIL_SMTP_USER` | _(user anda)_ | SMTP username (opsional; abaikan untuk unauthenticated relays) |
223
- | `MAIL_SMTP_PASSWORD` | _(password anda)_ | SMTP password |
224
-
225
- > Precedence: mailer milik organisasi sendiri (dikonfigurasi dari dashboard **Organization**) mengambil prioritas atas global mailer, yang pada gilirannya mengambil prioritas atas kunci Resend default.
226
-
227
- ## Menghubungkan proyek Intlayer Anda
228
-
229
- Setelah stack berjalan, arahkan proyek Anda ke backend dan dashboard yang di-self-host, bukan ke `intlayer.org`.
230
-
231
- ### Konfigurasi proyek
362
+ </Tab>
363
+ </Tabs>
364
+
365
+ ### Pengaturan Penginstal
366
+
367
+ Tanpa `--mode` (atau `INTLAYER_MODE`), penginstal akan menampilkan menu: `desktop`, `docker` (all-in-one), atau `compose`. Penginstal juga membaca beberapa variabel lingkungan; teruskan ke shell alih-alih ke `curl` karena ini disalurkan (piped):
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
+ > Variabel port hanya mengubah sisi **host** dari pemetaan. Image yang diterbitkan memiliki `http://localhost:3000`, `http://localhost:3100`, dan `http://localhost:9000` yang dikompilasi ke dalam bundle dasbor, jadi pertahankan default kecuali Anda membuat image sendiri, lihat [Batasan](#limitations).
393
+
394
+ ## Pengaturan Pertama Kali
395
+
396
+ Membuka dasbor pada instance baru (database kosong) akan otomatis dialihkan ke **`/init`**:
397
+
398
+ 1. Buat akun pertama. Karena koleksi pengguna kosong, akun ini secara otomatis dipromosikan menjadi **Super Admin**.
399
+ 2. Email verifikasi dikirim melalui Resend atau relay SMTP Anda. Verifikasi email **wajib** dilakukan, itulah mengapa pengirim email harus dikonfigurasi sebelum memulai.
400
+ 3. Klik tautan di email dan masuk.
401
+
402
+ Setelah admin ada, `/init` akan dialihkan ke halaman masuk biasa.
403
+
404
+ ## Variabel Lingkungan
405
+
406
+ Kedua mode Docker membaca file yang sama (berupa `intlayer.env` untuk kontainer atau `.env` untuk Compose) yang dihasilkan dari [`docker/selfhost/.env.template`](https://github.com/aymericzip/intlayer/blob/main/docker/selfhost/.env.template).
407
+
408
+ ### Wajib
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
+ ### Ditetapkan oleh Penerapan
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
+ Layanan Compose `app` juga menerima `INTLAYER_BACKEND_INTERNAL_URL=http://backend:3100`: browser menjangkau API di `localhost:3100`, tetapi rendering sisi server berjalan di dalam jaringan Compose sehingga harus menggunakan nama layanan.
435
+
436
+ ### Opsional (fitur akan dinonaktifkan dengan lancar jika tidak disetel)
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
+ ### Mailer Global
447
+
448
+ Semua email transaksional, termasuk email di luar organisasi seperti reset kata sandi dan magic link, melewati salah satu dari dua transport global:
449
+
450
+ - **Resend**: Menggunakan `RESEND_API_KEY`.
451
+ - **SMTP**: Menggunakan variabel `MAIL_SMTP_*`. Menyetel `MAIL_SMTP_HOST` akan langsung memilih transport SMTP dan mengabaikan `RESEND_API_KEY`.
452
+
453
+ `MAIL_PROVIDER` hanya diperlukan untuk memaksa salah satu transport jika keduanya dikonfigurasi (misalnya `MAIL_PROVIDER=resend` untuk tetap menggunakan Resend saat host SMTP ada).
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
+ > Urutan prioritas: Mailer milik organisasi sendiri (dikonfigurasi dari dasbor **Organisasi**) menggantikan mailer global, dan mailer global menggantikan kunci Resend default.
466
+
467
+ ## Menghubungkan Proyek Intlayer Anda
468
+
469
+ Setelah stack berjalan, konfigurasikan proyek Anda untuk mengarah ke backend dan dasbor self-hosted Anda, bukan ke `intlayer.org`.
470
+
471
+ ### Konfigurasi Proyek
232
472
 
233
473
  ```typescript fileName="intlayer.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
234
474
  import type { IntlayerConfig } from "intlayer";
@@ -239,13 +479,13 @@ const config: IntlayerConfig = {
239
479
  clientSecret: process.env.INTLAYER_CLIENT_SECRET,
240
480
 
241
481
  /**
242
- * URL dashboard CMS yang di-self-host.
482
+ * URL of the self-hosted CMS dashboard.
243
483
  * Default: https://app.intlayer.org
244
484
  */
245
485
  cmsURL: process.env.INTLAYER_CMS_URL, // e.g. http://localhost:3000
246
486
 
247
487
  /**
248
- * URL API backend yang di-self-host.
488
+ * URL of the self-hosted backend API.
249
489
  * Default: https://back.intlayer.org
250
490
  */
251
491
  backendURL: process.env.INTLAYER_BACKEND_URL, // e.g. http://localhost:3100
@@ -255,7 +495,7 @@ const config: IntlayerConfig = {
255
495
  export default config;
256
496
  ```
257
497
 
258
- Setel variabel lingkungan di `.env` proyek Anda:
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
- Buat kredensial akses di dashboard self-host Anda di bawah **Projects → Access keys** di `http://localhost:3000/projects`.
507
+ Buat kredensial akses di dasbor self-hosted Anda di **Proyek → Kunci Akses** (`http://localhost:3000/projects`).
268
508
 
269
- ### `@intlayer/api` SDK
509
+ ### SDK `@intlayer/api`
270
510
 
271
- Saat menggunakan `@intlayer/api` SDK secara terprogram, teruskan `backendURL` secara eksplisit:
511
+ Saat menggunakan SDK `@intlayer/api` secara terprogram, teruskan `backendURL` secara eksplisit:
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
- ## Peningkatan
289
-
290
- 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.
291
-
292
- ```sh
293
- docker compose pull
294
- docker compose up -d
295
- ```
296
-
297
- ## Cadangkan dan pulihkan
298
-
299
- Semua data persisten berada dalam tiga volume Docker bernama.
300
-
301
- ### Cadangkan
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
- ### Pulihkan
528
+ ## Batasan
321
529
 
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
- # Ulangi untuk redis-data dan minio-data
329
- ```
330
-
331
- ## Keterbatasan
332
-
333
- - **MongoDB harus external (Atlas).** Backend terhubung hanya melalui `mongodb+srv://` (dibangun dari `DB_ID` / `DB_MDP` / `DB_CLUSTER`), jadi plain `mongodb://host:27017` — termasuk `mongod` bundled container sendiri — tidak dapat digunakan. Sediakan cluster MongoDB Atlas.
334
- - **Tidak ada custom domain.** Semua URL `VITE_*` yang dihadapi browser di-inline ke dalam app pada saat build, dan image yang dipublikasikan dilengkapi dengan nilai `localhost`. Dashboard harus diakses di `http://localhost:3000`; melayaninya di domain publik memerlukan rebuilding image dengan target URLs yang tertanam dan tidak didukung out of the box.
335
- - **Email memerlukan mailer yang berfungsi.** Setup first-run menerapkan verifikasi email, jadi baik `RESEND_API_KEY` atau [global SMTP mailer](#global-mailer) (`MAIL_PROVIDER=smtp` + `MAIL_SMTP_*`) harus dikonfigurasi. Setelah admin pertama masuk, setiap organisasi juga dapat mengonfigurasi SMTP atau Resend mailer-nya sendiri dari dashboard.
336
-
337
- ## Pemecahan Masalah
338
-
339
- ### Backend crash-loops pada start pertama
340
-
341
- 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:
342
-
343
- ```sh
344
- docker compose ps
345
- docker compose logs mongo
346
- docker compose logs redis
347
- ```
348
-
349
- Cari `MongoDB connection error` di bagian atas log.
350
-
351
- ### Dashboard tidak dapat mencapai API
352
-
353
- 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:
354
-
355
- ### Bucket MinIO hilang
356
-
357
- Jika layanan one-shot `minio-init` tidak berjalan (atau berjalan sebelum MinIO siap), buat bucket secara manual:
358
-
359
- ```sh
360
- docker compose run --rm minio-init
361
- ```
530
+ - **Domain kustom dan pemetaan ulang port belum didukung.** Semua URL `VITE_*` yang ditujukan untuk browser dipanggang ke dalam dasbor pada waktu build, dan image yang diterbitkan (serta aplikasi desktop) memiliki nilai `localhost` / Intlayer Cloud. Dasbor harus diakses di `http://localhost:3000`, API di `:3100`, dan MinIO di `:9000`. Menghosting di domain publik atau mengarahkan aplikasi desktop ke backend self-hosted memerlukan pembuatan ulang dengan URL target yang dipanggang (pada `docker/selfhost/Dockerfile` atau `docker-compose.build.yml` dengan `--build-arg VITE_BACKEND_URL=… VITE_SITE_URL=… VITE_DOMAIN=…`), dan tidak didukung secara langsung.
531
+ - **Pengiriman email memerlukan mailer yang berfungsi.** Pengaturan pertama kali mewajibkan verifikasi email, jadi `RESEND_API_KEY` atau [relay SMTP](#global-mailer) (`MAIL_SMTP_*`) harus dikonfigurasi. Setelah admin pertama masuk, organisasi juga dapat mengonfigurasi mailer SMTP atau Resend mereka sendiri dari dasbor.
532
+ - **Aplikasi desktop memerlukan Node.js di mesin untuk memulai server yang disematkan.**
362
533
 
363
534
  ## Tautan Berguna
364
535
 
365
536
  - [Dokumentasi Intlayer CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/intlayer_CMS.md)
366
537
  - [Referensi Konfigurasi](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/configuration.md)
367
- - [SDK CMS — `@intlayer/api`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/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)
538
+ - [CMS SDK: `@intlayer/api`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/intlayer_CMS.md#programmatic-access-with-the-intlayerapi-sdk)
539
+ - [Rilis Aplikasi Desktop](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), mirror GHCR: `ghcr.io/aymericzip/intlayer/`
541
+ - [`docker/selfhost/`](https://github.com/aymericzip/intlayer/tree/main/docker/selfhost): Dockerfile, `docker-compose.yml`, `.env.template`