@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/it/self_hosting.md
CHANGED
|
@@ -1,232 +1,474 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-06-30
|
|
3
|
-
updatedAt: 2026-
|
|
4
|
-
title:
|
|
5
|
-
description: Esegui
|
|
3
|
+
updatedAt: 2026-09-21
|
|
4
|
+
title: Auto-hosting di Intlayer
|
|
5
|
+
description: "Esegui Intlayer sulla tua infrastruttura: come app desktop, singolo container Docker all-in-one o stack scalabile Docker Compose. Nessun account Intlayer Cloud richiesto."
|
|
6
6
|
keywords:
|
|
7
|
-
-
|
|
7
|
+
- Auto-hosting
|
|
8
8
|
- Docker
|
|
9
9
|
- Docker Compose
|
|
10
|
+
- Applicazione desktop
|
|
10
11
|
- Intlayer
|
|
11
12
|
- CMS
|
|
12
|
-
-
|
|
13
|
-
-
|
|
13
|
+
- Installazione
|
|
14
|
+
- Infrastruttura
|
|
14
15
|
slugs:
|
|
15
16
|
- doc
|
|
16
17
|
- self-hosting
|
|
17
18
|
author: aymericzip
|
|
18
19
|
---
|
|
19
20
|
|
|
20
|
-
#
|
|
21
|
+
# Auto-hosting di Intlayer
|
|
21
22
|
|
|
22
|
-
Intlayer può essere eseguito
|
|
23
|
+
Intlayer può essere eseguito sulla tua infrastruttura, nessun account Intlayer Cloud richiesto. Sono disponibili tre configurazioni, tutte gestite dallo stesso programma di installazione (`install.sh`, `install.ps1` su Windows o `npx intlayer init infra`):
|
|
23
24
|
|
|
24
|
-
|
|
25
|
+
| Setup | What it is | Pick it for |
|
|
26
|
+
| ------------------------ | --------------------------------------------------------------------------------------- | ----------------------------------------- |
|
|
27
|
+
| **Applicazione desktop** | Dashboard nativa per macOS, Linux e Windows | Un client locale, nulla da ospitare |
|
|
28
|
+
| **Docker all-in-one** | Dashboard, API, MongoDB, Redis e MinIO in un **singolo contenitore** | Test e installazioni su singola macchina |
|
|
29
|
+
| **Docker Compose** | **Un contenitore per servizio**, ogni archivio dati sostituibile con un'offerta gestita | Produzione, scalabilità, database gestiti |
|
|
30
|
+
|
|
31
|
+
## Table of Contents
|
|
32
|
+
|
|
33
|
+
<TOC/>
|
|
34
|
+
|
|
35
|
+
## Immagini e pacchetti pubblicati
|
|
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
|
+
Tutte e tre le immagini sono compilate dallo stesso [`docker/selfhost/Dockerfile`](https://github.com/aymericzip/intlayer/tree/main/docker/selfhost) e pubblicate a ogni rilascio. Lo stack Compose scarica anche le immagini ufficiali `mongo:8`, `redis:8-alpine` e `quay.io/minio/minio`.
|
|
45
|
+
|
|
46
|
+
## Configurazione
|
|
47
|
+
|
|
48
|
+
Il programma di installazione chiede quale configurazione desideri, controlla i prerequisiti (proponendo di installare Docker), scrive il file di ambiente con i segreti già generati e scarica le immagini. Non avvia nulla autonomamente: le modalità Docker richiedono prima un mailer, quindi termina stampando il comando da eseguire. Rieseguirlo è sicuro: un file di ambiente esistente non viene mai sovrascritto, fungendo anche da percorso di aggiornamento.
|
|
49
|
+
|
|
50
|
+
<Tabs group="mode">
|
|
51
|
+
<Tab label="Applicazione desktop" value="desktop">
|
|
52
|
+
|
|
53
|
+
La dashboard di Intlayer come applicazione nativa, creata con Tauri. Effettua l'accesso a Intlayer Cloud (`https://app.intlayer.org`), quindi non c'è nulla da ospitare. È la scelta giusta quando si desidera un client locale anziché una scheda del browser.
|
|
54
|
+
|
|
55
|
+
### Installazione
|
|
56
|
+
|
|
57
|
+
Il programma di installazione scarica il pacchetto per il sistema operativo e la CPU in uso, quindi lo apre (macOS), lo installa (`dpkg` / `rpm` su Linux) o avvia la procedura guidata (Windows). Puoi anche scaricarlo manualmente dalla [pagina dei rilasci](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
|
+
### Requisiti
|
|
37
86
|
|
|
38
|
-
|
|
87
|
+
- **Node.js**: l'applicazione incorpora il server della dashboard e lo avvia con il binario `node` della macchina. Installalo da [nodejs.org](https://nodejs.org) se l'app non si avvia.
|
|
88
|
+
|
|
89
|
+
> La versione desktop pubblicata comunica con il backend Intlayer Cloud. Indirizzarla verso un backend auto-ospitato richiede di ricompilare l'app con `VITE_BACKEND_URL` impostato sulla tua API, vedi [Limitazioni](#limitations).
|
|
90
|
+
|
|
91
|
+
</Tab>
|
|
92
|
+
<Tab label="Docker all-in-one" value="docker">
|
|
93
|
+
|
|
94
|
+
Tutto viene eseguito all'interno del singolo contenitore `intlayer/cms-all`, supervisionato da [s6-overlay](https://github.com/just-containers/s6-overlay), con ciascun archivio dati persistito in un unico volume.
|
|
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
|
+
| Servizio | Porta/e host | Scopo |
|
|
111
|
+
| ----------- | ----------------------------- | ---------------------------------------------------------------- |
|
|
112
|
+
| **app** | `3000` | Dashboard (interfaccia utente CMS) |
|
|
113
|
+
| **backend** | `3100` | REST API (endpoint `/health`) |
|
|
114
|
+
| **mongo** | interno | MongoDB 8, replica set a nodo singolo `rs0` |
|
|
115
|
+
| **redis** | interno | Code di lavoro (BullMQ) e memorizzazione nella cache |
|
|
116
|
+
| **minio** | `9000` (S3), `9001` (console) | Archiviazione oggetti compatibile con S3 per avatar e screenshot |
|
|
56
117
|
|
|
57
|
-
|
|
118
|
+
L'ordine di avvio è regolato dalle dipendenze s6 (`mongod` → avvio replica-set, `minio` → creazione bucket, poi `backend`, quindi `app`), e i servizi si riavviano in caso di chiusura, garantendo il ripristino autonomo al primo avvio.
|
|
58
119
|
|
|
59
|
-
|
|
60
|
-
- Porte `3000`, `3100`, `8025`, `9000` e `9001` disponibili sull'host.
|
|
61
|
-
- Un host Linux o macOS (o WSL2 su Windows).
|
|
120
|
+
### Prerequisiti
|
|
62
121
|
|
|
63
|
-
|
|
122
|
+
- **Docker** ≥ 24: il programma di installazione offre di installarlo (tramite [get.docker.com](https://get.docker.com) su Linux, Homebrew su macOS). Su Windows, installa prima [Docker Desktop](https://docs.docker.com/desktop/setup/install/windows-install/) (backend WSL 2).
|
|
123
|
+
- Porte `3000`, `3100`, `9000` e `9001` libere sull'host. MinIO `9000` deve rimanere raggiungibile dal browser, che carica le risorse direttamente da `S3_PUBLIC_URL`.
|
|
124
|
+
- Un mailer: una chiave API [Resend](https://resend.com) o un relay SMTP.
|
|
64
125
|
|
|
65
|
-
|
|
126
|
+
### 1. Installazione
|
|
66
127
|
|
|
67
|
-
|
|
128
|
+
Scrive `./intlayer.env` con `BETTER_AUTH_SECRET` e `S3_SECRET_ACCESS_KEY` generati, e scarica `intlayer/cms-all:latest`.
|
|
129
|
+
|
|
130
|
+
<Tabs group="os">
|
|
131
|
+
<Tab label="macOS / Linux" value="unix">
|
|
68
132
|
|
|
69
133
|
```sh
|
|
70
|
-
curl -fsSL https://intlayer.org/install.sh | sh
|
|
134
|
+
curl -fsSL https://intlayer.org/install.sh | sh -s -- --mode docker
|
|
71
135
|
```
|
|
72
136
|
|
|
73
|
-
|
|
137
|
+
</Tab>
|
|
138
|
+
<Tab label="Windows" value="windows">
|
|
139
|
+
|
|
140
|
+
In PowerShell:
|
|
141
|
+
|
|
142
|
+
```powershell
|
|
143
|
+
$env:INTLAYER_MODE = "docker"; irm https://intlayer.org/install.ps1 | iex
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
</Tab>
|
|
147
|
+
<Tab label="Intlayer CLI" value="cli">
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
npx intlayer init infra --mode docker
|
|
151
|
+
```
|
|
74
152
|
|
|
75
|
-
|
|
153
|
+
</Tab>
|
|
154
|
+
</Tabs>
|
|
76
155
|
|
|
77
|
-
### 2.
|
|
156
|
+
### 2. Configurare un mailer
|
|
78
157
|
|
|
79
|
-
Apri `intlayer.env` e
|
|
158
|
+
Apri `intlayer.env` e inserisci Resend **oppure** SMTP (dettagli in [Mailer globale](#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. Avviare
|
|
91
173
|
|
|
92
|
-
|
|
174
|
+
Questo è il comando stampato dal programma di installazione:
|
|
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
|
|
186
|
+
```
|
|
187
|
+
|
|
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
|
+
La CLI esegue il programma di installazione, che stampa il comando `docker run …` mostrato nelle altre schede. Copialo nel tuo terminale una volta configurato il mailer.
|
|
204
|
+
|
|
205
|
+
</Tab>
|
|
206
|
+
</Tabs>
|
|
207
|
+
|
|
208
|
+
Apri **http://localhost:3000** e segui la [Configurazione iniziale](#first-run-setup). Il primo avvio inizializza il replica set e il bucket, quindi attendi un minuto.
|
|
209
|
+
|
|
210
|
+
### Backup e aggiornamento
|
|
211
|
+
|
|
212
|
+
Tutto lo stato risiede nel volume `intlayer-data` (`/data/mongo`, `/data/redis`, `/data/minio`).
|
|
213
|
+
|
|
214
|
+
```sh
|
|
215
|
+
# Backup (stop the container first so MongoDB's files are consistent)
|
|
216
|
+
docker stop intlayer
|
|
217
|
+
docker run --rm -v intlayer-data:/data -v "$(pwd)":/backup busybox tar czf /backup/intlayer-data.tar.gz /data
|
|
218
|
+
docker start intlayer
|
|
219
|
+
|
|
220
|
+
# Restore
|
|
221
|
+
docker run --rm -v intlayer-data:/data -v "$(pwd)":/backup busybox tar xzf /backup/intlayer-data.tar.gz -C /
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
Per aggiornare, riesegui l'installatore (scarica l'immagine più recente e mantiene `intlayer.env`), quindi esegui `docker rm -f intlayer` e rilancia il comando di avvio. Per utilizzare un MongoDB gestito anziché quello integrato, imposta `MONGODB_URI` in `intlayer.env`.
|
|
225
|
+
|
|
226
|
+
</Tab>
|
|
227
|
+
<Tab label="Docker Compose" value="compose">
|
|
228
|
+
|
|
229
|
+
Un contenitore per servizio su una rete privata Compose. La dashboard e l'API utilizzano le immagini pubblicate `intlayer/cms-frontend` e `intlayer/cms-backend`; gli archivi dati utilizzano le immagini ufficiali `mongo`, `redis` e `minio`.
|
|
230
|
+
|
|
231
|
+
```
|
|
232
|
+
┌───────────────────┐
|
|
233
|
+
browser ──────▶ │ app :3000 │ ── SSR ──▶ http://backend:3100
|
|
234
|
+
(localhost) └───────────────────┘
|
|
235
|
+
┌───────────────────┐
|
|
236
|
+
browser ──────▶ │ backend :3100 │
|
|
237
|
+
(localhost) └─────────┬─────────┘
|
|
238
|
+
┌───────────────┼───────────────┐
|
|
239
|
+
▼ ▼ ▼
|
|
240
|
+
mongo:27017 redis:6379 minio:9000 ◀── browser (assets)
|
|
241
|
+
(1-node RS) minio:9001
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
| Servizio | Immagine | Ruolo |
|
|
245
|
+
| ------------ | ----------------------- | ----------------------------------------------------------------------- |
|
|
246
|
+
| `app` | `intlayer/cms-frontend` | Dashboard su `:3000`; attende che il backend sia integro |
|
|
247
|
+
| `backend` | `intlayer/cms-backend` | API su `:3100` con Chromium; attende Mongo, Redis e il bucket MinIO |
|
|
248
|
+
| `mongo` | `mongo:8` | Replica set a nodo singolo `rs0`, inizializzato dal proprio healthcheck |
|
|
249
|
+
| `redis` | `redis:8-alpine` | Code e cache, persistenza append-only |
|
|
250
|
+
| `minio` | `quay.io/minio/minio` | Archiviazione S3 su `:9000`, console su `:9001` |
|
|
251
|
+
| `minio-init` | `quay.io/minio/mc` | Attività una tantum: crea il bucket e la policy di download anonimo |
|
|
252
|
+
|
|
253
|
+
I dati sono conservati nei volumi `intlayer_mongo-data`, `intlayer_redis-data` e `intlayer_minio-data`. Il collegamento dei servizi (`MONGODB_URI`, `REDIS_URL`, `S3_ENDPOINT`, l'URL interno del backend usato dal rendering lato server) è fissato nel file compose e ha la precedenza su `.env`, che include solo i segreti e le integrazioni opzionali.
|
|
254
|
+
|
|
255
|
+
### Prerequisiti
|
|
256
|
+
|
|
257
|
+
- **Docker** ≥ 24 con il plugin Compose: l'installatore offre di installarlo su Linux e macOS. Su Windows, installa prima [Docker Desktop](https://docs.docker.com/desktop/setup/install/windows-install/) (backend WSL 2).
|
|
258
|
+
- Porte `3000`, `3100`, `9000` e `9001` libere sull'host.
|
|
259
|
+
- Un mailer: una chiave API [Resend](https://resend.com) o un relay SMTP.
|
|
260
|
+
|
|
261
|
+
### 1. Installazione
|
|
262
|
+
|
|
263
|
+
Scrive `docker-compose.yml` e un `.env` con i segreti generati in `./intlayer/`, e scarica le immagini.
|
|
264
|
+
|
|
265
|
+
<Tabs group="os">
|
|
266
|
+
<Tab label="macOS / Linux" value="unix">
|
|
267
|
+
|
|
268
|
+
```sh
|
|
269
|
+
curl -fsSL https://intlayer.org/install.sh | sh -s -- --mode compose
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Or by hand:
|
|
273
|
+
|
|
274
|
+
```sh
|
|
275
|
+
mkdir intlayer && cd intlayer
|
|
276
|
+
curl -fsSLO https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/docker-compose.yml
|
|
277
|
+
curl -fsSL https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/.env.template -o .env
|
|
278
|
+
# fill in BETTER_AUTH_SECRET and S3_SECRET_ACCESS_KEY (openssl rand -hex 32)
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
</Tab>
|
|
282
|
+
<Tab label="Windows" value="windows">
|
|
283
|
+
|
|
284
|
+
In PowerShell:
|
|
285
|
+
|
|
286
|
+
```powershell
|
|
287
|
+
$env:INTLAYER_MODE = "compose"; irm https://intlayer.org/install.ps1 | iex
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
Or by hand:
|
|
291
|
+
|
|
292
|
+
```powershell
|
|
293
|
+
mkdir intlayer; cd intlayer
|
|
294
|
+
irm https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/docker-compose.yml -OutFile docker-compose.yml
|
|
295
|
+
irm https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/.env.template -OutFile .env
|
|
296
|
+
# fill in BETTER_AUTH_SECRET and S3_SECRET_ACCESS_KEY
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
</Tab>
|
|
300
|
+
<Tab label="Intlayer CLI" value="cli">
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
npx intlayer init infra --mode compose
|
|
106
304
|
```
|
|
107
305
|
|
|
108
|
-
|
|
306
|
+
</Tab>
|
|
307
|
+
</Tabs>
|
|
109
308
|
|
|
110
|
-
|
|
309
|
+
### 2. Configurare un mailer
|
|
111
310
|
|
|
112
|
-
|
|
311
|
+
Inserisci Resend **oppure** SMTP in `intlayer/.env`, esattamente come per il container all-in-one (vedi [Mailer globale](#global-mailer)).
|
|
113
312
|
|
|
114
|
-
|
|
313
|
+
### 3. Avviare
|
|
115
314
|
|
|
116
315
|
```sh
|
|
117
|
-
|
|
316
|
+
cd intlayer && docker compose up -d
|
|
118
317
|
```
|
|
119
318
|
|
|
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
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
319
|
+
Apri **http://localhost:3000** e segui la [Configurazione iniziale](#first-run-setup).
|
|
320
|
+
|
|
321
|
+
### Datastore gestiti
|
|
322
|
+
|
|
323
|
+
Elimina dal file compose il servizio che stai sostituendo (insieme alla sua voce in `depends_on` in `backend`), quindi sovrascrivi la variabile corrispondente:
|
|
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` mantengono il loro significato con qualsiasi provider compatibile con S3.
|
|
336
|
+
|
|
337
|
+
### Scalabilità
|
|
338
|
+
|
|
339
|
+
`app` e `backend` sono privi di stato (stateless). Dietro un bilanciatore di carico, `docker compose up -d --scale backend=3` funziona dopo aver rimosso le mappature fisse delle porte host e quando il proxy indirizza i servizi per nome. I processi in background sono coordinati tramite Redis (BullMQ), consentendo a più repliche del backend di condividere la coda in sicurezza.
|
|
340
|
+
|
|
341
|
+
### Compilazione dai sorgenti
|
|
342
|
+
|
|
343
|
+
Da un clone del repository, una sovrascrittura commuta i due servizi Intlayer da `image:` a `build:`:
|
|
344
|
+
|
|
345
|
+
```sh
|
|
346
|
+
cd docker/selfhost
|
|
347
|
+
docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
Questo è anche il modo in cui produrre immagini per un dominio personalizzato: passa i valori `VITE_*` come argomenti di build (vedi [Limitazioni](#limitations)).
|
|
351
|
+
|
|
352
|
+
### Backup e aggiornamento
|
|
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
|
+
### Impostazioni del programma di installazione
|
|
368
|
+
|
|
369
|
+
Senza `--mode` (o `INTLAYER_MODE`), il programma di installazione mostra un menu: `desktop`, `docker` (all-in-one) o `compose`. Legge anche alcune variabili di ambiente. Poiché viene reindirizzato nella shell, passale alla shell anziché a `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
|
+
> Le variabili di porta modificano solo il lato **host** della mappatura. Le immagini pubblicate includono `http://localhost:3000`, `http://localhost:3100` e `http://localhost:9000` compilati nel pacchetto della dashboard, quindi mantieni i valori predefiniti a meno che non crei le tue immagini, vedi [Limitazioni](#limitations).
|
|
395
|
+
|
|
396
|
+
## Configurazione iniziale
|
|
397
|
+
|
|
398
|
+
Su una nuova istanza (database vuoto), l'apertura della dashboard reindirizza alla pagina **`/init`**:
|
|
399
|
+
|
|
400
|
+
1. Crea il primo account. Poiché la raccolta degli utenti è vuota, questo account viene automaticamente promosso a **super admin**.
|
|
401
|
+
2. Viene inviata un'email di verifica tramite Resend o il relay SMTP. La verifica dell'email è **obbligatoria**, motivo per cui un gestore di posta deve essere configurato prima di iniziare.
|
|
402
|
+
3. Fai clic sul link nell'email, quindi accedi.
|
|
403
|
+
|
|
404
|
+
Una volta che esiste un amministratore, `/init` reindirizza alla pagina di accesso standard.
|
|
405
|
+
|
|
406
|
+
## Variabili di ambiente
|
|
407
|
+
|
|
408
|
+
Entrambe le modalità Docker leggono lo stesso file (`intlayer.env` per il container, `.env` per Compose), generato da [`docker/selfhost/.env.template`](https://github.com/aymericzip/intlayer/blob/main/docker/selfhost/.env.template).
|
|
409
|
+
|
|
410
|
+
### Richieste
|
|
411
|
+
|
|
412
|
+
| Variable | Example | Description |
|
|
413
|
+
| ---------------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
414
|
+
| `BETTER_AUTH_SECRET` | _(generated)_ | 32-byte secret for session signing |
|
|
415
|
+
| `S3_SECRET_ACCESS_KEY` | _(generated)_ | Secret for the bundled MinIO |
|
|
416
|
+
| `RESEND_API_KEY` | _(your key)_ | Transactional email via Resend. Required for first-run setup unless an SMTP relay is configured instead (see [Global mailer](#global-mailer)) |
|
|
417
|
+
|
|
418
|
+
### Fissate dal deployment
|
|
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
|
+
Il servizio `app` di Compose riceve inoltre `INTLAYER_BACKEND_INTERNAL_URL=http://backend:3100`: il browser raggiunge l'API su `localhost:3100`, ma il rendering lato server viene eseguito all'interno della rete Compose e deve usare il nome del servizio.
|
|
437
|
+
|
|
438
|
+
### Opzionali (le funzionalità degradano dolcemente se assenti)
|
|
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 |
|
|
208
447
|
|
|
209
448
|
### Mailer globale
|
|
210
449
|
|
|
211
|
-
|
|
450
|
+
Ogni email transazionale, comprese le email esterne all'organizzazione come reimpostazioni password e link magici, passa attraverso uno dei due trasporti globali:
|
|
212
451
|
|
|
213
|
-
|
|
452
|
+
- **Resend**, usando `RESEND_API_KEY`.
|
|
453
|
+
- **SMTP**, usando le variabili `MAIL_SMTP_*`. Non appena `MAIL_SMTP_HOST` viene impostato, viene usato SMTP e `RESEND_API_KEY` viene ignorato.
|
|
214
454
|
|
|
215
|
-
|
|
216
|
-
| -------------------- | ------------------------------ | -------------------------------------------------------------------------------- |
|
|
217
|
-
| `MAIL_PROVIDER` | `smtp` | Trasporto globale: `smtp` o `resend`. Lascia non impostato per usare i default |
|
|
218
|
-
| `MAIL_FROM` | `Intlayer <no-reply@acme.com>` | Intestazione del mittente. Accetta un indirizzo bare o il formato `Name <email>` |
|
|
219
|
-
| `MAIL_SMTP_HOST` | `smtp.acme.com` | Host SMTP (obbligatorio quando `MAIL_PROVIDER=smtp`) |
|
|
220
|
-
| `MAIL_SMTP_PORT` | `587` | Porta SMTP (per impostazione predefinita `587`) |
|
|
221
|
-
| `MAIL_SMTP_SECURE` | `false` | TLS implicito. Imposta `true` per la porta `465` |
|
|
222
|
-
| `MAIL_SMTP_USER` | _(il tuo utente)_ | Nome utente SMTP (opzionale; ometti per relay non autenticati) |
|
|
223
|
-
| `MAIL_SMTP_PASSWORD` | _(la tua password)_ | Password SMTP |
|
|
455
|
+
`MAIL_PROVIDER` serve solo a forzare un trasporto quando entrambi sono configurati (ad esempio `MAIL_PROVIDER=resend` per mantenere Resend pur in presenza di un host SMTP).
|
|
224
456
|
|
|
225
|
-
|
|
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 |
|
|
226
466
|
|
|
227
|
-
|
|
467
|
+
> Precedenza: il mailer di un'organizzazione (configurato dalla dashboard **Organizzazione**) ha la precedenza sul mailer globale, che a sua volta ha la precedenza sulla chiave predefinita di Resend.
|
|
228
468
|
|
|
229
|
-
|
|
469
|
+
## Connettere il tuo progetto Intlayer
|
|
470
|
+
|
|
471
|
+
Una volta avviato lo stack, fai puntare il tuo progetto al backend e alla dashboard auto-ospitati invece di `intlayer.org`.
|
|
230
472
|
|
|
231
473
|
### Configurazione del progetto
|
|
232
474
|
|
|
@@ -239,14 +481,14 @@ const config: IntlayerConfig = {
|
|
|
239
481
|
clientSecret: process.env.INTLAYER_CLIENT_SECRET,
|
|
240
482
|
|
|
241
483
|
/**
|
|
242
|
-
* URL
|
|
243
|
-
*
|
|
484
|
+
* URL of the self-hosted CMS dashboard.
|
|
485
|
+
* Default: https://app.intlayer.org
|
|
244
486
|
*/
|
|
245
487
|
cmsURL: process.env.INTLAYER_CMS_URL, // e.g. http://localhost:3000
|
|
246
488
|
|
|
247
489
|
/**
|
|
248
|
-
* URL
|
|
249
|
-
*
|
|
490
|
+
* URL of the self-hosted backend API.
|
|
491
|
+
* Default: https://back.intlayer.org
|
|
250
492
|
*/
|
|
251
493
|
backendURL: process.env.INTLAYER_BACKEND_URL, // e.g. http://localhost:3100
|
|
252
494
|
},
|
|
@@ -255,7 +497,7 @@ const config: IntlayerConfig = {
|
|
|
255
497
|
export default config;
|
|
256
498
|
```
|
|
257
499
|
|
|
258
|
-
|
|
500
|
+
Set the environment variables in your project's `.env`:
|
|
259
501
|
|
|
260
502
|
```sh
|
|
261
503
|
INTLAYER_CMS_URL=http://localhost:3000
|
|
@@ -264,11 +506,11 @@ INTLAYER_CLIENT_ID=<your-client-id>
|
|
|
264
506
|
INTLAYER_CLIENT_SECRET=<your-client-secret>
|
|
265
507
|
```
|
|
266
508
|
|
|
267
|
-
Crea
|
|
509
|
+
Crea credenziali di accesso nella dashboard auto-ospitata in **Progetti → Chiavi di accesso** all'indirizzo `http://localhost:3000/projects`.
|
|
268
510
|
|
|
269
511
|
### SDK `@intlayer/api`
|
|
270
512
|
|
|
271
|
-
Quando si utilizza l'SDK `@intlayer/api`
|
|
513
|
+
Quando si utilizza l'SDK `@intlayer/api` a livello di codice, passare `backendURL` in modo esplicito:
|
|
272
514
|
|
|
273
515
|
```typescript fileName="cms.ts" codeFormat="typescript"
|
|
274
516
|
import { createIntlayerCMS } from "@intlayer/api";
|
|
@@ -285,84 +527,17 @@ const cms = createIntlayerCMS({
|
|
|
285
527
|
const { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();
|
|
286
528
|
```
|
|
287
529
|
|
|
288
|
-
## Aggiornamento
|
|
289
|
-
|
|
290
|
-
Questo scarica le immagini più recenti e riavvia i container con `docker compose pull && docker compose up -d`. I volumi esistenti (`mongo-data`, `redis-data`, `minio-data`) vengono preservati — nessuna perdita di dati.
|
|
291
|
-
|
|
292
|
-
```sh
|
|
293
|
-
docker compose pull
|
|
294
|
-
docker compose up -d
|
|
295
|
-
```
|
|
296
|
-
|
|
297
|
-
## Backup e ripristino
|
|
298
|
-
|
|
299
|
-
Tutti i dati persistenti risiedono in tre volumi Docker nominati.
|
|
300
|
-
|
|
301
|
-
### Backup
|
|
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
|
-
### Ripristino
|
|
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
|
-
# Ripetere per redis-data e minio-data
|
|
329
|
-
```
|
|
330
|
-
|
|
331
530
|
## Limitazioni
|
|
332
531
|
|
|
333
|
-
- **
|
|
334
|
-
- **
|
|
335
|
-
- **
|
|
336
|
-
|
|
337
|
-
## Risoluzione dei problemi
|
|
338
|
-
|
|
339
|
-
### Il backend si riavvia in loop al primo avvio
|
|
340
|
-
|
|
341
|
-
MongoDB e Redis devono essere sani prima che il backend si avvii. Il file compose utilizza `depends_on` con `condition: service_healthy`. Se vedi ripetuti riavvii del backend, verifica che i controlli di integrità di `mongo` e `redis` passino:
|
|
342
|
-
|
|
343
|
-
```sh
|
|
344
|
-
docker compose ps
|
|
345
|
-
docker compose logs mongo
|
|
346
|
-
docker compose logs redis
|
|
347
|
-
```
|
|
348
|
-
|
|
349
|
-
Cerca `MongoDB connection error` vicino alla parte superiore del log.
|
|
350
|
-
|
|
351
|
-
### La dashboard non riesce a raggiungere l'API
|
|
352
|
-
|
|
353
|
-
Verifica che `VITE_BACKEND_URL` corrisponda all'URL dove il backend è raggiungibile dal **browser** (non dalla rete Docker). Se hai cambiato la porta del backend o aggiunto un reverse proxy, ricostruisci l'immagine della dashboard:
|
|
354
|
-
|
|
355
|
-
### Bucket MinIO mancante
|
|
356
|
-
|
|
357
|
-
Se il servizio one-shot `minio-init` non è stato eseguito (o è stato eseguito prima che MinIO fosse pronto), crea il bucket manualmente:
|
|
358
|
-
|
|
359
|
-
```sh
|
|
360
|
-
docker compose run --rm minio-init
|
|
361
|
-
```
|
|
532
|
+
- **Nessun dominio personalizzato e nessuna rimappatura delle porte.** Tutti gli URL `VITE_*` visibili dal browser sono incorporati nella dashboard in fase di compilazione e le immagini pubblicate (nonché l'app desktop) vengono fornite con i valori di `localhost` / Intlayer Cloud. La dashboard deve essere accessibile su `http://localhost:3000`, l'API su `:3100` e MinIO su `:9000`. Servirla su un dominio pubblico, o puntare l'app desktop a un backend auto-ospitato, richiede la ricompilazione con gli URL di destinazione integrati (`--build-arg VITE_BACKEND_URL=… VITE_SITE_URL=… VITE_DOMAIN=…` su `docker/selfhost/Dockerfile`, o tramite `docker-compose.build.yml`) e non è supportato nativamente.
|
|
533
|
+
- **La posta richiede un mailer funzionante.** La configurazione iniziale impone la verifica dell'email, pertanto è necessario configurare `RESEND_API_KEY` oppure un [relay SMTP](#global-mailer) (`MAIL_SMTP_*`). Dopo l'accesso del primo amministratore, ciascuna organizzazione può configurare il proprio mailer SMTP o Resend dalla dashboard.
|
|
534
|
+
- **L'applicazione desktop richiede Node.js** sulla macchina per avviare il relativo server incorporato.
|
|
362
535
|
|
|
363
536
|
## Link utili
|
|
364
537
|
|
|
365
538
|
- [Documentazione Intlayer CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/intlayer_CMS.md)
|
|
366
|
-
- [Riferimento
|
|
367
|
-
- [SDK CMS
|
|
368
|
-
- [
|
|
539
|
+
- [Riferimento di configurazione](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/configuration.md)
|
|
540
|
+
- [SDK CMS: `@intlayer/api`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/intlayer_CMS.md#programmatic-access-with-the-intlayerapi-sdk)
|
|
541
|
+
- [Rilasci dell'applicazione desktop](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), con mirror su GHCR sotto `ghcr.io/aymericzip/intlayer/`
|
|
543
|
+
- [`docker/selfhost/`](https://github.com/aymericzip/intlayer/tree/main/docker/selfhost): Dockerfile, `docker-compose.yml` e `.env.template`
|