@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/uk/self_hosting.md
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-06-30
|
|
3
|
-
updatedAt: 2026-
|
|
4
|
-
title:
|
|
5
|
-
description:
|
|
3
|
+
updatedAt: 2026-09-21
|
|
4
|
+
title: Власний хостинг Intlayer
|
|
5
|
+
description: "Запускайте Intlayer на власній інфраструктурі: як десктопний застосунок, єдиний Docker-контейнер all-in-one або масштабований стек Docker Compose. Обліковий запис Intlayer Cloud не потрібен."
|
|
6
6
|
keywords:
|
|
7
|
-
-
|
|
7
|
+
- Власний хостинг
|
|
8
8
|
- Docker
|
|
9
9
|
- Docker Compose
|
|
10
|
+
- Десктопний застосунок
|
|
10
11
|
- Intlayer
|
|
11
12
|
- CMS
|
|
12
13
|
- Встановлення
|
|
@@ -17,218 +18,459 @@ slugs:
|
|
|
17
18
|
author: aymericzip
|
|
18
19
|
---
|
|
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
|
+
| **All-in-one 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>
|
|
84
|
+
|
|
85
|
+
### Вимоги
|
|
37
86
|
|
|
38
|
-
|
|
87
|
+
- **Node.js**: застосунок містить сервер панелі керування і запускає його системним бінарним файлом `node`. Встановіть його з [nodejs.org](https://nodejs.org), якщо застосунок не запускається.
|
|
88
|
+
|
|
89
|
+
> Опублікована збірка взаємодіє з бекендом Intlayer Cloud. Підключення до власного бекенду вимагає перебудови застосунку з `VITE_BACKEND_URL`, спрямованим на ваш API, див. [Обмеження](#limitations).
|
|
90
|
+
|
|
91
|
+
</Tab>
|
|
92
|
+
<Tab label="All-in-one Docker" value="docker">
|
|
93
|
+
|
|
94
|
+
Усе працює всередині єдиного контейнера `intlayer/cms-all` під керуванням [s6-overlay](https://github.com/just-containers/s6-overlay), а кожне сховище зберігається в одному томі даних.
|
|
39
95
|
|
|
40
96
|
```
|
|
41
97
|
┌─────────────────────────────┐
|
|
42
98
|
browser ──────▶ │ app (TanStack Start) :3000│ ──┐
|
|
43
|
-
|
|
99
|
+
(localhost) └─────────────────────────────┘ │ VITE_BACKEND_URL (baked at build)
|
|
44
100
|
┌─────────────────────────────┐ │
|
|
45
101
|
│ backend (Fastify/Bun) :3100│ ◀─┘
|
|
46
102
|
└──────────────┬──────────────┘
|
|
47
|
-
|
|
48
|
-
▼ ▼ ▼
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
(console) (web UI)
|
|
103
|
+
┌──────────┬─────────┼──────────────┐
|
|
104
|
+
▼ ▼ ▼ ▼
|
|
105
|
+
mongo:27017 redis:6379 minio:9000 Chromium
|
|
106
|
+
/data/mongo /data/redis /data/minio (in-image)
|
|
107
|
+
(1-node RS) minio:9001
|
|
53
108
|
```
|
|
54
109
|
|
|
55
|
-
|
|
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-сумісне сховище об'єктів для аватарів і скріншотів |
|
|
56
117
|
|
|
57
|
-
|
|
118
|
+
Порядок запуску визначається залежностями s6 (`mongod` → ініціалізація replica-set, `minio` → створення бакета, далі `backend`, далі `app`), а сервіси перезапускаються при виході, тому перший запуск відновлюється автоматично.
|
|
58
119
|
|
|
59
|
-
|
|
60
|
-
- Порти `3000`, `3100`, `8025`, `9000` та `9001` доступні на хості.
|
|
61
|
-
- Хост Linux або macOS (або WSL2 на Windows).
|
|
120
|
+
### Попередні вимоги
|
|
62
121
|
|
|
63
|
-
|
|
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.
|
|
64
125
|
|
|
65
|
-
|
|
126
|
+
### 1. Встановлення
|
|
66
127
|
|
|
67
|
-
|
|
128
|
+
Записує `./intlayer.env` зі згенерованими `BETTER_AUTH_SECRET` та `S3_SECRET_ACCESS_KEY` і завантажує `intlayer/cms-all:latest`.
|
|
129
|
+
|
|
130
|
+
<Tabs group="os">
|
|
131
|
+
<Tab label="macOS / Linux" value="unix">
|
|
68
132
|
|
|
69
133
|
```sh
|
|
70
|
-
curl -fsSL https://intlayer.org/install.sh | sh
|
|
134
|
+
curl -fsSL https://intlayer.org/install.sh | sh -s -- --mode docker
|
|
71
135
|
```
|
|
72
136
|
|
|
73
|
-
|
|
137
|
+
</Tab>
|
|
138
|
+
<Tab label="Windows" value="windows">
|
|
139
|
+
|
|
140
|
+
In PowerShell:
|
|
141
|
+
|
|
142
|
+
```powershell
|
|
143
|
+
$env:INTLAYER_MODE = "docker"; irm https://intlayer.org/install.ps1 | iex
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
</Tab>
|
|
147
|
+
<Tab label="Intlayer CLI" value="cli">
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
npx intlayer init infra --mode docker
|
|
151
|
+
```
|
|
74
152
|
|
|
75
|
-
|
|
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">
|
|
190
|
+
|
|
191
|
+
```powershell
|
|
192
|
+
docker run -d --name intlayer `
|
|
193
|
+
--restart unless-stopped `
|
|
194
|
+
-p 3000:3000 -p 3100:3100 -p 9000:9000 -p 9001:9001 `
|
|
195
|
+
-v intlayer-data:/data `
|
|
196
|
+
--env-file ./intlayer.env `
|
|
197
|
+
intlayer/cms-all:latest
|
|
198
|
+
```
|
|
109
199
|
|
|
110
|
-
>
|
|
200
|
+
</Tab>
|
|
201
|
+
<Tab label="Intlayer CLI" value="cli">
|
|
111
202
|
|
|
112
|
-
|
|
203
|
+
CLI запускає інсталятор, який виводить команду `docker run …`, показану на інших вкладках. Скопіюйте її в термінал після налаштування пошти.
|
|
113
204
|
|
|
114
|
-
|
|
205
|
+
</Tab>
|
|
206
|
+
</Tabs>
|
|
207
|
+
|
|
208
|
+
Відкрийте **http://localhost:3000** та виконайте кроки [Першого запуску](#first-run-setup). Перший запуск ініціалізує набір реплік та бакет, зачекайте хвилину.
|
|
209
|
+
|
|
210
|
+
### Резервне копіювання та оновлення
|
|
211
|
+
|
|
212
|
+
Усі дані зберігаються в томі `intlayer-data` (`/data/mongo`, `/data/redis`, `/data/minio`).
|
|
115
213
|
|
|
116
214
|
```sh
|
|
117
|
-
|
|
215
|
+
# Backup (stop the container first so MongoDB's files are consistent)
|
|
216
|
+
docker stop intlayer
|
|
217
|
+
docker run --rm -v intlayer-data:/data -v "$(pwd)":/backup busybox tar czf /backup/intlayer-data.tar.gz /data
|
|
218
|
+
docker start intlayer
|
|
219
|
+
|
|
220
|
+
# Restore
|
|
221
|
+
docker run --rm -v intlayer-data:/data -v "$(pwd)":/backup busybox tar xzf /backup/intlayer-data.tar.gz -C /
|
|
118
222
|
```
|
|
119
223
|
|
|
120
|
-
|
|
121
|
-
| ------------------------- | --------------------------------------------- | ------------------------------------ |
|
|
122
|
-
| `INTLAYER_IMAGE` | `ghcr.io/aymericzip/intlayer-selfhost:latest` | Image для завантаження |
|
|
123
|
-
| `INTLAYER_ENV_FILE` | `./intlayer.env` | Де писати env файл |
|
|
124
|
-
| `INTLAYER_CONTAINER_NAME` | `intlayer` | Ім'я контейнера |
|
|
125
|
-
| `INTLAYER_DATA_VOLUME` | `intlayer-data` | Названий том, змонтований на `/data` |
|
|
126
|
-
| `INTLAYER_APP_PORT` | `3000` | Хост-порт для dashboard |
|
|
127
|
-
| `INTLAYER_API_PORT` | `3100` | Хост-порт для API |
|
|
128
|
-
| `INTLAYER_S3_PORT` | `9000` | Хост-порт для MinIO S3 API |
|
|
129
|
-
| `INTLAYER_CONSOLE_PORT` | `9001` | Хост-порт для MinIO console |
|
|
224
|
+
Для оновлення повторно запустіть інсталятор (він завантажить найновіший образ і збереже `intlayer.env`), потім виконайте `docker rm -f intlayer` і запустіть команду старту знову. Щоб використовувати керовану MongoDB замість інтегрованої, задайте `MONGODB_URI` в `intlayer.env`.
|
|
130
225
|
|
|
131
|
-
>
|
|
226
|
+
</Tab>
|
|
227
|
+
<Tab label="Docker Compose" value="compose">
|
|
132
228
|
|
|
133
|
-
|
|
229
|
+
Один контейнер на сервіс у приватній мережі Compose. Панель керування та API використовують опубліковані образи `intlayer/cms-frontend` та `intlayer/cms-backend`; сховища даних використовують офіційні образи `mongo`, `redis` та `minio`.
|
|
134
230
|
|
|
135
|
-
|
|
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` | Черги та кешування, збереження append-only |
|
|
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:
|
|
136
285
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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
|
+
```
|
|
305
|
+
|
|
306
|
+
</Tab>
|
|
307
|
+
</Tabs>
|
|
308
|
+
|
|
309
|
+
### 2. Налаштування поштового сервісу
|
|
142
310
|
|
|
143
|
-
|
|
311
|
+
Вкажіть Resend **або** SMTP у `intlayer/.env` так само, як для контейнера all-in-one (див. [Глобальний поштовий сервіс](#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
|
+
```
|
|
144
334
|
|
|
145
|
-
|
|
335
|
+
`S3_ACCESS_KEY_ID` / `S3_SECRET_ACCESS_KEY` / `S3_BUCKET_NAME` зберігають своє значення для будь-якого S3-сумісного провайдера.
|
|
146
336
|
|
|
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` (веб-інтерфейс) | Локальний приймач транзакційних електронних листів |
|
|
337
|
+
### Масштабування
|
|
155
338
|
|
|
156
|
-
|
|
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
|
+
### Резервне копіювання та оновлення
|
|
353
|
+
|
|
354
|
+
```sh
|
|
355
|
+
# Backup one volume (repeat for intlayer_redis-data and intlayer_minio-data)
|
|
356
|
+
docker compose stop
|
|
357
|
+
docker run --rm -v intlayer_mongo-data:/data -v "$(pwd)":/backup busybox tar czf /backup/mongo-data.tar.gz /data
|
|
358
|
+
docker compose start
|
|
359
|
+
|
|
360
|
+
# Upgrade, volumes are kept
|
|
361
|
+
docker compose pull && docker compose up -d
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
</Tab>
|
|
365
|
+
</Tabs>
|
|
366
|
+
|
|
367
|
+
### Налаштування інсталятора
|
|
368
|
+
|
|
369
|
+
Без прапорця `--mode` (або `INTLAYER_MODE`) інсталятор показує меню: `desktop`, `docker` (all-in-one) або `compose`. Він також зчитує кілька змінних середовища. Оскільки запуск відбувається через пайплайн у командну оболонку, передавайте їх оболонці, а не `curl`:
|
|
370
|
+
|
|
371
|
+
```sh
|
|
372
|
+
curl -fsSL https://intlayer.org/install.sh | INTLAYER_COMPOSE_DIR=./cms sh -s -- --mode compose
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
```powershell
|
|
376
|
+
$env:INTLAYER_MODE = "compose"; $env:INTLAYER_COMPOSE_DIR = ".\cms"; irm https://intlayer.org/install.ps1 | iex
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
| Variable | Default | Applies to | Description |
|
|
380
|
+
| ------------------------- | ------------------------- | ---------- | ---------------------------------------------------------- |
|
|
381
|
+
| `INTLAYER_MODE` | _(asked)_ | all | `desktop`, `docker` or `compose`, same as `--mode` |
|
|
382
|
+
| `INTLAYER_DOWNLOAD_DIR` | `~/Downloads` | desktop | Where the app installer is saved |
|
|
383
|
+
| `INTLAYER_IMAGE` | `intlayer/cms-all:latest` | docker | All-in-one image to pull |
|
|
384
|
+
| `INTLAYER_ENV_FILE` | `./intlayer.env` | docker | Where to write the environment file |
|
|
385
|
+
| `INTLAYER_CONTAINER_NAME` | `intlayer` | docker | Container name |
|
|
386
|
+
| `INTLAYER_DATA_VOLUME` | `intlayer-data` | docker | Named volume mounted at `/data` |
|
|
387
|
+
| `INTLAYER_APP_PORT` | `3000` | docker | Host port for the dashboard |
|
|
388
|
+
| `INTLAYER_API_PORT` | `3100` | docker | Host port for the API |
|
|
389
|
+
| `INTLAYER_S3_PORT` | `9000` | docker | Host port for the MinIO S3 API |
|
|
390
|
+
| `INTLAYER_CONSOLE_PORT` | `9001` | docker | Host port for the MinIO console |
|
|
391
|
+
| `INTLAYER_COMPOSE_DIR` | `./intlayer` | compose | Where `docker-compose.yml` and `.env` are written |
|
|
392
|
+
| `INTLAYER_SELFHOST_REF` | `main` | both | Git ref the compose file and env template are fetched from |
|
|
393
|
+
|
|
394
|
+
> Змінні портів змінюють лише сторону **хоста** у відображенні. Опубліковані образи мають значення `http://localhost:3000`, `http://localhost:3100` та `http://localhost:9000`, скомпільовані в пакет панелі керування, тому зберігайте значення за замовчуванням, якщо не збираєте власні образи, див. [Обмеження](#limitations).
|
|
395
|
+
|
|
396
|
+
## Перший запуск
|
|
397
|
+
|
|
398
|
+
На новому екземплярі (порожня база даних) відкриття панелі керування перенаправляє на сторінку **`/init`**:
|
|
399
|
+
|
|
400
|
+
1. Створіть перший обліковий запис. Оскільки колекція користувачів порожня, цей акаунт автоматично стає **суперадміністратором**.
|
|
401
|
+
2. Лист для підтвердження надсилається через Resend або ваше реле SMTP. Підтвердження електронної пошти є **обов'язковим**, тому поштовий сервіс має бути налаштований до старту.
|
|
402
|
+
3. Перейдіть за посиланням у листі, після чого увійдіть.
|
|
403
|
+
|
|
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
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
## Підключення вашого проекту Intlayer
|
|
228
|
-
|
|
229
|
-
Після запуску стека направте свій проект на самостійно розгорнутий бекенд та дашборд замість `intlayer.org`.
|
|
230
|
-
|
|
231
|
-
### Конфігурація проекту
|
|
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
|
+
Сервіс Compose `app` додатково отримує `INTLAYER_BACKEND_INTERNAL_URL=http://backend:3100`: браузер звертається до API через `localhost:3100`, але серверний рендеринг виконується всередині мережі 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 за замовчуванням.
|
|
468
|
+
|
|
469
|
+
## Підключення вашого проєкту Intlayer
|
|
470
|
+
|
|
471
|
+
Після запуску стека спрямуйте свій проєкт на власний бекенд і панель керування замість `intlayer.org`.
|
|
472
|
+
|
|
473
|
+
### Конфігурація проєкту
|
|
232
474
|
|
|
233
475
|
```typescript fileName="intlayer.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
|
|
234
476
|
import type { IntlayerConfig } from "intlayer";
|
|
@@ -239,36 +481,36 @@ 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
|
-
cmsURL: process.env.INTLAYER_CMS_URL, //
|
|
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
|
-
backendURL: process.env.INTLAYER_BACKEND_URL, //
|
|
493
|
+
backendURL: process.env.INTLAYER_BACKEND_URL, // e.g. http://localhost:3100
|
|
252
494
|
},
|
|
253
495
|
};
|
|
254
496
|
|
|
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
|
|
262
504
|
INTLAYER_BACKEND_URL=http://localhost:3100
|
|
263
|
-
INTLAYER_CLIENT_ID
|
|
264
|
-
INTLAYER_CLIENT_SECRET
|
|
505
|
+
INTLAYER_CLIENT_ID=<your-client-id>
|
|
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
|
-
### Електронні листи не надсилаються
|
|
352
|
-
|
|
353
|
-
За замовчуванням усі вихідні електронні листи захоплюються Mailpit. Відкрийте `http://localhost:8025`, щоб побачити надіслані повідомлення. Щоб надсилати реальні електронні листи, встановіть `MAIL_PROVIDER=resend` та `RESEND_API_KEY=<ваш-ключ>` у `.env`, а потім перезапустіть бекенд:
|
|
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/uk/intlayer_CMS.md)
|
|
366
|
-
- [
|
|
367
|
-
- [CMS SDK
|
|
368
|
-
- [
|
|
539
|
+
- [Довідник конфігурації](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/configuration.md)
|
|
540
|
+
- [CMS SDK: `@intlayer/api`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/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`
|