@intlayer/docs 9.5.6 → 9.5.8

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 (643) 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/is_intlayer_lighter_than_paraglide.md +284 -0
  4. package/blog/ar/lingui_vs_intlayer.md +122 -15
  5. package/blog/ar/next-intl_vs_intlayer-next-intl.md +124 -15
  6. package/blog/ar/next-intl_vs_intlayer.md +136 -20
  7. package/blog/ar/vue-i18n_vs_intlayer-vue-i18n.md +119 -17
  8. package/blog/ar/vue-i18n_vs_intlayer.md +193 -31
  9. package/blog/ar/vue-i18n_vs_intlayer_benchmark.md +361 -0
  10. package/blog/de/i18next_vs_intlayer-i18next.md +122 -15
  11. package/blog/de/i18next_vs_intlayer.md +128 -14
  12. package/blog/de/is_intlayer_lighter_than_paraglide.md +284 -0
  13. package/blog/de/lingui_vs_intlayer.md +122 -15
  14. package/blog/de/next-intl_vs_intlayer-next-intl.md +124 -15
  15. package/blog/de/next-intl_vs_intlayer.md +125 -15
  16. package/blog/de/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  17. package/blog/de/vue-i18n_vs_intlayer.md +193 -31
  18. package/blog/en/i18next_vs_intlayer-i18next.md +121 -14
  19. package/blog/en/i18next_vs_intlayer.md +128 -14
  20. package/blog/en/is_intlayer_lighter_than_paraglide.md +288 -0
  21. package/blog/en/lingui_vs_intlayer.md +124 -15
  22. package/blog/en/next-intl_vs_intlayer-next-intl.md +123 -14
  23. package/blog/en/next-intl_vs_intlayer.md +125 -13
  24. package/blog/en/vue-i18n_vs_intlayer-vue-i18n.md +115 -15
  25. package/blog/en/vue-i18n_vs_intlayer.md +188 -27
  26. package/blog/en-GB/i18next_vs_intlayer-i18next.md +121 -14
  27. package/blog/en-GB/i18next_vs_intlayer.md +128 -14
  28. package/blog/en-GB/is_intlayer_lighter_than_paraglide.md +285 -0
  29. package/blog/en-GB/lingui_vs_intlayer.md +122 -15
  30. package/blog/en-GB/next-intl_vs_intlayer-next-intl.md +124 -15
  31. package/blog/en-GB/next-intl_vs_intlayer.md +125 -15
  32. package/blog/en-GB/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  33. package/blog/en-GB/vue-i18n_vs_intlayer.md +187 -25
  34. package/blog/en-GB/vue-i18n_vs_intlayer_benchmark.md +116 -0
  35. package/blog/es/i18next_vs_intlayer-i18next.md +122 -15
  36. package/blog/es/i18next_vs_intlayer.md +128 -14
  37. package/blog/es/is_intlayer_lighter_than_paraglide.md +284 -0
  38. package/blog/es/lingui_vs_intlayer.md +122 -15
  39. package/blog/es/next-intl_vs_intlayer-next-intl.md +124 -15
  40. package/blog/es/next-intl_vs_intlayer.md +125 -15
  41. package/blog/es/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  42. package/blog/es/vue-i18n_vs_intlayer.md +193 -31
  43. package/blog/fr/i18next_vs_intlayer-i18next.md +122 -15
  44. package/blog/fr/i18next_vs_intlayer.md +128 -14
  45. package/blog/fr/is_intlayer_lighter_than_paraglide.md +284 -0
  46. package/blog/fr/lingui_vs_intlayer.md +122 -15
  47. package/blog/fr/next-intl_vs_intlayer-next-intl.md +124 -15
  48. package/blog/fr/next-intl_vs_intlayer.md +127 -15
  49. package/blog/fr/vue-i18n_vs_intlayer-vue-i18n.md +118 -17
  50. package/blog/fr/vue-i18n_vs_intlayer.md +192 -31
  51. package/blog/fr/vue-i18n_vs_intlayer_benchmark.md +329 -7
  52. package/blog/hi/i18next_vs_intlayer-i18next.md +122 -15
  53. package/blog/hi/i18next_vs_intlayer.md +130 -16
  54. package/blog/hi/is_intlayer_lighter_than_paraglide.md +284 -0
  55. package/blog/hi/lingui_vs_intlayer.md +122 -15
  56. package/blog/hi/next-intl_vs_intlayer-next-intl.md +124 -15
  57. package/blog/hi/next-intl_vs_intlayer.md +135 -19
  58. package/blog/hi/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  59. package/blog/hi/vue-i18n_vs_intlayer.md +193 -31
  60. package/blog/hi/vue-i18n_vs_intlayer_benchmark.md +361 -0
  61. package/blog/id/i18next_vs_intlayer-i18next.md +122 -15
  62. package/blog/id/i18next_vs_intlayer.md +128 -14
  63. package/blog/id/is_intlayer_lighter_than_paraglide.md +284 -0
  64. package/blog/id/lingui_vs_intlayer.md +122 -15
  65. package/blog/id/next-intl_vs_intlayer-next-intl.md +124 -15
  66. package/blog/id/next-intl_vs_intlayer.md +135 -19
  67. package/blog/id/vue-i18n_vs_intlayer-vue-i18n.md +354 -2
  68. package/blog/id/vue-i18n_vs_intlayer.md +188 -26
  69. package/blog/id/vue-i18n_vs_intlayer_benchmark.md +327 -7
  70. package/blog/it/i18next_vs_intlayer-i18next.md +122 -15
  71. package/blog/it/i18next_vs_intlayer.md +128 -14
  72. package/blog/it/is_intlayer_lighter_than_paraglide.md +284 -0
  73. package/blog/it/lingui_vs_intlayer.md +122 -15
  74. package/blog/it/next-intl_vs_intlayer-next-intl.md +124 -15
  75. package/blog/it/next-intl_vs_intlayer.md +125 -15
  76. package/blog/it/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  77. package/blog/it/vue-i18n_vs_intlayer.md +191 -31
  78. package/blog/it/vue-i18n_vs_intlayer_benchmark.md +332 -5
  79. package/blog/ja/i18next_vs_intlayer-i18next.md +122 -15
  80. package/blog/ja/i18next_vs_intlayer.md +129 -17
  81. package/blog/ja/is_intlayer_lighter_than_paraglide.md +284 -0
  82. package/blog/ja/lingui_vs_intlayer.md +122 -15
  83. package/blog/ja/next-intl_vs_intlayer-next-intl.md +124 -15
  84. package/blog/ja/next-intl_vs_intlayer.md +124 -14
  85. package/blog/ja/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  86. package/blog/ja/vue-i18n_vs_intlayer.md +193 -31
  87. package/blog/ja/vue-i18n_vs_intlayer_benchmark.md +361 -0
  88. package/blog/ko/i18next_vs_intlayer-i18next.md +122 -15
  89. package/blog/ko/i18next_vs_intlayer.md +129 -17
  90. package/blog/ko/is_intlayer_lighter_than_paraglide.md +284 -0
  91. package/blog/ko/lingui_vs_intlayer.md +122 -15
  92. package/blog/ko/next-intl_vs_intlayer-next-intl.md +124 -15
  93. package/blog/ko/next-intl_vs_intlayer.md +134 -18
  94. package/blog/ko/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  95. package/blog/ko/vue-i18n_vs_intlayer.md +193 -31
  96. package/blog/pl/i18next_vs_intlayer-i18next.md +122 -15
  97. package/blog/pl/i18next_vs_intlayer.md +128 -14
  98. package/blog/pl/is_intlayer_lighter_than_paraglide.md +284 -0
  99. package/blog/pl/lingui_vs_intlayer.md +122 -15
  100. package/blog/pl/next-intl_vs_intlayer-next-intl.md +124 -15
  101. package/blog/pl/next-intl_vs_intlayer.md +134 -18
  102. package/blog/pl/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  103. package/blog/pl/vue-i18n_vs_intlayer.md +188 -26
  104. package/blog/pl/vue-i18n_vs_intlayer_benchmark.md +361 -0
  105. package/blog/pt/i18next_vs_intlayer-i18next.md +122 -15
  106. package/blog/pt/i18next_vs_intlayer.md +128 -14
  107. package/blog/pt/is_intlayer_lighter_than_paraglide.md +284 -0
  108. package/blog/pt/lingui_vs_intlayer.md +122 -15
  109. package/blog/pt/next-intl_vs_intlayer-next-intl.md +124 -15
  110. package/blog/pt/next-intl_vs_intlayer.md +131 -15
  111. package/blog/pt/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  112. package/blog/pt/vue-i18n_vs_intlayer.md +193 -31
  113. package/blog/pt/vue-i18n_vs_intlayer_benchmark.md +361 -0
  114. package/blog/ru/i18next_vs_intlayer-i18next.md +122 -15
  115. package/blog/ru/i18next_vs_intlayer.md +130 -16
  116. package/blog/ru/is_intlayer_lighter_than_paraglide.md +284 -0
  117. package/blog/ru/lingui_vs_intlayer.md +122 -15
  118. package/blog/ru/next-intl_vs_intlayer-next-intl.md +125 -16
  119. package/blog/ru/next-intl_vs_intlayer.md +123 -13
  120. package/blog/ru/vue-i18n_vs_intlayer-vue-i18n.md +127 -27
  121. package/blog/ru/vue-i18n_vs_intlayer.md +193 -31
  122. package/blog/ru/vue-i18n_vs_intlayer_benchmark.md +326 -19
  123. package/blog/tr/i18next_vs_intlayer-i18next.md +122 -15
  124. package/blog/tr/i18next_vs_intlayer.md +128 -14
  125. package/blog/tr/is_intlayer_lighter_than_paraglide.md +284 -0
  126. package/blog/tr/lingui_vs_intlayer.md +122 -15
  127. package/blog/tr/next-intl_vs_intlayer-next-intl.md +124 -15
  128. package/blog/tr/next-intl_vs_intlayer.md +136 -20
  129. package/blog/tr/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  130. package/blog/tr/vue-i18n_vs_intlayer.md +188 -26
  131. package/blog/tr/vue-i18n_vs_intlayer_benchmark.md +361 -0
  132. package/blog/uk/i18next_vs_intlayer-i18next.md +122 -15
  133. package/blog/uk/i18next_vs_intlayer.md +130 -16
  134. package/blog/uk/is_intlayer_lighter_than_paraglide.md +284 -0
  135. package/blog/uk/lingui_vs_intlayer.md +122 -15
  136. package/blog/uk/next-intl_vs_intlayer-next-intl.md +124 -15
  137. package/blog/uk/next-intl_vs_intlayer.md +135 -19
  138. package/blog/uk/vue-i18n_vs_intlayer-vue-i18n.md +135 -17
  139. package/blog/uk/vue-i18n_vs_intlayer.md +188 -27
  140. package/blog/uk/vue-i18n_vs_intlayer_benchmark.md +361 -0
  141. package/blog/vi/i18next_vs_intlayer-i18next.md +122 -15
  142. package/blog/vi/i18next_vs_intlayer.md +128 -14
  143. package/blog/vi/is_intlayer_lighter_than_paraglide.md +284 -0
  144. package/blog/vi/lingui_vs_intlayer.md +122 -15
  145. package/blog/vi/next-intl_vs_intlayer-next-intl.md +124 -15
  146. package/blog/vi/next-intl_vs_intlayer.md +135 -19
  147. package/blog/vi/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  148. package/blog/vi/vue-i18n_vs_intlayer.md +188 -26
  149. package/blog/vi/vue-i18n_vs_intlayer_benchmark.md +361 -0
  150. package/blog/zh/i18next_vs_intlayer-i18next.md +122 -15
  151. package/blog/zh/i18next_vs_intlayer.md +128 -14
  152. package/blog/zh/is_intlayer_lighter_than_paraglide.md +284 -0
  153. package/blog/zh/lingui_vs_intlayer.md +122 -15
  154. package/blog/zh/next-intl_vs_intlayer-next-intl.md +124 -15
  155. package/blog/zh/next-intl_vs_intlayer.md +125 -15
  156. package/blog/zh/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
  157. package/blog/zh/vue-i18n_vs_intlayer.md +192 -31
  158. package/blog/zh/vue-i18n_vs_intlayer_benchmark.md +340 -9
  159. package/dist/cjs/generated/blog.entry.cjs +20 -0
  160. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  161. package/dist/cjs/generated/docs.entry.cjs +60 -40
  162. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  163. package/dist/esm/generated/blog.entry.mjs +20 -0
  164. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  165. package/dist/esm/generated/docs.entry.mjs +60 -40
  166. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  167. package/dist/types/generated/blog.entry.d.ts +1 -0
  168. package/dist/types/generated/blog.entry.d.ts.map +1 -1
  169. package/dist/types/generated/docs.entry.d.ts +3 -2
  170. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  171. package/docs/ar/benchmark/nextjs.md +19 -16
  172. package/docs/ar/benchmark/solid.md +26 -9
  173. package/docs/ar/benchmark/svelte.md +22 -7
  174. package/docs/ar/benchmark/tanstack.md +20 -16
  175. package/docs/ar/benchmark/vue.md +19 -10
  176. package/docs/ar/chrome_extension.md +130 -0
  177. package/docs/ar/cli/index.md +11 -1
  178. package/docs/ar/cli/infra.md +162 -0
  179. package/docs/ar/cli/init.md +24 -1
  180. package/docs/ar/cli/upgrade.md +125 -0
  181. package/docs/ar/dictionary/html.md +173 -5
  182. package/docs/ar/dictionary/markdown.md +263 -1
  183. package/docs/ar/intlayer_with_analog.md +23 -1
  184. package/docs/ar/intlayer_with_angular_19.md +24 -1
  185. package/docs/ar/intlayer_with_angular_21.md +24 -1
  186. package/docs/ar/intlayer_with_astro.md +24 -1
  187. package/docs/ar/intlayer_with_astro_lit.md +25 -1
  188. package/docs/ar/intlayer_with_astro_preact.md +26 -1
  189. package/docs/ar/intlayer_with_astro_react.md +26 -1
  190. package/docs/ar/intlayer_with_astro_solid.md +26 -1
  191. package/docs/ar/intlayer_with_astro_svelte.md +25 -1
  192. package/docs/ar/intlayer_with_astro_vue.md +25 -1
  193. package/docs/ar/intlayer_with_remix_3.md +22 -1
  194. package/docs/ar/self_hosting.md +406 -231
  195. package/docs/de/benchmark/nextjs.md +19 -16
  196. package/docs/de/benchmark/solid.md +26 -9
  197. package/docs/de/benchmark/svelte.md +22 -7
  198. package/docs/de/benchmark/tanstack.md +20 -16
  199. package/docs/de/benchmark/vue.md +19 -10
  200. package/docs/de/chrome_extension.md +130 -0
  201. package/docs/de/cli/index.md +11 -1
  202. package/docs/de/cli/infra.md +162 -0
  203. package/docs/de/cli/init.md +24 -1
  204. package/docs/de/cli/upgrade.md +125 -0
  205. package/docs/de/dictionary/html.md +173 -5
  206. package/docs/de/dictionary/markdown.md +263 -1
  207. package/docs/de/intlayer_with_analog.md +23 -1
  208. package/docs/de/intlayer_with_angular_19.md +24 -1
  209. package/docs/de/intlayer_with_angular_21.md +24 -1
  210. package/docs/de/intlayer_with_astro.md +24 -1
  211. package/docs/de/intlayer_with_astro_lit.md +25 -1
  212. package/docs/de/intlayer_with_astro_preact.md +26 -1
  213. package/docs/de/intlayer_with_astro_react.md +26 -1
  214. package/docs/de/intlayer_with_astro_solid.md +26 -1
  215. package/docs/de/intlayer_with_astro_svelte.md +25 -1
  216. package/docs/de/intlayer_with_astro_vue.md +25 -1
  217. package/docs/de/intlayer_with_remix_3.md +22 -1
  218. package/docs/de/self_hosting.md +404 -227
  219. package/docs/en/agent_skills.md +29 -1
  220. package/docs/en/benchmark/nextjs.md +19 -16
  221. package/docs/en/benchmark/solid.md +26 -9
  222. package/docs/en/benchmark/svelte.md +22 -7
  223. package/docs/en/benchmark/tanstack.md +21 -17
  224. package/docs/en/benchmark/vue.md +20 -11
  225. package/docs/en/chrome_extension.md +130 -0
  226. package/docs/en/cli/index.md +11 -1
  227. package/docs/en/cli/infra.md +175 -0
  228. package/docs/en/cli/init.md +25 -1
  229. package/docs/en/cli/upgrade.md +125 -0
  230. package/docs/en/dictionary/html.md +173 -5
  231. package/docs/en/dictionary/markdown.md +263 -1
  232. package/docs/en/intlayer_with_analog.md +23 -1
  233. package/docs/en/intlayer_with_angular_19.md +24 -1
  234. package/docs/en/intlayer_with_angular_21.md +24 -1
  235. package/docs/en/intlayer_with_astro.md +24 -1
  236. package/docs/en/intlayer_with_astro_lit.md +25 -1
  237. package/docs/en/intlayer_with_astro_preact.md +26 -1
  238. package/docs/en/intlayer_with_astro_react.md +26 -1
  239. package/docs/en/intlayer_with_astro_solid.md +26 -1
  240. package/docs/en/intlayer_with_astro_svelte.md +25 -1
  241. package/docs/en/intlayer_with_astro_vue.md +25 -1
  242. package/docs/en/intlayer_with_remix_3.md +22 -1
  243. package/docs/en/self_hosting.md +418 -176
  244. package/docs/en-GB/benchmark/nextjs.md +19 -16
  245. package/docs/en-GB/benchmark/solid.md +26 -9
  246. package/docs/en-GB/benchmark/svelte.md +22 -7
  247. package/docs/en-GB/benchmark/tanstack.md +20 -16
  248. package/docs/en-GB/benchmark/vue.md +20 -11
  249. package/docs/en-GB/chrome_extension.md +130 -0
  250. package/docs/en-GB/cli/index.md +11 -1
  251. package/docs/en-GB/cli/infra.md +162 -0
  252. package/docs/en-GB/cli/init.md +24 -1
  253. package/docs/en-GB/cli/upgrade.md +125 -0
  254. package/docs/en-GB/dictionary/html.md +173 -5
  255. package/docs/en-GB/dictionary/markdown.md +263 -1
  256. package/docs/en-GB/intlayer_with_analog.md +23 -1
  257. package/docs/en-GB/intlayer_with_angular_19.md +24 -1
  258. package/docs/en-GB/intlayer_with_angular_21.md +24 -1
  259. package/docs/en-GB/intlayer_with_astro.md +24 -1
  260. package/docs/en-GB/intlayer_with_astro_lit.md +25 -1
  261. package/docs/en-GB/intlayer_with_astro_preact.md +26 -1
  262. package/docs/en-GB/intlayer_with_astro_react.md +26 -1
  263. package/docs/en-GB/intlayer_with_astro_solid.md +26 -1
  264. package/docs/en-GB/intlayer_with_astro_svelte.md +25 -1
  265. package/docs/en-GB/intlayer_with_astro_vue.md +25 -1
  266. package/docs/en-GB/intlayer_with_remix_3.md +22 -1
  267. package/docs/en-GB/self_hosting.md +381 -206
  268. package/docs/es/benchmark/nextjs.md +19 -16
  269. package/docs/es/benchmark/solid.md +26 -9
  270. package/docs/es/benchmark/svelte.md +22 -7
  271. package/docs/es/benchmark/tanstack.md +20 -16
  272. package/docs/es/benchmark/vue.md +19 -10
  273. package/docs/es/chrome_extension.md +130 -0
  274. package/docs/es/cli/index.md +11 -1
  275. package/docs/es/cli/infra.md +162 -0
  276. package/docs/es/cli/init.md +24 -1
  277. package/docs/es/cli/upgrade.md +125 -0
  278. package/docs/es/dictionary/html.md +173 -5
  279. package/docs/es/dictionary/markdown.md +263 -1
  280. package/docs/es/intlayer_with_analog.md +23 -1
  281. package/docs/es/intlayer_with_angular_19.md +24 -1
  282. package/docs/es/intlayer_with_angular_21.md +24 -1
  283. package/docs/es/intlayer_with_astro.md +24 -1
  284. package/docs/es/intlayer_with_astro_lit.md +25 -1
  285. package/docs/es/intlayer_with_astro_preact.md +26 -1
  286. package/docs/es/intlayer_with_astro_react.md +26 -1
  287. package/docs/es/intlayer_with_astro_solid.md +26 -1
  288. package/docs/es/intlayer_with_astro_svelte.md +25 -1
  289. package/docs/es/intlayer_with_astro_vue.md +25 -1
  290. package/docs/es/intlayer_with_remix_3.md +22 -1
  291. package/docs/es/self_hosting.md +400 -223
  292. package/docs/fr/benchmark/nextjs.md +19 -16
  293. package/docs/fr/benchmark/solid.md +26 -9
  294. package/docs/fr/benchmark/svelte.md +22 -7
  295. package/docs/fr/benchmark/tanstack.md +20 -16
  296. package/docs/fr/benchmark/vue.md +20 -11
  297. package/docs/fr/chrome_extension.md +130 -0
  298. package/docs/fr/cli/index.md +11 -1
  299. package/docs/fr/cli/infra.md +162 -0
  300. package/docs/fr/cli/init.md +24 -1
  301. package/docs/fr/cli/upgrade.md +125 -0
  302. package/docs/fr/dictionary/html.md +173 -5
  303. package/docs/fr/dictionary/markdown.md +265 -4
  304. package/docs/fr/intlayer_with_analog.md +23 -1
  305. package/docs/fr/intlayer_with_angular_19.md +24 -1
  306. package/docs/fr/intlayer_with_angular_21.md +24 -1
  307. package/docs/fr/intlayer_with_astro.md +24 -1
  308. package/docs/fr/intlayer_with_astro_lit.md +25 -1
  309. package/docs/fr/intlayer_with_astro_preact.md +26 -1
  310. package/docs/fr/intlayer_with_astro_react.md +26 -1
  311. package/docs/fr/intlayer_with_astro_solid.md +26 -1
  312. package/docs/fr/intlayer_with_astro_svelte.md +25 -1
  313. package/docs/fr/intlayer_with_astro_vue.md +25 -1
  314. package/docs/fr/intlayer_with_remix_3.md +22 -1
  315. package/docs/fr/self_hosting.md +401 -224
  316. package/docs/hi/benchmark/nextjs.md +19 -16
  317. package/docs/hi/benchmark/solid.md +26 -9
  318. package/docs/hi/benchmark/svelte.md +22 -7
  319. package/docs/hi/benchmark/tanstack.md +20 -16
  320. package/docs/hi/benchmark/vue.md +20 -11
  321. package/docs/hi/chrome_extension.md +130 -0
  322. package/docs/hi/cli/index.md +11 -1
  323. package/docs/hi/cli/infra.md +162 -0
  324. package/docs/hi/cli/init.md +24 -1
  325. package/docs/hi/cli/upgrade.md +125 -0
  326. package/docs/hi/dictionary/html.md +173 -5
  327. package/docs/hi/dictionary/markdown.md +263 -1
  328. package/docs/hi/intlayer_with_analog.md +23 -1
  329. package/docs/hi/intlayer_with_angular_19.md +24 -1
  330. package/docs/hi/intlayer_with_angular_21.md +24 -1
  331. package/docs/hi/intlayer_with_astro.md +24 -1
  332. package/docs/hi/intlayer_with_astro_lit.md +25 -1
  333. package/docs/hi/intlayer_with_astro_preact.md +26 -1
  334. package/docs/hi/intlayer_with_astro_react.md +26 -1
  335. package/docs/hi/intlayer_with_astro_solid.md +26 -1
  336. package/docs/hi/intlayer_with_astro_svelte.md +25 -1
  337. package/docs/hi/intlayer_with_astro_vue.md +25 -1
  338. package/docs/hi/intlayer_with_remix_3.md +22 -1
  339. package/docs/hi/self_hosting.md +409 -235
  340. package/docs/id/benchmark/nextjs.md +19 -16
  341. package/docs/id/benchmark/solid.md +26 -9
  342. package/docs/id/benchmark/svelte.md +22 -7
  343. package/docs/id/benchmark/tanstack.md +20 -16
  344. package/docs/id/benchmark/vue.md +20 -11
  345. package/docs/id/chrome_extension.md +130 -0
  346. package/docs/id/cli/index.md +11 -1
  347. package/docs/id/cli/infra.md +162 -0
  348. package/docs/id/cli/init.md +24 -1
  349. package/docs/id/cli/upgrade.md +125 -0
  350. package/docs/id/dictionary/html.md +173 -5
  351. package/docs/id/dictionary/markdown.md +263 -1
  352. package/docs/id/intlayer_with_analog.md +23 -1
  353. package/docs/id/intlayer_with_angular_19.md +24 -1
  354. package/docs/id/intlayer_with_angular_21.md +24 -1
  355. package/docs/id/intlayer_with_astro.md +24 -1
  356. package/docs/id/intlayer_with_astro_lit.md +25 -1
  357. package/docs/id/intlayer_with_astro_preact.md +26 -1
  358. package/docs/id/intlayer_with_astro_react.md +26 -1
  359. package/docs/id/intlayer_with_astro_solid.md +26 -1
  360. package/docs/id/intlayer_with_astro_svelte.md +25 -1
  361. package/docs/id/intlayer_with_astro_vue.md +25 -1
  362. package/docs/id/intlayer_with_remix_3.md +22 -1
  363. package/docs/id/self_hosting.md +416 -243
  364. package/docs/it/benchmark/nextjs.md +19 -16
  365. package/docs/it/benchmark/solid.md +26 -9
  366. package/docs/it/benchmark/svelte.md +22 -7
  367. package/docs/it/benchmark/tanstack.md +20 -16
  368. package/docs/it/benchmark/vue.md +19 -10
  369. package/docs/it/chrome_extension.md +130 -0
  370. package/docs/it/cli/index.md +11 -1
  371. package/docs/it/cli/infra.md +162 -0
  372. package/docs/it/cli/init.md +24 -1
  373. package/docs/it/cli/upgrade.md +125 -0
  374. package/docs/it/dictionary/html.md +173 -5
  375. package/docs/it/dictionary/markdown.md +263 -1
  376. package/docs/it/intlayer_with_analog.md +23 -1
  377. package/docs/it/intlayer_with_angular_19.md +24 -1
  378. package/docs/it/intlayer_with_angular_21.md +24 -1
  379. package/docs/it/intlayer_with_astro.md +24 -1
  380. package/docs/it/intlayer_with_astro_lit.md +25 -1
  381. package/docs/it/intlayer_with_astro_preact.md +26 -1
  382. package/docs/it/intlayer_with_astro_react.md +26 -1
  383. package/docs/it/intlayer_with_astro_solid.md +26 -1
  384. package/docs/it/intlayer_with_astro_svelte.md +25 -1
  385. package/docs/it/intlayer_with_astro_vue.md +25 -1
  386. package/docs/it/intlayer_with_remix_3.md +22 -1
  387. package/docs/it/self_hosting.md +412 -237
  388. package/docs/ja/benchmark/nextjs.md +19 -16
  389. package/docs/ja/benchmark/solid.md +26 -9
  390. package/docs/ja/benchmark/svelte.md +22 -7
  391. package/docs/ja/benchmark/tanstack.md +18 -14
  392. package/docs/ja/benchmark/vue.md +19 -10
  393. package/docs/ja/chrome_extension.md +130 -0
  394. package/docs/ja/cli/index.md +11 -1
  395. package/docs/ja/cli/infra.md +162 -0
  396. package/docs/ja/cli/init.md +24 -1
  397. package/docs/ja/cli/upgrade.md +125 -0
  398. package/docs/ja/dictionary/html.md +173 -5
  399. package/docs/ja/dictionary/markdown.md +263 -1
  400. package/docs/ja/intlayer_with_analog.md +23 -1
  401. package/docs/ja/intlayer_with_angular_19.md +24 -1
  402. package/docs/ja/intlayer_with_angular_21.md +24 -1
  403. package/docs/ja/intlayer_with_astro.md +24 -1
  404. package/docs/ja/intlayer_with_astro_lit.md +25 -1
  405. package/docs/ja/intlayer_with_astro_preact.md +26 -1
  406. package/docs/ja/intlayer_with_astro_react.md +26 -1
  407. package/docs/ja/intlayer_with_astro_solid.md +26 -1
  408. package/docs/ja/intlayer_with_astro_svelte.md +25 -1
  409. package/docs/ja/intlayer_with_astro_vue.md +25 -1
  410. package/docs/ja/intlayer_with_remix_3.md +22 -1
  411. package/docs/ja/self_hosting.md +398 -223
  412. package/docs/ko/benchmark/nextjs.md +19 -16
  413. package/docs/ko/benchmark/solid.md +26 -9
  414. package/docs/ko/benchmark/svelte.md +22 -7
  415. package/docs/ko/benchmark/tanstack.md +20 -16
  416. package/docs/ko/benchmark/vue.md +20 -11
  417. package/docs/ko/chrome_extension.md +130 -0
  418. package/docs/ko/cli/index.md +11 -1
  419. package/docs/ko/cli/infra.md +162 -0
  420. package/docs/ko/cli/init.md +24 -1
  421. package/docs/ko/cli/upgrade.md +126 -0
  422. package/docs/ko/dictionary/html.md +173 -5
  423. package/docs/ko/dictionary/markdown.md +263 -1
  424. package/docs/ko/intlayer_with_analog.md +23 -1
  425. package/docs/ko/intlayer_with_angular_19.md +24 -1
  426. package/docs/ko/intlayer_with_angular_21.md +24 -1
  427. package/docs/ko/intlayer_with_astro.md +24 -1
  428. package/docs/ko/intlayer_with_astro_lit.md +25 -1
  429. package/docs/ko/intlayer_with_astro_preact.md +26 -1
  430. package/docs/ko/intlayer_with_astro_react.md +26 -1
  431. package/docs/ko/intlayer_with_astro_solid.md +26 -1
  432. package/docs/ko/intlayer_with_astro_svelte.md +25 -1
  433. package/docs/ko/intlayer_with_astro_vue.md +25 -1
  434. package/docs/ko/intlayer_with_remix_3.md +22 -1
  435. package/docs/ko/self_hosting.md +411 -238
  436. package/docs/pl/benchmark/nextjs.md +19 -16
  437. package/docs/pl/benchmark/solid.md +26 -9
  438. package/docs/pl/benchmark/svelte.md +22 -7
  439. package/docs/pl/benchmark/tanstack.md +20 -16
  440. package/docs/pl/benchmark/vue.md +20 -11
  441. package/docs/pl/chrome_extension.md +130 -0
  442. package/docs/pl/cli/index.md +11 -1
  443. package/docs/pl/cli/infra.md +162 -0
  444. package/docs/pl/cli/init.md +24 -1
  445. package/docs/pl/cli/upgrade.md +125 -0
  446. package/docs/pl/dictionary/html.md +173 -5
  447. package/docs/pl/dictionary/markdown.md +263 -1
  448. package/docs/pl/intlayer_with_analog.md +23 -1
  449. package/docs/pl/intlayer_with_angular_19.md +24 -1
  450. package/docs/pl/intlayer_with_angular_21.md +24 -1
  451. package/docs/pl/intlayer_with_astro.md +24 -1
  452. package/docs/pl/intlayer_with_astro_lit.md +25 -1
  453. package/docs/pl/intlayer_with_astro_preact.md +26 -1
  454. package/docs/pl/intlayer_with_astro_react.md +26 -1
  455. package/docs/pl/intlayer_with_astro_solid.md +26 -1
  456. package/docs/pl/intlayer_with_astro_svelte.md +25 -1
  457. package/docs/pl/intlayer_with_astro_vue.md +25 -1
  458. package/docs/pl/intlayer_with_remix_3.md +22 -1
  459. package/docs/pl/self_hosting.md +408 -233
  460. package/docs/pt/benchmark/nextjs.md +19 -16
  461. package/docs/pt/benchmark/solid.md +26 -9
  462. package/docs/pt/benchmark/svelte.md +22 -7
  463. package/docs/pt/benchmark/tanstack.md +20 -16
  464. package/docs/pt/benchmark/vue.md +19 -10
  465. package/docs/pt/chrome_extension.md +130 -0
  466. package/docs/pt/cli/index.md +11 -1
  467. package/docs/pt/cli/infra.md +162 -0
  468. package/docs/pt/cli/init.md +24 -1
  469. package/docs/pt/cli/upgrade.md +125 -0
  470. package/docs/pt/dictionary/html.md +173 -5
  471. package/docs/pt/dictionary/markdown.md +263 -1
  472. package/docs/pt/intlayer_with_analog.md +23 -1
  473. package/docs/pt/intlayer_with_angular_19.md +24 -1
  474. package/docs/pt/intlayer_with_angular_21.md +24 -1
  475. package/docs/pt/intlayer_with_astro.md +24 -1
  476. package/docs/pt/intlayer_with_astro_lit.md +25 -1
  477. package/docs/pt/intlayer_with_astro_preact.md +26 -1
  478. package/docs/pt/intlayer_with_astro_react.md +26 -1
  479. package/docs/pt/intlayer_with_astro_solid.md +26 -1
  480. package/docs/pt/intlayer_with_astro_svelte.md +25 -1
  481. package/docs/pt/intlayer_with_astro_vue.md +25 -1
  482. package/docs/pt/intlayer_with_remix_3.md +22 -1
  483. package/docs/pt/self_hosting.md +399 -224
  484. package/docs/ru/benchmark/nextjs.md +19 -16
  485. package/docs/ru/benchmark/solid.md +26 -9
  486. package/docs/ru/benchmark/svelte.md +22 -7
  487. package/docs/ru/benchmark/tanstack.md +20 -16
  488. package/docs/ru/benchmark/vue.md +20 -11
  489. package/docs/ru/chrome_extension.md +130 -0
  490. package/docs/ru/cli/index.md +11 -1
  491. package/docs/ru/cli/infra.md +162 -0
  492. package/docs/ru/cli/init.md +24 -1
  493. package/docs/ru/cli/upgrade.md +125 -0
  494. package/docs/ru/dictionary/html.md +173 -5
  495. package/docs/ru/dictionary/markdown.md +263 -1
  496. package/docs/ru/intlayer_with_analog.md +23 -1
  497. package/docs/ru/intlayer_with_angular_19.md +24 -1
  498. package/docs/ru/intlayer_with_angular_21.md +24 -1
  499. package/docs/ru/intlayer_with_astro.md +24 -1
  500. package/docs/ru/intlayer_with_astro_lit.md +25 -1
  501. package/docs/ru/intlayer_with_astro_preact.md +26 -1
  502. package/docs/ru/intlayer_with_astro_react.md +26 -1
  503. package/docs/ru/intlayer_with_astro_solid.md +26 -1
  504. package/docs/ru/intlayer_with_astro_svelte.md +25 -1
  505. package/docs/ru/intlayer_with_astro_vue.md +25 -1
  506. package/docs/ru/intlayer_with_remix_3.md +22 -1
  507. package/docs/ru/self_hosting.md +403 -228
  508. package/docs/tr/benchmark/nextjs.md +19 -16
  509. package/docs/tr/benchmark/solid.md +26 -9
  510. package/docs/tr/benchmark/svelte.md +22 -7
  511. package/docs/tr/benchmark/tanstack.md +20 -16
  512. package/docs/tr/benchmark/vue.md +20 -11
  513. package/docs/tr/chrome_extension.md +130 -0
  514. package/docs/tr/cli/index.md +11 -1
  515. package/docs/tr/cli/infra.md +162 -0
  516. package/docs/tr/cli/init.md +24 -1
  517. package/docs/tr/cli/upgrade.md +125 -0
  518. package/docs/tr/dictionary/html.md +173 -5
  519. package/docs/tr/dictionary/markdown.md +263 -1
  520. package/docs/tr/intlayer_with_analog.md +23 -1
  521. package/docs/tr/intlayer_with_angular_19.md +24 -1
  522. package/docs/tr/intlayer_with_angular_21.md +24 -1
  523. package/docs/tr/intlayer_with_astro.md +24 -1
  524. package/docs/tr/intlayer_with_astro_lit.md +25 -1
  525. package/docs/tr/intlayer_with_astro_preact.md +26 -1
  526. package/docs/tr/intlayer_with_astro_react.md +26 -1
  527. package/docs/tr/intlayer_with_astro_solid.md +26 -1
  528. package/docs/tr/intlayer_with_astro_svelte.md +25 -1
  529. package/docs/tr/intlayer_with_astro_vue.md +25 -1
  530. package/docs/tr/intlayer_with_remix_3.md +22 -1
  531. package/docs/tr/self_hosting.md +410 -234
  532. package/docs/uk/benchmark/nextjs.md +19 -16
  533. package/docs/uk/benchmark/solid.md +26 -9
  534. package/docs/uk/benchmark/svelte.md +22 -7
  535. package/docs/uk/benchmark/tanstack.md +20 -16
  536. package/docs/uk/benchmark/vue.md +20 -11
  537. package/docs/uk/chrome_extension.md +130 -0
  538. package/docs/uk/cli/index.md +11 -1
  539. package/docs/uk/cli/infra.md +162 -0
  540. package/docs/uk/cli/init.md +24 -1
  541. package/docs/uk/cli/upgrade.md +125 -0
  542. package/docs/uk/dictionary/html.md +173 -5
  543. package/docs/uk/dictionary/markdown.md +263 -1
  544. package/docs/uk/intlayer_with_analog.md +23 -1
  545. package/docs/uk/intlayer_with_angular_19.md +24 -1
  546. package/docs/uk/intlayer_with_angular_21.md +24 -1
  547. package/docs/uk/intlayer_with_astro.md +24 -1
  548. package/docs/uk/intlayer_with_astro_lit.md +25 -1
  549. package/docs/uk/intlayer_with_astro_preact.md +26 -1
  550. package/docs/uk/intlayer_with_astro_react.md +26 -1
  551. package/docs/uk/intlayer_with_astro_solid.md +26 -1
  552. package/docs/uk/intlayer_with_astro_svelte.md +25 -1
  553. package/docs/uk/intlayer_with_astro_vue.md +25 -1
  554. package/docs/uk/intlayer_with_remix_3.md +22 -1
  555. package/docs/uk/self_hosting.md +413 -238
  556. package/docs/vi/benchmark/nextjs.md +19 -16
  557. package/docs/vi/benchmark/solid.md +26 -9
  558. package/docs/vi/benchmark/svelte.md +22 -7
  559. package/docs/vi/benchmark/tanstack.md +20 -16
  560. package/docs/vi/benchmark/vue.md +20 -11
  561. package/docs/vi/chrome_extension.md +130 -0
  562. package/docs/vi/cli/index.md +11 -1
  563. package/docs/vi/cli/infra.md +162 -0
  564. package/docs/vi/cli/init.md +24 -1
  565. package/docs/vi/cli/upgrade.md +125 -0
  566. package/docs/vi/dictionary/html.md +173 -5
  567. package/docs/vi/dictionary/markdown.md +263 -1
  568. package/docs/vi/intlayer_with_analog.md +23 -1
  569. package/docs/vi/intlayer_with_angular_19.md +24 -1
  570. package/docs/vi/intlayer_with_angular_21.md +24 -1
  571. package/docs/vi/intlayer_with_astro.md +24 -1
  572. package/docs/vi/intlayer_with_astro_lit.md +25 -1
  573. package/docs/vi/intlayer_with_astro_preact.md +26 -1
  574. package/docs/vi/intlayer_with_astro_react.md +26 -1
  575. package/docs/vi/intlayer_with_astro_solid.md +26 -1
  576. package/docs/vi/intlayer_with_astro_svelte.md +25 -1
  577. package/docs/vi/intlayer_with_astro_vue.md +25 -1
  578. package/docs/vi/intlayer_with_remix_3.md +22 -1
  579. package/docs/vi/self_hosting.md +408 -234
  580. package/docs/zh/benchmark/nextjs.md +19 -16
  581. package/docs/zh/benchmark/solid.md +26 -9
  582. package/docs/zh/benchmark/svelte.md +22 -7
  583. package/docs/zh/benchmark/tanstack.md +19 -15
  584. package/docs/zh/benchmark/vue.md +20 -11
  585. package/docs/zh/chrome_extension.md +130 -0
  586. package/docs/zh/cli/index.md +11 -1
  587. package/docs/zh/cli/infra.md +162 -0
  588. package/docs/zh/cli/init.md +24 -1
  589. package/docs/zh/cli/upgrade.md +125 -0
  590. package/docs/zh/dictionary/html.md +172 -5
  591. package/docs/zh/dictionary/markdown.md +262 -1
  592. package/docs/zh/intlayer_with_analog.md +23 -1
  593. package/docs/zh/intlayer_with_angular_19.md +24 -1
  594. package/docs/zh/intlayer_with_angular_21.md +24 -1
  595. package/docs/zh/intlayer_with_astro.md +24 -1
  596. package/docs/zh/intlayer_with_astro_lit.md +25 -1
  597. package/docs/zh/intlayer_with_astro_preact.md +26 -1
  598. package/docs/zh/intlayer_with_astro_react.md +26 -1
  599. package/docs/zh/intlayer_with_astro_solid.md +26 -1
  600. package/docs/zh/intlayer_with_astro_svelte.md +25 -1
  601. package/docs/zh/intlayer_with_astro_vue.md +25 -1
  602. package/docs/zh/intlayer_with_remix_3.md +22 -1
  603. package/docs/zh/self_hosting.md +410 -237
  604. package/legal/ar/privacy_notice.md +9 -3
  605. package/legal/de/privacy_notice.md +9 -3
  606. package/legal/en/privacy_notice.md +10 -3
  607. package/legal/en-GB/privacy_notice.md +9 -3
  608. package/legal/es/privacy_notice.md +9 -3
  609. package/legal/fr/privacy_notice.md +9 -3
  610. package/legal/hi/privacy_notice.md +9 -3
  611. package/legal/id/privacy_notice.md +9 -3
  612. package/legal/it/privacy_notice.md +9 -3
  613. package/legal/ja/privacy_notice.md +9 -3
  614. package/legal/ko/privacy_notice.md +9 -3
  615. package/legal/pl/privacy_notice.md +9 -3
  616. package/legal/pt/privacy_notice.md +9 -3
  617. package/legal/ru/privacy_notice.md +9 -3
  618. package/legal/tr/privacy_notice.md +9 -3
  619. package/legal/uk/privacy_notice.md +9 -3
  620. package/legal/vi/privacy_notice.md +9 -3
  621. package/legal/zh/privacy_notice.md +9 -3
  622. package/package.json +6 -6
  623. package/src/generated/blog.entry.ts +20 -0
  624. package/src/generated/docs.entry.ts +60 -40
  625. package/docs/ar/roadmap.md +0 -321
  626. package/docs/de/roadmap.md +0 -322
  627. package/docs/en/intlayer_with_astro_vanilla.md +0 -713
  628. package/docs/en/roadmap.md +0 -325
  629. package/docs/en-GB/roadmap.md +0 -322
  630. package/docs/es/roadmap.md +0 -322
  631. package/docs/fr/roadmap.md +0 -322
  632. package/docs/hi/roadmap.md +0 -322
  633. package/docs/id/roadmap.md +0 -325
  634. package/docs/it/roadmap.md +0 -322
  635. package/docs/ja/roadmap.md +0 -322
  636. package/docs/ko/roadmap.md +0 -322
  637. package/docs/pl/roadmap.md +0 -325
  638. package/docs/pt/roadmap.md +0 -322
  639. package/docs/ru/roadmap.md +0 -322
  640. package/docs/tr/roadmap.md +0 -325
  641. package/docs/uk/roadmap.md +0 -325
  642. package/docs/vi/roadmap.md +0 -325
  643. package/docs/zh/roadmap.md +0 -322
@@ -1,12 +1,13 @@
1
1
  ---
2
2
  createdAt: 2026-06-30
3
- updatedAt: 2026-06-30
3
+ updatedAt: 2026-09-21
4
4
  title: Самостоятельный хостинг Intlayer
5
- description: Запустите полноценный экземпляр Intlayer на собственной инфраструктуре с помощью одной команды. Аккаунт Intlayer Cloud не требуется.
5
+ description: "Запускайте Intlayer на собственной инфраструктуре: как десктопное приложение, единый Docker-контейнер «все в одном» или масштабируемый стек Docker Compose. Аккаунт Intlayer Cloud не требуется."
6
6
  keywords:
7
- - Самостоятельный хостинг
7
+ - Собственный хостинг
8
8
  - Docker
9
9
  - Docker Compose
10
+ - Десктопное приложение
10
11
  - Intlayer
11
12
  - CMS
12
13
  - Установка
@@ -19,214 +20,455 @@ author: aymericzip
19
20
 
20
21
  # Самостоятельный хостинг Intlayer
21
22
 
22
- Intlayer может полностью работать на вашей собственной инфраструктуре — аккаунт Intlayer Cloud не требуется. Одна команда запускает готовый к production стек:
23
+ Intlayer может работать на вашей собственной инфраструктуре без необходимости создания учетной записи Intlayer Cloud. Доступны три конфигурации, устанавливаемые одним и тем же установщиком (`install.sh`, `install.ps1` в Windows или `npx intlayer init infra`):
23
24
 
24
- Одна команда устанавливает всё:
25
+ | Setup | What it is | Pick it for |
26
+ | ------------------------- | ----------------------------------------------------------------------------------------- | -------------------------------------------------- |
27
+ | **Десктопное приложение** | Нативная панель управления для macOS, Linux и Windows | Локальный клиент, ничего не нужно хостить |
28
+ | **Docker «все в одном»** | Панель управления, API, MongoDB, Redis и MinIO в **едином контейнере** | Пробные и небольшие локальные установки |
29
+ | **Docker Compose** | **Один контейнер на сервис**, каждое хранилище данных можно заменить управляемым сервисом | Продакшн, масштабирование, управляемые базы данных |
30
+
31
+ ## Table of Contents
32
+
33
+ <TOC/>
34
+
35
+ ## Опубликованные образы и пакеты
36
+
37
+ | Artifact | Docker Hub | GHCR mirror | Contents |
38
+ | -------------------- | ------------------------------------------------------------------------- | ------------------------------------------ | -------------------------------------------------------------------------------- |
39
+ | All-in-one container | [`intlayer/cms-all`](https://hub.docker.com/r/intlayer/cms-all) | `ghcr.io/aymericzip/intlayer/cms-all` | app + backend + MongoDB 8 + Redis + MinIO + Chromium |
40
+ | Dashboard (frontend) | [`intlayer/cms-frontend`](https://hub.docker.com/r/intlayer/cms-frontend) | `ghcr.io/aymericzip/intlayer/cms-frontend` | TanStack Start dashboard on Bun |
41
+ | API (backend) | [`intlayer/cms-backend`](https://hub.docker.com/r/intlayer/cms-backend) | `ghcr.io/aymericzip/intlayer/cms-backend` | Fastify REST API on Bun + Chromium |
42
+ | Desktop app | [GitHub releases](https://github.com/aymericzip/intlayer/releases/latest) | n/a | `.dmg` (macOS), `.deb` / `.rpm` / `.AppImage` (Linux), `.exe` / `.msi` (Windows) |
43
+
44
+ Все три образа собираются из одного и того же [`docker/selfhost/Dockerfile`](https://github.com/aymericzip/intlayer/tree/main/docker/selfhost) и публикуются при каждом релизе. Стек Compose также загружает официальные образы `mongo:8`, `redis:8-alpine` и `quay.io/minio/minio`.
45
+
46
+ ## Настройка
47
+
48
+ Установщик запрашивает желаемую конфигурацию, проверяет предварительные требования (предлагая установить Docker), записывает файл переменных окружения с уже сгенерированными секретами и загружает образы. Он никогда ничего не запускает сам: режимам Docker сначала требуется почтовый сервис, поэтому в конце выводится команда для запуска. Повторный запуск безопасен: существующий файл окружения не перезаписывается, что делает его также способом обновления.
49
+
50
+ <Tabs group="mode">
51
+ <Tab label="Десктопное приложение" value="desktop">
52
+
53
+ Панель управления Intlayer в виде нативного приложения, созданного на Tauri. Оно подключается к Intlayer Cloud (`https://app.intlayer.org`), поэтому хостить ничего не требуется. Это отличный выбор, если вы предпочитаете локальный клиент вместо вкладки браузера.
54
+
55
+ ### Установка
56
+
57
+ Установщик загружает пакет для вашей ОС и процессора, а затем открывает его (macOS), устанавливает (`dpkg` / `rpm` в Linux) или запускает мастер установки (Windows). Вы также можете загрузить его вручную со [страницы релизов](https://github.com/aymericzip/intlayer/releases/latest).
58
+
59
+ <Tabs group="os">
60
+ <Tab label="macOS / Linux" value="unix">
25
61
 
26
62
  ```sh
27
- curl -fsSL https://intlayer.org/install.sh | sh
63
+ curl -fsSL https://intlayer.org/install.sh | sh -s -- --mode desktop
28
64
  ```
29
65
 
30
- Установщик загружает `docker-compose.yml` и `.env`, автоматически генерирует необходимые секреты и запускает все контейнеры с помощью `docker compose up -d`.
66
+ </Tab>
67
+ <Tab label="Windows" value="windows">
31
68
 
32
- Единственная внешняя зависимость — это **MongoDB**: backend подключается к кластеру MongoDB **Atlas**, который вы предоставляете. Всё остальное работает внутри контейнера.
69
+ In PowerShell:
33
70
 
34
- ## Оглавление
71
+ ```powershell
72
+ $env:INTLAYER_MODE = "desktop"; irm https://intlayer.org/install.ps1 | iex
73
+ ```
35
74
 
36
- <TOC/>
75
+ </Tab>
76
+ <Tab label="Intlayer CLI" value="cli">
77
+
78
+ ```bash
79
+ npx intlayer init infra --mode desktop
80
+ ```
81
+
82
+ </Tab>
83
+ </Tabs>
37
84
 
38
- ## Архитектура
85
+ ### Требования
86
+
87
+ - **Node.js**: приложение содержит сервер панели управления и запускает его с помощью бинарного файла `node`, установленного в системе. Установите его с [nodejs.org](https://nodejs.org), если приложение не запускается.
88
+
89
+ > Опубликованная десктопная сборка взаимодействует с бэкендом Intlayer Cloud. Подключение её к собственному бэкенду требует пересборки приложения с переменной `VITE_BACKEND_URL`, указывающей на ваш API, смотрите [Ограничения](#limitations).
90
+
91
+ </Tab>
92
+ <Tab label="Docker «все в одном»" value="docker">
93
+
94
+ Все работает внутри одного контейнера `intlayer/cms-all` под управлением [s6-overlay](https://github.com/just-containers/s6-overlay), а все хранилища данных сохраняются в едином томе.
39
95
 
40
96
  ```
41
97
  ┌─────────────────────────────┐
42
- браузер ──────▶ │ приложение (TanStack Start) :3000│ ──┐
43
- └─────────────────────────────┘ │ VITE_BACKEND_URL
98
+ browser ──────▶ │ app (TanStack Start) :3000│ ──┐
99
+ (localhost) └─────────────────────────────┘ │ VITE_BACKEND_URL (baked at build)
44
100
  ┌─────────────────────────────┐ │
45
- │ бэкенд (Fastify/Bun) :3100│ ◀─┘
101
+ │ backend (Fastify/Bun) :3100│ ◀─┘
46
102
  └──────────────┬──────────────┘
47
- ┌──────────┬─────────┼──────────┬───────────┐
48
- ▼ ▼ ▼ ▼ ▼
49
- mongo:27017 redis:6379 minio:9000 mailpit:1025 Chromium
50
- (RS из 1 узла) (API S3) (SMTP) (в образе)
51
- minio:9001 mailpit:8025
52
- (консоль) (веб-интерфейс)
103
+ ┌──────────┬─────────┼──────────────┐
104
+ ▼ ▼ ▼ ▼
105
+ mongo:27017 redis:6379 minio:9000 Chromium
106
+ /data/mongo /data/redis /data/minio (in-image)
107
+ (1-node RS) minio:9001
53
108
  ```
54
109
 
55
- Chromium (используемый для генерации скриншотов Puppeteer) включен в образ бэкенда — отдельный контейнер не требуется.
110
+ | Сервис | Порт(ы) хоста | Назначение |
111
+ | ----------- | ----------------------------- | ------------------------------------------------------------ |
112
+ | **app** | `3000` | Панель управления (интерфейс CMS) |
113
+ | **backend** | `3100` | REST API (эндпоинт `/health`) |
114
+ | **mongo** | внутренний | MongoDB 8, набор реплик из одного узла `rs0` |
115
+ | **redis** | внутренний | Очереди задач (BullMQ) и кэширование |
116
+ | **minio** | `9000` (S3), `9001` (консоль) | S3-совместимое объектное хранилище для аватаров и скриншотов |
117
+
118
+ Порядок запуска определяется зависимостями s6 (`mongod` → инициализация replica-set, `minio` → создание бакета, затем `backend`, затем `app`), а службы перезапускаются при завершении, поэтому первый запуск восстанавливается автоматически.
56
119
 
57
- ## Предварительные требования
120
+ ### Предварительные требования
58
121
 
59
- - **Docker** ≥ 24 и **Docker Compose** ≥ v2. Если что-либо из этого отсутствует, установщик выведет ссылку для установки и завершит работу.
60
- - Порты `3000`, `3100`, `8025`, `9000` и `9001` должны быть доступны на хосте.
61
- - Хост на Linux или macOS (или WSL2 на Windows).
122
+ - **Docker** ≥ 24: установщик предлагает установить его (через [get.docker.com](https://get.docker.com) в Linux, Homebrew в macOS). В Windows сначала установите [Docker Desktop](https://docs.docker.com/desktop/setup/install/windows-install/) (бэкенд WSL 2).
123
+ - Свободные порты `3000`, `3100`, `9000` и `9001` на хосте. MinIO `9000` должен быть доступен браузеру, загружающему ресурсы напрямую из `S3_PUBLIC_URL`.
124
+ - Почтовый сервис: API-ключ [Resend](https://resend.com) или SMTP-реле.
62
125
 
63
- Всё остальное — Bun, Redis, MinIO, Chromium — поставляется внутри образа.
126
+ ### 1. Установка
64
127
 
65
- ## Быстрый старт
128
+ Записывает `./intlayer.env` со сгенерированными `BETTER_AUTH_SECRET` и `S3_SECRET_ACCESS_KEY` и загружает `intlayer/cms-all:latest`.
66
129
 
67
- ### 1. Запустите установщик
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
- Установщик проверяет наличие установленного и запущенного Docker, создает файл `./intlayer.env` с уже сгенерированными `BETTER_AUTH_SECRET` и `S3_SECRET_ACCESS_KEY`, и загружает образ. Он не запускает контейнер — backend не может загрузиться без ваших учетных данных базы данных.
146
+ </Tab>
147
+ <Tab label="Intlayer CLI" value="cli">
74
148
 
75
- Повторный запуск установщика безопасен: существующий файл `intlayer.env` никогда не будет перезаписан, поэтому это также служит путем для обновления.
149
+ ```bash
150
+ npx intlayer init infra --mode docker
151
+ ```
152
+
153
+ </Tab>
154
+ </Tabs>
76
155
 
77
- ### 2. Заполните ваши учетные данные
156
+ ### 2. Настройка почтового сервиса
78
157
 
79
- Откройте `intlayer.env` и заполните значения, отмеченные `TODO`:
158
+ Откройте `intlayer.env` и укажите Resend **или** SMTP (подробнее в разделе [Глобальный почтовый сервис](#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
- Файл также содержит закомментированные блоки для опциональных функций — [SMTP mailer](#global-mailer), `OPENAI_API_KEY` и OAuth провайдеров. Раскомментируйте необходимое.
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
- > Файл читается с помощью `docker run --env-file`, который не удаляет кавычки и рассматривает все значение после `=` как значение. Пишите значения без кавычек и оставляйте комментарии на отдельных строках.
172
+ ### 3. Запуск
91
173
 
92
- ### 3. Запустите контейнер
174
+ Эту команду выводит установщик:
93
175
 
94
- Это команда, которую выводит установщик по завершении:
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
- Затем откройте **http://localhost:3000**. При первой загрузке инициализируются хранилища данных, поэтому подождите минуту.
188
+ </Tab>
189
+ <Tab label="Windows" value="windows">
109
190
 
110
- > Панель управления обслуживается на `localhost`. См. [Ограничения](#limitations) — пользовательские домены не поддерживаются опубликованным образом.
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
+ ```
111
199
 
112
- ### Параметры установщика
200
+ </Tab>
201
+ <Tab label="Intlayer CLI" value="cli">
202
+
203
+ CLI запускает установщик, выводящий команду `docker run …`, показанную на других вкладках. Скопируйте её в терминал после настройки почты.
204
+
205
+ </Tab>
206
+ </Tabs>
207
+
208
+ Откройте **http://localhost:3000** и выполните шаги [Первоначальной настройки](#first-run-setup). При первом запуске инициализируются набор реплик и бакет, поэтому подождите минуту.
209
+
210
+ ### Резервное копирование и обновление
211
+
212
+ Все данные хранятся в томе `intlayer-data` (`/data/mongo`, `/data/redis`, `/data/minio`).
213
+
214
+ ```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 /
222
+ ```
223
+
224
+ Для обновления повторно запустите установщик (он загрузит свежий образ и сохранит `intlayer.env`), затем выполните `docker rm -f intlayer` и снова запустите команду старта. Чтобы использовать управляемую MongoDB вместо встроенной, задайте `MONGODB_URI` в `intlayer.env`.
225
+
226
+ </Tab>
227
+ <Tab label="Docker Compose" value="compose">
228
+
229
+ Один контейнер на сервис в изолированной сети Compose. Панель управления и API используют опубликованные образы `intlayer/cms-frontend` и `intlayer/cms-backend`; базы данных используют официальные образы `mongo`, `redis` и `minio`.
230
+
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
+ ```
243
+
244
+ | Сервис | Образ | Роль |
245
+ | ------------ | ----------------------- | --------------------------------------------------------------------------- |
246
+ | `app` | `intlayer/cms-frontend` | Панель управления на `:3000`; ожидает готовности бэкенда |
247
+ | `backend` | `intlayer/cms-backend` | API на `:3100` с Chromium; ожидает Mongo, Redis и бакет MinIO |
248
+ | `mongo` | `mongo:8` | Набор реплик из одного узла `rs0`, инициализируемый собственным healthcheck |
249
+ | `redis` | `redis:8-alpine` | Очереди и кэш, постоянство только для добавления |
250
+ | `minio` | `quay.io/minio/minio` | Хранилище S3 на `:9000`, консоль на `:9001` |
251
+ | `minio-init` | `quay.io/minio/mc` | Однократный запуск: создает бакет и политику анонимного скачивания |
252
+
253
+ Данные сохраняются в томах `intlayer_mongo-data`, `intlayer_redis-data` и `intlayer_minio-data`. Подключение служб (`MONGODB_URI`, `REDIS_URL`, `S3_ENDPOINT`, внутренний URL бэкенда для SSR) зафиксировано в файле compose и имеет приоритет над `.env`, содержащим только секреты и дополнительные интеграции.
254
+
255
+ ### Предварительные требования
256
+
257
+ - **Docker** ≥ 24 с плагином Compose: установщик предлагает установить его в Linux и macOS. В Windows сначала установите [Docker Desktop](https://docs.docker.com/desktop/setup/install/windows-install/) (бэкенд WSL 2).
258
+ - Свободные порты `3000`, `3100`, `9000` и `9001` на хосте.
259
+ - Почтовый сервис: API-ключ [Resend](https://resend.com) или SMTP-реле.
260
+
261
+ ### 1. Установка
262
+
263
+ Записывает `docker-compose.yml` и `.env` со сгенерированными секретами в `./intlayer/` и загружает образы.
264
+
265
+ <Tabs group="os">
266
+ <Tab label="macOS / Linux" value="unix">
267
+
268
+ ```sh
269
+ curl -fsSL https://intlayer.org/install.sh | sh -s -- --mode compose
270
+ ```
271
+
272
+ Or by hand:
273
+
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
+ ```
289
+
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
+ ```
113
305
 
114
- Установщик читает несколько переменных окружения. Поскольку он передаётся в `sh`, передавайте их в shell, а не в `curl`:
306
+ </Tab>
307
+ </Tabs>
308
+
309
+ ### 2. Настройка почтового сервиса
310
+
311
+ Заполните Resend **или** SMTP в `intlayer/.env` точно так же, как для контейнера «все в одном» (см. [Глобальный почтовый сервис](#global-mailer)).
312
+
313
+ ### 3. Запуск
314
+
315
+ ```sh
316
+ cd intlayer && docker compose up -d
317
+ ```
318
+
319
+ Откройте **http://localhost:3000** и выполните шаги [Первоначальной настройки](#first-run-setup).
320
+
321
+ ### Управляемые хранилища данных
322
+
323
+ Удалите заменяемый сервис из compose-файла (а также его упоминание в `depends_on` у `backend`), затем переопределите соответствующую переменную:
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` сохраняют свое значение для любого S3-совместимого провайдера.
336
+
337
+ ### Масштабирование
338
+
339
+ `app` и `backend` не сохраняют состояние (stateless). За балансировщиком нагрузки команда `docker compose up -d --scale backend=3` работает после удаления жестких сопоставлений портов хоста, когда прокси обращается к службам по имени. Фоновые задачи координируются через Redis (BullMQ), поэтому несколько реплик бэкенда безопасно разделяют очередь.
340
+
341
+ ### Сборка из исходного кода
342
+
343
+ При клонировании репозитория файл переопределения переключает оба сервиса Intlayer с `image:` на `build:`:
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
+ Таким же образом создаются образы для пользовательского домена: передайте значения `VITE_*` как аргументы сборки (см. [Ограничения](#limitations)).
351
+
352
+ ### Резервное копирование и обновление
115
353
 
116
354
  ```sh
117
- curl -fsSL https://intlayer.org/install.sh | INTLAYER_ENV_FILE=./config/intlayer.env 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
118
362
  ```
119
363
 
120
- | Переменная | По умолчанию | Описание |
121
- | ------------------------- | --------------------------------------------- | --------------------------------------- |
122
- | `INTLAYER_IMAGE` | `ghcr.io/aymericzip/intlayer-selfhost:latest` | Образ для загрузки |
123
- | `INTLAYER_ENV_FILE` | `./intlayer.env` | Где записать env файл |
124
- | `INTLAYER_CONTAINER_NAME` | `intlayer` | Имя контейнера |
125
- | `INTLAYER_DATA_VOLUME` | `intlayer-data` | Именованный том, подключённый в `/data` |
126
- | `INTLAYER_APP_PORT` | `3000` | Порт хоста для панели управления |
127
- | `INTLAYER_API_PORT` | `3100` | Порт хоста для API |
128
- | `INTLAYER_S3_PORT` | `9000` | Порт хоста для MinIO S3 API |
129
- | `INTLAYER_CONSOLE_PORT` | `9001` | Порт хоста для консоли MinIO |
364
+ </Tab>
365
+ </Tabs>
130
366
 
131
- > Четыре переменные портов изменяют только **хост** часть маппинга, выведённую в команде `docker run`. Опубликованный образ имеет `http://localhost:3000`, `http://localhost:3100` и `http://localhost:9000`, встроенные в bundle панели управления во время сборки, поэтому переназначение их оставляет браузер указывающим на старые порты. Сохраняйте значения по умолчанию, если вы не создаёте свой собственный образ — см. [Ограничения](#limitations).
367
+ ### Параметры установщика
368
+
369
+ Без флага `--mode` (или `INTLAYER_MODE`) установщик отображает меню: `desktop`, `docker` (все в одном) или `compose`. Он также считывает несколько переменных окружения. Поскольку запуск происходит через пайплайн в оболочке, передавайте их оболочке, а не `curl`:
370
+
371
+ ```sh
372
+ curl -fsSL https://intlayer.org/install.sh | INTLAYER_COMPOSE_DIR=./cms sh -s -- --mode compose
373
+ ```
132
374
 
133
- ## Быстрый старт
375
+ ```powershell
376
+ $env:INTLAYER_MODE = "compose"; $env:INTLAYER_COMPOSE_DIR = ".\cms"; irm https://intlayer.org/install.ps1 | iex
377
+ ```
134
378
 
135
- Что делает установщик:
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 |
136
393
 
137
- 1. Проверяет наличие `docker` и `docker compose`.
138
- 2. Загружает `docker-compose.yml` и `.env.example` в `./intlayer/`.
139
- 3. Если файл `.env` отсутствует, копирует пример и генерирует случайные секреты для `BETTER_AUTH_SECRET`, `S3_ACCESS_KEY_ID` и `S3_SECRET_ACCESS_KEY` с помощью `openssl rand`.
140
- 4. Запускает `docker compose pull` + `docker compose up -d`.
141
- 5. Выводит URL: панель управления `:3000`, API `:3100`, интерфейс электронной почты `:8025`, консоль MinIO `:9001`.
394
+ > Переменные портов изменяют только сторону **хоста** сопоставления. В опубликованных образах `http://localhost:3000`, `http://localhost:3100` и `http://localhost:9000` встроены в сборку панели управления, поэтому сохраняйте значения по умолчанию, если не собираете собственные образы, смотрите [Ограничения](#limitations).
142
395
 
143
- После запуска стека откройте **http://localhost:3000** и создайте свою первую учетную запись.
396
+ ## Первоначальная настройка
144
397
 
145
- ## Сервисы
398
+ На новом экземпляре (пустая база данных) открытие панели перенаправляет на страницу **`/init`**:
146
399
 
147
- | Сервис | Образ | Порт(ы) хоста | Назначение |
148
- | ----------- | ------------------------------------- | ------------------------------------- | ----------------------------------------------------------------- |
149
- | **app** | построен из `apps/app/Dockerfile` | `3000` | Панель управления TanStack Start (пользовательский интерфейс CMS) |
150
- | **backend** | построен из `apps/backend/Dockerfile` | `3100` | REST API Fastify (эндпоинт `/health`) |
151
- | **mongo** | `mongo:7` | внутренний | Репликационный набор из одного узла (`rs0`) |
152
- | **redis** | `redis:7-alpine` | внутренний | Очереди заданий (BullMQ) и кеширование (ioredis) |
153
- | **minio** | `minio/minio` | `9000` (S3), `9001` (консоль) | S3-совместимое объектное хранилище для аватаров и скриншотов |
154
- | **mailpit** | `axllent/mailpit` | `1025` (SMTP), `8025` (веб-интерфейс) | Локальный приемник транзакционных электронных писем |
400
+ 1. Создайте первую учетную запись. Поскольку коллекция пользователей пуста, эта учетная запись автоматически становится **суперадминистратором**.
401
+ 2. Письмо с подтверждением отправляется через Resend или ваше SMTP-реле. Подтверждение электронной почты является **обязательным**, поэтому почтовый сервис должен быть настроен до начала работы.
402
+ 3. Перейдите по ссылке в письме и войдите в систему.
155
403
 
156
- > Порт MinIO `9000` должен быть доступен из браузера, поскольку загруженные активы (аватары, скриншоты) загружаются непосредственно из `S3_PUBLIC_URL=http://localhost:9000/intlayer`.
404
+ Когда администратор уже существует, `/init` перенаправляет на стандартную страницу входа.
157
405
 
158
406
  ## Переменные окружения
159
407
 
160
- ### Обязательно
161
-
162
- | Переменная | Пример | Описание |
163
- | ---------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
164
- | `DB_ID` | `intlayer` | Пользователь MongoDB Atlas |
165
- | `DB_MDP` | _(ваш пароль)_ | Пароль MongoDB Atlas |
166
- | `DB_CLUSTER` | `cluster0.xxxxx.mongodb.net` | Хост кластера MongoDB Atlas (используется в URI `mongodb+srv://`) |
167
- | `BETTER_AUTH_SECRET` | _(сгенерировано)_ | 32-байтовый секрет для подписания сессии |
168
- | `S3_SECRET_ACCESS_KEY` | _(сгенерировано)_ | Секрет для встроенного MinIO |
169
- | `RESEND_API_KEY` | _(ваш ключ)_ | Транзакционные письма через Resend. Требуется для первоначальной настройки, если вы не настроили глобальный SMTP mailer (см. [Global mailer](#global-mailer)) |
170
-
171
- ### Обязательные (автоматически генерируемые или запрашиваемые)
172
-
173
- | Переменная | Пример | Описание |
174
- | ---------------------- | ----------------------------------------------- | ----------------------------------------------------------- |
175
- | `NODE_ENV` | `production` | Среда выполнения |
176
- | `PORT` | `3100` | Порт прослушивания бэкенда |
177
- | `BACKEND_URL` | `http://localhost:3100` | Публичный URL API бэкенда |
178
- | `APP_URL` | `http://localhost:3000` | Публичный URL панели управления |
179
- | `DOMAIN` | `localhost` | Домен для файлов cookie |
180
- | `MONGODB_URI` | `mongodb://mongo:27017/intlayer?replicaSet=rs0` | Полный URI для подключения к MongoDB |
181
- | `REDIS_URL` | `redis://redis:6379` | URL для подключения к Redis |
182
- | `BETTER_AUTH_SECRET` | _(сгенерирован)_ | 32-байтный секрет для подписи сессий |
183
- | `MAIL_PROVIDER` | `smtp` | Транспорт для почты: `smtp` или `resend` |
184
- | `MAIL_SMTP_HOST` | `mailpit` | Имя хоста SMTP (имя контейнера Mailpit) |
185
- | `MAIL_SMTP_PORT` | `1025` | Порт SMTP |
186
- | `MAIL_FROM` | `Intlayer <no-reply@localhost>` | Адрес отправителя |
187
- | `S3_ENDPOINT` | `http://minio:9000` | S3-совместимый эндпоинт |
188
- | `S3_PUBLIC_URL` | `http://localhost:9000/intlayer` | Публичный URL для загрузки активов браузером |
189
- | `S3_BUCKET_NAME` | `intlayer` | Имя корзины |
190
- | `S3_ACCESS_KEY_ID` | _(сгенерирован)_ | Ключ доступа MinIO |
191
- | `S3_SECRET_ACCESS_KEY` | _(сгенерирован)_ | Секретный ключ MinIO |
192
- | `VITE_BACKEND_URL` | `http://localhost:3100` | URL бэкенда, встроенный в панель управления во время сборки |
193
- | `VITE_DOMAIN` | `localhost` | Домен, встроенный в панель управления во время сборки |
194
-
195
- ### Необязательные (функции работают с ограничениями, если отсутствуют)
196
-
197
- | Переменная | Функция |
198
- | -------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
199
- | `OPENAI_API_KEY` | Перевод и аудит контента с помощью ИИ |
200
- | `STRIPE_SECRET_KEY`, `STRIPE_WEBHOOK_SECRET`, `STRIPE_*` | Управление счетами и подписками |
201
- | `RESEND_API_KEY` | Транзакционные электронные письма через Resend (переопределяет Mailpit, если установлено) |
202
- | `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` | Вход через GitHub OAuth |
203
- | `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` | Вход через Google OAuth |
204
- | `GITLAB_CLIENT_ID`, `GITLAB_CLIENT_SECRET` | Вход через GitLab OAuth |
205
- | `MICROSOFT_CLIENT_ID`, `MICROSOFT_CLIENT_SECRET` | Вход через Microsoft OAuth |
206
- | `LINKEDIN_CLIENT_ID`, `LINKEDIN_CLIENT_SECRET` | Вход через LinkedIn OAuth |
207
- | `ATLASSIAN_CLIENT_ID`, `ATLASSIAN_CLIENT_SECRET` | Вход через Atlassian OAuth |
208
-
209
- ### Глобальная почтовая система
210
-
211
- По умолчанию все транзакционные письма отправляются через Resend с использованием `RESEND_API_KEY`. Самостоятельно размещенные развертывания могут вместо этого маршрутизировать **все** письма — включая письма, не связанные с организацией, такие как сброс пароля и магические ссылки — через глобальную почтовую систему, настроенную с помощью переменных окружения.
212
-
213
- Установите `MAIL_PROVIDER` для её активации. Если она не установлена, используется почтовая система Resend по умолчанию.
214
-
215
- | Переменная | Пример | Описание |
216
- | -------------------- | ------------------------------ | ----------------------------------------------------------------------------------------------------------- |
217
- | `MAIL_PROVIDER` | `smtp` | Глобальная доставка: `smtp` или `resend`. Оставьте не установленной для использования значений по умолчанию |
218
- | `MAIL_FROM` | `Intlayer <no-reply@acme.com>` | Заголовок отправителя. Принимает простой адрес или формат `Name <email>` |
219
- | `MAIL_SMTP_HOST` | `smtp.acme.com` | SMTP-хост (обязателен, когда `MAIL_PROVIDER=smtp`) |
220
- | `MAIL_SMTP_PORT` | `587` | SMTP-порт (по умолчанию `587`) |
221
- | `MAIL_SMTP_SECURE` | `false` | Неявный TLS. Установите `true` для порта `465` |
222
- | `MAIL_SMTP_USER` | _(ваше имя пользователя)_ | Имя пользователя SMTP (необязательно; опустите для неаутентифицированных релеев) |
223
- | `MAIL_SMTP_PASSWORD` | _(ваш пароль)_ | Пароль SMTP |
224
-
225
- > Приоритет: собственная почтовая система организации (настроенная из панели управления **Organization**) имеет приоритет над глобальной почтовой системой, которая, в свою очередь, имеет приоритет над стандартным ключом Resend.
408
+ Оба режима Docker читают один и тот же файл (`intlayer.env` для контейнера, `.env` для Compose), сгенерированный из [`docker/selfhost/.env.template`](https://github.com/aymericzip/intlayer/blob/main/docker/selfhost/.env.template).
409
+
410
+ ### Обязательные
411
+
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
+ ### Фиксированные развертыванием
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
+ Служба `app` в Compose дополнительно получает `INTLAYER_BACKEND_INTERNAL_URL=http://backend:3100`: браузер обращается к API через `localhost:3100`, но SSR выполняется внутри сети Compose и должен использовать имя службы.
437
+
438
+ ### Необязательные (функции мягко деградируют при отсутствии)
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
+ ### Глобальный почтовый сервис
449
+
450
+ Каждое транзакционное письмо, включая внеорганизационные письма (сброс пароля, магические ссылки), проходит через один из двух глобальных транспортов:
451
+
452
+ - **Resend**, с использованием `RESEND_API_KEY`.
453
+ - **SMTP**, с использованием переменных `MAIL_SMTP_*`. Как только задана `MAIL_SMTP_HOST`, используется SMTP, а `RESEND_API_KEY` игнорируется.
454
+
455
+ `MAIL_PROVIDER` требуется только для принудительного выбора транспорта, когда настроены оба (например, `MAIL_PROVIDER=resend`, чтобы сохранить Resend при наличии SMTP-хоста).
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
+ > Приоритет: собственный почтовый сервис организации (настроенный в панели управления **Организация**) имеет приоритет над глобальным почтовым сервисом, который, в свою очередь, имеет приоритет над ключом Resend по умолчанию.
226
468
 
227
469
  ## Подключение вашего проекта Intlayer
228
470
 
229
- После запуска стека направьте свой проект на самохостинговый бэкенд и панель управления вместо `intlayer.org`.
471
+ После запуска стека настройте свой проект на использование собственного бэкенда и панели управления вместо `intlayer.org`.
230
472
 
231
473
  ### Конфигурация проекта
232
474
 
@@ -239,14 +481,14 @@ const config: IntlayerConfig = {
239
481
  clientSecret: process.env.INTLAYER_CLIENT_SECRET,
240
482
 
241
483
  /**
242
- * URL самохостинговой панели управления CMS.
243
- * По умолчанию: https://app.intlayer.org
484
+ * URL of the self-hosted CMS dashboard.
485
+ * Default: https://app.intlayer.org
244
486
  */
245
487
  cmsURL: process.env.INTLAYER_CMS_URL, // e.g. http://localhost:3000
246
488
 
247
489
  /**
248
- * URL самохостингового API бэкенда.
249
- * По умолчанию: https://back.intlayer.org
490
+ * URL of the self-hosted backend API.
491
+ * Default: https://back.intlayer.org
250
492
  */
251
493
  backendURL: process.env.INTLAYER_BACKEND_URL, // e.g. http://localhost:3100
252
494
  },
@@ -255,7 +497,7 @@ const config: IntlayerConfig = {
255
497
  export default config;
256
498
  ```
257
499
 
258
- Установите переменные окружения в файле `.env` вашего проекта:
500
+ Set the environment variables in your project's `.env`:
259
501
 
260
502
  ```sh
261
503
  INTLAYER_CMS_URL=http://localhost:3000
@@ -264,11 +506,11 @@ INTLAYER_CLIENT_ID=<your-client-id>
264
506
  INTLAYER_CLIENT_SECRET=<your-client-secret>
265
507
  ```
266
508
 
267
- Создайте учетные данные доступа на вашей самохостинговой панели управления в разделе **Проекты → Ключи доступа** по адресу `http://localhost:3000/projects`.
509
+ Создайте учетные данные доступа в панели управления собственного сервера в разделе **Проекты → Ключи доступа** по адресу `http://localhost:3000/projects`.
268
510
 
269
511
  ### SDK `@intlayer/api`
270
512
 
271
- При программном использовании SDK `@intlayer/api` явно передайте `backendURL`:
513
+ При программном использовании SDK `@intlayer/api` передавайте `backendURL` явно:
272
514
 
273
515
  ```typescript fileName="cms.ts" codeFormat="typescript"
274
516
  import { createIntlayerCMS } from "@intlayer/api";
@@ -285,84 +527,17 @@ const cms = createIntlayerCMS({
285
527
  const { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();
286
528
  ```
287
529
 
288
- ## Обновление
289
-
290
- Это загружает последние образы и перезапускает контейнеры с помощью `docker compose pull && docker compose up -d`. Существующие тома (`mongo-data`, `redis-data`, `minio-data`) сохраняются — потери данных нет.
291
-
292
- ```sh
293
- docker compose pull
294
- docker compose up -d
295
- ```
296
-
297
- ## Резервное копирование и восстановление
298
-
299
- Все постоянные данные хранятся в трех именованных томах Docker.
300
-
301
- ### Резервное копирование
302
-
303
- ```sh
304
- docker run --rm \
305
- -v intlayer_mongo-data:/data \
306
- -v "$(pwd)":/backup \
307
- busybox tar czf /backup/mongo-data.tar.gz /data
308
-
309
- docker run --rm \
310
- -v intlayer_redis-data:/data \
311
- -v "$(pwd)":/backup \
312
- busybox tar czf /backup/redis-data.tar.gz /data
313
-
314
- docker run --rm \
315
- -v intlayer_minio-data:/data \
316
- -v "$(pwd)":/backup \
317
- busybox tar czf /backup/minio-data.tar.gz /data
318
- ```
319
-
320
- ### Восстановление
321
-
322
- ```sh
323
- docker run --rm \
324
- -v intlayer_mongo-data:/data \
325
- -v "$(pwd)":/backup \
326
- busybox tar xzf /backup/mongo-data.tar.gz -C /
327
-
328
- # Повторите для redis-data и minio-data
329
- ```
330
-
331
530
  ## Ограничения
332
531
 
333
- - **MongoDB должна быть внешней (Atlas).** Backend подключается только через `mongodb+srv://` (собирается из `DB_ID` / `DB_MDP` / `DB_CLUSTER`), поэтому обычный `mongodb://host:27017` — включая встроенный `mongod` контейнера — не может быть использован. Предоставьте кластер MongoDB Atlas.
334
- - **Нет пользовательского домена.** Все URL-адреса `VITE_*`, обращенные к браузеру, встраиваются в приложение во время сборки, и опубликованный образ поставляется со значениями `localhost`. Доступ к панели управления должен осуществляться через `http://localhost:3000`; подача его на общедоступный домен потребует перестройки образа с встроенными целевыми URL-адресами и не поддерживается из коробки.
335
- - **Email требует работающего mailer.** Начальная настройка требует проверки электронной почты, поэтому должны быть настроены либо `RESEND_API_KEY`, либо [глобальный SMTP mailer](#global-mailer) (`MAIL_PROVIDER=smtp` + `MAIL_SMTP_*`). После входа первого администратора каждая организация также может настроить свой собственный SMTP или Resend mailer из панели управления.
336
-
337
- ## Устранение неполадок
338
-
339
- ### Бэкенд циклически перезапускается при первом запуске
340
-
341
- MongoDB и Redis должны быть работоспособны до запуска бэкенда. Файл compose использует `depends_on` с `condition: service_healthy`. Если вы видите повторяющиеся перезапуски бэкенда, убедитесь, что проверки работоспособности `mongo` и `redis` проходят:
342
-
343
- ```sh
344
- docker compose ps
345
- docker compose logs mongo
346
- docker compose logs redis
347
- ```
348
-
349
- Найдите `MongoDB connection error` ближе к началу логов.
350
-
351
- ### Панель управления не может связаться с API
352
-
353
- Убедитесь, что `VITE_BACKEND_URL` соответствует URL, по которому бэкенд доступен из **браузера** (а не из сети Docker). Если вы изменили порт бэкенда или добавили обратный прокси, пересоберите образ панели управления:
354
-
355
- ### Отсутствует корзина MinIO
356
-
357
- Если одноразовый сервис `minio-init` не запустился (или запустился до того, как MinIO был готов), создайте корзину вручную:
358
-
359
- ```sh
360
- docker compose run --rm minio-init
361
- ```
532
+ - **Без пользовательского домена и без переназначения портов.** Все URL-адреса `VITE_*` для браузера встроены в панель управления во время сборки, а опубликованные образы (и десктопное приложение) поставляются со значениями `localhost` / Intlayer Cloud. Панель управления должна быть доступна по адресу `http://localhost:3000`, API — по адресу `:3100`, а MinIO — по адресу `:9000`. Размещение на публичном домене или подключение десктопного приложения к собственному бэкенду требует пересборки с внедренными целевыми URL (`--build-arg VITE_BACKEND_URL=… VITE_SITE_URL=… VITE_DOMAIN=…` в `docker/selfhost/Dockerfile` или через `docker-compose.build.yml`) и не поддерживается по умолчанию.
533
+ - **Для работы почты требуется рабочий почтовый сервис.** При первой настройке требуется подтверждение электронной почты, поэтому необходимо настроить `RESEND_API_KEY` или [SMTP-реле](#global-mailer) (`MAIL_SMTP_*`). После входа первого администратора каждая организация может настроить собственный SMTP или Resend из панели управления.
534
+ - **Десктопному приложению требуется Node.js** на компьютере для запуска встроенного сервера.
362
535
 
363
536
  ## Полезные ссылки
364
537
 
365
538
  - [Документация Intlayer CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/intlayer_CMS.md)
366
539
  - [Справочник по конфигурации](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/configuration.md)
367
- - [CMS SDK — `@intlayer/api`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/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)
540
+ - [CMS SDK: `@intlayer/api`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/intlayer_CMS.md#programmatic-access-with-the-intlayerapi-sdk)
541
+ - [Релизы десктопного приложения](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), зеркало на GHCR: `ghcr.io/aymericzip/intlayer/`
543
+ - [`docker/selfhost/`](https://github.com/aymericzip/intlayer/tree/main/docker/selfhost): Dockerfile, `docker-compose.yml` и `.env.template`