@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.
- package/blog/ar/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/ar/i18next_vs_intlayer.md +130 -16
- package/blog/ar/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/ar/lingui_vs_intlayer.md +122 -15
- package/blog/ar/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/ar/next-intl_vs_intlayer.md +136 -20
- package/blog/ar/vue-i18n_vs_intlayer-vue-i18n.md +119 -17
- package/blog/ar/vue-i18n_vs_intlayer.md +193 -31
- package/blog/ar/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/de/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/de/i18next_vs_intlayer.md +128 -14
- package/blog/de/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/de/lingui_vs_intlayer.md +122 -15
- package/blog/de/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/de/next-intl_vs_intlayer.md +125 -15
- package/blog/de/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/de/vue-i18n_vs_intlayer.md +193 -31
- package/blog/en/i18next_vs_intlayer-i18next.md +121 -14
- package/blog/en/i18next_vs_intlayer.md +128 -14
- package/blog/en/is_intlayer_lighter_than_paraglide.md +288 -0
- package/blog/en/lingui_vs_intlayer.md +124 -15
- package/blog/en/next-intl_vs_intlayer-next-intl.md +123 -14
- package/blog/en/next-intl_vs_intlayer.md +125 -13
- package/blog/en/vue-i18n_vs_intlayer-vue-i18n.md +115 -15
- package/blog/en/vue-i18n_vs_intlayer.md +188 -27
- package/blog/en-GB/i18next_vs_intlayer-i18next.md +121 -14
- package/blog/en-GB/i18next_vs_intlayer.md +128 -14
- package/blog/en-GB/is_intlayer_lighter_than_paraglide.md +285 -0
- package/blog/en-GB/lingui_vs_intlayer.md +122 -15
- package/blog/en-GB/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/en-GB/next-intl_vs_intlayer.md +125 -15
- package/blog/en-GB/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/en-GB/vue-i18n_vs_intlayer.md +187 -25
- package/blog/en-GB/vue-i18n_vs_intlayer_benchmark.md +116 -0
- package/blog/es/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/es/i18next_vs_intlayer.md +128 -14
- package/blog/es/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/es/lingui_vs_intlayer.md +122 -15
- package/blog/es/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/es/next-intl_vs_intlayer.md +125 -15
- package/blog/es/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/es/vue-i18n_vs_intlayer.md +193 -31
- package/blog/fr/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/fr/i18next_vs_intlayer.md +128 -14
- package/blog/fr/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/fr/lingui_vs_intlayer.md +122 -15
- package/blog/fr/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/fr/next-intl_vs_intlayer.md +127 -15
- package/blog/fr/vue-i18n_vs_intlayer-vue-i18n.md +118 -17
- package/blog/fr/vue-i18n_vs_intlayer.md +192 -31
- package/blog/fr/vue-i18n_vs_intlayer_benchmark.md +329 -7
- package/blog/hi/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/hi/i18next_vs_intlayer.md +130 -16
- package/blog/hi/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/hi/lingui_vs_intlayer.md +122 -15
- package/blog/hi/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/hi/next-intl_vs_intlayer.md +135 -19
- package/blog/hi/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/hi/vue-i18n_vs_intlayer.md +193 -31
- package/blog/hi/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/id/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/id/i18next_vs_intlayer.md +128 -14
- package/blog/id/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/id/lingui_vs_intlayer.md +122 -15
- package/blog/id/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/id/next-intl_vs_intlayer.md +135 -19
- package/blog/id/vue-i18n_vs_intlayer-vue-i18n.md +354 -2
- package/blog/id/vue-i18n_vs_intlayer.md +188 -26
- package/blog/id/vue-i18n_vs_intlayer_benchmark.md +327 -7
- package/blog/it/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/it/i18next_vs_intlayer.md +128 -14
- package/blog/it/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/it/lingui_vs_intlayer.md +122 -15
- package/blog/it/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/it/next-intl_vs_intlayer.md +125 -15
- package/blog/it/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/it/vue-i18n_vs_intlayer.md +191 -31
- package/blog/it/vue-i18n_vs_intlayer_benchmark.md +332 -5
- package/blog/ja/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/ja/i18next_vs_intlayer.md +129 -17
- package/blog/ja/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/ja/lingui_vs_intlayer.md +122 -15
- package/blog/ja/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/ja/next-intl_vs_intlayer.md +124 -14
- package/blog/ja/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/ja/vue-i18n_vs_intlayer.md +193 -31
- package/blog/ja/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/ko/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/ko/i18next_vs_intlayer.md +129 -17
- package/blog/ko/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/ko/lingui_vs_intlayer.md +122 -15
- package/blog/ko/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/ko/next-intl_vs_intlayer.md +134 -18
- package/blog/ko/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/ko/vue-i18n_vs_intlayer.md +193 -31
- package/blog/pl/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/pl/i18next_vs_intlayer.md +128 -14
- package/blog/pl/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/pl/lingui_vs_intlayer.md +122 -15
- package/blog/pl/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/pl/next-intl_vs_intlayer.md +134 -18
- package/blog/pl/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/pl/vue-i18n_vs_intlayer.md +188 -26
- package/blog/pl/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/pt/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/pt/i18next_vs_intlayer.md +128 -14
- package/blog/pt/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/pt/lingui_vs_intlayer.md +122 -15
- package/blog/pt/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/pt/next-intl_vs_intlayer.md +131 -15
- package/blog/pt/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/pt/vue-i18n_vs_intlayer.md +193 -31
- package/blog/pt/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/ru/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/ru/i18next_vs_intlayer.md +130 -16
- package/blog/ru/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/ru/lingui_vs_intlayer.md +122 -15
- package/blog/ru/next-intl_vs_intlayer-next-intl.md +125 -16
- package/blog/ru/next-intl_vs_intlayer.md +123 -13
- package/blog/ru/vue-i18n_vs_intlayer-vue-i18n.md +127 -27
- package/blog/ru/vue-i18n_vs_intlayer.md +193 -31
- package/blog/ru/vue-i18n_vs_intlayer_benchmark.md +326 -19
- package/blog/tr/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/tr/i18next_vs_intlayer.md +128 -14
- package/blog/tr/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/tr/lingui_vs_intlayer.md +122 -15
- package/blog/tr/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/tr/next-intl_vs_intlayer.md +136 -20
- package/blog/tr/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/tr/vue-i18n_vs_intlayer.md +188 -26
- package/blog/tr/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/uk/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/uk/i18next_vs_intlayer.md +130 -16
- package/blog/uk/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/uk/lingui_vs_intlayer.md +122 -15
- package/blog/uk/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/uk/next-intl_vs_intlayer.md +135 -19
- package/blog/uk/vue-i18n_vs_intlayer-vue-i18n.md +135 -17
- package/blog/uk/vue-i18n_vs_intlayer.md +188 -27
- package/blog/uk/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/vi/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/vi/i18next_vs_intlayer.md +128 -14
- package/blog/vi/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/vi/lingui_vs_intlayer.md +122 -15
- package/blog/vi/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/vi/next-intl_vs_intlayer.md +135 -19
- package/blog/vi/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/vi/vue-i18n_vs_intlayer.md +188 -26
- package/blog/vi/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/zh/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/zh/i18next_vs_intlayer.md +128 -14
- package/blog/zh/is_intlayer_lighter_than_paraglide.md +284 -0
- package/blog/zh/lingui_vs_intlayer.md +122 -15
- package/blog/zh/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/zh/next-intl_vs_intlayer.md +125 -15
- package/blog/zh/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/zh/vue-i18n_vs_intlayer.md +192 -31
- package/blog/zh/vue-i18n_vs_intlayer_benchmark.md +340 -9
- package/dist/cjs/generated/blog.entry.cjs +20 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +60 -40
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +20 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +60 -40
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/generated/blog.entry.d.ts +1 -0
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +3 -2
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/benchmark/nextjs.md +19 -16
- package/docs/ar/benchmark/solid.md +26 -9
- package/docs/ar/benchmark/svelte.md +22 -7
- package/docs/ar/benchmark/tanstack.md +20 -16
- package/docs/ar/benchmark/vue.md +19 -10
- package/docs/ar/chrome_extension.md +130 -0
- package/docs/ar/cli/index.md +11 -1
- package/docs/ar/cli/infra.md +162 -0
- package/docs/ar/cli/init.md +24 -1
- package/docs/ar/cli/upgrade.md +125 -0
- package/docs/ar/dictionary/html.md +173 -5
- package/docs/ar/dictionary/markdown.md +263 -1
- package/docs/ar/intlayer_with_analog.md +23 -1
- package/docs/ar/intlayer_with_angular_19.md +24 -1
- package/docs/ar/intlayer_with_angular_21.md +24 -1
- package/docs/ar/intlayer_with_astro.md +24 -1
- package/docs/ar/intlayer_with_astro_lit.md +25 -1
- package/docs/ar/intlayer_with_astro_preact.md +26 -1
- package/docs/ar/intlayer_with_astro_react.md +26 -1
- package/docs/ar/intlayer_with_astro_solid.md +26 -1
- package/docs/ar/intlayer_with_astro_svelte.md +25 -1
- package/docs/ar/intlayer_with_astro_vue.md +25 -1
- package/docs/ar/intlayer_with_remix_3.md +22 -1
- package/docs/ar/self_hosting.md +406 -231
- package/docs/de/benchmark/nextjs.md +19 -16
- package/docs/de/benchmark/solid.md +26 -9
- package/docs/de/benchmark/svelte.md +22 -7
- package/docs/de/benchmark/tanstack.md +20 -16
- package/docs/de/benchmark/vue.md +19 -10
- package/docs/de/chrome_extension.md +130 -0
- package/docs/de/cli/index.md +11 -1
- package/docs/de/cli/infra.md +162 -0
- package/docs/de/cli/init.md +24 -1
- package/docs/de/cli/upgrade.md +125 -0
- package/docs/de/dictionary/html.md +173 -5
- package/docs/de/dictionary/markdown.md +263 -1
- package/docs/de/intlayer_with_analog.md +23 -1
- package/docs/de/intlayer_with_angular_19.md +24 -1
- package/docs/de/intlayer_with_angular_21.md +24 -1
- package/docs/de/intlayer_with_astro.md +24 -1
- package/docs/de/intlayer_with_astro_lit.md +25 -1
- package/docs/de/intlayer_with_astro_preact.md +26 -1
- package/docs/de/intlayer_with_astro_react.md +26 -1
- package/docs/de/intlayer_with_astro_solid.md +26 -1
- package/docs/de/intlayer_with_astro_svelte.md +25 -1
- package/docs/de/intlayer_with_astro_vue.md +25 -1
- package/docs/de/intlayer_with_remix_3.md +22 -1
- package/docs/de/self_hosting.md +404 -227
- package/docs/en/agent_skills.md +29 -1
- package/docs/en/benchmark/nextjs.md +19 -16
- package/docs/en/benchmark/solid.md +26 -9
- package/docs/en/benchmark/svelte.md +22 -7
- package/docs/en/benchmark/tanstack.md +21 -17
- package/docs/en/benchmark/vue.md +20 -11
- package/docs/en/chrome_extension.md +130 -0
- package/docs/en/cli/index.md +11 -1
- package/docs/en/cli/infra.md +175 -0
- package/docs/en/cli/init.md +25 -1
- package/docs/en/cli/upgrade.md +125 -0
- package/docs/en/dictionary/html.md +173 -5
- package/docs/en/dictionary/markdown.md +263 -1
- package/docs/en/intlayer_with_analog.md +23 -1
- package/docs/en/intlayer_with_angular_19.md +24 -1
- package/docs/en/intlayer_with_angular_21.md +24 -1
- package/docs/en/intlayer_with_astro.md +24 -1
- package/docs/en/intlayer_with_astro_lit.md +25 -1
- package/docs/en/intlayer_with_astro_preact.md +26 -1
- package/docs/en/intlayer_with_astro_react.md +26 -1
- package/docs/en/intlayer_with_astro_solid.md +26 -1
- package/docs/en/intlayer_with_astro_svelte.md +25 -1
- package/docs/en/intlayer_with_astro_vue.md +25 -1
- package/docs/en/intlayer_with_remix_3.md +22 -1
- package/docs/en/self_hosting.md +418 -176
- package/docs/en-GB/benchmark/nextjs.md +19 -16
- package/docs/en-GB/benchmark/solid.md +26 -9
- package/docs/en-GB/benchmark/svelte.md +22 -7
- package/docs/en-GB/benchmark/tanstack.md +20 -16
- package/docs/en-GB/benchmark/vue.md +20 -11
- package/docs/en-GB/chrome_extension.md +130 -0
- package/docs/en-GB/cli/index.md +11 -1
- package/docs/en-GB/cli/infra.md +162 -0
- package/docs/en-GB/cli/init.md +24 -1
- package/docs/en-GB/cli/upgrade.md +125 -0
- package/docs/en-GB/dictionary/html.md +173 -5
- package/docs/en-GB/dictionary/markdown.md +263 -1
- package/docs/en-GB/intlayer_with_analog.md +23 -1
- package/docs/en-GB/intlayer_with_angular_19.md +24 -1
- package/docs/en-GB/intlayer_with_angular_21.md +24 -1
- package/docs/en-GB/intlayer_with_astro.md +24 -1
- package/docs/en-GB/intlayer_with_astro_lit.md +25 -1
- package/docs/en-GB/intlayer_with_astro_preact.md +26 -1
- package/docs/en-GB/intlayer_with_astro_react.md +26 -1
- package/docs/en-GB/intlayer_with_astro_solid.md +26 -1
- package/docs/en-GB/intlayer_with_astro_svelte.md +25 -1
- package/docs/en-GB/intlayer_with_astro_vue.md +25 -1
- package/docs/en-GB/intlayer_with_remix_3.md +22 -1
- package/docs/en-GB/self_hosting.md +381 -206
- package/docs/es/benchmark/nextjs.md +19 -16
- package/docs/es/benchmark/solid.md +26 -9
- package/docs/es/benchmark/svelte.md +22 -7
- package/docs/es/benchmark/tanstack.md +20 -16
- package/docs/es/benchmark/vue.md +19 -10
- package/docs/es/chrome_extension.md +130 -0
- package/docs/es/cli/index.md +11 -1
- package/docs/es/cli/infra.md +162 -0
- package/docs/es/cli/init.md +24 -1
- package/docs/es/cli/upgrade.md +125 -0
- package/docs/es/dictionary/html.md +173 -5
- package/docs/es/dictionary/markdown.md +263 -1
- package/docs/es/intlayer_with_analog.md +23 -1
- package/docs/es/intlayer_with_angular_19.md +24 -1
- package/docs/es/intlayer_with_angular_21.md +24 -1
- package/docs/es/intlayer_with_astro.md +24 -1
- package/docs/es/intlayer_with_astro_lit.md +25 -1
- package/docs/es/intlayer_with_astro_preact.md +26 -1
- package/docs/es/intlayer_with_astro_react.md +26 -1
- package/docs/es/intlayer_with_astro_solid.md +26 -1
- package/docs/es/intlayer_with_astro_svelte.md +25 -1
- package/docs/es/intlayer_with_astro_vue.md +25 -1
- package/docs/es/intlayer_with_remix_3.md +22 -1
- package/docs/es/self_hosting.md +400 -223
- package/docs/fr/benchmark/nextjs.md +19 -16
- package/docs/fr/benchmark/solid.md +26 -9
- package/docs/fr/benchmark/svelte.md +22 -7
- package/docs/fr/benchmark/tanstack.md +20 -16
- package/docs/fr/benchmark/vue.md +20 -11
- package/docs/fr/chrome_extension.md +130 -0
- package/docs/fr/cli/index.md +11 -1
- package/docs/fr/cli/infra.md +162 -0
- package/docs/fr/cli/init.md +24 -1
- package/docs/fr/cli/upgrade.md +125 -0
- package/docs/fr/dictionary/html.md +173 -5
- package/docs/fr/dictionary/markdown.md +265 -4
- package/docs/fr/intlayer_with_analog.md +23 -1
- package/docs/fr/intlayer_with_angular_19.md +24 -1
- package/docs/fr/intlayer_with_angular_21.md +24 -1
- package/docs/fr/intlayer_with_astro.md +24 -1
- package/docs/fr/intlayer_with_astro_lit.md +25 -1
- package/docs/fr/intlayer_with_astro_preact.md +26 -1
- package/docs/fr/intlayer_with_astro_react.md +26 -1
- package/docs/fr/intlayer_with_astro_solid.md +26 -1
- package/docs/fr/intlayer_with_astro_svelte.md +25 -1
- package/docs/fr/intlayer_with_astro_vue.md +25 -1
- package/docs/fr/intlayer_with_remix_3.md +22 -1
- package/docs/fr/self_hosting.md +401 -224
- package/docs/hi/benchmark/nextjs.md +19 -16
- package/docs/hi/benchmark/solid.md +26 -9
- package/docs/hi/benchmark/svelte.md +22 -7
- package/docs/hi/benchmark/tanstack.md +20 -16
- package/docs/hi/benchmark/vue.md +20 -11
- package/docs/hi/chrome_extension.md +130 -0
- package/docs/hi/cli/index.md +11 -1
- package/docs/hi/cli/infra.md +162 -0
- package/docs/hi/cli/init.md +24 -1
- package/docs/hi/cli/upgrade.md +125 -0
- package/docs/hi/dictionary/html.md +173 -5
- package/docs/hi/dictionary/markdown.md +263 -1
- package/docs/hi/intlayer_with_analog.md +23 -1
- package/docs/hi/intlayer_with_angular_19.md +24 -1
- package/docs/hi/intlayer_with_angular_21.md +24 -1
- package/docs/hi/intlayer_with_astro.md +24 -1
- package/docs/hi/intlayer_with_astro_lit.md +25 -1
- package/docs/hi/intlayer_with_astro_preact.md +26 -1
- package/docs/hi/intlayer_with_astro_react.md +26 -1
- package/docs/hi/intlayer_with_astro_solid.md +26 -1
- package/docs/hi/intlayer_with_astro_svelte.md +25 -1
- package/docs/hi/intlayer_with_astro_vue.md +25 -1
- package/docs/hi/intlayer_with_remix_3.md +22 -1
- package/docs/hi/self_hosting.md +409 -235
- package/docs/id/benchmark/nextjs.md +19 -16
- package/docs/id/benchmark/solid.md +26 -9
- package/docs/id/benchmark/svelte.md +22 -7
- package/docs/id/benchmark/tanstack.md +20 -16
- package/docs/id/benchmark/vue.md +20 -11
- package/docs/id/chrome_extension.md +130 -0
- package/docs/id/cli/index.md +11 -1
- package/docs/id/cli/infra.md +162 -0
- package/docs/id/cli/init.md +24 -1
- package/docs/id/cli/upgrade.md +125 -0
- package/docs/id/dictionary/html.md +173 -5
- package/docs/id/dictionary/markdown.md +263 -1
- package/docs/id/intlayer_with_analog.md +23 -1
- package/docs/id/intlayer_with_angular_19.md +24 -1
- package/docs/id/intlayer_with_angular_21.md +24 -1
- package/docs/id/intlayer_with_astro.md +24 -1
- package/docs/id/intlayer_with_astro_lit.md +25 -1
- package/docs/id/intlayer_with_astro_preact.md +26 -1
- package/docs/id/intlayer_with_astro_react.md +26 -1
- package/docs/id/intlayer_with_astro_solid.md +26 -1
- package/docs/id/intlayer_with_astro_svelte.md +25 -1
- package/docs/id/intlayer_with_astro_vue.md +25 -1
- package/docs/id/intlayer_with_remix_3.md +22 -1
- package/docs/id/self_hosting.md +416 -243
- package/docs/it/benchmark/nextjs.md +19 -16
- package/docs/it/benchmark/solid.md +26 -9
- package/docs/it/benchmark/svelte.md +22 -7
- package/docs/it/benchmark/tanstack.md +20 -16
- package/docs/it/benchmark/vue.md +19 -10
- package/docs/it/chrome_extension.md +130 -0
- package/docs/it/cli/index.md +11 -1
- package/docs/it/cli/infra.md +162 -0
- package/docs/it/cli/init.md +24 -1
- package/docs/it/cli/upgrade.md +125 -0
- package/docs/it/dictionary/html.md +173 -5
- package/docs/it/dictionary/markdown.md +263 -1
- package/docs/it/intlayer_with_analog.md +23 -1
- package/docs/it/intlayer_with_angular_19.md +24 -1
- package/docs/it/intlayer_with_angular_21.md +24 -1
- package/docs/it/intlayer_with_astro.md +24 -1
- package/docs/it/intlayer_with_astro_lit.md +25 -1
- package/docs/it/intlayer_with_astro_preact.md +26 -1
- package/docs/it/intlayer_with_astro_react.md +26 -1
- package/docs/it/intlayer_with_astro_solid.md +26 -1
- package/docs/it/intlayer_with_astro_svelte.md +25 -1
- package/docs/it/intlayer_with_astro_vue.md +25 -1
- package/docs/it/intlayer_with_remix_3.md +22 -1
- package/docs/it/self_hosting.md +412 -237
- package/docs/ja/benchmark/nextjs.md +19 -16
- package/docs/ja/benchmark/solid.md +26 -9
- package/docs/ja/benchmark/svelte.md +22 -7
- package/docs/ja/benchmark/tanstack.md +18 -14
- package/docs/ja/benchmark/vue.md +19 -10
- package/docs/ja/chrome_extension.md +130 -0
- package/docs/ja/cli/index.md +11 -1
- package/docs/ja/cli/infra.md +162 -0
- package/docs/ja/cli/init.md +24 -1
- package/docs/ja/cli/upgrade.md +125 -0
- package/docs/ja/dictionary/html.md +173 -5
- package/docs/ja/dictionary/markdown.md +263 -1
- package/docs/ja/intlayer_with_analog.md +23 -1
- package/docs/ja/intlayer_with_angular_19.md +24 -1
- package/docs/ja/intlayer_with_angular_21.md +24 -1
- package/docs/ja/intlayer_with_astro.md +24 -1
- package/docs/ja/intlayer_with_astro_lit.md +25 -1
- package/docs/ja/intlayer_with_astro_preact.md +26 -1
- package/docs/ja/intlayer_with_astro_react.md +26 -1
- package/docs/ja/intlayer_with_astro_solid.md +26 -1
- package/docs/ja/intlayer_with_astro_svelte.md +25 -1
- package/docs/ja/intlayer_with_astro_vue.md +25 -1
- package/docs/ja/intlayer_with_remix_3.md +22 -1
- package/docs/ja/self_hosting.md +398 -223
- package/docs/ko/benchmark/nextjs.md +19 -16
- package/docs/ko/benchmark/solid.md +26 -9
- package/docs/ko/benchmark/svelte.md +22 -7
- package/docs/ko/benchmark/tanstack.md +20 -16
- package/docs/ko/benchmark/vue.md +20 -11
- package/docs/ko/chrome_extension.md +130 -0
- package/docs/ko/cli/index.md +11 -1
- package/docs/ko/cli/infra.md +162 -0
- package/docs/ko/cli/init.md +24 -1
- package/docs/ko/cli/upgrade.md +126 -0
- package/docs/ko/dictionary/html.md +173 -5
- package/docs/ko/dictionary/markdown.md +263 -1
- package/docs/ko/intlayer_with_analog.md +23 -1
- package/docs/ko/intlayer_with_angular_19.md +24 -1
- package/docs/ko/intlayer_with_angular_21.md +24 -1
- package/docs/ko/intlayer_with_astro.md +24 -1
- package/docs/ko/intlayer_with_astro_lit.md +25 -1
- package/docs/ko/intlayer_with_astro_preact.md +26 -1
- package/docs/ko/intlayer_with_astro_react.md +26 -1
- package/docs/ko/intlayer_with_astro_solid.md +26 -1
- package/docs/ko/intlayer_with_astro_svelte.md +25 -1
- package/docs/ko/intlayer_with_astro_vue.md +25 -1
- package/docs/ko/intlayer_with_remix_3.md +22 -1
- package/docs/ko/self_hosting.md +411 -238
- package/docs/pl/benchmark/nextjs.md +19 -16
- package/docs/pl/benchmark/solid.md +26 -9
- package/docs/pl/benchmark/svelte.md +22 -7
- package/docs/pl/benchmark/tanstack.md +20 -16
- package/docs/pl/benchmark/vue.md +20 -11
- package/docs/pl/chrome_extension.md +130 -0
- package/docs/pl/cli/index.md +11 -1
- package/docs/pl/cli/infra.md +162 -0
- package/docs/pl/cli/init.md +24 -1
- package/docs/pl/cli/upgrade.md +125 -0
- package/docs/pl/dictionary/html.md +173 -5
- package/docs/pl/dictionary/markdown.md +263 -1
- package/docs/pl/intlayer_with_analog.md +23 -1
- package/docs/pl/intlayer_with_angular_19.md +24 -1
- package/docs/pl/intlayer_with_angular_21.md +24 -1
- package/docs/pl/intlayer_with_astro.md +24 -1
- package/docs/pl/intlayer_with_astro_lit.md +25 -1
- package/docs/pl/intlayer_with_astro_preact.md +26 -1
- package/docs/pl/intlayer_with_astro_react.md +26 -1
- package/docs/pl/intlayer_with_astro_solid.md +26 -1
- package/docs/pl/intlayer_with_astro_svelte.md +25 -1
- package/docs/pl/intlayer_with_astro_vue.md +25 -1
- package/docs/pl/intlayer_with_remix_3.md +22 -1
- package/docs/pl/self_hosting.md +408 -233
- package/docs/pt/benchmark/nextjs.md +19 -16
- package/docs/pt/benchmark/solid.md +26 -9
- package/docs/pt/benchmark/svelte.md +22 -7
- package/docs/pt/benchmark/tanstack.md +20 -16
- package/docs/pt/benchmark/vue.md +19 -10
- package/docs/pt/chrome_extension.md +130 -0
- package/docs/pt/cli/index.md +11 -1
- package/docs/pt/cli/infra.md +162 -0
- package/docs/pt/cli/init.md +24 -1
- package/docs/pt/cli/upgrade.md +125 -0
- package/docs/pt/dictionary/html.md +173 -5
- package/docs/pt/dictionary/markdown.md +263 -1
- package/docs/pt/intlayer_with_analog.md +23 -1
- package/docs/pt/intlayer_with_angular_19.md +24 -1
- package/docs/pt/intlayer_with_angular_21.md +24 -1
- package/docs/pt/intlayer_with_astro.md +24 -1
- package/docs/pt/intlayer_with_astro_lit.md +25 -1
- package/docs/pt/intlayer_with_astro_preact.md +26 -1
- package/docs/pt/intlayer_with_astro_react.md +26 -1
- package/docs/pt/intlayer_with_astro_solid.md +26 -1
- package/docs/pt/intlayer_with_astro_svelte.md +25 -1
- package/docs/pt/intlayer_with_astro_vue.md +25 -1
- package/docs/pt/intlayer_with_remix_3.md +22 -1
- package/docs/pt/self_hosting.md +399 -224
- package/docs/ru/benchmark/nextjs.md +19 -16
- package/docs/ru/benchmark/solid.md +26 -9
- package/docs/ru/benchmark/svelte.md +22 -7
- package/docs/ru/benchmark/tanstack.md +20 -16
- package/docs/ru/benchmark/vue.md +20 -11
- package/docs/ru/chrome_extension.md +130 -0
- package/docs/ru/cli/index.md +11 -1
- package/docs/ru/cli/infra.md +162 -0
- package/docs/ru/cli/init.md +24 -1
- package/docs/ru/cli/upgrade.md +125 -0
- package/docs/ru/dictionary/html.md +173 -5
- package/docs/ru/dictionary/markdown.md +263 -1
- package/docs/ru/intlayer_with_analog.md +23 -1
- package/docs/ru/intlayer_with_angular_19.md +24 -1
- package/docs/ru/intlayer_with_angular_21.md +24 -1
- package/docs/ru/intlayer_with_astro.md +24 -1
- package/docs/ru/intlayer_with_astro_lit.md +25 -1
- package/docs/ru/intlayer_with_astro_preact.md +26 -1
- package/docs/ru/intlayer_with_astro_react.md +26 -1
- package/docs/ru/intlayer_with_astro_solid.md +26 -1
- package/docs/ru/intlayer_with_astro_svelte.md +25 -1
- package/docs/ru/intlayer_with_astro_vue.md +25 -1
- package/docs/ru/intlayer_with_remix_3.md +22 -1
- package/docs/ru/self_hosting.md +403 -228
- package/docs/tr/benchmark/nextjs.md +19 -16
- package/docs/tr/benchmark/solid.md +26 -9
- package/docs/tr/benchmark/svelte.md +22 -7
- package/docs/tr/benchmark/tanstack.md +20 -16
- package/docs/tr/benchmark/vue.md +20 -11
- package/docs/tr/chrome_extension.md +130 -0
- package/docs/tr/cli/index.md +11 -1
- package/docs/tr/cli/infra.md +162 -0
- package/docs/tr/cli/init.md +24 -1
- package/docs/tr/cli/upgrade.md +125 -0
- package/docs/tr/dictionary/html.md +173 -5
- package/docs/tr/dictionary/markdown.md +263 -1
- package/docs/tr/intlayer_with_analog.md +23 -1
- package/docs/tr/intlayer_with_angular_19.md +24 -1
- package/docs/tr/intlayer_with_angular_21.md +24 -1
- package/docs/tr/intlayer_with_astro.md +24 -1
- package/docs/tr/intlayer_with_astro_lit.md +25 -1
- package/docs/tr/intlayer_with_astro_preact.md +26 -1
- package/docs/tr/intlayer_with_astro_react.md +26 -1
- package/docs/tr/intlayer_with_astro_solid.md +26 -1
- package/docs/tr/intlayer_with_astro_svelte.md +25 -1
- package/docs/tr/intlayer_with_astro_vue.md +25 -1
- package/docs/tr/intlayer_with_remix_3.md +22 -1
- package/docs/tr/self_hosting.md +410 -234
- package/docs/uk/benchmark/nextjs.md +19 -16
- package/docs/uk/benchmark/solid.md +26 -9
- package/docs/uk/benchmark/svelte.md +22 -7
- package/docs/uk/benchmark/tanstack.md +20 -16
- package/docs/uk/benchmark/vue.md +20 -11
- package/docs/uk/chrome_extension.md +130 -0
- package/docs/uk/cli/index.md +11 -1
- package/docs/uk/cli/infra.md +162 -0
- package/docs/uk/cli/init.md +24 -1
- package/docs/uk/cli/upgrade.md +125 -0
- package/docs/uk/dictionary/html.md +173 -5
- package/docs/uk/dictionary/markdown.md +263 -1
- package/docs/uk/intlayer_with_analog.md +23 -1
- package/docs/uk/intlayer_with_angular_19.md +24 -1
- package/docs/uk/intlayer_with_angular_21.md +24 -1
- package/docs/uk/intlayer_with_astro.md +24 -1
- package/docs/uk/intlayer_with_astro_lit.md +25 -1
- package/docs/uk/intlayer_with_astro_preact.md +26 -1
- package/docs/uk/intlayer_with_astro_react.md +26 -1
- package/docs/uk/intlayer_with_astro_solid.md +26 -1
- package/docs/uk/intlayer_with_astro_svelte.md +25 -1
- package/docs/uk/intlayer_with_astro_vue.md +25 -1
- package/docs/uk/intlayer_with_remix_3.md +22 -1
- package/docs/uk/self_hosting.md +413 -238
- package/docs/vi/benchmark/nextjs.md +19 -16
- package/docs/vi/benchmark/solid.md +26 -9
- package/docs/vi/benchmark/svelte.md +22 -7
- package/docs/vi/benchmark/tanstack.md +20 -16
- package/docs/vi/benchmark/vue.md +20 -11
- package/docs/vi/chrome_extension.md +130 -0
- package/docs/vi/cli/index.md +11 -1
- package/docs/vi/cli/infra.md +162 -0
- package/docs/vi/cli/init.md +24 -1
- package/docs/vi/cli/upgrade.md +125 -0
- package/docs/vi/dictionary/html.md +173 -5
- package/docs/vi/dictionary/markdown.md +263 -1
- package/docs/vi/intlayer_with_analog.md +23 -1
- package/docs/vi/intlayer_with_angular_19.md +24 -1
- package/docs/vi/intlayer_with_angular_21.md +24 -1
- package/docs/vi/intlayer_with_astro.md +24 -1
- package/docs/vi/intlayer_with_astro_lit.md +25 -1
- package/docs/vi/intlayer_with_astro_preact.md +26 -1
- package/docs/vi/intlayer_with_astro_react.md +26 -1
- package/docs/vi/intlayer_with_astro_solid.md +26 -1
- package/docs/vi/intlayer_with_astro_svelte.md +25 -1
- package/docs/vi/intlayer_with_astro_vue.md +25 -1
- package/docs/vi/intlayer_with_remix_3.md +22 -1
- package/docs/vi/self_hosting.md +408 -234
- package/docs/zh/benchmark/nextjs.md +19 -16
- package/docs/zh/benchmark/solid.md +26 -9
- package/docs/zh/benchmark/svelte.md +22 -7
- package/docs/zh/benchmark/tanstack.md +19 -15
- package/docs/zh/benchmark/vue.md +20 -11
- package/docs/zh/chrome_extension.md +130 -0
- package/docs/zh/cli/index.md +11 -1
- package/docs/zh/cli/infra.md +162 -0
- package/docs/zh/cli/init.md +24 -1
- package/docs/zh/cli/upgrade.md +125 -0
- package/docs/zh/dictionary/html.md +172 -5
- package/docs/zh/dictionary/markdown.md +262 -1
- package/docs/zh/intlayer_with_analog.md +23 -1
- package/docs/zh/intlayer_with_angular_19.md +24 -1
- package/docs/zh/intlayer_with_angular_21.md +24 -1
- package/docs/zh/intlayer_with_astro.md +24 -1
- package/docs/zh/intlayer_with_astro_lit.md +25 -1
- package/docs/zh/intlayer_with_astro_preact.md +26 -1
- package/docs/zh/intlayer_with_astro_react.md +26 -1
- package/docs/zh/intlayer_with_astro_solid.md +26 -1
- package/docs/zh/intlayer_with_astro_svelte.md +25 -1
- package/docs/zh/intlayer_with_astro_vue.md +25 -1
- package/docs/zh/intlayer_with_remix_3.md +22 -1
- package/docs/zh/self_hosting.md +410 -237
- package/legal/ar/privacy_notice.md +9 -3
- package/legal/de/privacy_notice.md +9 -3
- package/legal/en/privacy_notice.md +10 -3
- package/legal/en-GB/privacy_notice.md +9 -3
- package/legal/es/privacy_notice.md +9 -3
- package/legal/fr/privacy_notice.md +9 -3
- package/legal/hi/privacy_notice.md +9 -3
- package/legal/id/privacy_notice.md +9 -3
- package/legal/it/privacy_notice.md +9 -3
- package/legal/ja/privacy_notice.md +9 -3
- package/legal/ko/privacy_notice.md +9 -3
- package/legal/pl/privacy_notice.md +9 -3
- package/legal/pt/privacy_notice.md +9 -3
- package/legal/ru/privacy_notice.md +9 -3
- package/legal/tr/privacy_notice.md +9 -3
- package/legal/uk/privacy_notice.md +9 -3
- package/legal/vi/privacy_notice.md +9 -3
- package/legal/zh/privacy_notice.md +9 -3
- package/package.json +6 -6
- package/src/generated/blog.entry.ts +20 -0
- package/src/generated/docs.entry.ts +60 -40
- package/docs/ar/roadmap.md +0 -321
- package/docs/de/roadmap.md +0 -322
- package/docs/en/intlayer_with_astro_vanilla.md +0 -713
- package/docs/en/roadmap.md +0 -325
- package/docs/en-GB/roadmap.md +0 -322
- package/docs/es/roadmap.md +0 -322
- package/docs/fr/roadmap.md +0 -322
- package/docs/hi/roadmap.md +0 -322
- package/docs/id/roadmap.md +0 -325
- package/docs/it/roadmap.md +0 -322
- package/docs/ja/roadmap.md +0 -322
- package/docs/ko/roadmap.md +0 -322
- package/docs/pl/roadmap.md +0 -325
- package/docs/pt/roadmap.md +0 -322
- package/docs/ru/roadmap.md +0 -322
- package/docs/tr/roadmap.md +0 -325
- package/docs/uk/roadmap.md +0 -325
- package/docs/vi/roadmap.md +0 -325
- package/docs/zh/roadmap.md +0 -322
package/docs/ru/self_hosting.md
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-06-30
|
|
3
|
-
updatedAt: 2026-
|
|
3
|
+
updatedAt: 2026-09-21
|
|
4
4
|
title: Самостоятельный хостинг Intlayer
|
|
5
|
-
description:
|
|
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 может
|
|
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
|
-
|
|
66
|
+
</Tab>
|
|
67
|
+
<Tab label="Windows" value="windows">
|
|
31
68
|
|
|
32
|
-
|
|
69
|
+
In PowerShell:
|
|
33
70
|
|
|
34
|
-
|
|
71
|
+
```powershell
|
|
72
|
+
$env:INTLAYER_MODE = "desktop"; irm https://intlayer.org/install.ps1 | iex
|
|
73
|
+
```
|
|
35
74
|
|
|
36
|
-
|
|
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
|
-
|
|
43
|
-
|
|
98
|
+
browser ──────▶ │ app (TanStack Start) :3000│ ──┐
|
|
99
|
+
(localhost) └─────────────────────────────┘ │ VITE_BACKEND_URL (baked at build)
|
|
44
100
|
┌─────────────────────────────┐ │
|
|
45
|
-
│
|
|
101
|
+
│ backend (Fastify/Bun) :3100│ ◀─┘
|
|
46
102
|
└──────────────┬──────────────┘
|
|
47
|
-
|
|
48
|
-
▼ ▼ ▼
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
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
|
|
60
|
-
-
|
|
61
|
-
-
|
|
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
|
-
|
|
126
|
+
### 1. Установка
|
|
64
127
|
|
|
65
|
-
|
|
128
|
+
Записывает `./intlayer.env` со сгенерированными `BETTER_AUTH_SECRET` и `S3_SECRET_ACCESS_KEY` и загружает `intlayer/cms-all:latest`.
|
|
66
129
|
|
|
67
|
-
|
|
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
|
-
|
|
146
|
+
</Tab>
|
|
147
|
+
<Tab label="Intlayer CLI" value="cli">
|
|
74
148
|
|
|
75
|
-
|
|
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` и
|
|
158
|
+
Откройте `intlayer.env` и укажите Resend **или** SMTP (подробнее в разделе [Глобальный почтовый сервис](#global-mailer)):
|
|
80
159
|
|
|
81
160
|
```sh fileName="intlayer.env"
|
|
82
|
-
|
|
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
|
-
|
|
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
|
-
|
|
172
|
+
### 3. Запуск
|
|
91
173
|
|
|
92
|
-
|
|
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
|
-
|
|
185
|
+
intlayer/cms-all:latest
|
|
106
186
|
```
|
|
107
187
|
|
|
108
|
-
|
|
188
|
+
</Tab>
|
|
189
|
+
<Tab label="Windows" value="windows">
|
|
109
190
|
|
|
110
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
396
|
+
## Первоначальная настройка
|
|
144
397
|
|
|
145
|
-
|
|
398
|
+
На новом экземпляре (пустая база данных) открытие панели перенаправляет на страницу **`/init`**:
|
|
146
399
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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
|
-
|
|
404
|
+
Когда администратор уже существует, `/init` перенаправляет на стандартную страницу входа.
|
|
157
405
|
|
|
158
406
|
## Переменные окружения
|
|
159
407
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
|
165
|
-
|
|
|
166
|
-
| `
|
|
167
|
-
| `
|
|
168
|
-
| `
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
|
175
|
-
|
|
|
176
|
-
| `PORT`
|
|
177
|
-
| `
|
|
178
|
-
| `
|
|
179
|
-
| `DOMAIN`
|
|
180
|
-
| `
|
|
181
|
-
| `
|
|
182
|
-
| `
|
|
183
|
-
| `
|
|
184
|
-
| `
|
|
185
|
-
| `
|
|
186
|
-
| `
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
|
193
|
-
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
|
198
|
-
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
|
216
|
-
|
|
|
217
|
-
| `MAIL_PROVIDER` | `
|
|
218
|
-
|
|
219
|
-
|
|
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
|
-
После запуска стека
|
|
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
|
|
243
|
-
*
|
|
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
|
|
249
|
-
*
|
|
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
|
-
|
|
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
|
-
Создайте учетные данные доступа
|
|
509
|
+
Создайте учетные данные доступа в панели управления собственного сервера в разделе **Проекты → Ключи доступа** по адресу `http://localhost:3000/projects`.
|
|
268
510
|
|
|
269
511
|
### SDK `@intlayer/api`
|
|
270
512
|
|
|
271
|
-
При программном использовании SDK `@intlayer/api`
|
|
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
|
-
-
|
|
334
|
-
-
|
|
335
|
-
-
|
|
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
|
|
368
|
-
- [
|
|
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`
|