@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 selbst hosten"
5
- description: "Betreiben Sie eine komplette Intlayer-Instanz auf Ihrer eigenen Infrastruktur mit einem einzigen Befehl. Kein Intlayer Cloud-Konto erforderlich."
3
+ updatedAt: 2026-09-21
4
+ title: Intlayer selbst hosten
5
+ description: "Führen Sie Intlayer auf Ihrer eigenen Infrastruktur aus: als Desktop-App, einzelner All-in-One-Docker-Container oder skalierbarer Docker Compose-Stack. Kein Intlayer Cloud-Konto erforderlich."
6
6
  keywords:
7
- - Selbst-Hosting
7
+ - Self-Hosting
8
8
  - Docker
9
9
  - Docker Compose
10
+ - Desktop-App
10
11
  - Intlayer
11
12
  - CMS
12
13
  - Installation
@@ -19,212 +20,455 @@ author: aymericzip
19
20
 
20
21
  # Intlayer selbst hosten
21
22
 
22
- Intlayer kann vollständig auf Ihrer eigenen Infrastruktur ausgeführt werden – kein Intlayer Cloud-Konto erforderlich. Ein einziger Befehl startet einen produktionsbereiten Stack:
23
+ Intlayer kann auf Ihrer eigenen Infrastruktur ausgeführt werden, kein Intlayer Cloud-Konto erforderlich. Drei Setups stehen zur Verfügung, die alle über dasselbe Installationsprogramm verwaltet werden (`install.sh`, `install.ps1` unter Windows oder `npx intlayer init infra`):
23
24
 
24
- Ein Befehl installiert alles:
25
+ | Setup | What it is | Pick it for |
26
+ | --------------------- | ------------------------------------------------------------------------------------- | ---------------------------------------------- |
27
+ | **Desktop-App** | Natives Dashboard für macOS, Linux und Windows | Ein lokaler Client, nichts zu hosten |
28
+ | **All-in-One Docker** | Dashboard, API, MongoDB, Redis und MinIO in einem **einzigen Container** | Tests und kleine Single-Box-Installationen |
29
+ | **Docker Compose** | **Ein Container pro Dienst**, jeder Datenspeicher durch ein Managed-Angebot ersetzbar | Produktion, Skalierung, verwaltete Datenbanken |
30
+
31
+ ## Table of Contents
32
+
33
+ <TOC/>
34
+
35
+ ## Veröffentlichte Images und Pakete
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
+ Alle drei Images werden aus derselben Datei [`docker/selfhost/Dockerfile`](https://github.com/aymericzip/intlayer/tree/main/docker/selfhost) erstellt und bei jeder Version veröffentlicht. Der Compose-Stack ruft außerdem die offiziellen Images `mongo:8`, `redis:8-alpine` und `quay.io/minio/minio` ab.
45
+
46
+ ## Einrichtung
47
+
48
+ Das Installationsprogramm fragt nach dem gewünschten Setup, prüft die Voraussetzungen (bietet die Installation von Docker an), schreibt die Umgebungsdatei mit bereits generierten Secrets und lädt die Images herunter. Es startet nichts von selbst: Die Docker-Modi benötigen zuerst einen Mailer, daher endet es mit der Ausgabe des auszuführenden Befehls. Eine erneute Ausführung ist sicher: Eine vorhandene Umgebungsdatei wird nie überschrieben, was es auch zum Upgrade-Pfad macht.
49
+
50
+ <Tabs group="mode">
51
+ <Tab label="Desktop-App" value="desktop">
52
+
53
+ Das Intlayer-Dashboard als native Anwendung, erstellt mit Tauri. Es meldet sich bei der Intlayer Cloud (`https://app.intlayer.org`) an, sodass nichts gehostet werden muss. Es ist die richtige Wahl, wenn Sie einen lokalen Client statt eines Browser-Tabs bevorzugen.
54
+
55
+ ### Installation
56
+
57
+ Das Installationsprogramm lädt das Paket für Ihr Betriebssystem und Ihre CPU herunter und öffnet es (macOS), installiert es (`dpkg` / `rpm` unter Linux) oder startet den Setup-Assistenten (Windows). Sie können es auch manuell von der [Releases-Seite](https://github.com/aymericzip/intlayer/releases/latest) herunterladen.
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
- Der Installer lädt eine `docker-compose.yml` und eine `.env` herunter, generiert automatisch die erforderlichen Secrets und startet alle Container mit `docker compose up -d`.
66
+ </Tab>
67
+ <Tab label="Windows" value="windows">
31
68
 
32
- Die einzige externe Abhängigkeit ist **MongoDB**: Das Backend verbindet sich mit einem MongoDB **Atlas**-Cluster, den Sie bereitstellen. Alles andere läuft im Container.
69
+ In PowerShell:
33
70
 
34
- ## Inhaltsverzeichnis
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>
37
84
 
38
- ## Architektur
85
+ ### Anforderungen
86
+
87
+ - **Node.js**: Die App bettet den Dashboard-Server ein und startet ihn mit der maschineneigenen `node`-Binärdatei. Installieren Sie es von [nodejs.org](https://nodejs.org), falls die App nicht startet.
88
+
89
+ > Der veröffentlichte Desktop-Build kommuniziert mit dem Intlayer Cloud-Backend. Das Verweisen auf ein selbst gehostetes Backend erfordert das erneute Erstellen der App mit der auf Ihre API festgelegten `VITE_BACKEND_URL`, siehe [Einschränkungen](#limitations).
90
+
91
+ </Tab>
92
+ <Tab label="All-in-One Docker" value="docker">
93
+
94
+ Alles läuft im einzelnen `intlayer/cms-all`-Container, überwacht von [s6-overlay](https://github.com/just-containers/s6-overlay), wobei jeder Datenspeicher auf einem einzigen Volume persistiert wird.
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 (wird für die Erzeugung von Puppeteer-Screenshots verwendet) ist im Backend-Image gebündelt – es wird kein separater Container benötigt.
110
+ | Dienst | Host-Port(s) | Zweck |
111
+ | ----------- | ----------------------------- | --------------------------------------------------------- |
112
+ | **app** | `3000` | Dashboard (CMS-Benutzeroberfläche) |
113
+ | **backend** | `3100` | REST-API (`/health`-Endpunkt) |
114
+ | **mongo** | intern | MongoDB 8, Single-Node-Replica-Set `rs0` |
115
+ | **redis** | intern | Job-Warteschlangen (BullMQ) und Caching |
116
+ | **minio** | `9000` (S3), `9001` (Konsole) | S3-kompatibler Objektspeicher für Avatare und Screenshots |
117
+
118
+ Die Startreihenfolge wird durch s6-Abhängigkeiten gesteuert (`mongod` → Replica-Set-Init, `minio` → Bucket-Erstellung, dann `backend`, dann `app`), und Dienste starten bei Beendigung neu, sodass der erste Start sich von selbst erholt.
56
119
 
57
- ## Voraussetzungen
120
+ ### Voraussetzungen
58
121
 
59
- - **Docker** ≥ 24 und **Docker Compose** ≥ v2. Fehlt eines davon, gibt der Installer den Installationslink aus und beendet sich.
60
- - Ports `3000`, `3100`, `8025`, `9000` und `9001` auf dem Host verfügbar.
61
- - Ein Linux- oder macOS-Host (oder WSL2 unter Windows).
122
+ - **Docker** ≥ 24: Das Installationsprogramm bietet die Installation an (über [get.docker.com](https://get.docker.com) unter Linux, Homebrew unter macOS). Installieren Sie unter Windows zuerst [Docker Desktop](https://docs.docker.com/desktop/setup/install/windows-install/) (WSL 2-Backend).
123
+ - Ports `3000`, `3100`, `9000` und `9001` auf dem Host frei. MinIO `9000` muss für den Browser erreichbar bleiben, da Assets direkt von `S3_PUBLIC_URL` geladen werden.
124
+ - Ein Mailer: Ein [Resend](https://resend.com)-API-Schlüssel oder ein SMTP-Relay.
62
125
 
63
- Alles andere – Bun, Redis, MinIO, Chromium – wird im Image mitgeliefert.
126
+ ### 1. Installation
64
127
 
65
- ## Schnelleinstieg
128
+ Schreibt `./intlayer.env` mit generiertem `BETTER_AUTH_SECRET` und `S3_SECRET_ACCESS_KEY` und ruft `intlayer/cms-all:latest` ab.
66
129
 
67
- ### 1. Run the 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
- Es überprüft, ob Docker installiert und aktiv ist, schreibt `./intlayer.env` mit bereits generierten `BETTER_AUTH_SECRET` und `S3_SECRET_ACCESS_KEY` und lädt das Image herunter. Es startet den Container nicht — das Backend kann ohne deine Datenbankanmeldeinformationen nicht booten.
146
+ </Tab>
147
+ <Tab label="Intlayer CLI" value="cli">
74
148
 
75
- Das erneute Ausführen des Installers ist sicher: Eine vorhandene `intlayer.env` wird nie überschrieben, daher fungiert sie auch als Upgrade-Pfad.
149
+ ```bash
150
+ npx intlayer init infra --mode docker
151
+ ```
152
+
153
+ </Tab>
154
+ </Tabs>
76
155
 
77
- ### 2. Füllen Sie Ihre Anmeldedaten aus
156
+ ### 2. Mailer konfigurieren
78
157
 
79
- Öffnen Sie `intlayer.env` und vervollständigen Sie die mit `TODO` gekennzeichneten Werte:
158
+ Öffnen Sie `intlayer.env` und tragen Sie Resend **oder** SMTP ein (Details unter [Globaler Mailer](#global-mailer)):
80
159
 
81
160
  ```sh fileName="intlayer.env"
82
- DB_ID=<atlas-user>
83
- DB_MDP=<atlas-password>
84
- DB_CLUSTER=<cluster>.xxxxx.mongodb.net
161
+ # Option A: Resend
85
162
  RESEND_API_KEY=<your-resend-key>
86
- ```
87
163
 
88
- Die Datei enthält auch auskommentierte Blöcke für optionale Funktionen — [SMTP mailer](#global-mailer), `OPENAI_API_KEY` und die OAuth-Provider. Kommentieren Sie aus, was Sie benötigen.
164
+ # Option B: SMTP (takes over from Resend as soon as MAIL_SMTP_HOST is set)
165
+ MAIL_SMTP_HOST=smtp.example.com
166
+ MAIL_SMTP_PORT=587
167
+ MAIL_SMTP_USER=<user>
168
+ MAIL_SMTP_PASSWORD=<password>
169
+ MAIL_FROM=Intlayer <no-reply@example.com>
170
+ ```
89
171
 
90
- > Die Datei wird von `docker run --env-file` gelesen, das Anführungszeichen nicht entfernt und alles nach `=` als Wert behandelt. Schreiben Sie nackte Werte und behalten Sie Kommentare auf eigenen Zeilen.
172
+ ### 3. Starten
91
173
 
92
- ### 3. Container starten
174
+ Dies ist der vom Installationsprogramm ausgegebene Befehl:
93
175
 
94
- Dies ist der Befehl, den das Installationsprogramm nach Abschluss ausdruckt:
176
+ <Tabs group="os">
177
+ <Tab label="macOS / Linux" value="unix">
95
178
 
96
179
  ```sh
97
180
  docker run -d --name intlayer \
98
181
  --restart unless-stopped \
99
- -p 3000:3000 \
100
- -p 3100:3100 \
101
- -p 9000:9000 \
102
- -p 9001:9001 \
182
+ -p 3000:3000 -p 3100:3100 -p 9000:9000 -p 9001:9001 \
103
183
  -v intlayer-data:/data \
104
184
  --env-file ./intlayer.env \
105
- ghcr.io/aymericzip/intlayer-selfhost:latest
185
+ intlayer/cms-all:latest
106
186
  ```
107
187
 
108
- Öffnen Sie dann **http://localhost:3000**. Der erste Start initialisiert die Datenspeicher, geben Sie ihm also eine Minute Zeit.
188
+ </Tab>
189
+ <Tab label="Windows" value="windows">
190
+
191
+ ```powershell
192
+ docker run -d --name intlayer `
193
+ --restart unless-stopped `
194
+ -p 3000:3000 -p 3100:3100 -p 9000:9000 -p 9001:9001 `
195
+ -v intlayer-data:/data `
196
+ --env-file ./intlayer.env `
197
+ intlayer/cms-all:latest
198
+ ```
199
+
200
+ </Tab>
201
+ <Tab label="Intlayer CLI" value="cli">
202
+
203
+ Die CLI führt das Installationsprogramm aus, das den in den anderen Tabs gezeigten Befehl `docker run …` ausgibt. Kopieren Sie ihn nach der Konfiguration des Mailers in Ihr Terminal.
204
+
205
+ </Tab>
206
+ </Tabs>
109
207
 
110
- > Das Dashboard wird auf `localhost` bereitgestellt. Siehe [Limitations](#limitations) — benutzerdefinierte Domains werden vom veröffentlichten Image nicht unterstützt.
208
+ Öffnen Sie **http://localhost:3000** und folgen Sie der [Ersteinrichtung](#first-run-setup). Der erste Start initialisiert das Replica-Set und den Bucket, geben Sie ihm eine Minute Zeit.
111
209
 
112
- ### Installer-Einstellungen
210
+ ### Backup und Upgrade
113
211
 
114
- Das Installationsprogramm liest einige Umgebungsvariablen. Da diese in `sh` weitergeleitet werden, übergeben Sie sie der Shell anstelle von `curl`:
212
+ Der gesamte Zustand liegt im Volume `intlayer-data` (`/data/mongo`, `/data/redis`, `/data/minio`).
115
213
 
116
214
  ```sh
117
- curl -fsSL https://intlayer.org/install.sh | INTLAYER_ENV_FILE=./config/intlayer.env sh
215
+ # Backup (stop the container first so MongoDB's files are consistent)
216
+ docker stop intlayer
217
+ docker run --rm -v intlayer-data:/data -v "$(pwd)":/backup busybox tar czf /backup/intlayer-data.tar.gz /data
218
+ docker start intlayer
219
+
220
+ # Restore
221
+ docker run --rm -v intlayer-data:/data -v "$(pwd)":/backup busybox tar xzf /backup/intlayer-data.tar.gz -C /
118
222
  ```
119
223
 
120
- | Variable | Standard | Beschreibung |
121
- | ------------------------- | --------------------------------------------- | ------------------------------------ |
122
- | `INTLAYER_IMAGE` | `ghcr.io/aymericzip/intlayer-selfhost:latest` | Zu pullendes Image |
123
- | `INTLAYER_ENV_FILE` | `./intlayer.env` | Wo die env-Datei geschrieben wird |
124
- | `INTLAYER_CONTAINER_NAME` | `intlayer` | Container-Name |
125
- | `INTLAYER_DATA_VOLUME` | `intlayer-data` | Named Volume eingebunden bei `/data` |
126
- | `INTLAYER_APP_PORT` | `3000` | Host-Port für das Dashboard |
127
- | `INTLAYER_API_PORT` | `3100` | Host-Port für die API |
128
- | `INTLAYER_S3_PORT` | `9000` | Host-Port für die MinIO S3 API |
129
- | `INTLAYER_CONSOLE_PORT` | `9001` | Host-Port für die MinIO-Konsole |
224
+ Führen Sie zum Aktualisieren das Installationsprogramm erneut aus (es lädt das neueste Image und behält `intlayer.env`), führen Sie dann `docker rm -f intlayer` aus und starten Sie den Startbefehl erneut. Um ein verwaltetes MongoDB statt des gebündelten zu verwenden, setzen Sie `MONGODB_URI` in `intlayer.env`.
130
225
 
131
- > Die vier Port-Variablen ändern nur die **Host**-Seite des Mappings, das im `docker run`-Befehl ausgegeben wird. Das veröffentlichte Image hat `http://localhost:3000`, `http://localhost:3100` und `http://localhost:9000` zur Build-Zeit in das Dashboard-Bundle kompiliert, daher führt deren Neuanordnung dazu, dass der Browser auf die alten Ports zeigt. Behalten Sie die Standardwerte bei, es sei denn, Sie erstellen Ihr eigenes Image — siehe [Einschränkungen](#limitations).
226
+ </Tab>
227
+ <Tab label="Docker Compose" value="compose">
132
228
 
133
- ## Erstmalige Einrichtung
229
+ Ein Container pro Dienst in einem privaten Compose-Netzwerk. Das Dashboard und die API verwenden die veröffentlichten Images `intlayer/cms-frontend` und `intlayer/cms-backend`; die Datenspeicher verwenden die offiziellen Images `mongo`, `redis` und `minio`.
134
230
 
135
- Bei einer frischen Instanz (leere Datenbank) leitet Sie das Öffnen des Dashboards zur Seite **`/init`** weiter:
231
+ ```
232
+ ┌───────────────────┐
233
+ browser ──────▶ │ app :3000 │ ── SSR ──▶ http://backend:3100
234
+ (localhost) └───────────────────┘
235
+ ┌───────────────────┐
236
+ browser ──────▶ │ backend :3100 │
237
+ (localhost) └─────────┬─────────┘
238
+ ┌───────────────┼───────────────┐
239
+ ▼ ▼ ▼
240
+ mongo:27017 redis:6379 minio:9000 ◀── browser (assets)
241
+ (1-node RS) minio:9001
242
+ ```
136
243
 
137
- 1. Erstellen Sie das erste Konto. Da die users-Collection leer ist, wird dieses Konto automatisch zum **super admin** befördert.
138
- 2. Eine Verifizierungs-E-Mail wird gesendet (über Resend). E-Mail-Verifizierung ist **erforderlich** — deshalb muss `RESEND_API_KEY` vor dem Start gesetzt werden.
139
- 3. Klicken Sie auf den Link in der E-Mail und melden Sie sich an.
244
+ | Dienst | Image | Rolle |
245
+ | ------------ | ----------------------- | ------------------------------------------------------------------------------------- |
246
+ | `app` | `intlayer/cms-frontend` | Dashboard auf `:3000`; wartet, bis das Backend gesund ist |
247
+ | `backend` | `intlayer/cms-backend` | API auf `:3100` mit Chromium; wartet auf Mongo, Redis und den MinIO-Bucket |
248
+ | `mongo` | `mongo:8` | Single-Node-Replica-Set `rs0`, initialisiert durch eigenen Healthcheck |
249
+ | `redis` | `redis:8-alpine` | Warteschlangen und Caching, Append-Only-Persistenz |
250
+ | `minio` | `quay.io/minio/minio` | S3-Speicher auf `:9000`, Konsole auf `:9001` |
251
+ | `minio-init` | `quay.io/minio/mc` | Einmalige Ausführung: Erstellt den Bucket und dessen Richtlinie für anonyme Downloads |
252
+
253
+ Die Daten werden in den Volumes `intlayer_mongo-data`, `intlayer_redis-data` und `intlayer_minio-data` gespeichert. Die Dienstverbindungen (`MONGODB_URI`, `REDIS_URL`, `S3_ENDPOINT`, die interne Backend-URL für serverseitiges Rendering) sind in der Compose-Datei festgelegt und haben Vorrang vor `.env`, das nur Secrets und optionale Integrationen enthält.
254
+
255
+ ### Voraussetzungen
256
+
257
+ - **Docker** ≥ 24 mit dem Compose-Plugin: Das Installationsprogramm bietet die Installation unter Linux und macOS an. Installieren Sie unter Windows zuerst [Docker Desktop](https://docs.docker.com/desktop/setup/install/windows-install/) (WSL 2-Backend).
258
+ - Ports `3000`, `3100`, `9000` und `9001` auf dem Host frei.
259
+ - Ein Mailer: Ein [Resend](https://resend.com)-API-Schlüssel oder ein SMTP-Relay.
260
+
261
+ ### 1. Installation
262
+
263
+ Schreibt `docker-compose.yml` und ein `.env` mit den generierten Secrets nach `./intlayer/` und lädt die Images herunter.
140
264
 
141
- Sobald ein Admin existiert, leitet `/init` zur Standard-Anmeldeseite weiter.
265
+ <Tabs group="os">
266
+ <Tab label="macOS / Linux" value="unix">
142
267
 
143
- ## Dienste
268
+ ```sh
269
+ curl -fsSL https://intlayer.org/install.sh | sh -s -- --mode compose
270
+ ```
271
+
272
+ Or by hand:
144
273
 
145
- | Service | Image | Host port(s) | Zweck |
146
- | :---------- | :----------------------------------- | :--------------------------------------------- | :-------------------------------------------------------- |
147
- | **app** | built from `apps/app/Dockerfile` | `3000` | TanStack Start Dashboard (CMS-Benutzeroberfläche) |
148
- | **backend** | built from `apps/backend/Dockerfile` | `3100` | Fastify REST API (`/health` Endpunkt) |
149
- | **mongo** | `mongo:7` | intern | Einzelknoten-Replica Set (`rs0`) |
150
- | **redis** | `redis:7-alpine` | intern | Job-Warteschlangen (BullMQ) und Caching (ioredis) |
151
- | **minio** | `minio/minio` | `9000` (S3), `9001` (Konsole) | S3-kompatibler Objektspeicher für Avatare und Screenshots |
152
- | **mailpit** | `axllent/mailpit` | `1025` (SMTP), `8025` (Web-Benutzeroberfläche) | Lokale Transaktions-E-Mail-Senke |
274
+ ```sh
275
+ mkdir intlayer && cd intlayer
276
+ curl -fsSLO https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/docker-compose.yml
277
+ curl -fsSL https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/.env.template -o .env
278
+ # fill in BETTER_AUTH_SECRET and S3_SECRET_ACCESS_KEY (openssl rand -hex 32)
279
+ ```
280
+
281
+ </Tab>
282
+ <Tab label="Windows" value="windows">
283
+
284
+ In PowerShell:
285
+
286
+ ```powershell
287
+ $env:INTLAYER_MODE = "compose"; irm https://intlayer.org/install.ps1 | iex
288
+ ```
153
289
 
154
- > MinIO-Port `9000` muss vom Browser erreichbar sein, da hochgeladene Assets (Avatare, Screenshots) direkt von `S3_PUBLIC_URL=http://localhost:9000/intlayer` geladen werden.
290
+ Or by hand:
291
+
292
+ ```powershell
293
+ mkdir intlayer; cd intlayer
294
+ irm https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/docker-compose.yml -OutFile docker-compose.yml
295
+ irm https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/.env.template -OutFile .env
296
+ # fill in BETTER_AUTH_SECRET and S3_SECRET_ACCESS_KEY
297
+ ```
298
+
299
+ </Tab>
300
+ <Tab label="Intlayer CLI" value="cli">
301
+
302
+ ```bash
303
+ npx intlayer init infra --mode compose
304
+ ```
305
+
306
+ </Tab>
307
+ </Tabs>
308
+
309
+ ### 2. Mailer konfigurieren
310
+
311
+ Tragen Sie Resend **oder** SMTP in `intlayer/.env` ein, genau wie beim All-in-One-Container (siehe [Globaler Mailer](#global-mailer)).
312
+
313
+ ### 3. Starten
314
+
315
+ ```sh
316
+ cd intlayer && docker compose up -d
317
+ ```
318
+
319
+ Öffnen Sie **http://localhost:3000** und folgen Sie der [Ersteinrichtung](#first-run-setup).
320
+
321
+ ### Verwaltete Datenspeicher
322
+
323
+ Löschen Sie den Dienst, den Sie ersetzen, aus der Compose-Datei (sowie seinen Eintrag in `depends_on` bei `backend`), und überschreiben Sie die entsprechende Variable:
324
+
325
+ ```yaml fileName="docker-compose.yml"
326
+ services:
327
+ backend:
328
+ environment:
329
+ MONGODB_URI: mongodb+srv://user:password@cluster0.xxxxx.mongodb.net/intlayer
330
+ REDIS_URL: rediss://default:password@redis.example.com:6380
331
+ S3_ENDPOINT: https://s3.eu-west-1.amazonaws.com
332
+ S3_PUBLIC_URL: https://intlayer-assets.s3.eu-west-1.amazonaws.com
333
+ ```
334
+
335
+ `S3_ACCESS_KEY_ID` / `S3_SECRET_ACCESS_KEY` / `S3_BUCKET_NAME` behalten ihre Bedeutung gegenüber jedem S3-kompatiblen Anbieter.
336
+
337
+ ### Skalierung
338
+
339
+ `app` und `backend` sind zustandslos (stateless). Hinter einem Load Balancer funktioniert `docker compose up -d --scale backend=3`, sobald die festen Host-Portzuordnungen entfernt wurden und der Proxy die Dienste über den Namen adressiert. Hintergrundaufgaben werden über Redis (BullMQ) koordiniert, sodass mehrere Backend-Replikate die Warteschlange sicher teilen.
340
+
341
+ ### Erstellung aus dem Quellcode
342
+
343
+ Aus einem Checkout des Repositorys schaltet ein Override die beiden Intlayer-Dienste von `image:` auf `build:` um:
344
+
345
+ ```sh
346
+ cd docker/selfhost
347
+ docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build
348
+ ```
349
+
350
+ Auf diese Weise erstellen Sie auch Images für eine benutzerdefinierte Domain: Übergeben Sie die `VITE_*`-Werte als Build-Argumente (siehe [Einschränkungen](#limitations)).
351
+
352
+ ### Backup und Upgrade
353
+
354
+ ```sh
355
+ # Backup one volume (repeat for intlayer_redis-data and intlayer_minio-data)
356
+ docker compose stop
357
+ docker run --rm -v intlayer_mongo-data:/data -v "$(pwd)":/backup busybox tar czf /backup/mongo-data.tar.gz /data
358
+ docker compose start
359
+
360
+ # Upgrade, volumes are kept
361
+ docker compose pull && docker compose up -d
362
+ ```
363
+
364
+ </Tab>
365
+ </Tabs>
366
+
367
+ ### Installationsprogramm-Einstellungen
368
+
369
+ Ohne `--mode` (oder `INTLAYER_MODE`) zeigt das Installationsprogramm ein Menü an: `desktop`, `docker` (All-in-One) oder `compose`. Es liest auch einige Umgebungsvariablen. Da es in die Shell geleitet wird, übergeben Sie diese an die Shell und nicht an `curl`:
370
+
371
+ ```sh
372
+ curl -fsSL https://intlayer.org/install.sh | INTLAYER_COMPOSE_DIR=./cms sh -s -- --mode compose
373
+ ```
374
+
375
+ ```powershell
376
+ $env:INTLAYER_MODE = "compose"; $env:INTLAYER_COMPOSE_DIR = ".\cms"; irm https://intlayer.org/install.ps1 | iex
377
+ ```
378
+
379
+ | Variable | Default | Applies to | Description |
380
+ | ------------------------- | ------------------------- | ---------- | ---------------------------------------------------------- |
381
+ | `INTLAYER_MODE` | _(asked)_ | all | `desktop`, `docker` or `compose`, same as `--mode` |
382
+ | `INTLAYER_DOWNLOAD_DIR` | `~/Downloads` | desktop | Where the app installer is saved |
383
+ | `INTLAYER_IMAGE` | `intlayer/cms-all:latest` | docker | All-in-one image to pull |
384
+ | `INTLAYER_ENV_FILE` | `./intlayer.env` | docker | Where to write the environment file |
385
+ | `INTLAYER_CONTAINER_NAME` | `intlayer` | docker | Container name |
386
+ | `INTLAYER_DATA_VOLUME` | `intlayer-data` | docker | Named volume mounted at `/data` |
387
+ | `INTLAYER_APP_PORT` | `3000` | docker | Host port for the dashboard |
388
+ | `INTLAYER_API_PORT` | `3100` | docker | Host port for the API |
389
+ | `INTLAYER_S3_PORT` | `9000` | docker | Host port for the MinIO S3 API |
390
+ | `INTLAYER_CONSOLE_PORT` | `9001` | docker | Host port for the MinIO console |
391
+ | `INTLAYER_COMPOSE_DIR` | `./intlayer` | compose | Where `docker-compose.yml` and `.env` are written |
392
+ | `INTLAYER_SELFHOST_REF` | `main` | both | Git ref the compose file and env template are fetched from |
393
+
394
+ > Die Portvariablen ändern nur die **Host**-Seite des Mappings. Die veröffentlichten Images haben `http://localhost:3000`, `http://localhost:3100` und `http://localhost:9000` im Dashboard-Bundle kompiliert. Behalten Sie die Standardwerte bei, es sei denn, Sie erstellen eigene Images, siehe [Einschränkungen](#limitations).
395
+
396
+ ## Ersteinrichtung
397
+
398
+ Bei einer neuen Instanz (leere Datenbank) leitet das Öffnen des Dashboards auf die Seite **`/init`** weiter:
399
+
400
+ 1. Erstellen Sie das erste Konto. Da die Benutzersammlung leer ist, wird dieses Konto automatisch zum **Super-Admin** ernannt.
401
+ 2. Eine Bestätigungs-E-Mail wird über Resend oder Ihr SMTP-Relay gesendet. Die E-Mail-Bestätigung ist **obligatorisch**, weshalb vor dem Start ein Mailer konfiguriert werden muss.
402
+ 3. Klicken Sie auf den Link in der E-Mail und melden Sie sich an.
403
+
404
+ Sobald ein Admin existiert, leitet `/init` auf die Standard-Anmeldeseite weiter.
155
405
 
156
406
  ## Umgebungsvariablen
157
407
 
408
+ Beide Docker-Modi lesen dieselbe Datei (`intlayer.env` für den Container, `.env` für Compose), die aus [`docker/selfhost/.env.template`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/self_hosting.md) generiert wird.
409
+
158
410
  ### Erforderlich
159
411
 
160
- | Variable | Beispiel | Beschreibung |
161
- | ---------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
162
- | `DB_ID` | `intlayer` | MongoDB Atlas Benutzer |
163
- | `DB_MDP` | _(dein Passwort)_ | MongoDB Atlas Passwort |
164
- | `DB_CLUSTER` | `cluster0.xxxxx.mongodb.net` | MongoDB Atlas Cluster Host (verwendet in der `mongodb+srv://` URI) |
165
- | `BETTER_AUTH_SECRET` | _(generiert)_ | 32-Byte Secret für Session-Signierung |
166
- | `S3_SECRET_ACCESS_KEY` | _(generiert)_ | Secret für das gebündelte MinIO |
167
- | `RESEND_API_KEY` | _(dein Schlüssel)_ | Transaktionale E-Mail via Resend. Erforderlich für das erste Setup, es sei denn, du konfigurierst einen globalen SMTP Mailer (siehe [Global mailer](#global-mailer)) |
168
-
169
- ### Erforderlich (automatisch generiert oder abgefragt)
170
-
171
- | Variable | Beispiel | Beschreibung |
172
- | :--------------------- | :---------------------------------------------- | :--------------------------------------------------------------- |
173
- | `NODE_ENV` | `production` | Laufzeitumgebung |
174
- | `PORT` | `3100` | Backend-Listenport |
175
- | `BACKEND_URL` | `http://localhost:3100` | Öffentliche URL der Backend-API |
176
- | `APP_URL` | `http://localhost:3000` | Öffentliche URL des Dashboards |
177
- | `DOMAIN` | `localhost` | Cookie-Domain |
178
- | `MONGODB_URI` | `mongodb://mongo:27017/intlayer?replicaSet=rs0` | Vollständige MongoDB-Verbindungs-URI |
179
- | `REDIS_URL` | `redis://redis:6379` | Redis-Verbindungs-URL |
180
- | `BETTER_AUTH_SECRET` | _(generiert)_ | 32-Byte-Secret für die Session-Signierung |
181
- | `MAIL_PROVIDER` | `smtp` | Mail-Transport: `smtp` oder `resend` |
182
- | `MAIL_SMTP_HOST` | `mailpit` | SMTP-Hostname (Mailpit Container-Name) |
183
- | `MAIL_SMTP_PORT` | `1025` | SMTP-Port |
184
- | `MAIL_FROM` | `Intlayer <no-reply@localhost>` | Absenderadresse |
185
- | `S3_ENDPOINT` | `http://minio:9000` | S3-kompatibler Endpunkt |
186
- | `S3_PUBLIC_URL` | `http://localhost:9000/intlayer` | Öffentliche URL für das Laden von Browser-Assets |
187
- | `S3_BUCKET_NAME` | `intlayer` | Bucket-Name |
188
- | `S3_ACCESS_KEY_ID` | _(generiert)_ | MinIO-Zugangsschlüssel |
189
- | `S3_SECRET_ACCESS_KEY` | _(generiert)_ | MinIO-Geheimschlüssel |
190
- | `VITE_BACKEND_URL` | `http://localhost:3100` | Backend-URL, die zur Build-Zeit in das Dashboard integriert wird |
191
- | `VITE_DOMAIN` | `localhost` | Domain, die zur Build-Zeit in das Dashboard integriert wird |
192
-
193
- ### Optional (Funktionen funktionieren bei Abwesenheit eingeschränkt)
194
-
195
- | Variable | Funktion |
196
- | :------------------------------------------------------- | :------------------------------------------------------------------- |
197
- | `OPENAI_API_KEY` | KI-gestützte Übersetzung und Inhaltsprüfung |
198
- | `STRIPE_SECRET_KEY`, `STRIPE_WEBHOOK_SECRET`, `STRIPE_*` | Abrechnung und Abonnementverwaltung |
199
- | `RESEND_API_KEY` | Transaktions-E-Mail über Resend (überschreibt Mailpit, wenn gesetzt) |
200
- | `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` | GitHub OAuth-Login |
201
- | `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` | Google OAuth-Login |
202
- | `GITLAB_CLIENT_ID`, `GITLAB_CLIENT_SECRET` | GitLab OAuth-Login |
203
- | `MICROSOFT_CLIENT_ID`, `MICROSOFT_CLIENT_SECRET` | Microsoft OAuth-Login |
204
- | `LINKEDIN_CLIENT_ID`, `LINKEDIN_CLIENT_SECRET` | LinkedIn OAuth-Login |
205
- | `ATLASSIAN_CLIENT_ID`, `ATLASSIAN_CLIENT_SECRET` | Atlassian OAuth-Login |
206
-
207
- ### Global mailer
208
-
209
- By default, all transactional emails are sent through Resend using `RESEND_API_KEY`. Self-hosted deployments can instead route **every** email — including non-organization emails such as password resets and magic links — through a global mailer configured with environment variables.
210
-
211
- Set `MAIL_PROVIDER` to activate it. When unset, the default Resend mailer is used.
212
-
213
- | Variable | Example | Description |
214
- | -------------------- | ------------------------------ | ----------------------------------------------------------------- |
215
- | `MAIL_PROVIDER` | `smtp` | Global transport: `smtp` or `resend`. Leave unset to use defaults |
216
- | `MAIL_FROM` | `Intlayer <no-reply@acme.com>` | Sender header. Accepts a bare address or `Name <email>` format |
217
- | `MAIL_SMTP_HOST` | `smtp.acme.com` | SMTP host (required when `MAIL_PROVIDER=smtp`) |
218
- | `MAIL_SMTP_PORT` | `587` | SMTP port (defaults to `587`) |
219
- | `MAIL_SMTP_SECURE` | `false` | Implicit TLS. Set `true` for port `465` |
220
- | `MAIL_SMTP_USER` | _(your user)_ | SMTP username (optional; omit for unauthenticated relays) |
221
- | `MAIL_SMTP_PASSWORD` | _(your password)_ | SMTP password |
222
-
223
- > Precedence: an organization's own mailer (configured from the **Organization** dashboard) takes priority over the global mailer, which in turn takes priority over the default Resend key.
224
-
225
- ## Ihr Intlayer-Projekt verbinden
226
-
227
- Sobald der Stack läuft, verweisen Sie Ihr Projekt auf das selbst gehostete Backend und Dashboard anstelle von `intlayer.org`.
412
+ | Variable | Example | Description |
413
+ | ---------------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
414
+ | `BETTER_AUTH_SECRET` | _(generated)_ | 32-byte secret for session signing |
415
+ | `S3_SECRET_ACCESS_KEY` | _(generated)_ | Secret for the bundled MinIO |
416
+ | `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)) |
417
+
418
+ ### Durch das Deployment festgelegt
419
+
420
+ These are set by the image (all-in-one) or by the compose file, and only need overriding for a non-standard topology.
421
+
422
+ | Variable | All-in-one | Docker Compose | Description |
423
+ | ------------------ | --------------------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------- |
424
+ | `PORT` | `3100` | `3100` | Backend listening port |
425
+ | `APP_URL` | `http://localhost:3000` | `http://localhost:3000` | Public URL of the dashboard |
426
+ | `BACKEND_URL` | `http://localhost:3100` | `http://localhost:3100` | Public URL of the backend API |
427
+ | `DOMAIN` | `localhost` | `localhost` | Cookie domain |
428
+ | `SELF_HOSTED` | `true` | `true` | Disables the cloud-only API endpoints (billing, subscriptions, marketplace) |
429
+ | `MONGODB_URI` | `mongodb://127.0.0.1:27017/intlayer?replicaSet=rs0` | `mongodb://mongo:27017/…` | MongoDB connection string, any `mongodb://` or `mongodb+srv://` cluster works |
430
+ | `REDIS_URL` | `redis://127.0.0.1:6379` | `redis://redis:6379` | Redis |
431
+ | `S3_ENDPOINT` | `http://127.0.0.1:9000` | `http://minio:9000` | MinIO (server-to-server) |
432
+ | `S3_PUBLIC_URL` | `http://localhost:9000/intlayer` | `http://localhost:9000/intlayer` | Public URL for browser asset loading |
433
+ | `S3_BUCKET_NAME` | `intlayer` | `intlayer` | Bucket name |
434
+ | `S3_ACCESS_KEY_ID` | `intlayer` | `intlayer` | MinIO access key |
435
+
436
+ Der Compose-Dienst `app` erhält zusätzlich `INTLAYER_BACKEND_INTERNAL_URL=http://backend:3100`: Der Browser erreicht die API über `localhost:3100`, aber das serverseitige Rendering läuft innerhalb des Compose-Netzwerks und muss den Dienstnamen verwenden.
437
+
438
+ ### Optional (Funktionen fallen ohne sie sauber aus)
439
+
440
+ | Variable | Feature |
441
+ | ------------------------------------------------ | ----------------------------------------- |
442
+ | `OPENAI_API_KEY` | AI-assisted translation and content audit |
443
+ | `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` | GitHub OAuth login |
444
+ | `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` | Google OAuth login |
445
+ | `GITLAB_CLIENT_ID`, `GITLAB_CLIENT_SECRET` | GitLab OAuth login |
446
+ | `MICROSOFT_CLIENT_ID`, `MICROSOFT_CLIENT_SECRET` | Microsoft OAuth login |
447
+
448
+ ### Globaler Mailer
449
+
450
+ Jede transaktionale E-Mail, einschließlich E-Mails außerhalb der Organisation wie Passwort-Resets und Magic Links, läuft über einen von zwei globalen Transporten:
451
+
452
+ - **Resend**, unter Verwendung von `RESEND_API_KEY`.
453
+ - **SMTP**, unter Verwendung der Variablen `MAIL_SMTP_*`. Sobald `MAIL_SMTP_HOST` gesetzt ist, wird SMTP verwendet und `RESEND_API_KEY` ignoriert.
454
+
455
+ `MAIL_PROVIDER` wird nur benötigt, um einen Transport zu erzwingen, wenn beide konfiguriert sind (z. B. `MAIL_PROVIDER=resend`, um Resend beizubehalten, während ein SMTP-Host vorhanden ist).
456
+
457
+ | Variable | Example | Description |
458
+ | -------------------- | ------------------------------ | ---------------------------------------------------------------------------- |
459
+ | `MAIL_FROM` | `Intlayer <no-reply@acme.com>` | Sender header for either transport. Accepts a bare address or `Name <email>` |
460
+ | `MAIL_SMTP_HOST` | `smtp.acme.com` | SMTP host. Setting it selects the SMTP transport |
461
+ | `MAIL_SMTP_PORT` | `587` | SMTP port (defaults to `587`) |
462
+ | `MAIL_SMTP_SECURE` | `false` | Implicit TLS. Set `true` for port `465` |
463
+ | `MAIL_SMTP_USER` | _(your user)_ | SMTP username (optional; omit for unauthenticated relays) |
464
+ | `MAIL_SMTP_PASSWORD` | _(your password)_ | SMTP password |
465
+ | `MAIL_PROVIDER` | `resend` | Optional override: `smtp` or `resend`. Leave unset to auto-select |
466
+
467
+ > Rangfolge: Der eigene Mailer einer Organisation (im Dashboard unter **Organisation** konfiguriert) hat Vorrang vor dem globalen Mailer, der wiederum Vorrang vor dem standardmäßigen Resend-Schlüssel hat.
468
+
469
+ ## Verbinden Ihres Intlayer-Projekts
470
+
471
+ Sobald der Stack läuft, verweisen Sie mit Ihrem Projekt auf das selbst gehostete Backend und Dashboard anstelle von `intlayer.org`.
228
472
 
229
473
  ### Projektkonfiguration
230
474
 
@@ -237,14 +481,14 @@ const config: IntlayerConfig = {
237
481
  clientSecret: process.env.INTLAYER_CLIENT_SECRET,
238
482
 
239
483
  /**
240
- * URL des selbst gehosteten CMS-Dashboards.
241
- * Standard: https://app.intlayer.org
484
+ * URL of the self-hosted CMS dashboard.
485
+ * Default: https://app.intlayer.org
242
486
  */
243
487
  cmsURL: process.env.INTLAYER_CMS_URL, // e.g. http://localhost:3000
244
488
 
245
489
  /**
246
- * URL der selbst gehosteten Backend-API.
247
- * Standard: https://back.intlayer.org
490
+ * URL of the self-hosted backend API.
491
+ * Default: https://back.intlayer.org
248
492
  */
249
493
  backendURL: process.env.INTLAYER_BACKEND_URL, // e.g. http://localhost:3100
250
494
  },
@@ -253,7 +497,7 @@ const config: IntlayerConfig = {
253
497
  export default config;
254
498
  ```
255
499
 
256
- Setzen Sie die Umgebungsvariablen in der `.env` Ihres Projekts:
500
+ Set the environment variables in your project's `.env`:
257
501
 
258
502
  ```sh
259
503
  INTLAYER_CMS_URL=http://localhost:3000
@@ -262,11 +506,11 @@ INTLAYER_CLIENT_ID=<your-client-id>
262
506
  INTLAYER_CLIENT_SECRET=<your-client-secret>
263
507
  ```
264
508
 
265
- Erstellen Sie Zugangsdaten in Ihrem selbst gehosteten Dashboard unter **Projects → Access keys** unter `http://localhost:3000/projects`.
509
+ Erstellen Sie Zugangsdaten in Ihrem selbst gehosteten Dashboard unter **Projekte → Zugriffsschlüssel** unter `http://localhost:3000/projects`.
266
510
 
267
- ### `@intlayer/api` SDK
511
+ ### `@intlayer/api`-SDK
268
512
 
269
- Wenn Sie das `@intlayer/api` SDK programmatisch verwenden, übergeben Sie `backendURL` explizit:
513
+ Wenn Sie das `@intlayer/api`-SDK programmatisch verwenden, übergeben Sie `backendURL` explizit:
270
514
 
271
515
  ```typescript fileName="cms.ts" codeFormat="typescript"
272
516
  import { createIntlayerCMS } from "@intlayer/api";
@@ -283,84 +527,17 @@ const cms = createIntlayerCMS({
283
527
  const { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();
284
528
  ```
285
529
 
286
- ## Upgrade
287
-
288
- Ein erneutes Ausführen des Installers auf einer bestehenden Bereitstellung führt ein Rolling-Upgrade durch:
289
-
290
- ```sh
291
- docker compose pull
292
- docker compose up -d
293
- ```
294
-
295
- ## Backup und Wiederherstellung
296
-
297
- Alle persistenten Daten befinden sich in drei benannten Docker-Volumes.
298
-
299
- ### Backup
300
-
301
- ```sh
302
- docker run --rm \
303
- -v intlayer_mongo-data:/data \
304
- -v "$(pwd)":/backup \
305
- busybox tar czf /backup/mongo-data.tar.gz /data
306
-
307
- docker run --rm \
308
- -v intlayer_redis-data:/data \
309
- -v "$(pwd)":/backup \
310
- busybox tar czf /backup/redis-data.tar.gz /data
311
-
312
- docker run --rm \
313
- -v intlayer_minio-data:/data \
314
- -v "$(pwd)":/backup \
315
- busybox tar czf /backup/minio-data.tar.gz /data
316
- ```
317
-
318
- ### Wiederherstellung
319
-
320
- ```sh
321
- docker run --rm \
322
- -v intlayer_mongo-data:/data \
323
- -v "$(pwd)":/backup \
324
- busybox tar xzf /backup/mongo-data.tar.gz -C /
325
-
326
- # Wiederholen Sie dies für redis-data und minio-data
327
- ```
328
-
329
530
  ## Einschränkungen
330
531
 
331
- - **MongoDB muss extern sein (Atlas).** Das Backend verbindet sich nur über `mongodb+srv://` (zusammengesetzt aus `DB_ID` / `DB_MDP` / `DB_CLUSTER`), daher kann ein einfaches `mongodb://host:27017` — einschließlich des eigenen `mongod` des Containers — nicht verwendet werden. Stellen Sie einen MongoDB Atlas Cluster bereit.
332
- - **Keine benutzerdefinierte Domain.** Alle browsergestützten `VITE_*` URLs werden zur Build-Zeit in die App inline eingefügt, und das veröffentlichte Image wird mit `localhost` Werten ausgeliefert. Das Dashboard muss unter `http://localhost:3000` aufgerufen werden; das Serving auf einer öffentlichen Domain würde ein Neubau des Images mit den eingebetteten Ziel-URLs erfordern und wird out-of-the-box nicht unterstützt.
333
- - **E-Mail erfordert einen funktionierenden Mailer.** Das Setup beim ersten Durchlauf erzwingt eine E-Mail-Verifizierung, daher muss entweder `RESEND_API_KEY` oder ein [globaler SMTP Mailer](#global-mailer) (`MAIL_PROVIDER=smtp` + `MAIL_SMTP_*`) konfiguriert sein. Nach der ersten Anmeldung eines Administrators kann jede Organisation auch ihren eigenen SMTP oder Resend Mailer vom Dashboard aus konfigurieren.
334
-
335
- ## Fehlerbehebung
336
-
337
- ### Backend-Absturzschleifen beim ersten Start
338
-
339
- MongoDB und Redis müssen fehlerfrei sein, bevor das Backend startet. Die Compose-Datei verwendet `depends_on` mit `condition: service_healthy`. Wenn Sie wiederholte Backend-Neustarts sehen, überprüfen Sie, ob die `mongo`- und `redis`-Healthchecks erfolgreich sind:
340
-
341
- ```sh
342
- docker compose ps
343
- docker compose logs mongo
344
- docker compose logs redis
345
- ```
346
-
347
- Suchen Sie nach `MongoDB connection error` oben im Log.
348
-
349
- ### E-Mail wird nicht gesendet
350
-
351
- Standardmäßig werden alle ausgehenden E-Mails von Mailpit abgefangen. Öffnen Sie `http://localhost:8025`, um gesendete Nachrichten anzuzeigen. Um echte E-Mails zu senden, setzen Sie `MAIL_PROVIDER=resend` und `RESEND_API_KEY=<Ihr-Schlüssel>` in `.env` und starten Sie dann das Backend neu:
352
-
353
- ### MinIO-Bucket fehlt
354
-
355
- Wenn der `minio-init`-One-Shot-Service nicht ausgeführt wurde (oder vor der Bereitschaft von MinIO lief), erstellen Sie den Bucket manuell:
356
-
357
- ```sh
358
- docker compose run --rm minio-init
359
- ```
532
+ - **Keine benutzerdefinierte Domain und kein Port-Remapping.** Alle für den Browser sichtbaren `VITE_*`-URLs sind während des Builds in das Dashboard eingebunden, und die veröffentlichten Images (sowie die Desktop-App) werden mit `localhost` / Intlayer Cloud-Werten ausgeliefert. Auf das Dashboard muss unter `http://localhost:3000`, die API unter `:3100` und MinIO unter `:9000` zugegriffen werden. Die Bereitstellung auf einer öffentlichen Domain oder das Ausrichten der Desktop-App auf ein selbst gehostetes Backend erfordert das Neuerstellen mit integrierten Ziel-URLs (`--build-arg VITE_BACKEND_URL=… VITE_SITE_URL=… VITE_DOMAIN=…` auf `docker/selfhost/Dockerfile` oder über `docker-compose.build.yml`) und wird nicht standardmäßig unterstützt.
533
+ - **E-Mail erfordert einen funktionierenden Mailer.** Die Ersteinrichtung erzwingt die E-Mail-Verifizierung, daher muss entweder `RESEND_API_KEY` oder ein [SMTP-Relay](#global-mailer) (`MAIL_SMTP_*`) konfiguriert werden. Nachdem sich der erste Admin angemeldet hat, kann jede Organisation auch ihren eigenen SMTP- oder Resend-Mailer im Dashboard konfigurieren.
534
+ - **Die Desktop-App benötigt Node.js** auf dem Computer, um ihren eingebetteten Server zu starten.
360
535
 
361
536
  ## Nützliche Links
362
537
 
363
538
  - [Intlayer CMS-Dokumentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/intlayer_CMS.md)
364
539
  - [Konfigurationsreferenz](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/configuration.md)
365
- - [CMS SDK — `@intlayer/api`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/intlayer_CMS.md#programmatic-access-with-the-intlayerapi-sdk)
366
- - [Docker Image (aymercizip/intlayer-selfhost)](https://hub.docker.com/repository/docker/aymercizip/intlayer-selfhost/general)
540
+ - [CMS SDK: `@intlayer/api`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/intlayer_CMS.md#programmatic-access-with-the-intlayerapi-sdk)
541
+ - [Releases der Desktop-App](https://github.com/aymericzip/intlayer/releases/latest)
542
+ - 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), gespiegelt auf GHCR unter `ghcr.io/aymericzip/intlayer/`
543
+ - [`docker/selfhost/`](https://github.com/aymericzip/intlayer/tree/main/docker/selfhost): Dockerfile, `docker-compose.yml` und `.env.template`