@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/de/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 selbst hosten
|
|
5
|
+
description: "Führen Sie Intlayer auf Ihrer eigenen Infrastruktur aus: als Desktop-App, einzelner All-in-One-Docker-Container oder skalierbarer Docker Compose-Stack. Kein Intlayer Cloud-Konto erforderlich."
|
|
6
6
|
keywords:
|
|
7
|
-
-
|
|
7
|
+
- Self-Hosting
|
|
8
8
|
- Docker
|
|
9
9
|
- Docker Compose
|
|
10
|
+
- Desktop-App
|
|
10
11
|
- Intlayer
|
|
11
12
|
- CMS
|
|
12
13
|
- Installation
|
|
@@ -19,212 +20,455 @@ author: aymericzip
|
|
|
19
20
|
|
|
20
21
|
# Intlayer selbst hosten
|
|
21
22
|
|
|
22
|
-
Intlayer kann
|
|
23
|
+
Intlayer kann auf Ihrer eigenen Infrastruktur ausgeführt werden, kein Intlayer Cloud-Konto erforderlich. Drei Setups stehen zur Verfügung, die alle über dasselbe Installationsprogramm verwaltet werden (`install.sh`, `install.ps1` unter Windows oder `npx intlayer init infra`):
|
|
23
24
|
|
|
24
|
-
|
|
25
|
+
| Setup | What it is | Pick it for |
|
|
26
|
+
| --------------------- | ------------------------------------------------------------------------------------- | ---------------------------------------------- |
|
|
27
|
+
| **Desktop-App** | Natives Dashboard für macOS, Linux und Windows | Ein lokaler Client, nichts zu hosten |
|
|
28
|
+
| **All-in-One Docker** | Dashboard, API, MongoDB, Redis und MinIO in einem **einzigen Container** | Tests und kleine Single-Box-Installationen |
|
|
29
|
+
| **Docker Compose** | **Ein Container pro Dienst**, jeder Datenspeicher durch ein Managed-Angebot ersetzbar | Produktion, Skalierung, verwaltete Datenbanken |
|
|
30
|
+
|
|
31
|
+
## Table of Contents
|
|
32
|
+
|
|
33
|
+
<TOC/>
|
|
34
|
+
|
|
35
|
+
## Veröffentlichte Images und Pakete
|
|
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
|
+
Alle drei Images werden aus derselben Datei [`docker/selfhost/Dockerfile`](https://github.com/aymericzip/intlayer/tree/main/docker/selfhost) erstellt und bei jeder Version veröffentlicht. Der Compose-Stack ruft außerdem die offiziellen Images `mongo:8`, `redis:8-alpine` und `quay.io/minio/minio` ab.
|
|
45
|
+
|
|
46
|
+
## Einrichtung
|
|
47
|
+
|
|
48
|
+
Das Installationsprogramm fragt nach dem gewünschten Setup, prüft die Voraussetzungen (bietet die Installation von Docker an), schreibt die Umgebungsdatei mit bereits generierten Secrets und lädt die Images herunter. Es startet nichts von selbst: Die Docker-Modi benötigen zuerst einen Mailer, daher endet es mit der Ausgabe des auszuführenden Befehls. Eine erneute Ausführung ist sicher: Eine vorhandene Umgebungsdatei wird nie überschrieben, was es auch zum Upgrade-Pfad macht.
|
|
49
|
+
|
|
50
|
+
<Tabs group="mode">
|
|
51
|
+
<Tab label="Desktop-App" value="desktop">
|
|
52
|
+
|
|
53
|
+
Das Intlayer-Dashboard als native Anwendung, erstellt mit Tauri. Es meldet sich bei der Intlayer Cloud (`https://app.intlayer.org`) an, sodass nichts gehostet werden muss. Es ist die richtige Wahl, wenn Sie einen lokalen Client statt eines Browser-Tabs bevorzugen.
|
|
54
|
+
|
|
55
|
+
### Installation
|
|
56
|
+
|
|
57
|
+
Das Installationsprogramm lädt das Paket für Ihr Betriebssystem und Ihre CPU herunter und öffnet es (macOS), installiert es (`dpkg` / `rpm` unter Linux) oder startet den Setup-Assistenten (Windows). Sie können es auch manuell von der [Releases-Seite](https://github.com/aymericzip/intlayer/releases/latest) herunterladen.
|
|
58
|
+
|
|
59
|
+
<Tabs group="os">
|
|
60
|
+
<Tab label="macOS / Linux" value="unix">
|
|
25
61
|
|
|
26
62
|
```sh
|
|
27
|
-
curl -fsSL https://intlayer.org/install.sh | sh
|
|
63
|
+
curl -fsSL https://intlayer.org/install.sh | sh -s -- --mode desktop
|
|
28
64
|
```
|
|
29
65
|
|
|
30
|
-
|
|
66
|
+
</Tab>
|
|
67
|
+
<Tab label="Windows" value="windows">
|
|
31
68
|
|
|
32
|
-
|
|
69
|
+
In PowerShell:
|
|
33
70
|
|
|
34
|
-
|
|
71
|
+
```powershell
|
|
72
|
+
$env:INTLAYER_MODE = "desktop"; irm https://intlayer.org/install.ps1 | iex
|
|
73
|
+
```
|
|
35
74
|
|
|
36
|
-
|
|
75
|
+
</Tab>
|
|
76
|
+
<Tab label="Intlayer CLI" value="cli">
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
npx intlayer init infra --mode desktop
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
</Tab>
|
|
83
|
+
</Tabs>
|
|
37
84
|
|
|
38
|
-
|
|
85
|
+
### Anforderungen
|
|
86
|
+
|
|
87
|
+
- **Node.js**: Die App bettet den Dashboard-Server ein und startet ihn mit der maschineneigenen `node`-Binärdatei. Installieren Sie es von [nodejs.org](https://nodejs.org), falls die App nicht startet.
|
|
88
|
+
|
|
89
|
+
> Der veröffentlichte Desktop-Build kommuniziert mit dem Intlayer Cloud-Backend. Das Verweisen auf ein selbst gehostetes Backend erfordert das erneute Erstellen der App mit der auf Ihre API festgelegten `VITE_BACKEND_URL`, siehe [Einschränkungen](#limitations).
|
|
90
|
+
|
|
91
|
+
</Tab>
|
|
92
|
+
<Tab label="All-in-One Docker" value="docker">
|
|
93
|
+
|
|
94
|
+
Alles läuft im einzelnen `intlayer/cms-all`-Container, überwacht von [s6-overlay](https://github.com/just-containers/s6-overlay), wobei jeder Datenspeicher auf einem einzigen Volume persistiert wird.
|
|
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
|
+
| Dienst | Host-Port(s) | Zweck |
|
|
111
|
+
| ----------- | ----------------------------- | --------------------------------------------------------- |
|
|
112
|
+
| **app** | `3000` | Dashboard (CMS-Benutzeroberfläche) |
|
|
113
|
+
| **backend** | `3100` | REST-API (`/health`-Endpunkt) |
|
|
114
|
+
| **mongo** | intern | MongoDB 8, Single-Node-Replica-Set `rs0` |
|
|
115
|
+
| **redis** | intern | Job-Warteschlangen (BullMQ) und Caching |
|
|
116
|
+
| **minio** | `9000` (S3), `9001` (Konsole) | S3-kompatibler Objektspeicher für Avatare und Screenshots |
|
|
117
|
+
|
|
118
|
+
Die Startreihenfolge wird durch s6-Abhängigkeiten gesteuert (`mongod` → Replica-Set-Init, `minio` → Bucket-Erstellung, dann `backend`, dann `app`), und Dienste starten bei Beendigung neu, sodass der erste Start sich von selbst erholt.
|
|
56
119
|
|
|
57
|
-
|
|
120
|
+
### Voraussetzungen
|
|
58
121
|
|
|
59
|
-
- **Docker** ≥ 24
|
|
60
|
-
- Ports `3000`, `3100`, `
|
|
61
|
-
- Ein
|
|
122
|
+
- **Docker** ≥ 24: Das Installationsprogramm bietet die Installation an (über [get.docker.com](https://get.docker.com) unter Linux, Homebrew unter macOS). Installieren Sie unter Windows zuerst [Docker Desktop](https://docs.docker.com/desktop/setup/install/windows-install/) (WSL 2-Backend).
|
|
123
|
+
- Ports `3000`, `3100`, `9000` und `9001` auf dem Host frei. MinIO `9000` muss für den Browser erreichbar bleiben, da Assets direkt von `S3_PUBLIC_URL` geladen werden.
|
|
124
|
+
- Ein Mailer: Ein [Resend](https://resend.com)-API-Schlüssel oder ein SMTP-Relay.
|
|
62
125
|
|
|
63
|
-
|
|
126
|
+
### 1. Installation
|
|
64
127
|
|
|
65
|
-
|
|
128
|
+
Schreibt `./intlayer.env` mit generiertem `BETTER_AUTH_SECRET` und `S3_SECRET_ACCESS_KEY` und ruft `intlayer/cms-all:latest` ab.
|
|
66
129
|
|
|
67
|
-
|
|
130
|
+
<Tabs group="os">
|
|
131
|
+
<Tab label="macOS / Linux" value="unix">
|
|
68
132
|
|
|
69
133
|
```sh
|
|
70
|
-
curl -fsSL https://intlayer.org/install.sh | sh
|
|
134
|
+
curl -fsSL https://intlayer.org/install.sh | sh -s -- --mode docker
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
</Tab>
|
|
138
|
+
<Tab label="Windows" value="windows">
|
|
139
|
+
|
|
140
|
+
In PowerShell:
|
|
141
|
+
|
|
142
|
+
```powershell
|
|
143
|
+
$env:INTLAYER_MODE = "docker"; irm https://intlayer.org/install.ps1 | iex
|
|
71
144
|
```
|
|
72
145
|
|
|
73
|
-
|
|
146
|
+
</Tab>
|
|
147
|
+
<Tab label="Intlayer CLI" value="cli">
|
|
74
148
|
|
|
75
|
-
|
|
149
|
+
```bash
|
|
150
|
+
npx intlayer init infra --mode docker
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
</Tab>
|
|
154
|
+
</Tabs>
|
|
76
155
|
|
|
77
|
-
### 2.
|
|
156
|
+
### 2. Mailer konfigurieren
|
|
78
157
|
|
|
79
|
-
Öffnen Sie `intlayer.env` und
|
|
158
|
+
Öffnen Sie `intlayer.env` und tragen Sie Resend **oder** SMTP ein (Details unter [Globaler Mailer](#global-mailer)):
|
|
80
159
|
|
|
81
160
|
```sh fileName="intlayer.env"
|
|
82
|
-
|
|
83
|
-
DB_MDP=<atlas-password>
|
|
84
|
-
DB_CLUSTER=<cluster>.xxxxx.mongodb.net
|
|
161
|
+
# Option A: Resend
|
|
85
162
|
RESEND_API_KEY=<your-resend-key>
|
|
86
|
-
```
|
|
87
163
|
|
|
88
|
-
|
|
164
|
+
# Option B: SMTP (takes over from Resend as soon as MAIL_SMTP_HOST is set)
|
|
165
|
+
MAIL_SMTP_HOST=smtp.example.com
|
|
166
|
+
MAIL_SMTP_PORT=587
|
|
167
|
+
MAIL_SMTP_USER=<user>
|
|
168
|
+
MAIL_SMTP_PASSWORD=<password>
|
|
169
|
+
MAIL_FROM=Intlayer <no-reply@example.com>
|
|
170
|
+
```
|
|
89
171
|
|
|
90
|
-
|
|
172
|
+
### 3. Starten
|
|
91
173
|
|
|
92
|
-
|
|
174
|
+
Dies ist der vom Installationsprogramm ausgegebene Befehl:
|
|
93
175
|
|
|
94
|
-
|
|
176
|
+
<Tabs group="os">
|
|
177
|
+
<Tab label="macOS / Linux" value="unix">
|
|
95
178
|
|
|
96
179
|
```sh
|
|
97
180
|
docker run -d --name intlayer \
|
|
98
181
|
--restart unless-stopped \
|
|
99
|
-
-p 3000:3000 \
|
|
100
|
-
-p 3100:3100 \
|
|
101
|
-
-p 9000:9000 \
|
|
102
|
-
-p 9001:9001 \
|
|
182
|
+
-p 3000:3000 -p 3100:3100 -p 9000:9000 -p 9001:9001 \
|
|
103
183
|
-v intlayer-data:/data \
|
|
104
184
|
--env-file ./intlayer.env \
|
|
105
|
-
|
|
185
|
+
intlayer/cms-all:latest
|
|
106
186
|
```
|
|
107
187
|
|
|
108
|
-
|
|
188
|
+
</Tab>
|
|
189
|
+
<Tab label="Windows" value="windows">
|
|
190
|
+
|
|
191
|
+
```powershell
|
|
192
|
+
docker run -d --name intlayer `
|
|
193
|
+
--restart unless-stopped `
|
|
194
|
+
-p 3000:3000 -p 3100:3100 -p 9000:9000 -p 9001:9001 `
|
|
195
|
+
-v intlayer-data:/data `
|
|
196
|
+
--env-file ./intlayer.env `
|
|
197
|
+
intlayer/cms-all:latest
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
</Tab>
|
|
201
|
+
<Tab label="Intlayer CLI" value="cli">
|
|
202
|
+
|
|
203
|
+
Die CLI führt das Installationsprogramm aus, das den in den anderen Tabs gezeigten Befehl `docker run …` ausgibt. Kopieren Sie ihn nach der Konfiguration des Mailers in Ihr Terminal.
|
|
204
|
+
|
|
205
|
+
</Tab>
|
|
206
|
+
</Tabs>
|
|
109
207
|
|
|
110
|
-
|
|
208
|
+
Öffnen Sie **http://localhost:3000** und folgen Sie der [Ersteinrichtung](#first-run-setup). Der erste Start initialisiert das Replica-Set und den Bucket, geben Sie ihm eine Minute Zeit.
|
|
111
209
|
|
|
112
|
-
###
|
|
210
|
+
### Backup und Upgrade
|
|
113
211
|
|
|
114
|
-
|
|
212
|
+
Der gesamte Zustand liegt im Volume `intlayer-data` (`/data/mongo`, `/data/redis`, `/data/minio`).
|
|
115
213
|
|
|
116
214
|
```sh
|
|
117
|
-
|
|
215
|
+
# Backup (stop the container first so MongoDB's files are consistent)
|
|
216
|
+
docker stop intlayer
|
|
217
|
+
docker run --rm -v intlayer-data:/data -v "$(pwd)":/backup busybox tar czf /backup/intlayer-data.tar.gz /data
|
|
218
|
+
docker start intlayer
|
|
219
|
+
|
|
220
|
+
# Restore
|
|
221
|
+
docker run --rm -v intlayer-data:/data -v "$(pwd)":/backup busybox tar xzf /backup/intlayer-data.tar.gz -C /
|
|
118
222
|
```
|
|
119
223
|
|
|
120
|
-
|
|
121
|
-
| ------------------------- | --------------------------------------------- | ------------------------------------ |
|
|
122
|
-
| `INTLAYER_IMAGE` | `ghcr.io/aymericzip/intlayer-selfhost:latest` | Zu pullendes Image |
|
|
123
|
-
| `INTLAYER_ENV_FILE` | `./intlayer.env` | Wo die env-Datei geschrieben wird |
|
|
124
|
-
| `INTLAYER_CONTAINER_NAME` | `intlayer` | Container-Name |
|
|
125
|
-
| `INTLAYER_DATA_VOLUME` | `intlayer-data` | Named Volume eingebunden bei `/data` |
|
|
126
|
-
| `INTLAYER_APP_PORT` | `3000` | Host-Port für das Dashboard |
|
|
127
|
-
| `INTLAYER_API_PORT` | `3100` | Host-Port für die API |
|
|
128
|
-
| `INTLAYER_S3_PORT` | `9000` | Host-Port für die MinIO S3 API |
|
|
129
|
-
| `INTLAYER_CONSOLE_PORT` | `9001` | Host-Port für die MinIO-Konsole |
|
|
224
|
+
Führen Sie zum Aktualisieren das Installationsprogramm erneut aus (es lädt das neueste Image und behält `intlayer.env`), führen Sie dann `docker rm -f intlayer` aus und starten Sie den Startbefehl erneut. Um ein verwaltetes MongoDB statt des gebündelten zu verwenden, setzen Sie `MONGODB_URI` in `intlayer.env`.
|
|
130
225
|
|
|
131
|
-
>
|
|
226
|
+
</Tab>
|
|
227
|
+
<Tab label="Docker Compose" value="compose">
|
|
132
228
|
|
|
133
|
-
|
|
229
|
+
Ein Container pro Dienst in einem privaten Compose-Netzwerk. Das Dashboard und die API verwenden die veröffentlichten Images `intlayer/cms-frontend` und `intlayer/cms-backend`; die Datenspeicher verwenden die offiziellen Images `mongo`, `redis` und `minio`.
|
|
134
230
|
|
|
135
|
-
|
|
231
|
+
```
|
|
232
|
+
┌───────────────────┐
|
|
233
|
+
browser ──────▶ │ app :3000 │ ── SSR ──▶ http://backend:3100
|
|
234
|
+
(localhost) └───────────────────┘
|
|
235
|
+
┌───────────────────┐
|
|
236
|
+
browser ──────▶ │ backend :3100 │
|
|
237
|
+
(localhost) └─────────┬─────────┘
|
|
238
|
+
┌───────────────┼───────────────┐
|
|
239
|
+
▼ ▼ ▼
|
|
240
|
+
mongo:27017 redis:6379 minio:9000 ◀── browser (assets)
|
|
241
|
+
(1-node RS) minio:9001
|
|
242
|
+
```
|
|
136
243
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
244
|
+
| Dienst | Image | Rolle |
|
|
245
|
+
| ------------ | ----------------------- | ------------------------------------------------------------------------------------- |
|
|
246
|
+
| `app` | `intlayer/cms-frontend` | Dashboard auf `:3000`; wartet, bis das Backend gesund ist |
|
|
247
|
+
| `backend` | `intlayer/cms-backend` | API auf `:3100` mit Chromium; wartet auf Mongo, Redis und den MinIO-Bucket |
|
|
248
|
+
| `mongo` | `mongo:8` | Single-Node-Replica-Set `rs0`, initialisiert durch eigenen Healthcheck |
|
|
249
|
+
| `redis` | `redis:8-alpine` | Warteschlangen und Caching, Append-Only-Persistenz |
|
|
250
|
+
| `minio` | `quay.io/minio/minio` | S3-Speicher auf `:9000`, Konsole auf `:9001` |
|
|
251
|
+
| `minio-init` | `quay.io/minio/mc` | Einmalige Ausführung: Erstellt den Bucket und dessen Richtlinie für anonyme Downloads |
|
|
252
|
+
|
|
253
|
+
Die Daten werden in den Volumes `intlayer_mongo-data`, `intlayer_redis-data` und `intlayer_minio-data` gespeichert. Die Dienstverbindungen (`MONGODB_URI`, `REDIS_URL`, `S3_ENDPOINT`, die interne Backend-URL für serverseitiges Rendering) sind in der Compose-Datei festgelegt und haben Vorrang vor `.env`, das nur Secrets und optionale Integrationen enthält.
|
|
254
|
+
|
|
255
|
+
### Voraussetzungen
|
|
256
|
+
|
|
257
|
+
- **Docker** ≥ 24 mit dem Compose-Plugin: Das Installationsprogramm bietet die Installation unter Linux und macOS an. Installieren Sie unter Windows zuerst [Docker Desktop](https://docs.docker.com/desktop/setup/install/windows-install/) (WSL 2-Backend).
|
|
258
|
+
- Ports `3000`, `3100`, `9000` und `9001` auf dem Host frei.
|
|
259
|
+
- Ein Mailer: Ein [Resend](https://resend.com)-API-Schlüssel oder ein SMTP-Relay.
|
|
260
|
+
|
|
261
|
+
### 1. Installation
|
|
262
|
+
|
|
263
|
+
Schreibt `docker-compose.yml` und ein `.env` mit den generierten Secrets nach `./intlayer/` und lädt die Images herunter.
|
|
140
264
|
|
|
141
|
-
|
|
265
|
+
<Tabs group="os">
|
|
266
|
+
<Tab label="macOS / Linux" value="unix">
|
|
142
267
|
|
|
143
|
-
|
|
268
|
+
```sh
|
|
269
|
+
curl -fsSL https://intlayer.org/install.sh | sh -s -- --mode compose
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Or by hand:
|
|
144
273
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
274
|
+
```sh
|
|
275
|
+
mkdir intlayer && cd intlayer
|
|
276
|
+
curl -fsSLO https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/docker-compose.yml
|
|
277
|
+
curl -fsSL https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/.env.template -o .env
|
|
278
|
+
# fill in BETTER_AUTH_SECRET and S3_SECRET_ACCESS_KEY (openssl rand -hex 32)
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
</Tab>
|
|
282
|
+
<Tab label="Windows" value="windows">
|
|
283
|
+
|
|
284
|
+
In PowerShell:
|
|
285
|
+
|
|
286
|
+
```powershell
|
|
287
|
+
$env:INTLAYER_MODE = "compose"; irm https://intlayer.org/install.ps1 | iex
|
|
288
|
+
```
|
|
153
289
|
|
|
154
|
-
|
|
290
|
+
Or by hand:
|
|
291
|
+
|
|
292
|
+
```powershell
|
|
293
|
+
mkdir intlayer; cd intlayer
|
|
294
|
+
irm https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/docker-compose.yml -OutFile docker-compose.yml
|
|
295
|
+
irm https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/.env.template -OutFile .env
|
|
296
|
+
# fill in BETTER_AUTH_SECRET and S3_SECRET_ACCESS_KEY
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
</Tab>
|
|
300
|
+
<Tab label="Intlayer CLI" value="cli">
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
npx intlayer init infra --mode compose
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
</Tab>
|
|
307
|
+
</Tabs>
|
|
308
|
+
|
|
309
|
+
### 2. Mailer konfigurieren
|
|
310
|
+
|
|
311
|
+
Tragen Sie Resend **oder** SMTP in `intlayer/.env` ein, genau wie beim All-in-One-Container (siehe [Globaler Mailer](#global-mailer)).
|
|
312
|
+
|
|
313
|
+
### 3. Starten
|
|
314
|
+
|
|
315
|
+
```sh
|
|
316
|
+
cd intlayer && docker compose up -d
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
Öffnen Sie **http://localhost:3000** und folgen Sie der [Ersteinrichtung](#first-run-setup).
|
|
320
|
+
|
|
321
|
+
### Verwaltete Datenspeicher
|
|
322
|
+
|
|
323
|
+
Löschen Sie den Dienst, den Sie ersetzen, aus der Compose-Datei (sowie seinen Eintrag in `depends_on` bei `backend`), und überschreiben Sie die entsprechende Variable:
|
|
324
|
+
|
|
325
|
+
```yaml fileName="docker-compose.yml"
|
|
326
|
+
services:
|
|
327
|
+
backend:
|
|
328
|
+
environment:
|
|
329
|
+
MONGODB_URI: mongodb+srv://user:password@cluster0.xxxxx.mongodb.net/intlayer
|
|
330
|
+
REDIS_URL: rediss://default:password@redis.example.com:6380
|
|
331
|
+
S3_ENDPOINT: https://s3.eu-west-1.amazonaws.com
|
|
332
|
+
S3_PUBLIC_URL: https://intlayer-assets.s3.eu-west-1.amazonaws.com
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
`S3_ACCESS_KEY_ID` / `S3_SECRET_ACCESS_KEY` / `S3_BUCKET_NAME` behalten ihre Bedeutung gegenüber jedem S3-kompatiblen Anbieter.
|
|
336
|
+
|
|
337
|
+
### Skalierung
|
|
338
|
+
|
|
339
|
+
`app` und `backend` sind zustandslos (stateless). Hinter einem Load Balancer funktioniert `docker compose up -d --scale backend=3`, sobald die festen Host-Portzuordnungen entfernt wurden und der Proxy die Dienste über den Namen adressiert. Hintergrundaufgaben werden über Redis (BullMQ) koordiniert, sodass mehrere Backend-Replikate die Warteschlange sicher teilen.
|
|
340
|
+
|
|
341
|
+
### Erstellung aus dem Quellcode
|
|
342
|
+
|
|
343
|
+
Aus einem Checkout des Repositorys schaltet ein Override die beiden Intlayer-Dienste von `image:` auf `build:` um:
|
|
344
|
+
|
|
345
|
+
```sh
|
|
346
|
+
cd docker/selfhost
|
|
347
|
+
docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
Auf diese Weise erstellen Sie auch Images für eine benutzerdefinierte Domain: Übergeben Sie die `VITE_*`-Werte als Build-Argumente (siehe [Einschränkungen](#limitations)).
|
|
351
|
+
|
|
352
|
+
### Backup und Upgrade
|
|
353
|
+
|
|
354
|
+
```sh
|
|
355
|
+
# Backup one volume (repeat for intlayer_redis-data and intlayer_minio-data)
|
|
356
|
+
docker compose stop
|
|
357
|
+
docker run --rm -v intlayer_mongo-data:/data -v "$(pwd)":/backup busybox tar czf /backup/mongo-data.tar.gz /data
|
|
358
|
+
docker compose start
|
|
359
|
+
|
|
360
|
+
# Upgrade, volumes are kept
|
|
361
|
+
docker compose pull && docker compose up -d
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
</Tab>
|
|
365
|
+
</Tabs>
|
|
366
|
+
|
|
367
|
+
### Installationsprogramm-Einstellungen
|
|
368
|
+
|
|
369
|
+
Ohne `--mode` (oder `INTLAYER_MODE`) zeigt das Installationsprogramm ein Menü an: `desktop`, `docker` (All-in-One) oder `compose`. Es liest auch einige Umgebungsvariablen. Da es in die Shell geleitet wird, übergeben Sie diese an die Shell und nicht an `curl`:
|
|
370
|
+
|
|
371
|
+
```sh
|
|
372
|
+
curl -fsSL https://intlayer.org/install.sh | INTLAYER_COMPOSE_DIR=./cms sh -s -- --mode compose
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
```powershell
|
|
376
|
+
$env:INTLAYER_MODE = "compose"; $env:INTLAYER_COMPOSE_DIR = ".\cms"; irm https://intlayer.org/install.ps1 | iex
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
| Variable | Default | Applies to | Description |
|
|
380
|
+
| ------------------------- | ------------------------- | ---------- | ---------------------------------------------------------- |
|
|
381
|
+
| `INTLAYER_MODE` | _(asked)_ | all | `desktop`, `docker` or `compose`, same as `--mode` |
|
|
382
|
+
| `INTLAYER_DOWNLOAD_DIR` | `~/Downloads` | desktop | Where the app installer is saved |
|
|
383
|
+
| `INTLAYER_IMAGE` | `intlayer/cms-all:latest` | docker | All-in-one image to pull |
|
|
384
|
+
| `INTLAYER_ENV_FILE` | `./intlayer.env` | docker | Where to write the environment file |
|
|
385
|
+
| `INTLAYER_CONTAINER_NAME` | `intlayer` | docker | Container name |
|
|
386
|
+
| `INTLAYER_DATA_VOLUME` | `intlayer-data` | docker | Named volume mounted at `/data` |
|
|
387
|
+
| `INTLAYER_APP_PORT` | `3000` | docker | Host port for the dashboard |
|
|
388
|
+
| `INTLAYER_API_PORT` | `3100` | docker | Host port for the API |
|
|
389
|
+
| `INTLAYER_S3_PORT` | `9000` | docker | Host port for the MinIO S3 API |
|
|
390
|
+
| `INTLAYER_CONSOLE_PORT` | `9001` | docker | Host port for the MinIO console |
|
|
391
|
+
| `INTLAYER_COMPOSE_DIR` | `./intlayer` | compose | Where `docker-compose.yml` and `.env` are written |
|
|
392
|
+
| `INTLAYER_SELFHOST_REF` | `main` | both | Git ref the compose file and env template are fetched from |
|
|
393
|
+
|
|
394
|
+
> Die Portvariablen ändern nur die **Host**-Seite des Mappings. Die veröffentlichten Images haben `http://localhost:3000`, `http://localhost:3100` und `http://localhost:9000` im Dashboard-Bundle kompiliert. Behalten Sie die Standardwerte bei, es sei denn, Sie erstellen eigene Images, siehe [Einschränkungen](#limitations).
|
|
395
|
+
|
|
396
|
+
## Ersteinrichtung
|
|
397
|
+
|
|
398
|
+
Bei einer neuen Instanz (leere Datenbank) leitet das Öffnen des Dashboards auf die Seite **`/init`** weiter:
|
|
399
|
+
|
|
400
|
+
1. Erstellen Sie das erste Konto. Da die Benutzersammlung leer ist, wird dieses Konto automatisch zum **Super-Admin** ernannt.
|
|
401
|
+
2. Eine Bestätigungs-E-Mail wird über Resend oder Ihr SMTP-Relay gesendet. Die E-Mail-Bestätigung ist **obligatorisch**, weshalb vor dem Start ein Mailer konfiguriert werden muss.
|
|
402
|
+
3. Klicken Sie auf den Link in der E-Mail und melden Sie sich an.
|
|
403
|
+
|
|
404
|
+
Sobald ein Admin existiert, leitet `/init` auf die Standard-Anmeldeseite weiter.
|
|
155
405
|
|
|
156
406
|
## Umgebungsvariablen
|
|
157
407
|
|
|
408
|
+
Beide Docker-Modi lesen dieselbe Datei (`intlayer.env` für den Container, `.env` für Compose), die aus [`docker/selfhost/.env.template`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/self_hosting.md) generiert wird.
|
|
409
|
+
|
|
158
410
|
### Erforderlich
|
|
159
411
|
|
|
160
|
-
| Variable |
|
|
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
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
| `MAIL_SMTP_USER` | _(your user)_ | SMTP username (optional; omit for unauthenticated relays) |
|
|
221
|
-
| `MAIL_SMTP_PASSWORD` | _(your password)_ | SMTP password |
|
|
222
|
-
|
|
223
|
-
> Precedence: an organization's own mailer (configured from the **Organization** dashboard) takes priority over the global mailer, which in turn takes priority over the default Resend key.
|
|
224
|
-
|
|
225
|
-
## Ihr Intlayer-Projekt verbinden
|
|
226
|
-
|
|
227
|
-
Sobald der Stack läuft, verweisen Sie Ihr Projekt auf das selbst gehostete Backend und Dashboard anstelle von `intlayer.org`.
|
|
412
|
+
| Variable | Example | Description |
|
|
413
|
+
| ---------------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
414
|
+
| `BETTER_AUTH_SECRET` | _(generated)_ | 32-byte secret for session signing |
|
|
415
|
+
| `S3_SECRET_ACCESS_KEY` | _(generated)_ | Secret for the bundled MinIO |
|
|
416
|
+
| `RESEND_API_KEY` | _(your key)_ | Transactional email via Resend. Required for first-run setup unless an SMTP relay is configured instead (see [Global mailer](#global-mailer)) |
|
|
417
|
+
|
|
418
|
+
### Durch das Deployment festgelegt
|
|
419
|
+
|
|
420
|
+
These are set by the image (all-in-one) or by the compose file, and only need overriding for a non-standard topology.
|
|
421
|
+
|
|
422
|
+
| Variable | All-in-one | Docker Compose | Description |
|
|
423
|
+
| ------------------ | --------------------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------- |
|
|
424
|
+
| `PORT` | `3100` | `3100` | Backend listening port |
|
|
425
|
+
| `APP_URL` | `http://localhost:3000` | `http://localhost:3000` | Public URL of the dashboard |
|
|
426
|
+
| `BACKEND_URL` | `http://localhost:3100` | `http://localhost:3100` | Public URL of the backend API |
|
|
427
|
+
| `DOMAIN` | `localhost` | `localhost` | Cookie domain |
|
|
428
|
+
| `SELF_HOSTED` | `true` | `true` | Disables the cloud-only API endpoints (billing, subscriptions, marketplace) |
|
|
429
|
+
| `MONGODB_URI` | `mongodb://127.0.0.1:27017/intlayer?replicaSet=rs0` | `mongodb://mongo:27017/…` | MongoDB connection string, any `mongodb://` or `mongodb+srv://` cluster works |
|
|
430
|
+
| `REDIS_URL` | `redis://127.0.0.1:6379` | `redis://redis:6379` | Redis |
|
|
431
|
+
| `S3_ENDPOINT` | `http://127.0.0.1:9000` | `http://minio:9000` | MinIO (server-to-server) |
|
|
432
|
+
| `S3_PUBLIC_URL` | `http://localhost:9000/intlayer` | `http://localhost:9000/intlayer` | Public URL for browser asset loading |
|
|
433
|
+
| `S3_BUCKET_NAME` | `intlayer` | `intlayer` | Bucket name |
|
|
434
|
+
| `S3_ACCESS_KEY_ID` | `intlayer` | `intlayer` | MinIO access key |
|
|
435
|
+
|
|
436
|
+
Der Compose-Dienst `app` erhält zusätzlich `INTLAYER_BACKEND_INTERNAL_URL=http://backend:3100`: Der Browser erreicht die API über `localhost:3100`, aber das serverseitige Rendering läuft innerhalb des Compose-Netzwerks und muss den Dienstnamen verwenden.
|
|
437
|
+
|
|
438
|
+
### Optional (Funktionen fallen ohne sie sauber aus)
|
|
439
|
+
|
|
440
|
+
| Variable | Feature |
|
|
441
|
+
| ------------------------------------------------ | ----------------------------------------- |
|
|
442
|
+
| `OPENAI_API_KEY` | AI-assisted translation and content audit |
|
|
443
|
+
| `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` | GitHub OAuth login |
|
|
444
|
+
| `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` | Google OAuth login |
|
|
445
|
+
| `GITLAB_CLIENT_ID`, `GITLAB_CLIENT_SECRET` | GitLab OAuth login |
|
|
446
|
+
| `MICROSOFT_CLIENT_ID`, `MICROSOFT_CLIENT_SECRET` | Microsoft OAuth login |
|
|
447
|
+
|
|
448
|
+
### Globaler Mailer
|
|
449
|
+
|
|
450
|
+
Jede transaktionale E-Mail, einschließlich E-Mails außerhalb der Organisation wie Passwort-Resets und Magic Links, läuft über einen von zwei globalen Transporten:
|
|
451
|
+
|
|
452
|
+
- **Resend**, unter Verwendung von `RESEND_API_KEY`.
|
|
453
|
+
- **SMTP**, unter Verwendung der Variablen `MAIL_SMTP_*`. Sobald `MAIL_SMTP_HOST` gesetzt ist, wird SMTP verwendet und `RESEND_API_KEY` ignoriert.
|
|
454
|
+
|
|
455
|
+
`MAIL_PROVIDER` wird nur benötigt, um einen Transport zu erzwingen, wenn beide konfiguriert sind (z. B. `MAIL_PROVIDER=resend`, um Resend beizubehalten, während ein SMTP-Host vorhanden ist).
|
|
456
|
+
|
|
457
|
+
| Variable | Example | Description |
|
|
458
|
+
| -------------------- | ------------------------------ | ---------------------------------------------------------------------------- |
|
|
459
|
+
| `MAIL_FROM` | `Intlayer <no-reply@acme.com>` | Sender header for either transport. Accepts a bare address or `Name <email>` |
|
|
460
|
+
| `MAIL_SMTP_HOST` | `smtp.acme.com` | SMTP host. Setting it selects the SMTP transport |
|
|
461
|
+
| `MAIL_SMTP_PORT` | `587` | SMTP port (defaults to `587`) |
|
|
462
|
+
| `MAIL_SMTP_SECURE` | `false` | Implicit TLS. Set `true` for port `465` |
|
|
463
|
+
| `MAIL_SMTP_USER` | _(your user)_ | SMTP username (optional; omit for unauthenticated relays) |
|
|
464
|
+
| `MAIL_SMTP_PASSWORD` | _(your password)_ | SMTP password |
|
|
465
|
+
| `MAIL_PROVIDER` | `resend` | Optional override: `smtp` or `resend`. Leave unset to auto-select |
|
|
466
|
+
|
|
467
|
+
> Rangfolge: Der eigene Mailer einer Organisation (im Dashboard unter **Organisation** konfiguriert) hat Vorrang vor dem globalen Mailer, der wiederum Vorrang vor dem standardmäßigen Resend-Schlüssel hat.
|
|
468
|
+
|
|
469
|
+
## Verbinden Ihres Intlayer-Projekts
|
|
470
|
+
|
|
471
|
+
Sobald der Stack läuft, verweisen Sie mit Ihrem Projekt auf das selbst gehostete Backend und Dashboard anstelle von `intlayer.org`.
|
|
228
472
|
|
|
229
473
|
### Projektkonfiguration
|
|
230
474
|
|
|
@@ -237,14 +481,14 @@ const config: IntlayerConfig = {
|
|
|
237
481
|
clientSecret: process.env.INTLAYER_CLIENT_SECRET,
|
|
238
482
|
|
|
239
483
|
/**
|
|
240
|
-
* URL
|
|
241
|
-
*
|
|
484
|
+
* URL of the self-hosted CMS dashboard.
|
|
485
|
+
* Default: https://app.intlayer.org
|
|
242
486
|
*/
|
|
243
487
|
cmsURL: process.env.INTLAYER_CMS_URL, // e.g. http://localhost:3000
|
|
244
488
|
|
|
245
489
|
/**
|
|
246
|
-
* URL
|
|
247
|
-
*
|
|
490
|
+
* URL of the self-hosted backend API.
|
|
491
|
+
* Default: https://back.intlayer.org
|
|
248
492
|
*/
|
|
249
493
|
backendURL: process.env.INTLAYER_BACKEND_URL, // e.g. http://localhost:3100
|
|
250
494
|
},
|
|
@@ -253,7 +497,7 @@ const config: IntlayerConfig = {
|
|
|
253
497
|
export default config;
|
|
254
498
|
```
|
|
255
499
|
|
|
256
|
-
|
|
500
|
+
Set the environment variables in your project's `.env`:
|
|
257
501
|
|
|
258
502
|
```sh
|
|
259
503
|
INTLAYER_CMS_URL=http://localhost:3000
|
|
@@ -262,11 +506,11 @@ INTLAYER_CLIENT_ID=<your-client-id>
|
|
|
262
506
|
INTLAYER_CLIENT_SECRET=<your-client-secret>
|
|
263
507
|
```
|
|
264
508
|
|
|
265
|
-
Erstellen Sie Zugangsdaten in Ihrem selbst gehosteten Dashboard unter **
|
|
509
|
+
Erstellen Sie Zugangsdaten in Ihrem selbst gehosteten Dashboard unter **Projekte → Zugriffsschlüssel** unter `http://localhost:3000/projects`.
|
|
266
510
|
|
|
267
|
-
### `@intlayer/api
|
|
511
|
+
### `@intlayer/api`-SDK
|
|
268
512
|
|
|
269
|
-
Wenn Sie das `@intlayer/api
|
|
513
|
+
Wenn Sie das `@intlayer/api`-SDK programmatisch verwenden, übergeben Sie `backendURL` explizit:
|
|
270
514
|
|
|
271
515
|
```typescript fileName="cms.ts" codeFormat="typescript"
|
|
272
516
|
import { createIntlayerCMS } from "@intlayer/api";
|
|
@@ -283,84 +527,17 @@ const cms = createIntlayerCMS({
|
|
|
283
527
|
const { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();
|
|
284
528
|
```
|
|
285
529
|
|
|
286
|
-
## Upgrade
|
|
287
|
-
|
|
288
|
-
Ein erneutes Ausführen des Installers auf einer bestehenden Bereitstellung führt ein Rolling-Upgrade durch:
|
|
289
|
-
|
|
290
|
-
```sh
|
|
291
|
-
docker compose pull
|
|
292
|
-
docker compose up -d
|
|
293
|
-
```
|
|
294
|
-
|
|
295
|
-
## Backup und Wiederherstellung
|
|
296
|
-
|
|
297
|
-
Alle persistenten Daten befinden sich in drei benannten Docker-Volumes.
|
|
298
|
-
|
|
299
|
-
### Backup
|
|
300
|
-
|
|
301
|
-
```sh
|
|
302
|
-
docker run --rm \
|
|
303
|
-
-v intlayer_mongo-data:/data \
|
|
304
|
-
-v "$(pwd)":/backup \
|
|
305
|
-
busybox tar czf /backup/mongo-data.tar.gz /data
|
|
306
|
-
|
|
307
|
-
docker run --rm \
|
|
308
|
-
-v intlayer_redis-data:/data \
|
|
309
|
-
-v "$(pwd)":/backup \
|
|
310
|
-
busybox tar czf /backup/redis-data.tar.gz /data
|
|
311
|
-
|
|
312
|
-
docker run --rm \
|
|
313
|
-
-v intlayer_minio-data:/data \
|
|
314
|
-
-v "$(pwd)":/backup \
|
|
315
|
-
busybox tar czf /backup/minio-data.tar.gz /data
|
|
316
|
-
```
|
|
317
|
-
|
|
318
|
-
### Wiederherstellung
|
|
319
|
-
|
|
320
|
-
```sh
|
|
321
|
-
docker run --rm \
|
|
322
|
-
-v intlayer_mongo-data:/data \
|
|
323
|
-
-v "$(pwd)":/backup \
|
|
324
|
-
busybox tar xzf /backup/mongo-data.tar.gz -C /
|
|
325
|
-
|
|
326
|
-
# Wiederholen Sie dies für redis-data und minio-data
|
|
327
|
-
```
|
|
328
|
-
|
|
329
530
|
## Einschränkungen
|
|
330
531
|
|
|
331
|
-
- **
|
|
332
|
-
- **
|
|
333
|
-
- **
|
|
334
|
-
|
|
335
|
-
## Fehlerbehebung
|
|
336
|
-
|
|
337
|
-
### Backend-Absturzschleifen beim ersten Start
|
|
338
|
-
|
|
339
|
-
MongoDB und Redis müssen fehlerfrei sein, bevor das Backend startet. Die Compose-Datei verwendet `depends_on` mit `condition: service_healthy`. Wenn Sie wiederholte Backend-Neustarts sehen, überprüfen Sie, ob die `mongo`- und `redis`-Healthchecks erfolgreich sind:
|
|
340
|
-
|
|
341
|
-
```sh
|
|
342
|
-
docker compose ps
|
|
343
|
-
docker compose logs mongo
|
|
344
|
-
docker compose logs redis
|
|
345
|
-
```
|
|
346
|
-
|
|
347
|
-
Suchen Sie nach `MongoDB connection error` oben im Log.
|
|
348
|
-
|
|
349
|
-
### E-Mail wird nicht gesendet
|
|
350
|
-
|
|
351
|
-
Standardmäßig werden alle ausgehenden E-Mails von Mailpit abgefangen. Öffnen Sie `http://localhost:8025`, um gesendete Nachrichten anzuzeigen. Um echte E-Mails zu senden, setzen Sie `MAIL_PROVIDER=resend` und `RESEND_API_KEY=<Ihr-Schlüssel>` in `.env` und starten Sie dann das Backend neu:
|
|
352
|
-
|
|
353
|
-
### MinIO-Bucket fehlt
|
|
354
|
-
|
|
355
|
-
Wenn der `minio-init`-One-Shot-Service nicht ausgeführt wurde (oder vor der Bereitschaft von MinIO lief), erstellen Sie den Bucket manuell:
|
|
356
|
-
|
|
357
|
-
```sh
|
|
358
|
-
docker compose run --rm minio-init
|
|
359
|
-
```
|
|
532
|
+
- **Keine benutzerdefinierte Domain und kein Port-Remapping.** Alle für den Browser sichtbaren `VITE_*`-URLs sind während des Builds in das Dashboard eingebunden, und die veröffentlichten Images (sowie die Desktop-App) werden mit `localhost` / Intlayer Cloud-Werten ausgeliefert. Auf das Dashboard muss unter `http://localhost:3000`, die API unter `:3100` und MinIO unter `:9000` zugegriffen werden. Die Bereitstellung auf einer öffentlichen Domain oder das Ausrichten der Desktop-App auf ein selbst gehostetes Backend erfordert das Neuerstellen mit integrierten Ziel-URLs (`--build-arg VITE_BACKEND_URL=… VITE_SITE_URL=… VITE_DOMAIN=…` auf `docker/selfhost/Dockerfile` oder über `docker-compose.build.yml`) und wird nicht standardmäßig unterstützt.
|
|
533
|
+
- **E-Mail erfordert einen funktionierenden Mailer.** Die Ersteinrichtung erzwingt die E-Mail-Verifizierung, daher muss entweder `RESEND_API_KEY` oder ein [SMTP-Relay](#global-mailer) (`MAIL_SMTP_*`) konfiguriert werden. Nachdem sich der erste Admin angemeldet hat, kann jede Organisation auch ihren eigenen SMTP- oder Resend-Mailer im Dashboard konfigurieren.
|
|
534
|
+
- **Die Desktop-App benötigt Node.js** auf dem Computer, um ihren eingebetteten Server zu starten.
|
|
360
535
|
|
|
361
536
|
## Nützliche Links
|
|
362
537
|
|
|
363
538
|
- [Intlayer CMS-Dokumentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/intlayer_CMS.md)
|
|
364
539
|
- [Konfigurationsreferenz](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/configuration.md)
|
|
365
|
-
- [CMS SDK
|
|
366
|
-
- [
|
|
540
|
+
- [CMS SDK: `@intlayer/api`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/intlayer_CMS.md#programmatic-access-with-the-intlayerapi-sdk)
|
|
541
|
+
- [Releases der Desktop-App](https://github.com/aymericzip/intlayer/releases/latest)
|
|
542
|
+
- Docker Hub: [`intlayer/cms-all`](https://hub.docker.com/r/intlayer/cms-all), [`intlayer/cms-frontend`](https://hub.docker.com/r/intlayer/cms-frontend), [`intlayer/cms-backend`](https://hub.docker.com/r/intlayer/cms-backend), gespiegelt auf GHCR unter `ghcr.io/aymericzip/intlayer/`
|
|
543
|
+
- [`docker/selfhost/`](https://github.com/aymericzip/intlayer/tree/main/docker/selfhost): Dockerfile, `docker-compose.yml` und `.env.template`
|