@intlayer/docs 9.5.6 → 9.5.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blog/ar/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/ar/i18next_vs_intlayer.md +130 -16
- 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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/docs.entry.cjs +40 -40
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/index.cjs +2 -2
- package/dist/esm/generated/docs.entry.mjs +40 -40
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/esm/index.mjs +2 -2
- package/dist/types/generated/docs.entry.d.ts +2 -2
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/benchmark/nextjs.md +13 -13
- package/docs/ar/benchmark/solid.md +5 -5
- package/docs/ar/benchmark/svelte.md +4 -4
- package/docs/ar/benchmark/tanstack.md +14 -13
- package/docs/ar/benchmark/vue.md +5 -5
- package/docs/ar/chrome_extension.md +130 -0
- package/docs/ar/cli/index.md +6 -1
- package/docs/ar/cli/infra.md +162 -0
- package/docs/ar/cli/init.md +24 -1
- 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 +13 -13
- package/docs/de/benchmark/solid.md +5 -5
- package/docs/de/benchmark/svelte.md +4 -4
- package/docs/de/benchmark/tanstack.md +14 -13
- package/docs/de/benchmark/vue.md +5 -5
- package/docs/de/chrome_extension.md +130 -0
- package/docs/de/cli/index.md +6 -1
- package/docs/de/cli/infra.md +162 -0
- package/docs/de/cli/init.md +24 -1
- 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/benchmark/nextjs.md +13 -13
- package/docs/en/benchmark/solid.md +5 -5
- package/docs/en/benchmark/svelte.md +4 -4
- package/docs/en/benchmark/tanstack.md +14 -13
- package/docs/en/benchmark/vue.md +5 -5
- package/docs/en/chrome_extension.md +130 -0
- package/docs/en/cli/index.md +6 -1
- package/docs/en/cli/infra.md +175 -0
- package/docs/en/cli/init.md +25 -1
- 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 +13 -13
- package/docs/en-GB/benchmark/solid.md +5 -5
- package/docs/en-GB/benchmark/svelte.md +4 -4
- package/docs/en-GB/benchmark/tanstack.md +14 -13
- package/docs/en-GB/benchmark/vue.md +5 -5
- package/docs/en-GB/chrome_extension.md +130 -0
- package/docs/en-GB/cli/index.md +6 -1
- package/docs/en-GB/cli/infra.md +162 -0
- package/docs/en-GB/cli/init.md +24 -1
- 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 +13 -13
- package/docs/es/benchmark/solid.md +5 -5
- package/docs/es/benchmark/svelte.md +4 -4
- package/docs/es/benchmark/tanstack.md +14 -13
- package/docs/es/benchmark/vue.md +5 -5
- package/docs/es/chrome_extension.md +130 -0
- package/docs/es/cli/index.md +6 -1
- package/docs/es/cli/infra.md +162 -0
- package/docs/es/cli/init.md +24 -1
- 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 +13 -13
- package/docs/fr/benchmark/solid.md +5 -5
- package/docs/fr/benchmark/svelte.md +4 -4
- package/docs/fr/benchmark/tanstack.md +14 -13
- package/docs/fr/benchmark/vue.md +5 -5
- package/docs/fr/chrome_extension.md +130 -0
- package/docs/fr/cli/index.md +6 -1
- package/docs/fr/cli/infra.md +162 -0
- package/docs/fr/cli/init.md +24 -1
- 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 +13 -13
- package/docs/hi/benchmark/solid.md +5 -5
- package/docs/hi/benchmark/svelte.md +4 -4
- package/docs/hi/benchmark/tanstack.md +14 -13
- package/docs/hi/benchmark/vue.md +5 -5
- package/docs/hi/chrome_extension.md +130 -0
- package/docs/hi/cli/index.md +6 -1
- package/docs/hi/cli/infra.md +162 -0
- package/docs/hi/cli/init.md +24 -1
- 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 +13 -13
- package/docs/id/benchmark/solid.md +5 -5
- package/docs/id/benchmark/svelte.md +4 -4
- package/docs/id/benchmark/tanstack.md +14 -13
- package/docs/id/benchmark/vue.md +5 -5
- package/docs/id/chrome_extension.md +130 -0
- package/docs/id/cli/index.md +6 -1
- package/docs/id/cli/infra.md +162 -0
- package/docs/id/cli/init.md +24 -1
- 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 +13 -13
- package/docs/it/benchmark/solid.md +5 -5
- package/docs/it/benchmark/svelte.md +4 -4
- package/docs/it/benchmark/tanstack.md +14 -13
- package/docs/it/benchmark/vue.md +5 -5
- package/docs/it/chrome_extension.md +130 -0
- package/docs/it/cli/index.md +6 -1
- package/docs/it/cli/infra.md +162 -0
- package/docs/it/cli/init.md +24 -1
- 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 +13 -13
- package/docs/ja/benchmark/solid.md +5 -5
- package/docs/ja/benchmark/svelte.md +4 -4
- package/docs/ja/benchmark/tanstack.md +13 -12
- package/docs/ja/benchmark/vue.md +5 -5
- package/docs/ja/chrome_extension.md +130 -0
- package/docs/ja/cli/index.md +6 -1
- package/docs/ja/cli/infra.md +162 -0
- package/docs/ja/cli/init.md +24 -1
- 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 +13 -13
- package/docs/ko/benchmark/solid.md +5 -5
- package/docs/ko/benchmark/svelte.md +4 -4
- package/docs/ko/benchmark/tanstack.md +14 -13
- package/docs/ko/benchmark/vue.md +5 -5
- package/docs/ko/chrome_extension.md +130 -0
- package/docs/ko/cli/index.md +6 -1
- package/docs/ko/cli/infra.md +162 -0
- package/docs/ko/cli/init.md +24 -1
- 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 +13 -13
- package/docs/pl/benchmark/solid.md +5 -5
- package/docs/pl/benchmark/svelte.md +4 -4
- package/docs/pl/benchmark/tanstack.md +14 -13
- package/docs/pl/benchmark/vue.md +5 -5
- package/docs/pl/chrome_extension.md +130 -0
- package/docs/pl/cli/index.md +6 -1
- package/docs/pl/cli/infra.md +162 -0
- package/docs/pl/cli/init.md +24 -1
- 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 +13 -13
- package/docs/pt/benchmark/solid.md +5 -5
- package/docs/pt/benchmark/svelte.md +4 -4
- package/docs/pt/benchmark/tanstack.md +14 -13
- package/docs/pt/benchmark/vue.md +5 -5
- package/docs/pt/chrome_extension.md +130 -0
- package/docs/pt/cli/index.md +6 -1
- package/docs/pt/cli/infra.md +162 -0
- package/docs/pt/cli/init.md +24 -1
- 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 +13 -13
- package/docs/ru/benchmark/solid.md +5 -5
- package/docs/ru/benchmark/svelte.md +4 -4
- package/docs/ru/benchmark/tanstack.md +14 -13
- package/docs/ru/benchmark/vue.md +5 -5
- package/docs/ru/chrome_extension.md +130 -0
- package/docs/ru/cli/index.md +6 -1
- package/docs/ru/cli/infra.md +162 -0
- package/docs/ru/cli/init.md +24 -1
- 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 +13 -13
- package/docs/tr/benchmark/solid.md +5 -5
- package/docs/tr/benchmark/svelte.md +4 -4
- package/docs/tr/benchmark/tanstack.md +14 -13
- package/docs/tr/benchmark/vue.md +5 -5
- package/docs/tr/chrome_extension.md +130 -0
- package/docs/tr/cli/index.md +6 -1
- package/docs/tr/cli/infra.md +162 -0
- package/docs/tr/cli/init.md +24 -1
- 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 +13 -13
- package/docs/uk/benchmark/solid.md +5 -5
- package/docs/uk/benchmark/svelte.md +4 -4
- package/docs/uk/benchmark/tanstack.md +14 -13
- package/docs/uk/benchmark/vue.md +5 -5
- package/docs/uk/chrome_extension.md +130 -0
- package/docs/uk/cli/index.md +6 -1
- package/docs/uk/cli/infra.md +162 -0
- package/docs/uk/cli/init.md +24 -1
- 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 +13 -13
- package/docs/vi/benchmark/solid.md +5 -5
- package/docs/vi/benchmark/svelte.md +4 -4
- package/docs/vi/benchmark/tanstack.md +14 -13
- package/docs/vi/benchmark/vue.md +5 -5
- package/docs/vi/chrome_extension.md +130 -0
- package/docs/vi/cli/index.md +6 -1
- package/docs/vi/cli/infra.md +162 -0
- package/docs/vi/cli/init.md +24 -1
- 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 +13 -13
- package/docs/zh/benchmark/solid.md +5 -5
- package/docs/zh/benchmark/svelte.md +4 -4
- package/docs/zh/benchmark/tanstack.md +14 -13
- package/docs/zh/benchmark/vue.md +5 -5
- package/docs/zh/chrome_extension.md +130 -0
- package/docs/zh/cli/index.md +6 -1
- package/docs/zh/cli/infra.md +162 -0
- package/docs/zh/cli/init.md +24 -1
- 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 +1 -1
- package/src/generated/docs.entry.ts +40 -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/zh/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 容器或可扩展的 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,457 @@ slugs:
|
|
|
17
18
|
author: aymericzip
|
|
18
19
|
---
|
|
19
20
|
|
|
20
|
-
#
|
|
21
|
+
# 自行托管 Intlayer
|
|
21
22
|
|
|
22
|
-
Intlayer
|
|
23
|
+
Intlayer 可以完全运行在您自己的基础设施上,无需 Intlayer Cloud 账户。由同一个安装程序(`install.sh`、Windows 上为 `install.ps1` 或 `npx intlayer init infra`)驱动三种设置:
|
|
23
24
|
|
|
24
|
-
|
|
25
|
+
| Setup | What it is | Pick it for |
|
|
26
|
+
| ------------------ | ----------------------------------------------------------- | ------------------------------ |
|
|
27
|
+
| **桌面应用** | 适用于 macOS、Linux 和 Windows 的原生控制面板 | 本地客户端,无需托管任何内容 |
|
|
28
|
+
| **多合一 Docker** | 控制面板、API、MongoDB、Redis 和 MinIO 集成在**单个容器**中 | 试验和小规模单机安装 |
|
|
29
|
+
| **Docker Compose** | **每个服务一个容器**,每个数据存储都可替换为托管云服务 | 生产环境、横向扩展、托管数据库 |
|
|
30
|
+
|
|
31
|
+
## Table of Contents
|
|
32
|
+
|
|
33
|
+
<TOC/>
|
|
34
|
+
|
|
35
|
+
## 已发布的镜像和安装包
|
|
36
|
+
|
|
37
|
+
| Artifact | Docker Hub | GHCR mirror | Contents |
|
|
38
|
+
| -------------------- | ------------------------------------------------------------------------- | ------------------------------------------ | -------------------------------------------------------------------------------- |
|
|
39
|
+
| All-in-one container | [`intlayer/cms-all`](https://hub.docker.com/r/intlayer/cms-all) | `ghcr.io/aymericzip/intlayer/cms-all` | app + backend + MongoDB 8 + Redis + MinIO + Chromium |
|
|
40
|
+
| Dashboard (frontend) | [`intlayer/cms-frontend`](https://hub.docker.com/r/intlayer/cms-frontend) | `ghcr.io/aymericzip/intlayer/cms-frontend` | TanStack Start dashboard on Bun |
|
|
41
|
+
| API (backend) | [`intlayer/cms-backend`](https://hub.docker.com/r/intlayer/cms-backend) | `ghcr.io/aymericzip/intlayer/cms-backend` | Fastify REST API on Bun + Chromium |
|
|
42
|
+
| Desktop app | [GitHub releases](https://github.com/aymericzip/intlayer/releases/latest) | n/a | `.dmg` (macOS), `.deb` / `.rpm` / `.AppImage` (Linux), `.exe` / `.msi` (Windows) |
|
|
43
|
+
|
|
44
|
+
这三个镜像均基于同一个 [`docker/selfhost/Dockerfile`](https://github.com/aymericzip/intlayer/tree/main/docker/selfhost) 构建,并在每次发布时更新。Compose 堆栈还会拉取官方的 `mongo:8`、`redis:8-alpine` 和 `quay.io/minio/minio` 镜像。
|
|
45
|
+
|
|
46
|
+
## 安装与设置
|
|
47
|
+
|
|
48
|
+
安装程序会询问您需要的安装模式,检查前提条件(提供安装 Docker 的选项),写入包含已生成密钥的环境变量文件,并拉取所需镜像。它不会自动启动任何容器:Docker 模式首先需要配置邮件服务,因此它最后会输出待执行的启动命令。重新运行它是完全安全的:现有的环境配置文件绝不会被覆盖,这也使其成为便捷的升级路径。
|
|
49
|
+
|
|
50
|
+
<Tabs group="mode">
|
|
51
|
+
<Tab label="桌面应用" value="desktop">
|
|
52
|
+
|
|
53
|
+
基于 Tauri 构建的原生应用程序形式的 Intlayer 控制面板。它直接连接至 Intlayer Cloud (`https://app.intlayer.org`),因此无需在本地托管后端服务。当您想要一个本地客户端而非浏览器标签页时,这是理想的选择。
|
|
54
|
+
|
|
55
|
+
### 安装
|
|
56
|
+
|
|
57
|
+
安装程序会自动下载适用于您的操作系统和 CPU 的安装包,然后打开它(macOS)、进行安装(Linux 上的 `dpkg` / `rpm`)或启动安装向导(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 后端。若要将其指向自行托管的后端,需要使用配置为您自身 API 地址的 `VITE_BACKEND_URL` 重新编译该应用,详情请参阅[限制条件](#limitations)。
|
|
90
|
+
|
|
91
|
+
</Tab>
|
|
92
|
+
<Tab label="多合一 Docker" value="docker">
|
|
93
|
+
|
|
94
|
+
所有组件都运行在单个 `intlayer/cms-all` 容器中,由 [s6-overlay](https://github.com/just-containers/s6-overlay) 统一监控管理,所有数据持久化保存在同一个 Docker 卷中。
|
|
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` → 副本集初始化,`minio` → 存储桶创建,然后是 `backend`,最后是 `app`),且长期运行的服务在退出时会自动重启,因此初次启动时能够自动恢复。
|
|
58
119
|
|
|
59
|
-
|
|
60
|
-
- 主机上端口 `3000`、`3100`、`8025`、`9000` 和 `9001` 可用。
|
|
61
|
-
- Linux 或 macOS 主机(或 Windows 上的 WSL2)。
|
|
120
|
+
### 前提条件
|
|
62
121
|
|
|
63
|
-
|
|
122
|
+
- **Docker** ≥ 24:安装程序可自动协助安装(在 Linux 上通过 [get.docker.com](https://get.docker.com),在 macOS 上通过 Homebrew)。在 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
|
+
- 邮件发送服务:[Resend](https://resend.com) API 密钥或 SMTP 中继服务。
|
|
64
125
|
|
|
65
|
-
|
|
126
|
+
### 1. 执行安装
|
|
66
127
|
|
|
67
|
-
|
|
128
|
+
在当前目录写入包含自动生成的 `BETTER_AUTH_SECRET` 和 `S3_SECRET_ACCESS_KEY` 的 `./intlayer.env`,并拉取 `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
|
+
CLI 会调用安装程序并打印其他标签页中所示的 `docker run …` 命令。配置好邮件发送服务后,将其粘贴到终端中运行即可。
|
|
74
150
|
|
|
75
|
-
|
|
151
|
+
</Tab>
|
|
152
|
+
</Tabs>
|
|
76
153
|
|
|
77
|
-
### 2.
|
|
154
|
+
### 2. 配置邮件服务
|
|
78
155
|
|
|
79
|
-
打开 `intlayer.env`
|
|
156
|
+
打开 `intlayer.env` 并配置 Resend **或** SMTP(详情参见[全局邮件服务](#global-mailer)):
|
|
80
157
|
|
|
81
158
|
```sh fileName="intlayer.env"
|
|
82
|
-
|
|
83
|
-
DB_MDP=<atlas-password>
|
|
84
|
-
DB_CLUSTER=<cluster>.xxxxx.mongodb.net
|
|
159
|
+
# Option A: Resend
|
|
85
160
|
RESEND_API_KEY=<your-resend-key>
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
该文件还包含了可选功能的注释块 — [SMTP mailer](#global-mailer)、`OPENAI_API_KEY` 和 OAuth 提供商。取消注释你需要的内容。
|
|
89
161
|
|
|
90
|
-
|
|
162
|
+
# Option B: SMTP (takes over from Resend as soon as MAIL_SMTP_HOST is set)
|
|
163
|
+
MAIL_SMTP_HOST=smtp.example.com
|
|
164
|
+
MAIL_SMTP_PORT=587
|
|
165
|
+
MAIL_SMTP_USER=<user>
|
|
166
|
+
MAIL_SMTP_PASSWORD=<password>
|
|
167
|
+
MAIL_FROM=Intlayer <no-reply@example.com>
|
|
168
|
+
```
|
|
91
169
|
|
|
92
170
|
### 3. 启动容器
|
|
93
171
|
|
|
94
|
-
|
|
172
|
+
这是安装程序输出的启动命令:
|
|
173
|
+
|
|
174
|
+
<Tabs group="os">
|
|
175
|
+
<Tab label="macOS / Linux" value="unix">
|
|
95
176
|
|
|
96
177
|
```sh
|
|
97
178
|
docker run -d --name intlayer \
|
|
98
179
|
--restart unless-stopped \
|
|
99
|
-
-p 3000:3000 \
|
|
100
|
-
-p 3100:3100 \
|
|
101
|
-
-p 9000:9000 \
|
|
102
|
-
-p 9001:9001 \
|
|
180
|
+
-p 3000:3000 -p 3100:3100 -p 9000:9000 -p 9001:9001 \
|
|
103
181
|
-v intlayer-data:/data \
|
|
104
182
|
--env-file ./intlayer.env \
|
|
105
|
-
|
|
183
|
+
intlayer/cms-all:latest
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
</Tab>
|
|
187
|
+
<Tab label="Windows" value="windows">
|
|
188
|
+
|
|
189
|
+
```powershell
|
|
190
|
+
docker run -d --name intlayer `
|
|
191
|
+
--restart unless-stopped `
|
|
192
|
+
-p 3000:3000 -p 3100:3100 -p 9000:9000 -p 9001:9001 `
|
|
193
|
+
-v intlayer-data:/data `
|
|
194
|
+
--env-file ./intlayer.env `
|
|
195
|
+
intlayer/cms-all:latest
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
</Tab>
|
|
199
|
+
<Tab label="Intlayer CLI" value="cli">
|
|
200
|
+
|
|
201
|
+
CLI 会调用安装程序并打印其他标签页中所示的 `docker run …` 命令。配置好邮件发送服务后,将其粘贴到终端中运行即可。
|
|
202
|
+
|
|
203
|
+
</Tab>
|
|
204
|
+
</Tabs>
|
|
205
|
+
|
|
206
|
+
打开 **http://localhost:3000** 并按照[首次运行设置](#first-run-setup)进行操作。初次启动需要初始化数据库副本集和存储桶,请稍候约一分钟。
|
|
207
|
+
|
|
208
|
+
### 备份与升级
|
|
209
|
+
|
|
210
|
+
所有持久化数据均保存在 `intlayer-data` 数据卷中(`/data/mongo`、`/data/redis`、`/data/minio`)。
|
|
211
|
+
|
|
212
|
+
```sh
|
|
213
|
+
# Backup (stop the container first so MongoDB's files are consistent)
|
|
214
|
+
docker stop intlayer
|
|
215
|
+
docker run --rm -v intlayer-data:/data -v "$(pwd)":/backup busybox tar czf /backup/intlayer-data.tar.gz /data
|
|
216
|
+
docker start intlayer
|
|
217
|
+
|
|
218
|
+
# Restore
|
|
219
|
+
docker run --rm -v intlayer-data:/data -v "$(pwd)":/backup busybox tar xzf /backup/intlayer-data.tar.gz -C /
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
如需升级,只需重新运行安装程序(它会拉取最新镜像并保留原有的 `intlayer.env`),然后执行 `docker rm -f intlayer` 并再次运行启动命令。若要使用外部托管的 MongoDB 而非内置数据库,请在 `intlayer.env` 中设置 `MONGODB_URI`。
|
|
223
|
+
|
|
224
|
+
</Tab>
|
|
225
|
+
<Tab label="Docker Compose" value="compose">
|
|
226
|
+
|
|
227
|
+
在独立的 Compose 私有网络中每个服务运行一个容器。控制面板和 API 分别使用公开发布的 `intlayer/cms-frontend` 和 `intlayer/cms-backend` 镜像;数据存储采用官方的 `mongo`、`redis` 和 `minio` 镜像。
|
|
228
|
+
|
|
229
|
+
```
|
|
230
|
+
┌───────────────────┐
|
|
231
|
+
browser ──────▶ │ app :3000 │ ── SSR ──▶ http://backend:3100
|
|
232
|
+
(localhost) └───────────────────┘
|
|
233
|
+
┌───────────────────┐
|
|
234
|
+
browser ──────▶ │ backend :3100 │
|
|
235
|
+
(localhost) └─────────┬─────────┘
|
|
236
|
+
┌───────────────┼───────────────┐
|
|
237
|
+
▼ ▼ ▼
|
|
238
|
+
mongo:27017 redis:6379 minio:9000 ◀── browser (assets)
|
|
239
|
+
(1-node RS) minio:9001
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
| 服务 | 镜像 | 职责 |
|
|
243
|
+
| ------------ | ----------------------- | -------------------------------------------------------------------------- |
|
|
244
|
+
| `app` | `intlayer/cms-frontend` | 运行在 `:3000` 的控制面板;等待后端健康检查就绪 |
|
|
245
|
+
| `backend` | `intlayer/cms-backend` | 包含 Chromium 运行在 `:3100` 的 API;等待 Mongo、Redis 和 MinIO 存储桶就绪 |
|
|
246
|
+
| `mongo` | `mongo:8` | 单节点副本集 `rs0`,通过自身的健康检查脚本自动初始化 |
|
|
247
|
+
| `redis` | `redis:8-alpine` | 队列与缓存,采用 append-only 持久化策略 |
|
|
248
|
+
| `minio` | `quay.io/minio/minio` | 运行在 `:9000` 的 S3 存储与运行在 `:9001` 的控制台 |
|
|
249
|
+
| `minio-init` | `quay.io/minio/mc` | 单次运行任务:自动创建存储桶并配置匿名只读下载策略 |
|
|
250
|
+
|
|
251
|
+
数据持久保存在 `intlayer_mongo-data`、`intlayer_redis-data` 和 `intlayer_minio-data` 卷中。服务之间的连接设置(`MONGODB_URI`、`REDIS_URL`、`S3_ENDPOINT` 以及服务端渲染所用的内部后端 URL)已在 compose 文件中固定,其优先级高于 `.env` 文件(`.env` 仅用于传递敏感密钥和可选集成配置)。
|
|
252
|
+
|
|
253
|
+
### 前提条件
|
|
254
|
+
|
|
255
|
+
- **Docker** ≥ 24 并安装 Compose 插件:在 Linux 和 macOS 上安装程序可协助自动安装。在 Windows 上,请先安装 [Docker Desktop](https://docs.docker.com/desktop/setup/install/windows-install/)(WSL 2 后端)。
|
|
256
|
+
- 主机上的 `3000`、`3100`、`9000` 和 `9001` 端口可用。
|
|
257
|
+
- 邮件发送服务:[Resend](https://resend.com) API 密钥或 SMTP 中继服务。
|
|
258
|
+
|
|
259
|
+
### 1. 执行安装
|
|
260
|
+
|
|
261
|
+
在 `./intlayer/` 目录中写入 `docker-compose.yml` 和包含自动生成密钥的 `.env`,并拉取所需的镜像。
|
|
262
|
+
|
|
263
|
+
<Tabs group="os">
|
|
264
|
+
<Tab label="macOS / Linux" value="unix">
|
|
265
|
+
|
|
266
|
+
```sh
|
|
267
|
+
curl -fsSL https://intlayer.org/install.sh | sh -s -- --mode compose
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
Or by hand:
|
|
271
|
+
|
|
272
|
+
```sh
|
|
273
|
+
mkdir intlayer && cd intlayer
|
|
274
|
+
curl -fsSLO https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/docker-compose.yml
|
|
275
|
+
curl -fsSL https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/.env.template -o .env
|
|
276
|
+
# fill in BETTER_AUTH_SECRET and S3_SECRET_ACCESS_KEY (openssl rand -hex 32)
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
</Tab>
|
|
280
|
+
<Tab label="Windows" value="windows">
|
|
281
|
+
|
|
282
|
+
In PowerShell:
|
|
283
|
+
|
|
284
|
+
```powershell
|
|
285
|
+
$env:INTLAYER_MODE = "compose"; irm https://intlayer.org/install.ps1 | iex
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
Or by hand:
|
|
289
|
+
|
|
290
|
+
```powershell
|
|
291
|
+
mkdir intlayer; cd intlayer
|
|
292
|
+
irm https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/docker-compose.yml -OutFile docker-compose.yml
|
|
293
|
+
irm https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/.env.template -OutFile .env
|
|
294
|
+
# fill in BETTER_AUTH_SECRET and S3_SECRET_ACCESS_KEY
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
</Tab>
|
|
298
|
+
<Tab label="Intlayer CLI" value="cli">
|
|
299
|
+
|
|
300
|
+
```bash
|
|
301
|
+
npx intlayer init infra --mode compose
|
|
106
302
|
```
|
|
107
303
|
|
|
108
|
-
|
|
304
|
+
</Tab>
|
|
305
|
+
</Tabs>
|
|
109
306
|
|
|
110
|
-
|
|
307
|
+
### 2. 配置邮件服务
|
|
111
308
|
|
|
112
|
-
|
|
309
|
+
在 `intlayer/.env` 中填入 Resend **或** SMTP 配置,配置方式与多合一容器完全相同(参见[全局邮件服务](#global-mailer))。
|
|
113
310
|
|
|
114
|
-
|
|
311
|
+
### 3. 启动堆栈
|
|
115
312
|
|
|
116
313
|
```sh
|
|
117
|
-
|
|
314
|
+
cd intlayer && docker compose up -d
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
打开 **http://localhost:3000** 并按照[首次运行设置](#first-run-setup)进行操作。
|
|
318
|
+
|
|
319
|
+
### 使用外部托管数据库
|
|
320
|
+
|
|
321
|
+
从 compose 文件中删除要替换的服务(以及 `backend` 中对它的 `depends_on` 依赖项),然后覆盖对应的环境变量:
|
|
322
|
+
|
|
323
|
+
```yaml fileName="docker-compose.yml"
|
|
324
|
+
services:
|
|
325
|
+
backend:
|
|
326
|
+
environment:
|
|
327
|
+
MONGODB_URI: mongodb+srv://user:password@cluster0.xxxxx.mongodb.net/intlayer
|
|
328
|
+
REDIS_URL: rediss://default:password@redis.example.com:6380
|
|
329
|
+
S3_ENDPOINT: https://s3.eu-west-1.amazonaws.com
|
|
330
|
+
S3_PUBLIC_URL: https://intlayer-assets.s3.eu-west-1.amazonaws.com
|
|
118
331
|
```
|
|
119
332
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
-
| `RESEND_API_KEY`
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
|
333
|
+
`S3_ACCESS_KEY_ID` / `S3_SECRET_ACCESS_KEY` / `S3_BUCKET_NAME` 适用于任何兼容 S3 协议的对象存储服务商。
|
|
334
|
+
|
|
335
|
+
### 集群横向扩展
|
|
336
|
+
|
|
337
|
+
`app` 和 `backend` 服务均为无状态设计(stateless)。在负载均衡器后,移除固定的主机端口映射,并配置反向代理直接按容器服务名称访问后,执行 `docker compose up -d --scale backend=3` 即可实现横向扩展。后台异步任务通过 Redis (BullMQ) 协调,多个后端副本可以安全地共享同一个任务队列。
|
|
338
|
+
|
|
339
|
+
### 从源码编译构建
|
|
340
|
+
|
|
341
|
+
在代码仓库的根目录下,可以使用 override 文件将两个 Intlayer 服务的镜像拉取模式 `image:` 切换为源码构建 `build:`:
|
|
342
|
+
|
|
343
|
+
```sh
|
|
344
|
+
cd docker/selfhost
|
|
345
|
+
docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
为自定义域名生成专属镜像也是通过这种方式完成的:将 `VITE_*` 配置作为构建参数传入(参见[限制条件](#limitations))。
|
|
349
|
+
|
|
350
|
+
### 备份与升级
|
|
351
|
+
|
|
352
|
+
```sh
|
|
353
|
+
# Backup one volume (repeat for intlayer_redis-data and intlayer_minio-data)
|
|
354
|
+
docker compose stop
|
|
355
|
+
docker run --rm -v intlayer_mongo-data:/data -v "$(pwd)":/backup busybox tar czf /backup/mongo-data.tar.gz /data
|
|
356
|
+
docker compose start
|
|
357
|
+
|
|
358
|
+
# Upgrade, volumes are kept
|
|
359
|
+
docker compose pull && docker compose up -d
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
</Tab>
|
|
363
|
+
</Tabs>
|
|
364
|
+
|
|
365
|
+
### 安装程序高级选项
|
|
366
|
+
|
|
367
|
+
如果不带 `--mode`(或 `INTLAYER_MODE`)运行,安装程序会弹出交互菜单:`desktop`、`docker`(多合一)或 `compose`。它还支持读取一系列环境变量。由于安装脚本是通过管道输入给 shell 执行的,请在 shell 运行命令前设置这些变量,而不是传给 `curl`:
|
|
368
|
+
|
|
369
|
+
```sh
|
|
370
|
+
curl -fsSL https://intlayer.org/install.sh | INTLAYER_COMPOSE_DIR=./cms sh -s -- --mode compose
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
```powershell
|
|
374
|
+
$env:INTLAYER_MODE = "compose"; $env:INTLAYER_COMPOSE_DIR = ".\cms"; irm https://intlayer.org/install.ps1 | iex
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
| Variable | Default | Applies to | Description |
|
|
378
|
+
| ------------------------- | ------------------------- | ---------- | ---------------------------------------------------------- |
|
|
379
|
+
| `INTLAYER_MODE` | _(asked)_ | all | `desktop`, `docker` or `compose`, same as `--mode` |
|
|
380
|
+
| `INTLAYER_DOWNLOAD_DIR` | `~/Downloads` | desktop | Where the app installer is saved |
|
|
381
|
+
| `INTLAYER_IMAGE` | `intlayer/cms-all:latest` | docker | All-in-one image to pull |
|
|
382
|
+
| `INTLAYER_ENV_FILE` | `./intlayer.env` | docker | Where to write the environment file |
|
|
383
|
+
| `INTLAYER_CONTAINER_NAME` | `intlayer` | docker | Container name |
|
|
384
|
+
| `INTLAYER_DATA_VOLUME` | `intlayer-data` | docker | Named volume mounted at `/data` |
|
|
385
|
+
| `INTLAYER_APP_PORT` | `3000` | docker | Host port for the dashboard |
|
|
386
|
+
| `INTLAYER_API_PORT` | `3100` | docker | Host port for the API |
|
|
387
|
+
| `INTLAYER_S3_PORT` | `9000` | docker | Host port for the MinIO S3 API |
|
|
388
|
+
| `INTLAYER_CONSOLE_PORT` | `9001` | docker | Host port for the MinIO console |
|
|
389
|
+
| `INTLAYER_COMPOSE_DIR` | `./intlayer` | compose | Where `docker-compose.yml` and `.env` are written |
|
|
390
|
+
| `INTLAYER_SELFHOST_REF` | `main` | both | Git ref the compose file and env template are fetched from |
|
|
391
|
+
|
|
392
|
+
> 端口变量仅影响宿主机 **host** 端的端口映射。由于官方发布的镜像已将 `http://localhost:3000`、`http://localhost:3100` 和 `http://localhost:9000` 预编译到了前端静态代码中,因此除非您自行重新构建镜像,否则请保持这些默认端口不变,详情请参阅[限制条件](#limitations)。
|
|
393
|
+
|
|
394
|
+
## 首次运行设置
|
|
395
|
+
|
|
396
|
+
在一个全新的实例中(数据库尚为空),首次在浏览器中打开控制面板会自动重定向至 **`/init`** 初始化页面:
|
|
397
|
+
|
|
398
|
+
1. 注册首个管理员账户。由于用户数据集合为空,系统会自动将该账户提升为**超级管理员(super admin)**。
|
|
399
|
+
2. 系统会通过 Resend 或配置的 SMTP 中继向您的邮箱发送验证邮件。邮箱验证是**强制要求**的,这也是为什么在启动容器之前必须配置好邮件服务。
|
|
400
|
+
3. 点击邮件中的验证链接,然后登录系统。
|
|
401
|
+
|
|
402
|
+
一旦超级管理员创建完成,再次访问 `/init` 将自动重定向至标准登录页面。
|
|
403
|
+
|
|
404
|
+
## 环境变量参考
|
|
405
|
+
|
|
406
|
+
两种 Docker 模式均读取相同的环境变量配置文件(容器模式为 `intlayer.env`,Compose 模式为 `.env`),该文件模板派生自 [`docker/selfhost/.env.template`](https://github.com/aymericzip/intlayer/blob/main/docker/selfhost/.env.template)。
|
|
407
|
+
|
|
408
|
+
### 必填变量
|
|
409
|
+
|
|
410
|
+
| Variable | Example | Description |
|
|
411
|
+
| ---------------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
412
|
+
| `BETTER_AUTH_SECRET` | _(generated)_ | 32-byte secret for session signing |
|
|
413
|
+
| `S3_SECRET_ACCESS_KEY` | _(generated)_ | Secret for the bundled MinIO |
|
|
414
|
+
| `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)) |
|
|
415
|
+
|
|
416
|
+
### 部署环境固定变量
|
|
417
|
+
|
|
418
|
+
These are set by the image (all-in-one) or by the compose file, and only need overriding for a non-standard topology.
|
|
419
|
+
|
|
420
|
+
| Variable | All-in-one | Docker Compose | Description |
|
|
421
|
+
| ------------------ | --------------------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------- |
|
|
422
|
+
| `PORT` | `3100` | `3100` | Backend listening port |
|
|
423
|
+
| `APP_URL` | `http://localhost:3000` | `http://localhost:3000` | Public URL of the dashboard |
|
|
424
|
+
| `BACKEND_URL` | `http://localhost:3100` | `http://localhost:3100` | Public URL of the backend API |
|
|
425
|
+
| `DOMAIN` | `localhost` | `localhost` | Cookie domain |
|
|
426
|
+
| `SELF_HOSTED` | `true` | `true` | Disables the cloud-only API endpoints (billing, subscriptions, marketplace) |
|
|
427
|
+
| `MONGODB_URI` | `mongodb://127.0.0.1:27017/intlayer?replicaSet=rs0` | `mongodb://mongo:27017/…` | MongoDB connection string, any `mongodb://` or `mongodb+srv://` cluster works |
|
|
428
|
+
| `REDIS_URL` | `redis://127.0.0.1:6379` | `redis://redis:6379` | Redis |
|
|
429
|
+
| `S3_ENDPOINT` | `http://127.0.0.1:9000` | `http://minio:9000` | MinIO (server-to-server) |
|
|
430
|
+
| `S3_PUBLIC_URL` | `http://localhost:9000/intlayer` | `http://localhost:9000/intlayer` | Public URL for browser asset loading |
|
|
431
|
+
| `S3_BUCKET_NAME` | `intlayer` | `intlayer` | Bucket name |
|
|
432
|
+
| `S3_ACCESS_KEY_ID` | `intlayer` | `intlayer` | MinIO access key |
|
|
433
|
+
|
|
434
|
+
在 Compose 模式下,`app` 服务还会额外注入 `INTLAYER_BACKEND_INTERNAL_URL=http://backend:3100`:浏览器在宿主机上通过 `localhost:3100` 访问 API,但前端的服务端渲染(SSR)在容器内网运行,必须通过服务名通信。
|
|
435
|
+
|
|
436
|
+
### 可选变量(未配置时相关功能优雅降级)
|
|
437
|
+
|
|
438
|
+
| Variable | Feature |
|
|
439
|
+
| ------------------------------------------------ | ----------------------------------------- |
|
|
440
|
+
| `OPENAI_API_KEY` | AI-assisted translation and content audit |
|
|
441
|
+
| `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` | GitHub OAuth login |
|
|
442
|
+
| `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` | Google OAuth login |
|
|
443
|
+
| `GITLAB_CLIENT_ID`, `GITLAB_CLIENT_SECRET` | GitLab OAuth login |
|
|
444
|
+
| `MICROSOFT_CLIENT_ID`, `MICROSOFT_CLIENT_SECRET` | Microsoft OAuth login |
|
|
208
445
|
|
|
209
446
|
### 全局邮件服务
|
|
210
447
|
|
|
211
|
-
|
|
448
|
+
所有事务性邮件,包括非组织级别的系统邮件(如重置密码、免密登录链接等),均通过以下两种全局传输方式之一发送:
|
|
449
|
+
|
|
450
|
+
- **Resend**:使用 `RESEND_API_KEY`。
|
|
451
|
+
- **SMTP**:使用 `MAIL_SMTP_*` 变量。一旦检测到设置了 `MAIL_SMTP_HOST`,系统将优先启用 SMTP 并忽略 `RESEND_API_KEY`。
|
|
212
452
|
|
|
213
|
-
|
|
453
|
+
`MAIL_PROVIDER` 仅在两者皆已配置时用于强制指定发送通道(例如在配置了 SMTP 的情况下设置 `MAIL_PROVIDER=resend` 强制保留 Resend)。
|
|
214
454
|
|
|
215
|
-
|
|
|
216
|
-
| -------------------- | ------------------------------ |
|
|
217
|
-
| `
|
|
218
|
-
| `
|
|
219
|
-
| `
|
|
220
|
-
| `
|
|
221
|
-
| `
|
|
222
|
-
| `
|
|
223
|
-
| `
|
|
455
|
+
| Variable | Example | Description |
|
|
456
|
+
| -------------------- | ------------------------------ | ---------------------------------------------------------------------------- |
|
|
457
|
+
| `MAIL_FROM` | `Intlayer <no-reply@acme.com>` | Sender header for either transport. Accepts a bare address or `Name <email>` |
|
|
458
|
+
| `MAIL_SMTP_HOST` | `smtp.acme.com` | SMTP host. Setting it selects the SMTP transport |
|
|
459
|
+
| `MAIL_SMTP_PORT` | `587` | SMTP port (defaults to `587`) |
|
|
460
|
+
| `MAIL_SMTP_SECURE` | `false` | Implicit TLS. Set `true` for port `465` |
|
|
461
|
+
| `MAIL_SMTP_USER` | _(your user)_ | SMTP username (optional; omit for unauthenticated relays) |
|
|
462
|
+
| `MAIL_SMTP_PASSWORD` | _(your password)_ | SMTP password |
|
|
463
|
+
| `MAIL_PROVIDER` | `resend` | Optional override: `smtp` or `resend`. Leave unset to auto-select |
|
|
224
464
|
|
|
225
|
-
>
|
|
465
|
+
> 优先级规则:组织在后台控制面板中独立配置的邮件服务(**组织**设置页面)拥有最高优先级,其次是此处配置的全局邮件服务,最后是默认的 Resend 密钥。
|
|
226
466
|
|
|
227
467
|
## 连接您的 Intlayer 项目
|
|
228
468
|
|
|
229
|
-
|
|
469
|
+
当服务堆栈成功运行后,配置您的前端项目指向自建的后端 API 和控制面板,而非官方的 `intlayer.org` 云端服务。
|
|
230
470
|
|
|
231
|
-
###
|
|
471
|
+
### 项目配置文件
|
|
232
472
|
|
|
233
473
|
```typescript fileName="intlayer.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
|
|
234
474
|
import type { IntlayerConfig } from "intlayer";
|
|
@@ -239,14 +479,14 @@ const config: IntlayerConfig = {
|
|
|
239
479
|
clientSecret: process.env.INTLAYER_CLIENT_SECRET,
|
|
240
480
|
|
|
241
481
|
/**
|
|
242
|
-
*
|
|
243
|
-
*
|
|
482
|
+
* URL of the self-hosted CMS dashboard.
|
|
483
|
+
* Default: https://app.intlayer.org
|
|
244
484
|
*/
|
|
245
485
|
cmsURL: process.env.INTLAYER_CMS_URL, // e.g. http://localhost:3000
|
|
246
486
|
|
|
247
487
|
/**
|
|
248
|
-
*
|
|
249
|
-
*
|
|
488
|
+
* URL of the self-hosted backend API.
|
|
489
|
+
* Default: https://back.intlayer.org
|
|
250
490
|
*/
|
|
251
491
|
backendURL: process.env.INTLAYER_BACKEND_URL, // e.g. http://localhost:3100
|
|
252
492
|
},
|
|
@@ -255,7 +495,7 @@ const config: IntlayerConfig = {
|
|
|
255
495
|
export default config;
|
|
256
496
|
```
|
|
257
497
|
|
|
258
|
-
|
|
498
|
+
Set the environment variables in your project's `.env`:
|
|
259
499
|
|
|
260
500
|
```sh
|
|
261
501
|
INTLAYER_CMS_URL=http://localhost:3000
|
|
@@ -264,11 +504,11 @@ INTLAYER_CLIENT_ID=<your-client-id>
|
|
|
264
504
|
INTLAYER_CLIENT_SECRET=<your-client-secret>
|
|
265
505
|
```
|
|
266
506
|
|
|
267
|
-
|
|
507
|
+
登录您的自建控制面板,在 **Projects → Access keys** 页面(`http://localhost:3000/projects`)创建项目的客户端凭证。
|
|
268
508
|
|
|
269
509
|
### `@intlayer/api` SDK
|
|
270
510
|
|
|
271
|
-
|
|
511
|
+
在代码中通过 SDK 调用 `@intlayer/api` 时,请显式传入自建后端的 `backendURL`:
|
|
272
512
|
|
|
273
513
|
```typescript fileName="cms.ts" codeFormat="typescript"
|
|
274
514
|
import { createIntlayerCMS } from "@intlayer/api";
|
|
@@ -285,84 +525,17 @@ const cms = createIntlayerCMS({
|
|
|
285
525
|
const { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();
|
|
286
526
|
```
|
|
287
527
|
|
|
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
528
|
## 限制条件
|
|
332
529
|
|
|
333
|
-
-
|
|
334
|
-
-
|
|
335
|
-
- **
|
|
336
|
-
|
|
337
|
-
## 故障排除
|
|
338
|
-
|
|
339
|
-
### 后端首次启动时崩溃循环
|
|
340
|
-
|
|
341
|
-
MongoDB 和 Redis 必须在后端启动前保持健康。compose 文件使用带有 `condition: service_healthy` 的 `depends_on`。如果您看到后端重复重启,请检查 `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` 查看已发送的消息。要发送真实电子邮件,请在 `.env` 中设置 `MAIL_PROVIDER=resend` 和 `RESEND_API_KEY=<your-key>`,然后重启后端:
|
|
354
|
-
|
|
355
|
-
### MinIO 存储桶缺失
|
|
356
|
-
|
|
357
|
-
如果 `minio-init` 一次性服务未运行(或在 MinIO 准备好之前运行),请手动创建存储桶:
|
|
358
|
-
|
|
359
|
-
```sh
|
|
360
|
-
docker compose run --rm minio-init
|
|
361
|
-
```
|
|
530
|
+
- **不支持自定义域名与端口重映射。** 所有面向浏览器的 `VITE_*` 接口地址均在镜像构建阶段静态固化到了前端代码中,且官方镜像(及桌面应用)默认硬编码了 `localhost` / Intlayer Cloud 地址。控制面板必须通过 `http://localhost:3000` 访问,API 为 `:3100`,MinIO 为 `:9000`。若需部署在公网自定义域名下,或将桌面应用连接至自建后端,必须在构建时通过构建参数(在 `docker/selfhost/Dockerfile` 或 `docker-compose.build.yml` 中传入 `--build-arg VITE_BACKEND_URL=… VITE_SITE_URL=… VITE_DOMAIN=…`)重新编译镜像,目前暂不支持开箱即用的动态配置。
|
|
531
|
+
- **必须配置可用的邮件发送服务。** 系统的首次初始化要求必须通过邮件链接完成身份验证,因此在启动前必须配置好 `RESEND_API_KEY` 或 [SMTP 中继](#global-mailer)(`MAIL_SMTP_*`)。在首个超级管理员成功登录后,各个子组织可以在控制面板中单独配置属于自己的 SMTP 或 Resend 凭证。
|
|
532
|
+
- **桌面版应用需要在宿主机上安装 Node.js** 运行时以启动其内嵌的本地前端服务。
|
|
362
533
|
|
|
363
|
-
##
|
|
534
|
+
## 相关参考链接
|
|
364
535
|
|
|
365
|
-
- [Intlayer CMS
|
|
366
|
-
- [
|
|
367
|
-
- [CMS SDK
|
|
368
|
-
- [
|
|
536
|
+
- [Intlayer CMS 官方文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_CMS.md)
|
|
537
|
+
- [项目配置参考指南](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md)
|
|
538
|
+
- [CMS SDK: `@intlayer/api`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_CMS.md#programmatic-access-with-the-intlayerapi-sdk)
|
|
539
|
+
- [桌面客户端最新发布版本](https://github.com/aymericzip/intlayer/releases/latest)
|
|
540
|
+
- 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/`
|
|
541
|
+
- [`docker/selfhost/`](https://github.com/aymericzip/intlayer/tree/main/docker/selfhost):Dockerfile、`docker-compose.yml` 及 `.env.template` 配置文件模板
|