@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/vi/self_hosting.md
CHANGED
|
@@ -1,232 +1,473 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-06-30
|
|
3
|
-
updatedAt: 2026-
|
|
4
|
-
title: Tự
|
|
5
|
-
description: Chạy
|
|
3
|
+
updatedAt: 2026-09-21
|
|
4
|
+
title: Tự lưu trữ Intlayer (Self-Hosting)
|
|
5
|
+
description: "Chạy Intlayer trên cơ sở hạ tầng của riêng bạn: ứng dụng desktop, một container Docker all-in-one duy nhất hoặc stack Docker Compose có thể mở rộng. Không cần tài khoản Intlayer Cloud."
|
|
6
6
|
keywords:
|
|
7
7
|
- Self-Hosting
|
|
8
|
+
- Tự lưu trữ
|
|
8
9
|
- Docker
|
|
9
10
|
- Docker Compose
|
|
11
|
+
- Ứng dụng Desktop
|
|
10
12
|
- Intlayer
|
|
11
13
|
- CMS
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
+
- Cài đặt
|
|
15
|
+
- Cơ sở hạ tầng
|
|
14
16
|
slugs:
|
|
15
17
|
- doc
|
|
16
18
|
- self-hosting
|
|
17
19
|
author: aymericzip
|
|
18
20
|
---
|
|
19
21
|
|
|
20
|
-
# Tự
|
|
22
|
+
# Tự lưu trữ Intlayer (Self-Hosting)
|
|
21
23
|
|
|
22
|
-
Intlayer có thể chạy
|
|
24
|
+
Intlayer có thể chạy trên cơ sở hạ tầng của riêng bạn mà không cần tài khoản Intlayer Cloud. Ba cấu hình được cung cấp, tất cả đều có thể thiết lập bằng cùng một trình cài đặt (`install.sh`, `install.ps1` trên Windows, hoặc `npx intlayer init infra`):
|
|
23
25
|
|
|
24
|
-
|
|
26
|
+
| Setup | What it is | Pick it for |
|
|
27
|
+
| --------------------- | -------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------- |
|
|
28
|
+
| **Ứng dụng Desktop** | Bảng điều khiển gốc cho macOS, Linux và Windows | Một ứng dụng máy khách cục bộ, không cần lưu trữ |
|
|
29
|
+
| **Docker All-in-One** | Bảng điều khiển, API, MongoDB, Redis và MinIO trong **một container duy nhất** | Thử nghiệm và cài đặt trên máy đơn quy mô nhỏ |
|
|
30
|
+
| **Docker Compose** | **Một container cho mỗi dịch vụ**, mọi kho lưu trữ dữ liệu đều có thể thay thế bằng dịch vụ được quản lý | Môi trường sản xuất, mở rộng quy mô, cơ sở dữ liệu được quản lý |
|
|
31
|
+
|
|
32
|
+
## Table of Contents
|
|
33
|
+
|
|
34
|
+
<TOC/>
|
|
35
|
+
|
|
36
|
+
## Hình ảnh và Gói đã xuất bản
|
|
37
|
+
|
|
38
|
+
| Artifact | Docker Hub | GHCR mirror | Contents |
|
|
39
|
+
| -------------------- | ------------------------------------------------------------------------- | ------------------------------------------ | -------------------------------------------------------------------------------- |
|
|
40
|
+
| 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 |
|
|
41
|
+
| Dashboard (frontend) | [`intlayer/cms-frontend`](https://hub.docker.com/r/intlayer/cms-frontend) | `ghcr.io/aymericzip/intlayer/cms-frontend` | TanStack Start dashboard on Bun |
|
|
42
|
+
| 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 |
|
|
43
|
+
| Desktop app | [GitHub releases](https://github.com/aymericzip/intlayer/releases/latest) | n/a | `.dmg` (macOS), `.deb` / `.rpm` / `.AppImage` (Linux), `.exe` / `.msi` (Windows) |
|
|
44
|
+
|
|
45
|
+
Cả ba hình ảnh đều được xây dựng từ cùng một tệp [`docker/selfhost/Dockerfile`](https://github.com/aymericzip/intlayer/tree/main/docker/selfhost) và được xuất bản theo từng bản phát hành. Stack Compose cũng kéo các hình ảnh chính thức `mongo:8`, `redis:8-alpine` và `quay.io/minio/minio`.
|
|
46
|
+
|
|
47
|
+
## Thiết lập
|
|
48
|
+
|
|
49
|
+
Trình cài đặt sẽ hỏi cấu hình bạn mong muốn, kiểm tra các điều kiện tiên quyết (đề xuất cài đặt Docker), ghi tệp môi trường với các secret đã được tạo sẵn và kéo các hình ảnh. Nó không tự khởi động bất cứ điều gì: các chế độ Docker yêu cầu cấu hình trình gửi thư trước, vì vậy nó kết thúc bằng việc in lệnh cần chạy. Việc chạy lại là an toàn: tệp môi trường hiện có sẽ không bao giờ bị ghi đè, điều này cũng làm cho nó trở thành phương thức nâng cấp.
|
|
50
|
+
|
|
51
|
+
<Tabs group="mode">
|
|
52
|
+
<Tab label="Ứng dụng Desktop" value="desktop">
|
|
53
|
+
|
|
54
|
+
Bảng điều khiển Intlayer dưới dạng ứng dụng gốc được xây dựng bằng Tauri. Đăng nhập vào Intlayer Cloud (`https://app.intlayer.org`), vì vậy không cần lưu trữ máy chủ. Đây là lựa chọn phù hợp khi bạn muốn dùng ứng dụng cục bộ thay vì tab trình duyệt.
|
|
55
|
+
|
|
56
|
+
### Cài đặt
|
|
57
|
+
|
|
58
|
+
Trình cài đặt sẽ tải xuống gói thích hợp cho hệ điều hành và CPU của bạn rồi mở nó (macOS), cài đặt nó (`dpkg` / `rpm` trên Linux), hoặc khởi chạy trình hướng dẫn cài đặt (Windows). Bạn cũng có thể tải xuống thủ công từ [trang Bản phát hành](https://github.com/aymericzip/intlayer/releases/latest).
|
|
59
|
+
|
|
60
|
+
<Tabs group="os">
|
|
61
|
+
<Tab label="macOS / Linux" value="unix">
|
|
25
62
|
|
|
26
63
|
```sh
|
|
27
|
-
curl -fsSL https://intlayer.org/install.sh | sh
|
|
64
|
+
curl -fsSL https://intlayer.org/install.sh | sh -s -- --mode desktop
|
|
28
65
|
```
|
|
29
66
|
|
|
30
|
-
|
|
67
|
+
</Tab>
|
|
68
|
+
<Tab label="Windows" value="windows">
|
|
31
69
|
|
|
32
|
-
|
|
70
|
+
In PowerShell:
|
|
33
71
|
|
|
34
|
-
|
|
72
|
+
```powershell
|
|
73
|
+
$env:INTLAYER_MODE = "desktop"; irm https://intlayer.org/install.ps1 | iex
|
|
74
|
+
```
|
|
35
75
|
|
|
36
|
-
|
|
76
|
+
</Tab>
|
|
77
|
+
<Tab label="Intlayer CLI" value="cli">
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
npx intlayer init infra --mode desktop
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
</Tab>
|
|
84
|
+
</Tabs>
|
|
37
85
|
|
|
38
|
-
|
|
86
|
+
### Yêu cầu
|
|
87
|
+
|
|
88
|
+
- **Node.js**: Ứng dụng nhúng máy chủ bảng điều khiển và khởi động bằng tệp thực thi `node` của máy. Cài đặt từ [nodejs.org](https://nodejs.org) nếu ứng dụng không mở.
|
|
89
|
+
|
|
90
|
+
> Bản dựng desktop đã xuất bản giao tiếp với backend Intlayer Cloud. Để trỏ nó đến backend tự lưu trữ, cần phải xây dựng lại ứng dụng với `VITE_BACKEND_URL` được đặt thành API của bạn, xem [Giới hạn](#limitations).
|
|
91
|
+
|
|
92
|
+
</Tab>
|
|
93
|
+
<Tab label="Docker All-in-One" value="docker">
|
|
94
|
+
|
|
95
|
+
Mọi thứ chạy bên trong một container `intlayer/cms-all` duy nhất, được giám sát bởi [s6-overlay](https://github.com/just-containers/s6-overlay), với mọi kho dữ liệu được lưu trữ liên tục trên một volume duy nhất.
|
|
39
96
|
|
|
40
97
|
```
|
|
41
98
|
┌─────────────────────────────┐
|
|
42
99
|
browser ──────▶ │ app (TanStack Start) :3000│ ──┐
|
|
43
|
-
|
|
100
|
+
(localhost) └─────────────────────────────┘ │ VITE_BACKEND_URL (baked at build)
|
|
44
101
|
┌─────────────────────────────┐ │
|
|
45
102
|
│ backend (Fastify/Bun) :3100│ ◀─┘
|
|
46
103
|
└──────────────┬──────────────┘
|
|
47
|
-
|
|
48
|
-
▼ ▼ ▼
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
(console) (web UI)
|
|
104
|
+
┌──────────┬─────────┼──────────────┐
|
|
105
|
+
▼ ▼ ▼ ▼
|
|
106
|
+
mongo:27017 redis:6379 minio:9000 Chromium
|
|
107
|
+
/data/mongo /data/redis /data/minio (in-image)
|
|
108
|
+
(1-node RS) minio:9001
|
|
53
109
|
```
|
|
54
110
|
|
|
55
|
-
|
|
111
|
+
| Dịch vụ | Cổng máy chủ | Mục đích |
|
|
112
|
+
| ----------- | ----------------------------- | ---------------------------------------------------------------------- |
|
|
113
|
+
| **app** | `3000` | Bảng điều khiển (Giao diện người dùng CMS) |
|
|
114
|
+
| **backend** | `3100` | REST API (endpoint `/health`) |
|
|
115
|
+
| **mongo** | nội bộ | MongoDB 8, replica-set nút đơn `rs0` |
|
|
116
|
+
| **redis** | nội bộ | Hàng đợi tác vụ (BullMQ) và bộ nhớ đệm |
|
|
117
|
+
| **minio** | `9000` (S3), `9001` (console) | Lưu trữ đối tượng tương thích S3 cho ảnh đại diện và ảnh chụp màn hình |
|
|
118
|
+
|
|
119
|
+
Thứ tự khởi động được kiểm soát bởi các phụ thuộc s6 (`mongod` → khởi tạo replica-set, `minio` → tạo bucket, sau đó là `backend`, rồi đến `app`), và các dịch vụ sẽ tự khởi động lại khi kết thúc, do đó lần khởi động đầu tiên sẽ tự phục hồi.
|
|
56
120
|
|
|
57
|
-
|
|
121
|
+
### Điều kiện tiên quyết
|
|
58
122
|
|
|
59
|
-
- **Docker** ≥ 24
|
|
60
|
-
- Các cổng `3000`, `3100`, `
|
|
61
|
-
-
|
|
123
|
+
- **Docker** ≥ 24: Trình cài đặt đề xuất cài đặt nó (qua [get.docker.com](https://get.docker.com) trên Linux, Homebrew trên macOS). Trên Windows, trước tiên hãy cài đặt [Docker Desktop](https://docs.docker.com/desktop/setup/install/windows-install/) (backend WSL 2).
|
|
124
|
+
- Các cổng `3000`, `3100`, `9000`, và `9001` còn trống trên máy chủ. Cổng MinIO `9000` phải duy trì khả năng truy cập từ trình duyệt vì tài nguyên được tải trực tiếp từ `S3_PUBLIC_URL`.
|
|
125
|
+
- Trình gửi thư (mailer): Khóa API [Resend](https://resend.com) hoặc relay SMTP.
|
|
62
126
|
|
|
63
|
-
|
|
127
|
+
### 1. Cài đặt
|
|
64
128
|
|
|
65
|
-
|
|
129
|
+
Ghi `./intlayer.env` với `BETTER_AUTH_SECRET` và `S3_SECRET_ACCESS_KEY` đã tạo, sau đó kéo `intlayer/cms-all:latest`.
|
|
66
130
|
|
|
67
|
-
|
|
131
|
+
<Tabs group="os">
|
|
132
|
+
<Tab label="macOS / Linux" value="unix">
|
|
68
133
|
|
|
69
134
|
```sh
|
|
70
|
-
curl -fsSL https://intlayer.org/install.sh | sh
|
|
135
|
+
curl -fsSL https://intlayer.org/install.sh | sh -s -- --mode docker
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
</Tab>
|
|
139
|
+
<Tab label="Windows" value="windows">
|
|
140
|
+
|
|
141
|
+
In PowerShell:
|
|
142
|
+
|
|
143
|
+
```powershell
|
|
144
|
+
$env:INTLAYER_MODE = "docker"; irm https://intlayer.org/install.ps1 | iex
|
|
71
145
|
```
|
|
72
146
|
|
|
73
|
-
|
|
147
|
+
</Tab>
|
|
148
|
+
<Tab label="Intlayer CLI" value="cli">
|
|
74
149
|
|
|
75
|
-
|
|
150
|
+
CLI chạy trình cài đặt và in lệnh `docker run …` như hiển thị ở các tab khác. Hãy dán vào terminal của bạn sau khi đã định cấu hình mailer.
|
|
76
151
|
|
|
77
|
-
|
|
152
|
+
</Tab>
|
|
153
|
+
</Tabs>
|
|
78
154
|
|
|
79
|
-
|
|
155
|
+
### 2. Cấu hình Mailer
|
|
156
|
+
|
|
157
|
+
Mở `intlayer.env` và điền Resend **hoặc** SMTP (xem chi tiết tại [Trình gửi thư toàn cục](#global-mailer)):
|
|
80
158
|
|
|
81
159
|
```sh fileName="intlayer.env"
|
|
82
|
-
|
|
83
|
-
DB_MDP=<atlas-password>
|
|
84
|
-
DB_CLUSTER=<cluster>.xxxxx.mongodb.net
|
|
160
|
+
# Option A: Resend
|
|
85
161
|
RESEND_API_KEY=<your-resend-key>
|
|
86
|
-
```
|
|
87
162
|
|
|
88
|
-
|
|
163
|
+
# Option B: SMTP (takes over from Resend as soon as MAIL_SMTP_HOST is set)
|
|
164
|
+
MAIL_SMTP_HOST=smtp.example.com
|
|
165
|
+
MAIL_SMTP_PORT=587
|
|
166
|
+
MAIL_SMTP_USER=<user>
|
|
167
|
+
MAIL_SMTP_PASSWORD=<password>
|
|
168
|
+
MAIL_FROM=Intlayer <no-reply@example.com>
|
|
169
|
+
```
|
|
89
170
|
|
|
90
|
-
|
|
171
|
+
### 3. Khởi chạy
|
|
91
172
|
|
|
92
|
-
|
|
173
|
+
Đây là lệnh khởi chạy do trình cài đặt in ra:
|
|
93
174
|
|
|
94
|
-
|
|
175
|
+
<Tabs group="os">
|
|
176
|
+
<Tab label="macOS / Linux" value="unix">
|
|
95
177
|
|
|
96
178
|
```sh
|
|
97
179
|
docker run -d --name intlayer \
|
|
98
180
|
--restart unless-stopped \
|
|
99
|
-
-p 3000:3000 \
|
|
100
|
-
-p 3100:3100 \
|
|
101
|
-
-p 9000:9000 \
|
|
102
|
-
-p 9001:9001 \
|
|
181
|
+
-p 3000:3000 -p 3100:3100 -p 9000:9000 -p 9001:9001 \
|
|
103
182
|
-v intlayer-data:/data \
|
|
104
183
|
--env-file ./intlayer.env \
|
|
105
|
-
|
|
184
|
+
intlayer/cms-all:latest
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
</Tab>
|
|
188
|
+
<Tab label="Windows" value="windows">
|
|
189
|
+
|
|
190
|
+
```powershell
|
|
191
|
+
docker run -d --name intlayer `
|
|
192
|
+
--restart unless-stopped `
|
|
193
|
+
-p 3000:3000 -p 3100:3100 -p 9000:9000 -p 9001:9001 `
|
|
194
|
+
-v intlayer-data:/data `
|
|
195
|
+
--env-file ./intlayer.env `
|
|
196
|
+
intlayer/cms-all:latest
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
</Tab>
|
|
200
|
+
<Tab label="Intlayer CLI" value="cli">
|
|
201
|
+
|
|
202
|
+
CLI chạy trình cài đặt và in lệnh `docker run …` như hiển thị ở các tab khác. Hãy dán vào terminal của bạn sau khi đã định cấu hình mailer.
|
|
203
|
+
|
|
204
|
+
</Tab>
|
|
205
|
+
</Tabs>
|
|
206
|
+
|
|
207
|
+
Mở **http://localhost:3000** và làm theo hướng dẫn [Thiết lập lần đầu](#first-run-setup). Lần khởi động đầu tiên sẽ khởi tạo replica-set và bucket, vui lòng đợi trong giây lát.
|
|
208
|
+
|
|
209
|
+
### Sao lưu và Nâng cấp
|
|
210
|
+
|
|
211
|
+
Toàn bộ trạng thái được lưu trong volume `intlayer-data` (`/data/mongo`, `/data/redis`, `/data/minio`).
|
|
212
|
+
|
|
213
|
+
```sh
|
|
214
|
+
# Backup (stop the container first so MongoDB's files are consistent)
|
|
215
|
+
docker stop intlayer
|
|
216
|
+
docker run --rm -v intlayer-data:/data -v "$(pwd)":/backup busybox tar czf /backup/intlayer-data.tar.gz /data
|
|
217
|
+
docker start intlayer
|
|
218
|
+
|
|
219
|
+
# Restore
|
|
220
|
+
docker run --rm -v intlayer-data:/data -v "$(pwd)":/backup busybox tar xzf /backup/intlayer-data.tar.gz -C /
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Để nâng cấp, hãy chạy lại trình cài đặt (nó sẽ kéo hình ảnh mới nhất và giữ nguyên `intlayer.env`), sau đó chạy `docker rm -f intlayer` và chạy lại lệnh khởi chạy. Để sử dụng MongoDB được quản lý thay vì bản đi kèm, hãy đặt `MONGODB_URI` trong `intlayer.env`.
|
|
224
|
+
|
|
225
|
+
</Tab>
|
|
226
|
+
<Tab label="Docker Compose" value="compose">
|
|
227
|
+
|
|
228
|
+
Một container cho mỗi dịch vụ trên mạng Compose riêng tư. Bảng điều khiển và API sử dụng các hình ảnh `intlayer/cms-frontend` và `intlayer/cms-backend` đã xuất bản; các kho dữ liệu sử dụng hình ảnh chính thức của `mongo`, `redis` và `minio`.
|
|
229
|
+
|
|
230
|
+
```
|
|
231
|
+
┌───────────────────┐
|
|
232
|
+
browser ──────▶ │ app :3000 │ ── SSR ──▶ http://backend:3100
|
|
233
|
+
(localhost) └───────────────────┘
|
|
234
|
+
┌───────────────────┐
|
|
235
|
+
browser ──────▶ │ backend :3100 │
|
|
236
|
+
(localhost) └─────────┬─────────┘
|
|
237
|
+
┌───────────────┼───────────────┐
|
|
238
|
+
▼ ▼ ▼
|
|
239
|
+
mongo:27017 redis:6379 minio:9000 ◀── browser (assets)
|
|
240
|
+
(1-node RS) minio:9001
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
| Dịch vụ | Hình ảnh | Vai trò |
|
|
244
|
+
| ------------ | ----------------------- | --------------------------------------------------------------------- |
|
|
245
|
+
| `app` | `intlayer/cms-frontend` | Bảng điều khiển trên `:3000`; chờ backend khỏe mạnh |
|
|
246
|
+
| `backend` | `intlayer/cms-backend` | API trên `:3100` với Chromium; chờ Mongo, Redis và bucket MinIO |
|
|
247
|
+
| `mongo` | `mongo:8` | Replica-set nút đơn `rs0`, được khởi tạo bởi chính healthcheck của nó |
|
|
248
|
+
| `redis` | `redis:8-alpine` | Hàng đợi và bộ nhớ đệm, lưu trữ liên tục chỉ nối thêm (append-only) |
|
|
249
|
+
| `minio` | `quay.io/minio/minio` | Lưu trữ S3 trên `:9000`, console trên `:9001` |
|
|
250
|
+
| `minio-init` | `quay.io/minio/mc` | Chạy một lần: tạo bucket và chính sách tải xuống ẩn danh |
|
|
251
|
+
|
|
252
|
+
Dữ liệu được lưu trữ trong các volume `intlayer_mongo-data`, `intlayer_redis-data` và `intlayer_minio-data`. Các kết nối dịch vụ (`MONGODB_URI`, `REDIS_URL`, `S3_ENDPOINT`, URL backend nội bộ cho render phía máy chủ) được gắn cố định trong tệp compose và được ưu tiên hơn tệp `.env` (chỉ chứa các secret và tích hợp tùy chọn).
|
|
253
|
+
|
|
254
|
+
### Điều kiện tiên quyết
|
|
255
|
+
|
|
256
|
+
- **Docker** ≥ 24 với plugin Compose: Trình cài đặt đề xuất cài đặt nó trên Linux và macOS. Trên Windows, trước tiên hãy cài đặt [Docker Desktop](https://docs.docker.com/desktop/setup/install/windows-install/) (backend WSL 2) terlebih dahulu.
|
|
257
|
+
- Các cổng `3000`, `3100`, `9000` và `9001` còn trống trên máy chủ.
|
|
258
|
+
- Trình gửi thư: Khóa API [Resend](https://resend.com) hoặc relay SMTP.
|
|
259
|
+
|
|
260
|
+
### 1. Cài đặt
|
|
261
|
+
|
|
262
|
+
Ghi `docker-compose.yml` và `.env` với các secret đã tạo vào `./intlayer/` và kéo các hình ảnh.
|
|
263
|
+
|
|
264
|
+
<Tabs group="os">
|
|
265
|
+
<Tab label="macOS / Linux" value="unix">
|
|
266
|
+
|
|
267
|
+
```sh
|
|
268
|
+
curl -fsSL https://intlayer.org/install.sh | sh -s -- --mode compose
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
Or by hand:
|
|
272
|
+
|
|
273
|
+
```sh
|
|
274
|
+
mkdir intlayer && cd intlayer
|
|
275
|
+
curl -fsSLO https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/docker-compose.yml
|
|
276
|
+
curl -fsSL https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/.env.template -o .env
|
|
277
|
+
# fill in BETTER_AUTH_SECRET and S3_SECRET_ACCESS_KEY (openssl rand -hex 32)
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
</Tab>
|
|
281
|
+
<Tab label="Windows" value="windows">
|
|
282
|
+
|
|
283
|
+
In PowerShell:
|
|
284
|
+
|
|
285
|
+
```powershell
|
|
286
|
+
$env:INTLAYER_MODE = "compose"; irm https://intlayer.org/install.ps1 | iex
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
Or by hand:
|
|
290
|
+
|
|
291
|
+
```powershell
|
|
292
|
+
mkdir intlayer; cd intlayer
|
|
293
|
+
irm https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/docker-compose.yml -OutFile docker-compose.yml
|
|
294
|
+
irm https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/.env.template -OutFile .env
|
|
295
|
+
# fill in BETTER_AUTH_SECRET and S3_SECRET_ACCESS_KEY
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
</Tab>
|
|
299
|
+
<Tab label="Intlayer CLI" value="cli">
|
|
300
|
+
|
|
301
|
+
```bash
|
|
302
|
+
npx intlayer init infra --mode compose
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
</Tab>
|
|
306
|
+
</Tabs>
|
|
307
|
+
|
|
308
|
+
### 2. Cấu hình Mailer
|
|
309
|
+
|
|
310
|
+
Điền Resend **hoặc** SMTP vào `intlayer/.env`, tương tự như container all-in-one (xem [Trình gửi thư toàn cục](#global-mailer)).
|
|
311
|
+
|
|
312
|
+
### 3. Khởi chạy
|
|
313
|
+
|
|
314
|
+
```sh
|
|
315
|
+
cd intlayer && docker compose up -d
|
|
106
316
|
```
|
|
107
317
|
|
|
108
|
-
|
|
318
|
+
Mở **http://localhost:3000** và làm theo hướng dẫn [Thiết lập lần đầu](#first-run-setup).
|
|
319
|
+
|
|
320
|
+
### Kho dữ liệu được quản lý
|
|
321
|
+
|
|
322
|
+
Xóa dịch vụ bạn đang thay thế khỏi tệp compose (cùng với mục `depends_on` của nó trong `backend`), và ghi đè biến tương ứng:
|
|
323
|
+
|
|
324
|
+
```yaml fileName="docker-compose.yml"
|
|
325
|
+
services:
|
|
326
|
+
backend:
|
|
327
|
+
environment:
|
|
328
|
+
MONGODB_URI: mongodb+srv://user:password@cluster0.xxxxx.mongodb.net/intlayer
|
|
329
|
+
REDIS_URL: rediss://default:password@redis.example.com:6380
|
|
330
|
+
S3_ENDPOINT: https://s3.eu-west-1.amazonaws.com
|
|
331
|
+
S3_PUBLIC_URL: https://intlayer-assets.s3.eu-west-1.amazonaws.com
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
`S3_ACCESS_KEY_ID` / `S3_SECRET_ACCESS_KEY` / `S3_BUCKET_NAME` hoạt động trực tiếp với bất kỳ nhà cung cấp nào tương thích với S3.
|
|
335
|
+
|
|
336
|
+
### Mở rộng quy mô
|
|
337
|
+
|
|
338
|
+
`app` và `backend` là stateless. Đằng sau bộ cân bằng tải, giả sử loại bỏ các ánh xạ cổng máy chủ cố định và proxy định tuyến theo tên dịch vụ, `docker compose up -d --scale backend=3` sẽ hoạt động. Các tác vụ nền được điều phối qua Redis (BullMQ), vì vậy nhiều bản sao backend chia sẻ hàng đợi một cách an toàn.
|
|
339
|
+
|
|
340
|
+
### Xây dựng từ nguồn
|
|
341
|
+
|
|
342
|
+
Từ bản sao lưu trữ, chuyển đổi hai dịch vụ Intlayer từ `image:` sang `build:` bằng cấu hình ghi đè:
|
|
109
343
|
|
|
110
|
-
|
|
344
|
+
```sh
|
|
345
|
+
cd docker/selfhost
|
|
346
|
+
docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build
|
|
347
|
+
```
|
|
111
348
|
|
|
112
|
-
|
|
349
|
+
Sử dụng cách này khi xây dựng hình ảnh cho miền tùy chỉnh: truyền các giá trị `VITE_*` dưới dạng đối số bản dựng (xem [Giới hạn](#limitations)).
|
|
113
350
|
|
|
114
|
-
|
|
351
|
+
### Sao lưu và Nâng cấp
|
|
115
352
|
|
|
116
353
|
```sh
|
|
117
|
-
|
|
354
|
+
# Backup one volume (repeat for intlayer_redis-data and intlayer_minio-data)
|
|
355
|
+
docker compose stop
|
|
356
|
+
docker run --rm -v intlayer_mongo-data:/data -v "$(pwd)":/backup busybox tar czf /backup/mongo-data.tar.gz /data
|
|
357
|
+
docker compose start
|
|
358
|
+
|
|
359
|
+
# Upgrade, volumes are kept
|
|
360
|
+
docker compose pull && docker compose up -d
|
|
118
361
|
```
|
|
119
362
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
| `INTLAYER_IMAGE` | `ghcr.io/aymericzip/intlayer-selfhost:latest` | Image để pull |
|
|
123
|
-
| `INTLAYER_ENV_FILE` | `./intlayer.env` | Nơi ghi file env |
|
|
124
|
-
| `INTLAYER_CONTAINER_NAME` | `intlayer` | Tên container |
|
|
125
|
-
| `INTLAYER_DATA_VOLUME` | `intlayer-data` | Named volume mounted tại `/data` |
|
|
126
|
-
| `INTLAYER_APP_PORT` | `3000` | Host port cho dashboard |
|
|
127
|
-
| `INTLAYER_API_PORT` | `3100` | Host port cho API |
|
|
128
|
-
| `INTLAYER_S3_PORT` | `9000` | Host port cho MinIO S3 API |
|
|
129
|
-
| `INTLAYER_CONSOLE_PORT` | `9001` | Host port cho MinIO console |
|
|
363
|
+
</Tab>
|
|
364
|
+
</Tabs>
|
|
130
365
|
|
|
131
|
-
|
|
366
|
+
### Cài đặt của Trình cài đặt
|
|
132
367
|
|
|
133
|
-
|
|
368
|
+
Nếu không có `--mode` (hoặc `INTLAYER_MODE`), trình cài đặt sẽ nhắc menu: `desktop`, `docker` (all-in-one), hoặc `compose`. Nó cũng đọc một số biến môi trường; hãy truyền chúng vào shell thay vì `curl` vì lệnh này được truyền qua đường ống (piped):
|
|
134
369
|
|
|
135
|
-
|
|
370
|
+
```sh
|
|
371
|
+
curl -fsSL https://intlayer.org/install.sh | INTLAYER_COMPOSE_DIR=./cms sh -s -- --mode compose
|
|
372
|
+
```
|
|
136
373
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
374
|
+
```powershell
|
|
375
|
+
$env:INTLAYER_MODE = "compose"; $env:INTLAYER_COMPOSE_DIR = ".\cms"; irm https://intlayer.org/install.ps1 | iex
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
| Variable | Default | Applies to | Description |
|
|
379
|
+
| ------------------------- | ------------------------- | ---------- | ---------------------------------------------------------- |
|
|
380
|
+
| `INTLAYER_MODE` | _(asked)_ | all | `desktop`, `docker` or `compose`, same as `--mode` |
|
|
381
|
+
| `INTLAYER_DOWNLOAD_DIR` | `~/Downloads` | desktop | Where the app installer is saved |
|
|
382
|
+
| `INTLAYER_IMAGE` | `intlayer/cms-all:latest` | docker | All-in-one image to pull |
|
|
383
|
+
| `INTLAYER_ENV_FILE` | `./intlayer.env` | docker | Where to write the environment file |
|
|
384
|
+
| `INTLAYER_CONTAINER_NAME` | `intlayer` | docker | Container name |
|
|
385
|
+
| `INTLAYER_DATA_VOLUME` | `intlayer-data` | docker | Named volume mounted at `/data` |
|
|
386
|
+
| `INTLAYER_APP_PORT` | `3000` | docker | Host port for the dashboard |
|
|
387
|
+
| `INTLAYER_API_PORT` | `3100` | docker | Host port for the API |
|
|
388
|
+
| `INTLAYER_S3_PORT` | `9000` | docker | Host port for the MinIO S3 API |
|
|
389
|
+
| `INTLAYER_CONSOLE_PORT` | `9001` | docker | Host port for the MinIO console |
|
|
390
|
+
| `INTLAYER_COMPOSE_DIR` | `./intlayer` | compose | Where `docker-compose.yml` and `.env` are written |
|
|
391
|
+
| `INTLAYER_SELFHOST_REF` | `main` | both | Git ref the compose file and env template are fetched from |
|
|
142
392
|
|
|
143
|
-
|
|
393
|
+
> Các biến cổng chỉ thay đổi phía **máy chủ** của ánh xạ. Các hình ảnh đã xuất bản có `http://localhost:3000`, `http://localhost:3100`, `http://localhost:9000` được biên dịch sẵn vào gói bảng điều khiển, vì vậy hãy giữ nguyên các giá trị mặc định trừ khi bạn tự xây dựng hình ảnh, xem [Giới hạn](#limitations).
|
|
144
394
|
|
|
145
|
-
##
|
|
395
|
+
## Thiết lập lần đầu
|
|
146
396
|
|
|
147
|
-
|
|
148
|
-
| ----------- | ------------------------------------------ | ------------------------------ | ---------------------------------------------------------------- |
|
|
149
|
-
| **app** | được xây dựng từ `apps/app/Dockerfile` | `3000` | Dashboard TanStack Start (UI của CMS) |
|
|
150
|
-
| **backend** | được xây dựng từ `apps/backend/Dockerfile` | `3100` | API REST Fastify (endpoint `/health`) |
|
|
151
|
-
| **mongo** | `mongo:7` | nội bộ | Bộ nhân bản một node (`rs0`) |
|
|
152
|
-
| **redis** | `redis:7-alpine` | nội bộ | Hàng đợi công việc (BullMQ) và caching (ioredis) |
|
|
153
|
-
| **minio** | `minio/minio` | `9000` (S3), `9001` (console) | Lưu trữ đối tượng tương thích S3 cho avatar và ảnh chụp màn hình |
|
|
154
|
-
| **mailpit** | `axllent/mailpit` | `1025` (SMTP), `8025` (web UI) | Nơi nhận email giao dịch cục bộ |
|
|
397
|
+
Khi mở bảng điều khiển trên một phiên bản mới (cơ sở dữ liệu trống), bạn sẽ tự động được chuyển hướng đến trang **`/init`**:
|
|
155
398
|
|
|
156
|
-
|
|
399
|
+
1. Tạo tài khoản đầu tiên. Vì bộ sưu tập người dùng đang trống, tài khoản này sẽ tự động được nâng cấp thành **Super Admin**.
|
|
400
|
+
2. Một email xác minh sẽ được gửi qua Resend hoặc relay SMTP của bạn. Xác minh email là **bắt buộc**, đó là lý do tại sao phải cấu hình trình gửi thư trước khi khởi chạy.
|
|
401
|
+
3. Nhấp vào liên kết trong email và đăng nhập.
|
|
402
|
+
|
|
403
|
+
Sau khi đã có quản trị viên, `/init` sẽ chuyển hướng đến trang đăng nhập thông thường.
|
|
157
404
|
|
|
158
405
|
## Biến môi trường
|
|
159
406
|
|
|
407
|
+
Cả hai chế độ Docker đều đọc cùng một tệp (tệp `intlayer.env` cho container hoặc `.env` cho Compose) được tạo từ [`docker/selfhost/.env.template`](https://github.com/aymericzip/intlayer/blob/main/docker/selfhost/.env.template).
|
|
408
|
+
|
|
160
409
|
### Bắt buộc
|
|
161
410
|
|
|
162
|
-
| Variable | Example
|
|
163
|
-
| ---------------------- |
|
|
164
|
-
| `
|
|
165
|
-
| `
|
|
166
|
-
| `
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
|
174
|
-
|
|
|
175
|
-
| `
|
|
176
|
-
| `
|
|
177
|
-
| `
|
|
178
|
-
| `
|
|
179
|
-
| `
|
|
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
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
| `MAIL_SMTP_USER` | _(your user)_ | Tên người dùng SMTP (tùy chọn; bỏ qua đối với relay không xác thực) |
|
|
223
|
-
| `MAIL_SMTP_PASSWORD` | _(your password)_ | Mật khẩu SMTP |
|
|
224
|
-
|
|
225
|
-
> Thứ tự ưu tiên: mailer riêng của một tổ chức (được định cấu hình từ bảng điều khiển **Organization**) có ưu tiên hơn mailer toàn cầu, cái này lần lượt có ưu tiên hơn khóa Resend mặc định.
|
|
226
|
-
|
|
227
|
-
## Kết nối dự án Intlayer của bạn
|
|
228
|
-
|
|
229
|
-
Khi stack đang chạy, hãy trỏ dự án của bạn đến backend và dashboard được tự host thay vì `intlayer.org`.
|
|
411
|
+
| Variable | Example | Description |
|
|
412
|
+
| ---------------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
413
|
+
| `BETTER_AUTH_SECRET` | _(generated)_ | 32-byte secret for session signing |
|
|
414
|
+
| `S3_SECRET_ACCESS_KEY` | _(generated)_ | Secret for the bundled MinIO |
|
|
415
|
+
| `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)) |
|
|
416
|
+
|
|
417
|
+
### Được cố định bởi việc triển khai
|
|
418
|
+
|
|
419
|
+
These are set by the image (all-in-one) or by the compose file, and only need overriding for a non-standard topology.
|
|
420
|
+
|
|
421
|
+
| Variable | All-in-one | Docker Compose | Description |
|
|
422
|
+
| ------------------ | --------------------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------- |
|
|
423
|
+
| `PORT` | `3100` | `3100` | Backend listening port |
|
|
424
|
+
| `APP_URL` | `http://localhost:3000` | `http://localhost:3000` | Public URL of the dashboard |
|
|
425
|
+
| `BACKEND_URL` | `http://localhost:3100` | `http://localhost:3100` | Public URL of the backend API |
|
|
426
|
+
| `DOMAIN` | `localhost` | `localhost` | Cookie domain |
|
|
427
|
+
| `SELF_HOSTED` | `true` | `true` | Disables the cloud-only API endpoints (billing, subscriptions, marketplace) |
|
|
428
|
+
| `MONGODB_URI` | `mongodb://127.0.0.1:27017/intlayer?replicaSet=rs0` | `mongodb://mongo:27017/…` | MongoDB connection string, any `mongodb://` or `mongodb+srv://` cluster works |
|
|
429
|
+
| `REDIS_URL` | `redis://127.0.0.1:6379` | `redis://redis:6379` | Redis |
|
|
430
|
+
| `S3_ENDPOINT` | `http://127.0.0.1:9000` | `http://minio:9000` | MinIO (server-to-server) |
|
|
431
|
+
| `S3_PUBLIC_URL` | `http://localhost:9000/intlayer` | `http://localhost:9000/intlayer` | Public URL for browser asset loading |
|
|
432
|
+
| `S3_BUCKET_NAME` | `intlayer` | `intlayer` | Bucket name |
|
|
433
|
+
| `S3_ACCESS_KEY_ID` | `intlayer` | `intlayer` | MinIO access key |
|
|
434
|
+
|
|
435
|
+
Dịch vụ Compose `app` nhận thêm `INTLAYER_BACKEND_INTERNAL_URL=http://backend:3100`: trình duyệt tiếp cận API tại `localhost:3100`, nhưng quá trình kết xuất phía máy chủ chạy bên trong mạng Compose nên nó phải sử dụng tên dịch vụ.
|
|
436
|
+
|
|
437
|
+
### Tùy chọn (các tính năng sẽ giảm cấp nhẹ nhàng khi không được đặt)
|
|
438
|
+
|
|
439
|
+
| Variable | Feature |
|
|
440
|
+
| ------------------------------------------------ | ----------------------------------------- |
|
|
441
|
+
| `OPENAI_API_KEY` | AI-assisted translation and content audit |
|
|
442
|
+
| `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` | GitHub OAuth login |
|
|
443
|
+
| `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` | Google OAuth login |
|
|
444
|
+
| `GITLAB_CLIENT_ID`, `GITLAB_CLIENT_SECRET` | GitLab OAuth login |
|
|
445
|
+
| `MICROSOFT_CLIENT_ID`, `MICROSOFT_CLIENT_SECRET` | Microsoft OAuth login |
|
|
446
|
+
|
|
447
|
+
### Trình gửi thư toàn cục (Mailer)
|
|
448
|
+
|
|
449
|
+
Tất cả các email giao dịch, bao gồm các email ngoài tổ chức như đặt lại mật khẩu và magic links, đều đi qua một trong hai cổng truyền tải toàn cục:
|
|
450
|
+
|
|
451
|
+
- **Resend**: Sử dụng `RESEND_API_KEY`.
|
|
452
|
+
- **SMTP**: Sử dụng các biến `MAIL_SMTP_*`. Đặt `MAIL_SMTP_HOST` sẽ lập tức chọn giao thức SMTP và bỏ qua `RESEND_API_KEY`.
|
|
453
|
+
|
|
454
|
+
`MAIL_PROVIDER` chỉ cần thiết khi muốn buộc sử dụng một phương thức truyền tải nếu cả hai đều được cấu hình (ví dụ: `MAIL_PROVIDER=resend` để giữ Resend khi máy chủ SMTP tồn tại).
|
|
455
|
+
|
|
456
|
+
| Variable | Example | Description |
|
|
457
|
+
| -------------------- | ------------------------------ | ---------------------------------------------------------------------------- |
|
|
458
|
+
| `MAIL_FROM` | `Intlayer <no-reply@acme.com>` | Sender header for either transport. Accepts a bare address or `Name <email>` |
|
|
459
|
+
| `MAIL_SMTP_HOST` | `smtp.acme.com` | SMTP host. Setting it selects the SMTP transport |
|
|
460
|
+
| `MAIL_SMTP_PORT` | `587` | SMTP port (defaults to `587`) |
|
|
461
|
+
| `MAIL_SMTP_SECURE` | `false` | Implicit TLS. Set `true` for port `465` |
|
|
462
|
+
| `MAIL_SMTP_USER` | _(your user)_ | SMTP username (optional; omit for unauthenticated relays) |
|
|
463
|
+
| `MAIL_SMTP_PASSWORD` | _(your password)_ | SMTP password |
|
|
464
|
+
| `MAIL_PROVIDER` | `resend` | Optional override: `smtp` or `resend`. Leave unset to auto-select |
|
|
465
|
+
|
|
466
|
+
> Thứ tự ưu tiên: Trình gửi thư riêng của tổ chức (được cấu hình từ bảng điều khiển **Tổ chức**) sẽ ghi đè trình gửi thư toàn cục, và trình gửi thư toàn cục sẽ ghi đè khóa Resend mặc định.
|
|
467
|
+
|
|
468
|
+
## Kết nối Dự án Intlayer của bạn
|
|
469
|
+
|
|
470
|
+
Sau khi stack đang chạy, hãy cấu hình dự án của bạn để trỏ đến backend và bảng điều khiển tự lưu trữ thay vì `intlayer.org`.
|
|
230
471
|
|
|
231
472
|
### Cấu hình dự án
|
|
232
473
|
|
|
@@ -239,23 +480,23 @@ const config: IntlayerConfig = {
|
|
|
239
480
|
clientSecret: process.env.INTLAYER_CLIENT_SECRET,
|
|
240
481
|
|
|
241
482
|
/**
|
|
242
|
-
* URL
|
|
243
|
-
*
|
|
483
|
+
* URL of the self-hosted CMS dashboard.
|
|
484
|
+
* Default: https://app.intlayer.org
|
|
244
485
|
*/
|
|
245
|
-
cmsURL: process.env.INTLAYER_CMS_URL, //
|
|
486
|
+
cmsURL: process.env.INTLAYER_CMS_URL, // e.g. http://localhost:3000
|
|
246
487
|
|
|
247
488
|
/**
|
|
248
|
-
* URL
|
|
249
|
-
*
|
|
489
|
+
* URL of the self-hosted backend API.
|
|
490
|
+
* Default: https://back.intlayer.org
|
|
250
491
|
*/
|
|
251
|
-
backendURL: process.env.INTLAYER_BACKEND_URL, //
|
|
492
|
+
backendURL: process.env.INTLAYER_BACKEND_URL, // e.g. http://localhost:3100
|
|
252
493
|
},
|
|
253
494
|
};
|
|
254
495
|
|
|
255
496
|
export default config;
|
|
256
497
|
```
|
|
257
498
|
|
|
258
|
-
|
|
499
|
+
Set the environment variables in your project's `.env`:
|
|
259
500
|
|
|
260
501
|
```sh
|
|
261
502
|
INTLAYER_CMS_URL=http://localhost:3000
|
|
@@ -264,11 +505,11 @@ INTLAYER_CLIENT_ID=<your-client-id>
|
|
|
264
505
|
INTLAYER_CLIENT_SECRET=<your-client-secret>
|
|
265
506
|
```
|
|
266
507
|
|
|
267
|
-
Tạo thông tin truy cập trong
|
|
508
|
+
Tạo thông tin đăng nhập truy cập trong bảng điều khiển tự lưu trữ của bạn tại **Dự án → Khóa truy cập** (`http://localhost:3000/projects`).
|
|
268
509
|
|
|
269
510
|
### SDK `@intlayer/api`
|
|
270
511
|
|
|
271
|
-
Khi sử dụng SDK `@intlayer/api` theo
|
|
512
|
+
Khi sử dụng SDK `@intlayer/api` theo phương thức lập trình, hãy truyền `backendURL` một cách rõ ràng:
|
|
272
513
|
|
|
273
514
|
```typescript fileName="cms.ts" codeFormat="typescript"
|
|
274
515
|
import { createIntlayerCMS } from "@intlayer/api";
|
|
@@ -285,84 +526,17 @@ const cms = createIntlayerCMS({
|
|
|
285
526
|
const { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();
|
|
286
527
|
```
|
|
287
528
|
|
|
288
|
-
##
|
|
289
|
-
|
|
290
|
-
Thao tác này sẽ kéo các image mới nhất và khởi động lại các container với `docker compose pull && docker compose up -d`. Các volume hiện có (`mongo-data`, `redis-data`, `minio-data`) được bảo toàn — không mất dữ liệu.
|
|
291
|
-
|
|
292
|
-
```sh
|
|
293
|
-
docker compose pull
|
|
294
|
-
docker compose up -d
|
|
295
|
-
```
|
|
296
|
-
|
|
297
|
-
## Sao lưu và phục hồi
|
|
298
|
-
|
|
299
|
-
Tất cả dữ liệu bền vững nằm trong ba Docker volume được đặt tên.
|
|
300
|
-
|
|
301
|
-
### Sao lưu
|
|
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
|
-
### Phục hồi
|
|
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 /
|
|
529
|
+
## Giới hạn
|
|
327
530
|
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
## Hạn chế
|
|
332
|
-
|
|
333
|
-
- **MongoDB phải là external (Atlas).** Backend chỉ kết nối qua `mongodb+srv://` (được xây dựng từ `DB_ID` / `DB_MDP` / `DB_CLUSTER`), do đó `mongodb://host:27017` đơn giản — bao gồm cả `mongod` được bao gồm của container — không thể được sử dụng. Cung cấp một cluster MongoDB Atlas.
|
|
334
|
-
- **Không có tên miền tùy chỉnh.** Tất cả các `VITE_*` URLs hướng tới trình duyệt được nhúng inline vào ứng dụng tại thời điểm xây dựng, và hình ảnh được xuất bản có các giá trị `localhost`. Dashboard phải được truy cập tại `http://localhost:3000`; phục vụ nó trên một tên miền công khai sẽ yêu cầu xây dựng lại hình ảnh với các URL mục tiêu được xây dựng sẵn và không được hỗ trợ ra khỏi hộp.
|
|
335
|
-
- **Email yêu cầu một mailer hoạt động.** Thiết lập lần chạy đầu tiên thực thi xác minh email, do đó `RESEND_API_KEY` hoặc một [mailer SMTP toàn cục](#global-mailer) (`MAIL_PROVIDER=smtp` + `MAIL_SMTP_*`) phải được cấu hình. Sau khi admin đầu tiên đăng nhập, mỗi tổ chức cũng có thể cấu hình mailer SMTP hoặc Resend riêng của nó từ dashboard.
|
|
336
|
-
|
|
337
|
-
## Khắc phục sự cố
|
|
338
|
-
|
|
339
|
-
### Backend bị crash-loop khi khởi động lần đầu
|
|
340
|
-
|
|
341
|
-
MongoDB và Redis phải hoạt động tốt trước khi backend khởi động. File compose sử dụng `depends_on` với `condition: service_healthy`. Nếu bạn thấy backend khởi động lại liên tục, hãy kiểm tra xem healthcheck của `mongo` và `redis` có vượt qua không:
|
|
342
|
-
|
|
343
|
-
```sh
|
|
344
|
-
docker compose ps
|
|
345
|
-
docker compose logs mongo
|
|
346
|
-
docker compose logs redis
|
|
347
|
-
```
|
|
348
|
-
|
|
349
|
-
Tìm kiếm `MongoDB connection error` gần phía trên của log.
|
|
350
|
-
|
|
351
|
-
### Dashboard không thể kết nối tới API
|
|
352
|
-
|
|
353
|
-
Xác minh rằng `VITE_BACKEND_URL` khớp với URL mà backend có thể truy cập được từ **trình duyệt** (không phải mạng Docker). Nếu bạn đã thay đổi cổng backend hoặc thêm reverse proxy, hãy build lại image dashboard:
|
|
354
|
-
|
|
355
|
-
### Thiếu MinIO bucket
|
|
356
|
-
|
|
357
|
-
Nếu dịch vụ một lần chạy `minio-init` không chạy (hoặc chạy trước khi MinIO sẵn sàng), hãy tạo bucket thủ công:
|
|
358
|
-
|
|
359
|
-
```sh
|
|
360
|
-
docker compose run --rm minio-init
|
|
361
|
-
```
|
|
531
|
+
- **Chưa hỗ trợ tên miền tùy chỉnh và ánh xạ lại cổng.** Tất cả các URL `VITE_*` hướng đến trình duyệt đều được nhúng sẵn vào bảng điều khiển tại thời điểm xây dựng, và các hình ảnh đã xuất bản (cùng với ứng dụng desktop) có sẵn các giá trị `localhost` / Intlayer Cloud. Bảng điều khiển phải được truy cập tại `http://localhost:3000`, API tại `:3100` và MinIO tại `:9000`. Việc lưu trữ trên miền công khai hoặc trỏ ứng dụng desktop đến backend tự lưu trữ yêu cầu xây dựng lại với các URL mục tiêu được nhúng sẵn (trên `docker/selfhost/Dockerfile` hoặc `docker-compose.build.yml` với `--build-arg VITE_BACKEND_URL=… VITE_SITE_URL=… VITE_DOMAIN=…`), điều này không được hỗ trợ sẵn ngay khi cài đặt.
|
|
532
|
+
- **Gửi thư yêu cầu một mailer hoạt động.** Thiết lập lần đầu bắt buộc phải xác minh email, vì vậy phải định cấu hình `RESEND_API_KEY` hoặc một [relay SMTP](#global-mailer) (`MAIL_SMTP_*`). Sau khi quản trị viên đầu tiên đăng nhập, các tổ chức cũng có thể cấu hình mailer SMTP hoặc Resend riêng của họ từ bảng điều khiển.
|
|
533
|
+
- **Ứng dụng desktop yêu cầu Node.js trên máy để khởi động máy chủ nhúng.**
|
|
362
534
|
|
|
363
|
-
##
|
|
535
|
+
## Liên kết hữu ích
|
|
364
536
|
|
|
365
537
|
- [Tài liệu Intlayer CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/intlayer_CMS.md)
|
|
366
538
|
- [Tham chiếu cấu hình](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/configuration.md)
|
|
367
|
-
- [CMS SDK
|
|
368
|
-
- [
|
|
539
|
+
- [CMS SDK: `@intlayer/api`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/intlayer_CMS.md#programmatic-access-with-the-intlayerapi-sdk)
|
|
540
|
+
- [Bản phát hành ứng dụng Desktop](https://github.com/aymericzip/intlayer/releases/latest)
|
|
541
|
+
- Docker Hub: [`intlayer/cms-all`](https://hub.docker.com/r/intlayer/cms-all), [`intlayer/cms-frontend`](https://hub.docker.com/r/intlayer/cms-frontend), [`intlayer/cms-backend`](https://hub.docker.com/r/intlayer/cms-backend), mirror GHCR: `ghcr.io/aymericzip/intlayer/`
|
|
542
|
+
- [`docker/selfhost/`](https://github.com/aymericzip/intlayer/tree/main/docker/selfhost): Dockerfile, `docker-compose.yml`, `.env.template`
|