@intlayer/docs 9.5.6 → 9.5.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blog/ar/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/ar/i18next_vs_intlayer.md +130 -16
- package/blog/ar/lingui_vs_intlayer.md +122 -15
- package/blog/ar/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/ar/next-intl_vs_intlayer.md +136 -20
- package/blog/ar/vue-i18n_vs_intlayer-vue-i18n.md +119 -17
- package/blog/ar/vue-i18n_vs_intlayer.md +193 -31
- package/blog/ar/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/de/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/de/i18next_vs_intlayer.md +128 -14
- package/blog/de/lingui_vs_intlayer.md +122 -15
- package/blog/de/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/de/next-intl_vs_intlayer.md +125 -15
- package/blog/de/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/de/vue-i18n_vs_intlayer.md +193 -31
- package/blog/en/i18next_vs_intlayer-i18next.md +121 -14
- package/blog/en/i18next_vs_intlayer.md +128 -14
- package/blog/en/lingui_vs_intlayer.md +124 -15
- package/blog/en/next-intl_vs_intlayer-next-intl.md +123 -14
- package/blog/en/next-intl_vs_intlayer.md +125 -13
- package/blog/en/vue-i18n_vs_intlayer-vue-i18n.md +115 -15
- package/blog/en/vue-i18n_vs_intlayer.md +188 -27
- package/blog/en-GB/i18next_vs_intlayer-i18next.md +121 -14
- package/blog/en-GB/i18next_vs_intlayer.md +128 -14
- package/blog/en-GB/lingui_vs_intlayer.md +122 -15
- package/blog/en-GB/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/en-GB/next-intl_vs_intlayer.md +125 -15
- package/blog/en-GB/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/en-GB/vue-i18n_vs_intlayer.md +187 -25
- package/blog/en-GB/vue-i18n_vs_intlayer_benchmark.md +116 -0
- package/blog/es/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/es/i18next_vs_intlayer.md +128 -14
- package/blog/es/lingui_vs_intlayer.md +122 -15
- package/blog/es/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/es/next-intl_vs_intlayer.md +125 -15
- package/blog/es/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/es/vue-i18n_vs_intlayer.md +193 -31
- package/blog/fr/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/fr/i18next_vs_intlayer.md +128 -14
- package/blog/fr/lingui_vs_intlayer.md +122 -15
- package/blog/fr/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/fr/next-intl_vs_intlayer.md +127 -15
- package/blog/fr/vue-i18n_vs_intlayer-vue-i18n.md +118 -17
- package/blog/fr/vue-i18n_vs_intlayer.md +192 -31
- package/blog/fr/vue-i18n_vs_intlayer_benchmark.md +329 -7
- package/blog/hi/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/hi/i18next_vs_intlayer.md +130 -16
- package/blog/hi/lingui_vs_intlayer.md +122 -15
- package/blog/hi/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/hi/next-intl_vs_intlayer.md +135 -19
- package/blog/hi/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/hi/vue-i18n_vs_intlayer.md +193 -31
- package/blog/hi/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/id/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/id/i18next_vs_intlayer.md +128 -14
- package/blog/id/lingui_vs_intlayer.md +122 -15
- package/blog/id/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/id/next-intl_vs_intlayer.md +135 -19
- package/blog/id/vue-i18n_vs_intlayer-vue-i18n.md +354 -2
- package/blog/id/vue-i18n_vs_intlayer.md +188 -26
- package/blog/id/vue-i18n_vs_intlayer_benchmark.md +327 -7
- package/blog/it/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/it/i18next_vs_intlayer.md +128 -14
- package/blog/it/lingui_vs_intlayer.md +122 -15
- package/blog/it/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/it/next-intl_vs_intlayer.md +125 -15
- package/blog/it/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/it/vue-i18n_vs_intlayer.md +191 -31
- package/blog/it/vue-i18n_vs_intlayer_benchmark.md +332 -5
- package/blog/ja/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/ja/i18next_vs_intlayer.md +129 -17
- package/blog/ja/lingui_vs_intlayer.md +122 -15
- package/blog/ja/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/ja/next-intl_vs_intlayer.md +124 -14
- package/blog/ja/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/ja/vue-i18n_vs_intlayer.md +193 -31
- package/blog/ja/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/ko/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/ko/i18next_vs_intlayer.md +129 -17
- package/blog/ko/lingui_vs_intlayer.md +122 -15
- package/blog/ko/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/ko/next-intl_vs_intlayer.md +134 -18
- package/blog/ko/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/ko/vue-i18n_vs_intlayer.md +193 -31
- package/blog/pl/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/pl/i18next_vs_intlayer.md +128 -14
- package/blog/pl/lingui_vs_intlayer.md +122 -15
- package/blog/pl/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/pl/next-intl_vs_intlayer.md +134 -18
- package/blog/pl/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/pl/vue-i18n_vs_intlayer.md +188 -26
- package/blog/pl/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/pt/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/pt/i18next_vs_intlayer.md +128 -14
- package/blog/pt/lingui_vs_intlayer.md +122 -15
- package/blog/pt/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/pt/next-intl_vs_intlayer.md +131 -15
- package/blog/pt/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/pt/vue-i18n_vs_intlayer.md +193 -31
- package/blog/pt/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/ru/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/ru/i18next_vs_intlayer.md +130 -16
- package/blog/ru/lingui_vs_intlayer.md +122 -15
- package/blog/ru/next-intl_vs_intlayer-next-intl.md +125 -16
- package/blog/ru/next-intl_vs_intlayer.md +123 -13
- package/blog/ru/vue-i18n_vs_intlayer-vue-i18n.md +127 -27
- package/blog/ru/vue-i18n_vs_intlayer.md +193 -31
- package/blog/ru/vue-i18n_vs_intlayer_benchmark.md +326 -19
- package/blog/tr/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/tr/i18next_vs_intlayer.md +128 -14
- package/blog/tr/lingui_vs_intlayer.md +122 -15
- package/blog/tr/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/tr/next-intl_vs_intlayer.md +136 -20
- package/blog/tr/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/tr/vue-i18n_vs_intlayer.md +188 -26
- package/blog/tr/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/uk/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/uk/i18next_vs_intlayer.md +130 -16
- package/blog/uk/lingui_vs_intlayer.md +122 -15
- package/blog/uk/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/uk/next-intl_vs_intlayer.md +135 -19
- package/blog/uk/vue-i18n_vs_intlayer-vue-i18n.md +135 -17
- package/blog/uk/vue-i18n_vs_intlayer.md +188 -27
- package/blog/uk/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/vi/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/vi/i18next_vs_intlayer.md +128 -14
- package/blog/vi/lingui_vs_intlayer.md +122 -15
- package/blog/vi/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/vi/next-intl_vs_intlayer.md +135 -19
- package/blog/vi/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/vi/vue-i18n_vs_intlayer.md +188 -26
- package/blog/vi/vue-i18n_vs_intlayer_benchmark.md +361 -0
- package/blog/zh/i18next_vs_intlayer-i18next.md +122 -15
- package/blog/zh/i18next_vs_intlayer.md +128 -14
- package/blog/zh/lingui_vs_intlayer.md +122 -15
- package/blog/zh/next-intl_vs_intlayer-next-intl.md +124 -15
- package/blog/zh/next-intl_vs_intlayer.md +125 -15
- package/blog/zh/vue-i18n_vs_intlayer-vue-i18n.md +117 -17
- package/blog/zh/vue-i18n_vs_intlayer.md +192 -31
- package/blog/zh/vue-i18n_vs_intlayer_benchmark.md +340 -9
- package/dist/cjs/generated/docs.entry.cjs +40 -40
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/index.cjs +2 -2
- package/dist/esm/generated/docs.entry.mjs +40 -40
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/esm/index.mjs +2 -2
- package/dist/types/generated/docs.entry.d.ts +2 -2
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/benchmark/nextjs.md +13 -13
- package/docs/ar/benchmark/solid.md +5 -5
- package/docs/ar/benchmark/svelte.md +4 -4
- package/docs/ar/benchmark/tanstack.md +14 -13
- package/docs/ar/benchmark/vue.md +5 -5
- package/docs/ar/chrome_extension.md +130 -0
- package/docs/ar/cli/index.md +6 -1
- package/docs/ar/cli/infra.md +162 -0
- package/docs/ar/cli/init.md +24 -1
- package/docs/ar/dictionary/html.md +173 -5
- package/docs/ar/dictionary/markdown.md +263 -1
- package/docs/ar/intlayer_with_analog.md +23 -1
- package/docs/ar/intlayer_with_angular_19.md +24 -1
- package/docs/ar/intlayer_with_angular_21.md +24 -1
- package/docs/ar/intlayer_with_astro.md +24 -1
- package/docs/ar/intlayer_with_astro_lit.md +25 -1
- package/docs/ar/intlayer_with_astro_preact.md +26 -1
- package/docs/ar/intlayer_with_astro_react.md +26 -1
- package/docs/ar/intlayer_with_astro_solid.md +26 -1
- package/docs/ar/intlayer_with_astro_svelte.md +25 -1
- package/docs/ar/intlayer_with_astro_vue.md +25 -1
- package/docs/ar/intlayer_with_remix_3.md +22 -1
- package/docs/ar/self_hosting.md +406 -231
- package/docs/de/benchmark/nextjs.md +13 -13
- package/docs/de/benchmark/solid.md +5 -5
- package/docs/de/benchmark/svelte.md +4 -4
- package/docs/de/benchmark/tanstack.md +14 -13
- package/docs/de/benchmark/vue.md +5 -5
- package/docs/de/chrome_extension.md +130 -0
- package/docs/de/cli/index.md +6 -1
- package/docs/de/cli/infra.md +162 -0
- package/docs/de/cli/init.md +24 -1
- package/docs/de/dictionary/html.md +173 -5
- package/docs/de/dictionary/markdown.md +263 -1
- package/docs/de/intlayer_with_analog.md +23 -1
- package/docs/de/intlayer_with_angular_19.md +24 -1
- package/docs/de/intlayer_with_angular_21.md +24 -1
- package/docs/de/intlayer_with_astro.md +24 -1
- package/docs/de/intlayer_with_astro_lit.md +25 -1
- package/docs/de/intlayer_with_astro_preact.md +26 -1
- package/docs/de/intlayer_with_astro_react.md +26 -1
- package/docs/de/intlayer_with_astro_solid.md +26 -1
- package/docs/de/intlayer_with_astro_svelte.md +25 -1
- package/docs/de/intlayer_with_astro_vue.md +25 -1
- package/docs/de/intlayer_with_remix_3.md +22 -1
- package/docs/de/self_hosting.md +404 -227
- package/docs/en/benchmark/nextjs.md +13 -13
- package/docs/en/benchmark/solid.md +5 -5
- package/docs/en/benchmark/svelte.md +4 -4
- package/docs/en/benchmark/tanstack.md +14 -13
- package/docs/en/benchmark/vue.md +5 -5
- package/docs/en/chrome_extension.md +130 -0
- package/docs/en/cli/index.md +6 -1
- package/docs/en/cli/infra.md +175 -0
- package/docs/en/cli/init.md +25 -1
- package/docs/en/dictionary/html.md +173 -5
- package/docs/en/dictionary/markdown.md +263 -1
- package/docs/en/intlayer_with_analog.md +23 -1
- package/docs/en/intlayer_with_angular_19.md +24 -1
- package/docs/en/intlayer_with_angular_21.md +24 -1
- package/docs/en/intlayer_with_astro.md +24 -1
- package/docs/en/intlayer_with_astro_lit.md +25 -1
- package/docs/en/intlayer_with_astro_preact.md +26 -1
- package/docs/en/intlayer_with_astro_react.md +26 -1
- package/docs/en/intlayer_with_astro_solid.md +26 -1
- package/docs/en/intlayer_with_astro_svelte.md +25 -1
- package/docs/en/intlayer_with_astro_vue.md +25 -1
- package/docs/en/intlayer_with_remix_3.md +22 -1
- package/docs/en/self_hosting.md +418 -176
- package/docs/en-GB/benchmark/nextjs.md +13 -13
- package/docs/en-GB/benchmark/solid.md +5 -5
- package/docs/en-GB/benchmark/svelte.md +4 -4
- package/docs/en-GB/benchmark/tanstack.md +14 -13
- package/docs/en-GB/benchmark/vue.md +5 -5
- package/docs/en-GB/chrome_extension.md +130 -0
- package/docs/en-GB/cli/index.md +6 -1
- package/docs/en-GB/cli/infra.md +162 -0
- package/docs/en-GB/cli/init.md +24 -1
- package/docs/en-GB/dictionary/html.md +173 -5
- package/docs/en-GB/dictionary/markdown.md +263 -1
- package/docs/en-GB/intlayer_with_analog.md +23 -1
- package/docs/en-GB/intlayer_with_angular_19.md +24 -1
- package/docs/en-GB/intlayer_with_angular_21.md +24 -1
- package/docs/en-GB/intlayer_with_astro.md +24 -1
- package/docs/en-GB/intlayer_with_astro_lit.md +25 -1
- package/docs/en-GB/intlayer_with_astro_preact.md +26 -1
- package/docs/en-GB/intlayer_with_astro_react.md +26 -1
- package/docs/en-GB/intlayer_with_astro_solid.md +26 -1
- package/docs/en-GB/intlayer_with_astro_svelte.md +25 -1
- package/docs/en-GB/intlayer_with_astro_vue.md +25 -1
- package/docs/en-GB/intlayer_with_remix_3.md +22 -1
- package/docs/en-GB/self_hosting.md +381 -206
- package/docs/es/benchmark/nextjs.md +13 -13
- package/docs/es/benchmark/solid.md +5 -5
- package/docs/es/benchmark/svelte.md +4 -4
- package/docs/es/benchmark/tanstack.md +14 -13
- package/docs/es/benchmark/vue.md +5 -5
- package/docs/es/chrome_extension.md +130 -0
- package/docs/es/cli/index.md +6 -1
- package/docs/es/cli/infra.md +162 -0
- package/docs/es/cli/init.md +24 -1
- package/docs/es/dictionary/html.md +173 -5
- package/docs/es/dictionary/markdown.md +263 -1
- package/docs/es/intlayer_with_analog.md +23 -1
- package/docs/es/intlayer_with_angular_19.md +24 -1
- package/docs/es/intlayer_with_angular_21.md +24 -1
- package/docs/es/intlayer_with_astro.md +24 -1
- package/docs/es/intlayer_with_astro_lit.md +25 -1
- package/docs/es/intlayer_with_astro_preact.md +26 -1
- package/docs/es/intlayer_with_astro_react.md +26 -1
- package/docs/es/intlayer_with_astro_solid.md +26 -1
- package/docs/es/intlayer_with_astro_svelte.md +25 -1
- package/docs/es/intlayer_with_astro_vue.md +25 -1
- package/docs/es/intlayer_with_remix_3.md +22 -1
- package/docs/es/self_hosting.md +400 -223
- package/docs/fr/benchmark/nextjs.md +13 -13
- package/docs/fr/benchmark/solid.md +5 -5
- package/docs/fr/benchmark/svelte.md +4 -4
- package/docs/fr/benchmark/tanstack.md +14 -13
- package/docs/fr/benchmark/vue.md +5 -5
- package/docs/fr/chrome_extension.md +130 -0
- package/docs/fr/cli/index.md +6 -1
- package/docs/fr/cli/infra.md +162 -0
- package/docs/fr/cli/init.md +24 -1
- package/docs/fr/dictionary/html.md +173 -5
- package/docs/fr/dictionary/markdown.md +265 -4
- package/docs/fr/intlayer_with_analog.md +23 -1
- package/docs/fr/intlayer_with_angular_19.md +24 -1
- package/docs/fr/intlayer_with_angular_21.md +24 -1
- package/docs/fr/intlayer_with_astro.md +24 -1
- package/docs/fr/intlayer_with_astro_lit.md +25 -1
- package/docs/fr/intlayer_with_astro_preact.md +26 -1
- package/docs/fr/intlayer_with_astro_react.md +26 -1
- package/docs/fr/intlayer_with_astro_solid.md +26 -1
- package/docs/fr/intlayer_with_astro_svelte.md +25 -1
- package/docs/fr/intlayer_with_astro_vue.md +25 -1
- package/docs/fr/intlayer_with_remix_3.md +22 -1
- package/docs/fr/self_hosting.md +401 -224
- package/docs/hi/benchmark/nextjs.md +13 -13
- package/docs/hi/benchmark/solid.md +5 -5
- package/docs/hi/benchmark/svelte.md +4 -4
- package/docs/hi/benchmark/tanstack.md +14 -13
- package/docs/hi/benchmark/vue.md +5 -5
- package/docs/hi/chrome_extension.md +130 -0
- package/docs/hi/cli/index.md +6 -1
- package/docs/hi/cli/infra.md +162 -0
- package/docs/hi/cli/init.md +24 -1
- package/docs/hi/dictionary/html.md +173 -5
- package/docs/hi/dictionary/markdown.md +263 -1
- package/docs/hi/intlayer_with_analog.md +23 -1
- package/docs/hi/intlayer_with_angular_19.md +24 -1
- package/docs/hi/intlayer_with_angular_21.md +24 -1
- package/docs/hi/intlayer_with_astro.md +24 -1
- package/docs/hi/intlayer_with_astro_lit.md +25 -1
- package/docs/hi/intlayer_with_astro_preact.md +26 -1
- package/docs/hi/intlayer_with_astro_react.md +26 -1
- package/docs/hi/intlayer_with_astro_solid.md +26 -1
- package/docs/hi/intlayer_with_astro_svelte.md +25 -1
- package/docs/hi/intlayer_with_astro_vue.md +25 -1
- package/docs/hi/intlayer_with_remix_3.md +22 -1
- package/docs/hi/self_hosting.md +409 -235
- package/docs/id/benchmark/nextjs.md +13 -13
- package/docs/id/benchmark/solid.md +5 -5
- package/docs/id/benchmark/svelte.md +4 -4
- package/docs/id/benchmark/tanstack.md +14 -13
- package/docs/id/benchmark/vue.md +5 -5
- package/docs/id/chrome_extension.md +130 -0
- package/docs/id/cli/index.md +6 -1
- package/docs/id/cli/infra.md +162 -0
- package/docs/id/cli/init.md +24 -1
- package/docs/id/dictionary/html.md +173 -5
- package/docs/id/dictionary/markdown.md +263 -1
- package/docs/id/intlayer_with_analog.md +23 -1
- package/docs/id/intlayer_with_angular_19.md +24 -1
- package/docs/id/intlayer_with_angular_21.md +24 -1
- package/docs/id/intlayer_with_astro.md +24 -1
- package/docs/id/intlayer_with_astro_lit.md +25 -1
- package/docs/id/intlayer_with_astro_preact.md +26 -1
- package/docs/id/intlayer_with_astro_react.md +26 -1
- package/docs/id/intlayer_with_astro_solid.md +26 -1
- package/docs/id/intlayer_with_astro_svelte.md +25 -1
- package/docs/id/intlayer_with_astro_vue.md +25 -1
- package/docs/id/intlayer_with_remix_3.md +22 -1
- package/docs/id/self_hosting.md +416 -243
- package/docs/it/benchmark/nextjs.md +13 -13
- package/docs/it/benchmark/solid.md +5 -5
- package/docs/it/benchmark/svelte.md +4 -4
- package/docs/it/benchmark/tanstack.md +14 -13
- package/docs/it/benchmark/vue.md +5 -5
- package/docs/it/chrome_extension.md +130 -0
- package/docs/it/cli/index.md +6 -1
- package/docs/it/cli/infra.md +162 -0
- package/docs/it/cli/init.md +24 -1
- package/docs/it/dictionary/html.md +173 -5
- package/docs/it/dictionary/markdown.md +263 -1
- package/docs/it/intlayer_with_analog.md +23 -1
- package/docs/it/intlayer_with_angular_19.md +24 -1
- package/docs/it/intlayer_with_angular_21.md +24 -1
- package/docs/it/intlayer_with_astro.md +24 -1
- package/docs/it/intlayer_with_astro_lit.md +25 -1
- package/docs/it/intlayer_with_astro_preact.md +26 -1
- package/docs/it/intlayer_with_astro_react.md +26 -1
- package/docs/it/intlayer_with_astro_solid.md +26 -1
- package/docs/it/intlayer_with_astro_svelte.md +25 -1
- package/docs/it/intlayer_with_astro_vue.md +25 -1
- package/docs/it/intlayer_with_remix_3.md +22 -1
- package/docs/it/self_hosting.md +412 -237
- package/docs/ja/benchmark/nextjs.md +13 -13
- package/docs/ja/benchmark/solid.md +5 -5
- package/docs/ja/benchmark/svelte.md +4 -4
- package/docs/ja/benchmark/tanstack.md +13 -12
- package/docs/ja/benchmark/vue.md +5 -5
- package/docs/ja/chrome_extension.md +130 -0
- package/docs/ja/cli/index.md +6 -1
- package/docs/ja/cli/infra.md +162 -0
- package/docs/ja/cli/init.md +24 -1
- package/docs/ja/dictionary/html.md +173 -5
- package/docs/ja/dictionary/markdown.md +263 -1
- package/docs/ja/intlayer_with_analog.md +23 -1
- package/docs/ja/intlayer_with_angular_19.md +24 -1
- package/docs/ja/intlayer_with_angular_21.md +24 -1
- package/docs/ja/intlayer_with_astro.md +24 -1
- package/docs/ja/intlayer_with_astro_lit.md +25 -1
- package/docs/ja/intlayer_with_astro_preact.md +26 -1
- package/docs/ja/intlayer_with_astro_react.md +26 -1
- package/docs/ja/intlayer_with_astro_solid.md +26 -1
- package/docs/ja/intlayer_with_astro_svelte.md +25 -1
- package/docs/ja/intlayer_with_astro_vue.md +25 -1
- package/docs/ja/intlayer_with_remix_3.md +22 -1
- package/docs/ja/self_hosting.md +398 -223
- package/docs/ko/benchmark/nextjs.md +13 -13
- package/docs/ko/benchmark/solid.md +5 -5
- package/docs/ko/benchmark/svelte.md +4 -4
- package/docs/ko/benchmark/tanstack.md +14 -13
- package/docs/ko/benchmark/vue.md +5 -5
- package/docs/ko/chrome_extension.md +130 -0
- package/docs/ko/cli/index.md +6 -1
- package/docs/ko/cli/infra.md +162 -0
- package/docs/ko/cli/init.md +24 -1
- package/docs/ko/dictionary/html.md +173 -5
- package/docs/ko/dictionary/markdown.md +263 -1
- package/docs/ko/intlayer_with_analog.md +23 -1
- package/docs/ko/intlayer_with_angular_19.md +24 -1
- package/docs/ko/intlayer_with_angular_21.md +24 -1
- package/docs/ko/intlayer_with_astro.md +24 -1
- package/docs/ko/intlayer_with_astro_lit.md +25 -1
- package/docs/ko/intlayer_with_astro_preact.md +26 -1
- package/docs/ko/intlayer_with_astro_react.md +26 -1
- package/docs/ko/intlayer_with_astro_solid.md +26 -1
- package/docs/ko/intlayer_with_astro_svelte.md +25 -1
- package/docs/ko/intlayer_with_astro_vue.md +25 -1
- package/docs/ko/intlayer_with_remix_3.md +22 -1
- package/docs/ko/self_hosting.md +411 -238
- package/docs/pl/benchmark/nextjs.md +13 -13
- package/docs/pl/benchmark/solid.md +5 -5
- package/docs/pl/benchmark/svelte.md +4 -4
- package/docs/pl/benchmark/tanstack.md +14 -13
- package/docs/pl/benchmark/vue.md +5 -5
- package/docs/pl/chrome_extension.md +130 -0
- package/docs/pl/cli/index.md +6 -1
- package/docs/pl/cli/infra.md +162 -0
- package/docs/pl/cli/init.md +24 -1
- package/docs/pl/dictionary/html.md +173 -5
- package/docs/pl/dictionary/markdown.md +263 -1
- package/docs/pl/intlayer_with_analog.md +23 -1
- package/docs/pl/intlayer_with_angular_19.md +24 -1
- package/docs/pl/intlayer_with_angular_21.md +24 -1
- package/docs/pl/intlayer_with_astro.md +24 -1
- package/docs/pl/intlayer_with_astro_lit.md +25 -1
- package/docs/pl/intlayer_with_astro_preact.md +26 -1
- package/docs/pl/intlayer_with_astro_react.md +26 -1
- package/docs/pl/intlayer_with_astro_solid.md +26 -1
- package/docs/pl/intlayer_with_astro_svelte.md +25 -1
- package/docs/pl/intlayer_with_astro_vue.md +25 -1
- package/docs/pl/intlayer_with_remix_3.md +22 -1
- package/docs/pl/self_hosting.md +408 -233
- package/docs/pt/benchmark/nextjs.md +13 -13
- package/docs/pt/benchmark/solid.md +5 -5
- package/docs/pt/benchmark/svelte.md +4 -4
- package/docs/pt/benchmark/tanstack.md +14 -13
- package/docs/pt/benchmark/vue.md +5 -5
- package/docs/pt/chrome_extension.md +130 -0
- package/docs/pt/cli/index.md +6 -1
- package/docs/pt/cli/infra.md +162 -0
- package/docs/pt/cli/init.md +24 -1
- package/docs/pt/dictionary/html.md +173 -5
- package/docs/pt/dictionary/markdown.md +263 -1
- package/docs/pt/intlayer_with_analog.md +23 -1
- package/docs/pt/intlayer_with_angular_19.md +24 -1
- package/docs/pt/intlayer_with_angular_21.md +24 -1
- package/docs/pt/intlayer_with_astro.md +24 -1
- package/docs/pt/intlayer_with_astro_lit.md +25 -1
- package/docs/pt/intlayer_with_astro_preact.md +26 -1
- package/docs/pt/intlayer_with_astro_react.md +26 -1
- package/docs/pt/intlayer_with_astro_solid.md +26 -1
- package/docs/pt/intlayer_with_astro_svelte.md +25 -1
- package/docs/pt/intlayer_with_astro_vue.md +25 -1
- package/docs/pt/intlayer_with_remix_3.md +22 -1
- package/docs/pt/self_hosting.md +399 -224
- package/docs/ru/benchmark/nextjs.md +13 -13
- package/docs/ru/benchmark/solid.md +5 -5
- package/docs/ru/benchmark/svelte.md +4 -4
- package/docs/ru/benchmark/tanstack.md +14 -13
- package/docs/ru/benchmark/vue.md +5 -5
- package/docs/ru/chrome_extension.md +130 -0
- package/docs/ru/cli/index.md +6 -1
- package/docs/ru/cli/infra.md +162 -0
- package/docs/ru/cli/init.md +24 -1
- package/docs/ru/dictionary/html.md +173 -5
- package/docs/ru/dictionary/markdown.md +263 -1
- package/docs/ru/intlayer_with_analog.md +23 -1
- package/docs/ru/intlayer_with_angular_19.md +24 -1
- package/docs/ru/intlayer_with_angular_21.md +24 -1
- package/docs/ru/intlayer_with_astro.md +24 -1
- package/docs/ru/intlayer_with_astro_lit.md +25 -1
- package/docs/ru/intlayer_with_astro_preact.md +26 -1
- package/docs/ru/intlayer_with_astro_react.md +26 -1
- package/docs/ru/intlayer_with_astro_solid.md +26 -1
- package/docs/ru/intlayer_with_astro_svelte.md +25 -1
- package/docs/ru/intlayer_with_astro_vue.md +25 -1
- package/docs/ru/intlayer_with_remix_3.md +22 -1
- package/docs/ru/self_hosting.md +403 -228
- package/docs/tr/benchmark/nextjs.md +13 -13
- package/docs/tr/benchmark/solid.md +5 -5
- package/docs/tr/benchmark/svelte.md +4 -4
- package/docs/tr/benchmark/tanstack.md +14 -13
- package/docs/tr/benchmark/vue.md +5 -5
- package/docs/tr/chrome_extension.md +130 -0
- package/docs/tr/cli/index.md +6 -1
- package/docs/tr/cli/infra.md +162 -0
- package/docs/tr/cli/init.md +24 -1
- package/docs/tr/dictionary/html.md +173 -5
- package/docs/tr/dictionary/markdown.md +263 -1
- package/docs/tr/intlayer_with_analog.md +23 -1
- package/docs/tr/intlayer_with_angular_19.md +24 -1
- package/docs/tr/intlayer_with_angular_21.md +24 -1
- package/docs/tr/intlayer_with_astro.md +24 -1
- package/docs/tr/intlayer_with_astro_lit.md +25 -1
- package/docs/tr/intlayer_with_astro_preact.md +26 -1
- package/docs/tr/intlayer_with_astro_react.md +26 -1
- package/docs/tr/intlayer_with_astro_solid.md +26 -1
- package/docs/tr/intlayer_with_astro_svelte.md +25 -1
- package/docs/tr/intlayer_with_astro_vue.md +25 -1
- package/docs/tr/intlayer_with_remix_3.md +22 -1
- package/docs/tr/self_hosting.md +410 -234
- package/docs/uk/benchmark/nextjs.md +13 -13
- package/docs/uk/benchmark/solid.md +5 -5
- package/docs/uk/benchmark/svelte.md +4 -4
- package/docs/uk/benchmark/tanstack.md +14 -13
- package/docs/uk/benchmark/vue.md +5 -5
- package/docs/uk/chrome_extension.md +130 -0
- package/docs/uk/cli/index.md +6 -1
- package/docs/uk/cli/infra.md +162 -0
- package/docs/uk/cli/init.md +24 -1
- package/docs/uk/dictionary/html.md +173 -5
- package/docs/uk/dictionary/markdown.md +263 -1
- package/docs/uk/intlayer_with_analog.md +23 -1
- package/docs/uk/intlayer_with_angular_19.md +24 -1
- package/docs/uk/intlayer_with_angular_21.md +24 -1
- package/docs/uk/intlayer_with_astro.md +24 -1
- package/docs/uk/intlayer_with_astro_lit.md +25 -1
- package/docs/uk/intlayer_with_astro_preact.md +26 -1
- package/docs/uk/intlayer_with_astro_react.md +26 -1
- package/docs/uk/intlayer_with_astro_solid.md +26 -1
- package/docs/uk/intlayer_with_astro_svelte.md +25 -1
- package/docs/uk/intlayer_with_astro_vue.md +25 -1
- package/docs/uk/intlayer_with_remix_3.md +22 -1
- package/docs/uk/self_hosting.md +413 -238
- package/docs/vi/benchmark/nextjs.md +13 -13
- package/docs/vi/benchmark/solid.md +5 -5
- package/docs/vi/benchmark/svelte.md +4 -4
- package/docs/vi/benchmark/tanstack.md +14 -13
- package/docs/vi/benchmark/vue.md +5 -5
- package/docs/vi/chrome_extension.md +130 -0
- package/docs/vi/cli/index.md +6 -1
- package/docs/vi/cli/infra.md +162 -0
- package/docs/vi/cli/init.md +24 -1
- package/docs/vi/dictionary/html.md +173 -5
- package/docs/vi/dictionary/markdown.md +263 -1
- package/docs/vi/intlayer_with_analog.md +23 -1
- package/docs/vi/intlayer_with_angular_19.md +24 -1
- package/docs/vi/intlayer_with_angular_21.md +24 -1
- package/docs/vi/intlayer_with_astro.md +24 -1
- package/docs/vi/intlayer_with_astro_lit.md +25 -1
- package/docs/vi/intlayer_with_astro_preact.md +26 -1
- package/docs/vi/intlayer_with_astro_react.md +26 -1
- package/docs/vi/intlayer_with_astro_solid.md +26 -1
- package/docs/vi/intlayer_with_astro_svelte.md +25 -1
- package/docs/vi/intlayer_with_astro_vue.md +25 -1
- package/docs/vi/intlayer_with_remix_3.md +22 -1
- package/docs/vi/self_hosting.md +408 -234
- package/docs/zh/benchmark/nextjs.md +13 -13
- package/docs/zh/benchmark/solid.md +5 -5
- package/docs/zh/benchmark/svelte.md +4 -4
- package/docs/zh/benchmark/tanstack.md +14 -13
- package/docs/zh/benchmark/vue.md +5 -5
- package/docs/zh/chrome_extension.md +130 -0
- package/docs/zh/cli/index.md +6 -1
- package/docs/zh/cli/infra.md +162 -0
- package/docs/zh/cli/init.md +24 -1
- package/docs/zh/dictionary/html.md +172 -5
- package/docs/zh/dictionary/markdown.md +262 -1
- package/docs/zh/intlayer_with_analog.md +23 -1
- package/docs/zh/intlayer_with_angular_19.md +24 -1
- package/docs/zh/intlayer_with_angular_21.md +24 -1
- package/docs/zh/intlayer_with_astro.md +24 -1
- package/docs/zh/intlayer_with_astro_lit.md +25 -1
- package/docs/zh/intlayer_with_astro_preact.md +26 -1
- package/docs/zh/intlayer_with_astro_react.md +26 -1
- package/docs/zh/intlayer_with_astro_solid.md +26 -1
- package/docs/zh/intlayer_with_astro_svelte.md +25 -1
- package/docs/zh/intlayer_with_astro_vue.md +25 -1
- package/docs/zh/intlayer_with_remix_3.md +22 -1
- package/docs/zh/self_hosting.md +410 -237
- package/legal/ar/privacy_notice.md +9 -3
- package/legal/de/privacy_notice.md +9 -3
- package/legal/en/privacy_notice.md +10 -3
- package/legal/en-GB/privacy_notice.md +9 -3
- package/legal/es/privacy_notice.md +9 -3
- package/legal/fr/privacy_notice.md +9 -3
- package/legal/hi/privacy_notice.md +9 -3
- package/legal/id/privacy_notice.md +9 -3
- package/legal/it/privacy_notice.md +9 -3
- package/legal/ja/privacy_notice.md +9 -3
- package/legal/ko/privacy_notice.md +9 -3
- package/legal/pl/privacy_notice.md +9 -3
- package/legal/pt/privacy_notice.md +9 -3
- package/legal/ru/privacy_notice.md +9 -3
- package/legal/tr/privacy_notice.md +9 -3
- package/legal/uk/privacy_notice.md +9 -3
- package/legal/vi/privacy_notice.md +9 -3
- package/legal/zh/privacy_notice.md +9 -3
- package/package.json +1 -1
- package/src/generated/docs.entry.ts +40 -40
- package/docs/ar/roadmap.md +0 -321
- package/docs/de/roadmap.md +0 -322
- package/docs/en/intlayer_with_astro_vanilla.md +0 -713
- package/docs/en/roadmap.md +0 -325
- package/docs/en-GB/roadmap.md +0 -322
- package/docs/es/roadmap.md +0 -322
- package/docs/fr/roadmap.md +0 -322
- package/docs/hi/roadmap.md +0 -322
- package/docs/id/roadmap.md +0 -325
- package/docs/it/roadmap.md +0 -322
- package/docs/ja/roadmap.md +0 -322
- package/docs/ko/roadmap.md +0 -322
- package/docs/pl/roadmap.md +0 -325
- package/docs/pt/roadmap.md +0 -322
- package/docs/ru/roadmap.md +0 -322
- package/docs/tr/roadmap.md +0 -325
- package/docs/uk/roadmap.md +0 -325
- package/docs/vi/roadmap.md +0 -325
- package/docs/zh/roadmap.md +0 -322
package/docs/ar/self_hosting.md
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2026-06-30
|
|
3
|
-
updatedAt: 2026-
|
|
4
|
-
title: استضافة Intlayer
|
|
5
|
-
description: قم بتشغيل
|
|
3
|
+
updatedAt: 2026-09-21
|
|
4
|
+
title: استضافة Intlayer ذاتيًا (Self-Hosting)
|
|
5
|
+
description: "قم بتشغيل Intlayer على بنيتك التحتية الخاصة: كتطبيق سطح مكتب، أو حاوية Docker واحدة شاملة (all-in-one)، أو حزمة Docker Compose قابلة للتطوير. لا يلزم وجود حساب على Intlayer Cloud."
|
|
6
6
|
keywords:
|
|
7
|
-
-
|
|
7
|
+
- استضافة ذاتية
|
|
8
8
|
- Docker
|
|
9
9
|
- Docker Compose
|
|
10
|
+
- تطبيق سطح المكتب
|
|
10
11
|
- Intlayer
|
|
11
12
|
- CMS
|
|
12
13
|
- تثبيت
|
|
@@ -17,216 +18,457 @@ slugs:
|
|
|
17
18
|
author: aymericzip
|
|
18
19
|
---
|
|
19
20
|
|
|
20
|
-
# استضافة Intlayer
|
|
21
|
+
# استضافة Intlayer ذاتيًا (Self-Hosting)
|
|
21
22
|
|
|
22
|
-
يمكن تشغيل Intlayer
|
|
23
|
+
يمكن تشغيل Intlayer على بنيتك التحتية الخاصة دون الحاجة إلى حساب Intlayer Cloud. تتوفر ثلاثة إعدادات، يتم إدارتها جميعًا من خلال نفس برنامج التثبيت (`install.sh`، أو `install.ps1` على نظام Windows، أو `npx intlayer init infra`):
|
|
23
24
|
|
|
24
|
-
|
|
25
|
+
| Setup | What it is | Pick it for |
|
|
26
|
+
| ---------------------------- | ------------------------------------------------------------------------------------- | ---------------------------------------- |
|
|
27
|
+
| **تطبيق سطح المكتب** | لوحة تحكم أصلية لأنظمة macOS و Linux و Windows | عميل محلي، لا يتطلب استضافة |
|
|
28
|
+
| **Docker شامل (All-in-one)** | لوحة التحكم وواجهة برمجة التطبيقات (API) و MongoDB و Redis و MinIO في **حاوية واحدة** | للتجارب والتركيبات الصغيرة على جهاز واحد |
|
|
29
|
+
| **Docker Compose** | **حاوية واحدة لكل خدمة**، مع إمكانية استبدال أي مخزن بيانات بخدمة مُدارة | للإنتاج والتوسع وقواعد البيانات المُدارة |
|
|
30
|
+
|
|
31
|
+
## Table of Contents
|
|
32
|
+
|
|
33
|
+
<TOC/>
|
|
34
|
+
|
|
35
|
+
## الصور والحزم المنشورة
|
|
36
|
+
|
|
37
|
+
| Artifact | Docker Hub | GHCR mirror | Contents |
|
|
38
|
+
| -------------------- | ------------------------------------------------------------------------- | ------------------------------------------ | -------------------------------------------------------------------------------- |
|
|
39
|
+
| All-in-one container | [`intlayer/cms-all`](https://hub.docker.com/r/intlayer/cms-all) | `ghcr.io/aymericzip/intlayer/cms-all` | app + backend + MongoDB 8 + Redis + MinIO + Chromium |
|
|
40
|
+
| Dashboard (frontend) | [`intlayer/cms-frontend`](https://hub.docker.com/r/intlayer/cms-frontend) | `ghcr.io/aymericzip/intlayer/cms-frontend` | TanStack Start dashboard on Bun |
|
|
41
|
+
| API (backend) | [`intlayer/cms-backend`](https://hub.docker.com/r/intlayer/cms-backend) | `ghcr.io/aymericzip/intlayer/cms-backend` | Fastify REST API on Bun + Chromium |
|
|
42
|
+
| Desktop app | [GitHub releases](https://github.com/aymericzip/intlayer/releases/latest) | n/a | `.dmg` (macOS), `.deb` / `.rpm` / `.AppImage` (Linux), `.exe` / `.msi` (Windows) |
|
|
43
|
+
|
|
44
|
+
يتم بناء جميع الصور الثلاث من نفس الملف [`docker/selfhost/Dockerfile`](https://github.com/aymericzip/intlayer/tree/main/docker/selfhost) ويتم نشرها مع كل إصدار. تقوم حزمة Compose أيضًا بسحب الصور الرسمية `mongo:8` و `redis:8-alpine` و `quay.io/minio/minio`.
|
|
45
|
+
|
|
46
|
+
## الإعداد
|
|
47
|
+
|
|
48
|
+
يسأل برنامج التثبيت عن الإعداد المطلوب، ويتحقق من المتطلبات الأساسية (مع عرض تثبيت Docker)، ويكتب ملف البيئة مع المفاتيح السرية المنشأة مسبقًا، ويسحب الصور. لا يبدأ أي شيء تلقائيًا: تتطلب أوضاع Docker إعداد برنامج بريد أولاً، لذا ينتهي البرنامج بطباعة الأمر المطلوب تشغيله. إعادة التشغيل آمنة: لا يتم استبدال ملف البيئة الحالي أبدًا، مما يجعله أيضًا مسارًا للترقية.
|
|
49
|
+
|
|
50
|
+
<Tabs group="mode">
|
|
51
|
+
<Tab label="تطبيق سطح المكتب" value="desktop">
|
|
52
|
+
|
|
53
|
+
لوحة تحكم Intlayer كتطبيق أصلي تم إنشاؤه باستخدام Tauri. يسجل الدخول إلى Intlayer Cloud (`https://app.intlayer.org`)، لذلك لا توجد حاجة للاستضافة. إنه الخيار المناسب عندما تفضل عميلاً محلياً بدلاً من علامة تبويب في المتصفح.
|
|
54
|
+
|
|
55
|
+
### التثبيت
|
|
56
|
+
|
|
57
|
+
يقوم برنامج التثبيت بتنزيل الحزمة المناسبة لنظام التشغيل والمعالج لديك ثم يفتحها (macOS)، أو يثبتها (`dpkg` / `rpm` على Linux) أو يشغل معالج الإعداد (Windows). يمكنك أيضًا تنزيلها يدويًا من [صفحة الإصدارات](https://github.com/aymericzip/intlayer/releases/latest).
|
|
58
|
+
|
|
59
|
+
<Tabs group="os">
|
|
60
|
+
<Tab label="macOS / Linux" value="unix">
|
|
25
61
|
|
|
26
62
|
```sh
|
|
27
|
-
curl -fsSL https://intlayer.org/install.sh | sh
|
|
63
|
+
curl -fsSL https://intlayer.org/install.sh | sh -s -- --mode desktop
|
|
28
64
|
```
|
|
29
65
|
|
|
30
|
-
|
|
66
|
+
</Tab>
|
|
67
|
+
<Tab label="Windows" value="windows">
|
|
31
68
|
|
|
32
|
-
|
|
69
|
+
In PowerShell:
|
|
33
70
|
|
|
34
|
-
|
|
71
|
+
```powershell
|
|
72
|
+
$env:INTLAYER_MODE = "desktop"; irm https://intlayer.org/install.ps1 | iex
|
|
73
|
+
```
|
|
35
74
|
|
|
36
|
-
|
|
75
|
+
</Tab>
|
|
76
|
+
<Tab label="Intlayer CLI" value="cli">
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
npx intlayer init infra --mode desktop
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
</Tab>
|
|
83
|
+
</Tabs>
|
|
37
84
|
|
|
38
|
-
|
|
85
|
+
### المتطلبات
|
|
86
|
+
|
|
87
|
+
- **Node.js**: يدمج التطبيق خادم لوحة التحكم ويشغله باستخدام ملف `node` الثنائي على جهازك. قم بتثبيته من [nodejs.org](https://nodejs.org) إذا لم يفتح التطبيق.
|
|
88
|
+
|
|
89
|
+
> يتصل إصدار سطح المكتب المنشور بالواجهة الخلفية لـ Intlayer Cloud. يتطلب توجيهه إلى واجهة خلفية مستضافة ذاتيًا إعادة بناء التطبيق مع تعيين `VITE_BACKEND_URL` للإشارة إلى واجهة برمجة التطبيقات الخاصة بك، راجع [القيود](#limitations).
|
|
90
|
+
|
|
91
|
+
</Tab>
|
|
92
|
+
<Tab label="Docker شامل (All-in-one)" value="docker">
|
|
93
|
+
|
|
94
|
+
يعمل كل شيء داخل حاوية `intlayer/cms-all` واحدة، تحت إشراف [s6-overlay](https://github.com/just-containers/s6-overlay)، مع استمرار حفظ جميع مخازن البيانات على وحدة تخزين واحدة.
|
|
39
95
|
|
|
40
96
|
```
|
|
41
97
|
┌─────────────────────────────┐
|
|
42
98
|
browser ──────▶ │ app (TanStack Start) :3000│ ──┐
|
|
43
|
-
|
|
99
|
+
(localhost) └─────────────────────────────┘ │ VITE_BACKEND_URL (baked at build)
|
|
44
100
|
┌─────────────────────────────┐ │
|
|
45
101
|
│ backend (Fastify/Bun) :3100│ ◀─┘
|
|
46
102
|
└──────────────┬──────────────┘
|
|
47
|
-
|
|
48
|
-
▼ ▼ ▼
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
(console) (web UI)
|
|
103
|
+
┌──────────┬─────────┼──────────────┐
|
|
104
|
+
▼ ▼ ▼ ▼
|
|
105
|
+
mongo:27017 redis:6379 minio:9000 Chromium
|
|
106
|
+
/data/mongo /data/redis /data/minio (in-image)
|
|
107
|
+
(1-node RS) minio:9001
|
|
53
108
|
```
|
|
54
109
|
|
|
55
|
-
|
|
110
|
+
| الخدمة | منفذ (منافذ) المضيف | الغرض |
|
|
111
|
+
| ----------- | --------------------------------- | ----------------------------------------------------- |
|
|
112
|
+
| **app** | `3000` | لوحة التحكم (واجهة مستخدم CMS) |
|
|
113
|
+
| **backend** | `3100` | واجهة برمجة تطبيقات REST (نقطة نهاية `/health`) |
|
|
114
|
+
| **mongo** | داخلي | MongoDB 8، مجموعة نسخ متماثلة بعقدة واحدة `rs0` |
|
|
115
|
+
| **redis** | داخلي | قوائم انتظار المهام (BullMQ) والتخزين المؤقت |
|
|
116
|
+
| **minio** | `9000` (S3)، `9001` (وحدة التحكم) | تخزين كائنات متوافق مع S3 للصور الرمزية ولقطات الشاشة |
|
|
117
|
+
|
|
118
|
+
يتم إدارة ترتيب التمهيد من خلال تبعيات s6 (`mongod` ← تهيئة مجموعة النسخ، `minio` ← إنشاء الحاوية، ثم `backend`، ثم `app`)، وتتم إعادة تشغيل الخدمات عند الخروج، بحيث يتعافى التمهيد الأول ذاتيًا.
|
|
56
119
|
|
|
57
|
-
|
|
120
|
+
### المتطلبات الأساسية
|
|
58
121
|
|
|
59
|
-
- **Docker** ≥ 24
|
|
60
|
-
- المنافذ `3000
|
|
61
|
-
-
|
|
122
|
+
- **Docker** ≥ 24: يعرض برنامج التثبيت تثبيته (عبر [get.docker.com](https://get.docker.com) على Linux، أو Homebrew على macOS). على نظام Windows، قم بتثبيت [Docker Desktop](https://docs.docker.com/desktop/setup/install/windows-install/) (واجهة WSL 2 الخلفية) أولاً.
|
|
123
|
+
- المنافذ `3000` و `3100` و `9000` و `9001` متاحة على المضيف. يجب أن يظل منفذ MinIO `9000` قابلاً للوصول من قبل المتصفح حيث يتم تحميل الأصول مباشرة من `S3_PUBLIC_URL`.
|
|
124
|
+
- خادم بريد (mailer): مفتاح API لـ [Resend](https://resend.com) أو مرحّل SMTP.
|
|
62
125
|
|
|
63
|
-
|
|
126
|
+
### 1. التثبيت
|
|
64
127
|
|
|
65
|
-
|
|
128
|
+
يكتب `./intlayer.env` مع مفاتيح `BETTER_AUTH_SECRET` و `S3_SECRET_ACCESS_KEY` المنشأة مسبقًا، ويسحب `intlayer/cms-all:latest`.
|
|
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
|
+
تقوم أداة CLI بتشغيل برنامج التثبيت الذي يطبع الأمر `docker run …` الموضح في علامات التبويب الأخرى. الصقه في جهازك الطرفي بعد تكوين خادم البريد.
|
|
76
150
|
|
|
77
|
-
|
|
151
|
+
</Tab>
|
|
152
|
+
</Tabs>
|
|
78
153
|
|
|
79
|
-
|
|
154
|
+
### 2. تكوين خادم البريد
|
|
155
|
+
|
|
156
|
+
افتح `intlayer.env` واملأ إعدادات Resend **أو** SMTP (انظر التفاصيل في [خادم البريد العام](#global-mailer)):
|
|
80
157
|
|
|
81
158
|
```sh fileName="intlayer.env"
|
|
82
|
-
|
|
83
|
-
DB_MDP=<atlas-password>
|
|
84
|
-
DB_CLUSTER=<cluster>.xxxxx.mongodb.net
|
|
159
|
+
# Option A: Resend
|
|
85
160
|
RESEND_API_KEY=<your-resend-key>
|
|
86
|
-
```
|
|
87
161
|
|
|
88
|
-
|
|
162
|
+
# Option B: SMTP (takes over from Resend as soon as MAIL_SMTP_HOST is set)
|
|
163
|
+
MAIL_SMTP_HOST=smtp.example.com
|
|
164
|
+
MAIL_SMTP_PORT=587
|
|
165
|
+
MAIL_SMTP_USER=<user>
|
|
166
|
+
MAIL_SMTP_PASSWORD=<password>
|
|
167
|
+
MAIL_FROM=Intlayer <no-reply@example.com>
|
|
168
|
+
```
|
|
89
169
|
|
|
90
|
-
|
|
170
|
+
### 3. التشغيل
|
|
91
171
|
|
|
92
|
-
|
|
172
|
+
هذا هو أمر التشغيل الذي يطبعه برنامج التثبيت:
|
|
93
173
|
|
|
94
|
-
|
|
174
|
+
<Tabs group="os">
|
|
175
|
+
<Tab label="macOS / Linux" value="unix">
|
|
95
176
|
|
|
96
177
|
```sh
|
|
97
178
|
docker run -d --name intlayer \
|
|
98
179
|
--restart unless-stopped \
|
|
99
|
-
-p 3000:3000 \
|
|
100
|
-
-p 3100:3100 \
|
|
101
|
-
-p 9000:9000 \
|
|
102
|
-
-p 9001:9001 \
|
|
180
|
+
-p 3000:3000 -p 3100:3100 -p 9000:9000 -p 9001:9001 \
|
|
103
181
|
-v intlayer-data:/data \
|
|
104
182
|
--env-file ./intlayer.env \
|
|
105
|
-
|
|
183
|
+
intlayer/cms-all:latest
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
</Tab>
|
|
187
|
+
<Tab label="Windows" value="windows">
|
|
188
|
+
|
|
189
|
+
```powershell
|
|
190
|
+
docker run -d --name intlayer `
|
|
191
|
+
--restart unless-stopped `
|
|
192
|
+
-p 3000:3000 -p 3100:3100 -p 9000:9000 -p 9001:9001 `
|
|
193
|
+
-v intlayer-data:/data `
|
|
194
|
+
--env-file ./intlayer.env `
|
|
195
|
+
intlayer/cms-all:latest
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
</Tab>
|
|
199
|
+
<Tab label="Intlayer CLI" value="cli">
|
|
200
|
+
|
|
201
|
+
تقوم أداة CLI بتشغيل برنامج التثبيت الذي يطبع الأمر `docker run …` الموضح في علامات التبويب الأخرى. الصقه في جهازك الطرفي بعد تكوين خادم البريد.
|
|
202
|
+
|
|
203
|
+
</Tab>
|
|
204
|
+
</Tabs>
|
|
205
|
+
|
|
206
|
+
افتح **http://localhost:3000** واتبع [إعداد التشغيل الأول](#first-run-setup). يقوم التمهيد الأول بتهيئة مجموعة النسخ والحاوية، لذا امنحه دقيقة واحدة.
|
|
207
|
+
|
|
208
|
+
### النسخ الاحتياطي والترقية
|
|
209
|
+
|
|
210
|
+
يتم الاحتفاظ بجميع الحالات داخل وحدة التخزين `intlayer-data` (`/data/mongo`، `/data/redis`، `/data/minio`).
|
|
211
|
+
|
|
212
|
+
```sh
|
|
213
|
+
# Backup (stop the container first so MongoDB's files are consistent)
|
|
214
|
+
docker stop intlayer
|
|
215
|
+
docker run --rm -v intlayer-data:/data -v "$(pwd)":/backup busybox tar czf /backup/intlayer-data.tar.gz /data
|
|
216
|
+
docker start intlayer
|
|
217
|
+
|
|
218
|
+
# Restore
|
|
219
|
+
docker run --rm -v intlayer-data:/data -v "$(pwd)":/backup busybox tar xzf /backup/intlayer-data.tar.gz -C /
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
للترقية، أعد تشغيل برنامج التثبيت (يقوم بسحب أحدث صورة والاحتفاظ بملف `intlayer.env`)، ثم قم بتشغيل `docker rm -f intlayer` وأعد تشغيل أمر البدء. لاستخدام قاعدة بيانات MongoDB مُدارة بدلاً من المضمنة، عيّن `MONGODB_URI` في `intlayer.env`.
|
|
223
|
+
|
|
224
|
+
</Tab>
|
|
225
|
+
<Tab label="Docker Compose" value="compose">
|
|
226
|
+
|
|
227
|
+
حاوية واحدة لكل خدمة على شبكة Compose خاصة. تستخدم لوحة التحكم وواجهة برمجة التطبيقات الصور المنشورة `intlayer/cms-frontend` و `intlayer/cms-backend`؛ وتستخدم مخازن البيانات صور `mongo` و `redis` و `minio` الرسمية.
|
|
228
|
+
|
|
106
229
|
```
|
|
230
|
+
┌───────────────────┐
|
|
231
|
+
browser ──────▶ │ app :3000 │ ── SSR ──▶ http://backend:3100
|
|
232
|
+
(localhost) └───────────────────┘
|
|
233
|
+
┌───────────────────┐
|
|
234
|
+
browser ──────▶ │ backend :3100 │
|
|
235
|
+
(localhost) └─────────┬─────────┘
|
|
236
|
+
┌───────────────┼───────────────┐
|
|
237
|
+
▼ ▼ ▼
|
|
238
|
+
mongo:27017 redis:6379 minio:9000 ◀── browser (assets)
|
|
239
|
+
(1-node RS) minio:9001
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
| الخدمة | الصورة | الدور |
|
|
243
|
+
| ------------ | ----------------------- | -------------------------------------------------------------------------------------- |
|
|
244
|
+
| `app` | `intlayer/cms-frontend` | لوحة التحكم على المنفذ `:3000`؛ تنتظر حتى تكون الواجهة الخلفية جاهزة |
|
|
245
|
+
| `backend` | `intlayer/cms-backend` | واجهة برمجة التطبيقات على المنفذ `:3100` مع Chromium؛ تنتظر Mongo و Redis وحاوية MinIO |
|
|
246
|
+
| `mongo` | `mongo:8` | مجموعة نسخ بعقدة واحدة `rs0`، تتم تهيئتها بواسطة فحص الحالة الخاص بها |
|
|
247
|
+
| `redis` | `redis:8-alpine` | قوائم الانتظار والتخزين المؤقت، واستمرارية الإلحاق فقط (append-only) |
|
|
248
|
+
| `minio` | `quay.io/minio/minio` | تخزين S3 على المنفذ `:9000`، وحدة التحكم على `:9001` |
|
|
249
|
+
| `minio-init` | `quay.io/minio/mc` | تشغيل لمرة واحدة: ينشئ الحاوية وسياسة التنزيل المجهول الخاصة بها |
|
|
250
|
+
|
|
251
|
+
يتم حفظ البيانات في وحدات التخزين `intlayer_mongo-data` و `intlayer_redis-data` و `intlayer_minio-data`. تم تثبيت اتصالات الخدمة (`MONGODB_URI` و `REDIS_URL` و `S3_ENDPOINT` وعنوان URL الداخلي للواجهة الخلفية للعرض من جانب الخادم) في ملف compose ولها الأسبقية على `.env`، الذي يحتفظ فقط بالمفاتيح السرية والتكاملات الاختيارية.
|
|
252
|
+
|
|
253
|
+
### المتطلبات الأساسية
|
|
254
|
+
|
|
255
|
+
- **Docker** ≥ 24 مع ملحق Compose: يعرض برنامج التثبيت تثبيته على Linux و macOS. على نظام Windows، قم بتثبيت [Docker Desktop](https://docs.docker.com/desktop/setup/install/windows-install/) (واجهة WSL 2 الخلفية) أولاً.
|
|
256
|
+
- المنافذ `3000` و `3100` و `9000` و `9001` متاحة على المضيف.
|
|
257
|
+
- خادم بريد: مفتاح API لـ [Resend](https://resend.com) أو مرحّل SMTP.
|
|
258
|
+
|
|
259
|
+
### 1. التثبيت
|
|
107
260
|
|
|
108
|
-
|
|
261
|
+
يكتب `docker-compose.yml` وملف `.env` مع المفاتيح السرية المنشأة في `./intlayer/` ويسحب الصور.
|
|
109
262
|
|
|
110
|
-
>
|
|
263
|
+
<Tabs group="os">
|
|
264
|
+
<Tab label="macOS / Linux" value="unix">
|
|
111
265
|
|
|
112
|
-
|
|
266
|
+
```sh
|
|
267
|
+
curl -fsSL https://intlayer.org/install.sh | sh -s -- --mode compose
|
|
268
|
+
```
|
|
113
269
|
|
|
114
|
-
|
|
270
|
+
Or by hand:
|
|
115
271
|
|
|
116
272
|
```sh
|
|
117
|
-
|
|
273
|
+
mkdir intlayer && cd intlayer
|
|
274
|
+
curl -fsSLO https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/docker-compose.yml
|
|
275
|
+
curl -fsSL https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/.env.template -o .env
|
|
276
|
+
# fill in BETTER_AUTH_SECRET and S3_SECRET_ACCESS_KEY (openssl rand -hex 32)
|
|
118
277
|
```
|
|
119
278
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
| `INTLAYER_IMAGE` | `ghcr.io/aymericzip/intlayer-selfhost:latest` | الصورة المراد سحبها |
|
|
123
|
-
| `INTLAYER_ENV_FILE` | `./intlayer.env` | حيث يتم كتابة ملف البيئة |
|
|
124
|
-
| `INTLAYER_CONTAINER_NAME` | `intlayer` | اسم الحاوية |
|
|
125
|
-
| `INTLAYER_DATA_VOLUME` | `intlayer-data` | وحدة تخزين مسماة مثبتة في `/data` |
|
|
126
|
-
| `INTLAYER_APP_PORT` | `3000` | منفذ المضيف لوحة التحكم |
|
|
127
|
-
| `INTLAYER_API_PORT` | `3100` | منفذ المضيف للـ API |
|
|
128
|
-
| `INTLAYER_S3_PORT` | `9000` | منفذ المضيف لـ MinIO S3 API |
|
|
129
|
-
| `INTLAYER_CONSOLE_PORT` | `9001` | منفذ المضيف لوحة MinIO |
|
|
279
|
+
</Tab>
|
|
280
|
+
<Tab label="Windows" value="windows">
|
|
130
281
|
|
|
131
|
-
|
|
282
|
+
In PowerShell:
|
|
132
283
|
|
|
133
|
-
|
|
284
|
+
```powershell
|
|
285
|
+
$env:INTLAYER_MODE = "compose"; irm https://intlayer.org/install.ps1 | iex
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
Or by hand:
|
|
289
|
+
|
|
290
|
+
```powershell
|
|
291
|
+
mkdir intlayer; cd intlayer
|
|
292
|
+
irm https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/docker-compose.yml -OutFile docker-compose.yml
|
|
293
|
+
irm https://raw.githubusercontent.com/aymericzip/intlayer/main/docker/selfhost/.env.template -OutFile .env
|
|
294
|
+
# fill in BETTER_AUTH_SECRET and S3_SECRET_ACCESS_KEY
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
</Tab>
|
|
298
|
+
<Tab label="Intlayer CLI" value="cli">
|
|
299
|
+
|
|
300
|
+
```bash
|
|
301
|
+
npx intlayer init infra --mode compose
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
</Tab>
|
|
305
|
+
</Tabs>
|
|
306
|
+
|
|
307
|
+
### 2. تكوين خادم البريد
|
|
308
|
+
|
|
309
|
+
املأ بيانات Resend **أو** SMTP في `intlayer/.env`، تمامًا كما في الحاوية الشاملة (انظر [خادم البريد العام](#global-mailer)).
|
|
310
|
+
|
|
311
|
+
### 3. التشغيل
|
|
312
|
+
|
|
313
|
+
```sh
|
|
314
|
+
cd intlayer && docker compose up -d
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
افتح **http://localhost:3000** واتبع [إعداد التشغيل الأول](#first-run-setup).
|
|
134
318
|
|
|
135
|
-
|
|
319
|
+
### مخازن البيانات المُدارة
|
|
136
320
|
|
|
137
|
-
|
|
138
|
-
2. يتم إرسال بريد إلكتروني للتحقق (عبر Resend). التحقق من البريد الإلكتروني **إلزامي** — وهذا هو السبب في أنه يجب تعيين `RESEND_API_KEY` قبل أن تبدأ.
|
|
139
|
-
3. انقر على الرابط في البريد الإلكتروني، ثم قم بتسجيل الدخول.
|
|
321
|
+
احذف الخدمة التي تستبدلها من ملف compose (بالإضافة إلى إدخال `depends_on` الخاص بها في `backend`)، وتجاوز المتغير المقابل:
|
|
140
322
|
|
|
141
|
-
|
|
323
|
+
```yaml fileName="docker-compose.yml"
|
|
324
|
+
services:
|
|
325
|
+
backend:
|
|
326
|
+
environment:
|
|
327
|
+
MONGODB_URI: mongodb+srv://user:password@cluster0.xxxxx.mongodb.net/intlayer
|
|
328
|
+
REDIS_URL: rediss://default:password@redis.example.com:6380
|
|
329
|
+
S3_ENDPOINT: https://s3.eu-west-1.amazonaws.com
|
|
330
|
+
S3_PUBLIC_URL: https://intlayer-assets.s3.eu-west-1.amazonaws.com
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
تعمل المتغيرات `S3_ACCESS_KEY_ID` / `S3_SECRET_ACCESS_KEY` / `S3_BUCKET_NAME` بشكل مباشر مع أي مزود متوافق مع S3.
|
|
334
|
+
|
|
335
|
+
### التوسع
|
|
336
|
+
|
|
337
|
+
الخدمتان `app` و `backend` عديمتا الحالة (stateless). خلف موازن التحميل، وبافتراض إزالة تعيينات منافذ المضيف الثابتة وتوجيه الوكيل حسب اسم الخدمة، سيعمل الأمر `docker compose up -d --scale backend=3`. يتم تنسيق المهام في الخلفية عبر Redis (BullMQ)، بحيث تشارك نسخ الواجهة الخلفية المتعددة قوائم الانتظار بأمان.
|
|
338
|
+
|
|
339
|
+
### البناء من المصدر
|
|
340
|
+
|
|
341
|
+
من استنساخ المستودع، قم بتبديل خدمتي Intlayer من `image:` إلى `build:` باستخدام ملف تجاوز:
|
|
342
|
+
|
|
343
|
+
```sh
|
|
344
|
+
cd docker/selfhost
|
|
345
|
+
docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
استخدم هذا أيضًا عند إنشاء صور لنطاق مخصص: مرر قيم `VITE_*` كوسائط بناء (انظر [القيود](#limitations)).
|
|
349
|
+
|
|
350
|
+
### النسخ الاحتياطي والترقية
|
|
351
|
+
|
|
352
|
+
```sh
|
|
353
|
+
# Backup one volume (repeat for intlayer_redis-data and intlayer_minio-data)
|
|
354
|
+
docker compose stop
|
|
355
|
+
docker run --rm -v intlayer_mongo-data:/data -v "$(pwd)":/backup busybox tar czf /backup/mongo-data.tar.gz /data
|
|
356
|
+
docker start intlayer
|
|
357
|
+
|
|
358
|
+
# Upgrade, volumes are kept
|
|
359
|
+
docker compose pull && docker compose up -d
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
</Tab>
|
|
363
|
+
</Tabs>
|
|
364
|
+
|
|
365
|
+
### إعدادات برنامج التثبيت
|
|
366
|
+
|
|
367
|
+
بدون `--mode` (أو `INTLAYER_MODE`)، يعرض برنامج التثبيت قائمة: `desktop` أو `docker` (شامل) أو `compose`. كما يقرأ بعض متغيرات البيئة؛ قم بتمريرها إلى الصدفة بدلاً من `curl` لأن الأمر يتم توجيهه بالأنابيب:
|
|
142
368
|
|
|
143
|
-
|
|
369
|
+
```sh
|
|
370
|
+
curl -fsSL https://intlayer.org/install.sh | INTLAYER_COMPOSE_DIR=./cms sh -s -- --mode compose
|
|
371
|
+
```
|
|
144
372
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
| **backend** | built from `apps/backend/Dockerfile` | `3100` | واجهة Fastify REST API (نقطة نهاية `/health`) |
|
|
149
|
-
| **mongo** | `mongo:7` | داخلي | مجموعة نسخ متماثلة أحادية العقدة (`rs0`) |
|
|
150
|
-
| **redis** | `redis:7-alpine` | داخلي | قوائم انتظار المهام (BullMQ) والتخزين المؤقت (ioredis) |
|
|
151
|
-
| **minio** | `minio/minio` | `9000` (S3)، `9001` (وحدة التحكم) | تخزين كائنات متوافق مع S3 للصور الرمزية ولقطات الشاشة |
|
|
152
|
-
| **mailpit** | `axllent/mailpit` | `1025` (SMTP)، `8025` (واجهة الويب) | مجمّع بريد إلكتروني تفاعلي محلي |
|
|
373
|
+
```powershell
|
|
374
|
+
$env:INTLAYER_MODE = "compose"; $env:INTLAYER_COMPOSE_DIR = ".\cms"; irm https://intlayer.org/install.ps1 | iex
|
|
375
|
+
```
|
|
153
376
|
|
|
154
|
-
|
|
377
|
+
| Variable | Default | Applies to | Description |
|
|
378
|
+
| ------------------------- | ------------------------- | ---------- | ---------------------------------------------------------- |
|
|
379
|
+
| `INTLAYER_MODE` | _(asked)_ | all | `desktop`, `docker` or `compose`, same as `--mode` |
|
|
380
|
+
| `INTLAYER_DOWNLOAD_DIR` | `~/Downloads` | desktop | Where the app installer is saved |
|
|
381
|
+
| `INTLAYER_IMAGE` | `intlayer/cms-all:latest` | docker | All-in-one image to pull |
|
|
382
|
+
| `INTLAYER_ENV_FILE` | `./intlayer.env` | docker | Where to write the environment file |
|
|
383
|
+
| `INTLAYER_CONTAINER_NAME` | `intlayer` | docker | Container name |
|
|
384
|
+
| `INTLAYER_DATA_VOLUME` | `intlayer-data` | docker | Named volume mounted at `/data` |
|
|
385
|
+
| `INTLAYER_APP_PORT` | `3000` | docker | Host port for the dashboard |
|
|
386
|
+
| `INTLAYER_API_PORT` | `3100` | docker | Host port for the API |
|
|
387
|
+
| `INTLAYER_S3_PORT` | `9000` | docker | Host port for the MinIO S3 API |
|
|
388
|
+
| `INTLAYER_CONSOLE_PORT` | `9001` | docker | Host port for the MinIO console |
|
|
389
|
+
| `INTLAYER_COMPOSE_DIR` | `./intlayer` | compose | Where `docker-compose.yml` and `.env` are written |
|
|
390
|
+
| `INTLAYER_SELFHOST_REF` | `main` | both | Git ref the compose file and env template are fetched from |
|
|
391
|
+
|
|
392
|
+
> تغير متغيرات المنفذ جانب **المضيف** فقط من التعيين. تحتوي الصور المنشورة على `http://localhost:3000` و `http://localhost:3100` و `http://localhost:9000` المترجمة في حزمة لوحة التحكم، لذا احتفظ بالإعدادات الافتراضية ما لم تقم ببناء صورتك الخاصة، راجع [القيود](#limitations).
|
|
393
|
+
|
|
394
|
+
## إعداد التشغيل الأول
|
|
395
|
+
|
|
396
|
+
سيؤدي فتح لوحة التحكم على مثيل جديد (قاعدة بيانات فارغة) إلى إعادة التوجيه تلقائيًا إلى صفحة **`/init`**:
|
|
397
|
+
|
|
398
|
+
1. أنشئ الحساب الأول. نظرًا لأن مجموعة المستخدمين فارغة، تتم ترقية هذا الحساب تلقائيًا إلى **مسؤول متميز**.
|
|
399
|
+
2. يتم إرسال رسالة بريد إلكتروني للتحقق عبر Resend أو مرحّل SMTP الخاص بك. التحقق من البريد الإلكتروني **إلزامي**، ولهذا السبب يجب تكوين خادم البريد قبل البدء.
|
|
400
|
+
3. انقر فوق الرابط الموجود في البريد الإلكتروني وقم بتسجيل الدخول.
|
|
401
|
+
|
|
402
|
+
بمجرد وجود مسؤول، يعيد المسار `/init` التوجيه إلى صفحة تسجيل الدخول العادية.
|
|
155
403
|
|
|
156
404
|
## متغيرات البيئة
|
|
157
405
|
|
|
406
|
+
يقرأ كلا وضعي Docker نفس الملف (`intlayer.env` للحاوية أو `.env` لـ Compose) الذي تم إنشاؤه من [`docker/selfhost/.env.template`](https://github.com/aymericzip/intlayer/blob/main/docker/selfhost/.env.template).
|
|
407
|
+
|
|
158
408
|
### مطلوب
|
|
159
409
|
|
|
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
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
> الأولوية: بريد المنظمة الخاص بها (المُعد من لوحة المعلومات **Organization**) له الأولوية على البريد العام، والذي له بدوره الأولوية على مفتاح Resend الافتراضي.
|
|
224
|
-
|
|
225
|
-
## ربط مشروعك بـ Intlayer
|
|
226
|
-
|
|
227
|
-
بمجرد تشغيل المكدس، وجّه مشروعك نحو الخادم الخلفي ولوحة التحكم المستضافَين ذاتياً بدلاً من `intlayer.org`.
|
|
228
|
-
|
|
229
|
-
### تهيئة المشروع
|
|
410
|
+
| Variable | Example | Description |
|
|
411
|
+
| ---------------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
412
|
+
| `BETTER_AUTH_SECRET` | _(generated)_ | 32-byte secret for session signing |
|
|
413
|
+
| `S3_SECRET_ACCESS_KEY` | _(generated)_ | Secret for the bundled MinIO |
|
|
414
|
+
| `RESEND_API_KEY` | _(your key)_ | Transactional email via Resend. Required for first-run setup unless an SMTP relay is configured instead (see [Global mailer](#global-mailer)) |
|
|
415
|
+
|
|
416
|
+
### محدد بواسطة النشر
|
|
417
|
+
|
|
418
|
+
These are set by the image (all-in-one) or by the compose file, and only need overriding for a non-standard topology.
|
|
419
|
+
|
|
420
|
+
| Variable | All-in-one | Docker Compose | Description |
|
|
421
|
+
| ------------------ | --------------------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------- |
|
|
422
|
+
| `PORT` | `3100` | `3100` | Backend listening port |
|
|
423
|
+
| `APP_URL` | `http://localhost:3000` | `http://localhost:3000` | Public URL of the dashboard |
|
|
424
|
+
| `BACKEND_URL` | `http://localhost:3100` | `http://localhost:3100` | Public URL of the backend API |
|
|
425
|
+
| `DOMAIN` | `localhost` | `localhost` | Cookie domain |
|
|
426
|
+
| `SELF_HOSTED` | `true` | `true` | Disables the cloud-only API endpoints (billing, subscriptions, marketplace) |
|
|
427
|
+
| `MONGODB_URI` | `mongodb://127.0.0.1:27017/intlayer?replicaSet=rs0` | `mongodb://mongo:27017/…` | MongoDB connection string, any `mongodb://` or `mongodb+srv://` cluster works |
|
|
428
|
+
| `REDIS_URL` | `redis://127.0.0.1:6379` | `redis://redis:6379` | Redis |
|
|
429
|
+
| `S3_ENDPOINT` | `http://127.0.0.1:9000` | `http://minio:9000` | MinIO (server-to-server) |
|
|
430
|
+
| `S3_PUBLIC_URL` | `http://localhost:9000/intlayer` | `http://localhost:9000/intlayer` | Public URL for browser asset loading |
|
|
431
|
+
| `S3_BUCKET_NAME` | `intlayer` | `intlayer` | Bucket name |
|
|
432
|
+
| `S3_ACCESS_KEY_ID` | `intlayer` | `intlayer` | MinIO access key |
|
|
433
|
+
|
|
434
|
+
تتلقى خدمة `app` في Compose أيضًا `INTLAYER_BACKEND_INTERNAL_URL=http://backend:3100`: يصل المتصفح إلى واجهة برمجة التطبيقات على `localhost:3100`، ولكن العرض من جانب الخادم يتم داخل شبكة Compose ولذلك يجب استخدام اسم الخدمة.
|
|
435
|
+
|
|
436
|
+
### اختياري (تتراجع الميزات بسلاسة عند غيابها)
|
|
437
|
+
|
|
438
|
+
| Variable | Feature |
|
|
439
|
+
| ------------------------------------------------ | ----------------------------------------- |
|
|
440
|
+
| `OPENAI_API_KEY` | AI-assisted translation and content audit |
|
|
441
|
+
| `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` | GitHub OAuth login |
|
|
442
|
+
| `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` | Google OAuth login |
|
|
443
|
+
| `GITLAB_CLIENT_ID`, `GITLAB_CLIENT_SECRET` | GitLab OAuth login |
|
|
444
|
+
| `MICROSOFT_CLIENT_ID`, `MICROSOFT_CLIENT_SECRET` | Microsoft OAuth login |
|
|
445
|
+
|
|
446
|
+
### خادم البريد العام
|
|
447
|
+
|
|
448
|
+
تمر جميع رسائل البريد الإلكتروني الخاصة بالمعاملات، بما في ذلك رسائل البريد الإلكتروني غير التابعة للمؤسسة مثل عمليات إعادة تعيين كلمة المرور والروابط السحرية، عبر أحد وسيطي النقل العالميين:
|
|
449
|
+
|
|
450
|
+
- **Resend**: باستخدام `RESEND_API_KEY`.
|
|
451
|
+
- **SMTP**: باستخدام متغيرات `MAIL_SMTP_*`. بمجرد تعيين `MAIL_SMTP_HOST`، يتم استخدام SMTP وتجاهل `RESEND_API_KEY`.
|
|
452
|
+
|
|
453
|
+
يلزم استخدام `MAIL_PROVIDER` فقط لفرض وسيلة نقل معينة إذا تم تكوين كليهما (على سبيل المثال `MAIL_PROVIDER=resend` للاحتفاظ بـ Resend عند وجود مضيف SMTP).
|
|
454
|
+
|
|
455
|
+
| Variable | Example | Description |
|
|
456
|
+
| -------------------- | ------------------------------ | ---------------------------------------------------------------------------- |
|
|
457
|
+
| `MAIL_FROM` | `Intlayer <no-reply@acme.com>` | Sender header for either transport. Accepts a bare address or `Name <email>` |
|
|
458
|
+
| `MAIL_SMTP_HOST` | `smtp.acme.com` | SMTP host. Setting it selects the SMTP transport |
|
|
459
|
+
| `MAIL_SMTP_PORT` | `587` | SMTP port (defaults to `587`) |
|
|
460
|
+
| `MAIL_SMTP_SECURE` | `false` | Implicit TLS. Set `true` for port `465` |
|
|
461
|
+
| `MAIL_SMTP_USER` | _(your user)_ | SMTP username (optional; omit for unauthenticated relays) |
|
|
462
|
+
| `MAIL_SMTP_PASSWORD` | _(your password)_ | SMTP password |
|
|
463
|
+
| `MAIL_PROVIDER` | `resend` | Optional override: `smtp` or `resend`. Leave unset to auto-select |
|
|
464
|
+
|
|
465
|
+
> ترتيب الأسبقية: يتجاوز خادم البريد الخاص بالمؤسسة (المكون من لوحة تحكم **المؤسسة**) خادم البريد العام، ويتجاوز خادم البريد العام مفتاح Resend الافتراضي.
|
|
466
|
+
|
|
467
|
+
## ربط مشروع Intlayer الخاص بك
|
|
468
|
+
|
|
469
|
+
بمجرد تشغيل الحزمة، قم بتكوين مشروعك للإشارة إلى الواجهة الخلفية ولوحة التحكم المستضافة ذاتيًا بدلاً من `intlayer.org`.
|
|
470
|
+
|
|
471
|
+
### تكوين المشروع
|
|
230
472
|
|
|
231
473
|
```typescript fileName="intlayer.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
|
|
232
474
|
import type { IntlayerConfig } from "intlayer";
|
|
@@ -237,14 +479,14 @@ const config: IntlayerConfig = {
|
|
|
237
479
|
clientSecret: process.env.INTLAYER_CLIENT_SECRET,
|
|
238
480
|
|
|
239
481
|
/**
|
|
240
|
-
*
|
|
241
|
-
*
|
|
482
|
+
* URL of the self-hosted CMS dashboard.
|
|
483
|
+
* Default: https://app.intlayer.org
|
|
242
484
|
*/
|
|
243
485
|
cmsURL: process.env.INTLAYER_CMS_URL, // e.g. http://localhost:3000
|
|
244
486
|
|
|
245
487
|
/**
|
|
246
|
-
*
|
|
247
|
-
*
|
|
488
|
+
* URL of the self-hosted backend API.
|
|
489
|
+
* Default: https://back.intlayer.org
|
|
248
490
|
*/
|
|
249
491
|
backendURL: process.env.INTLAYER_BACKEND_URL, // e.g. http://localhost:3100
|
|
250
492
|
},
|
|
@@ -253,7 +495,7 @@ const config: IntlayerConfig = {
|
|
|
253
495
|
export default config;
|
|
254
496
|
```
|
|
255
497
|
|
|
256
|
-
|
|
498
|
+
Set the environment variables in your project's `.env`:
|
|
257
499
|
|
|
258
500
|
```sh
|
|
259
501
|
INTLAYER_CMS_URL=http://localhost:3000
|
|
@@ -262,11 +504,11 @@ INTLAYER_CLIENT_ID=<your-client-id>
|
|
|
262
504
|
INTLAYER_CLIENT_SECRET=<your-client-secret>
|
|
263
505
|
```
|
|
264
506
|
|
|
265
|
-
أنشئ بيانات اعتماد الوصول في لوحة التحكم المستضافة
|
|
507
|
+
أنشئ بيانات اعتماد الوصول في لوحة التحكم المستضافة ذاتيًا في **المشاريع ← مفاتيح الوصول** (`http://localhost:3000/projects`).
|
|
266
508
|
|
|
267
|
-
### SDK
|
|
509
|
+
### حزمة SDK `@intlayer/api`
|
|
268
510
|
|
|
269
|
-
عند استخدام SDK
|
|
511
|
+
عند استخدام حزمة SDK `@intlayer/api` برمجيًا، مرر `backendURL` بشكل صريح:
|
|
270
512
|
|
|
271
513
|
```typescript fileName="cms.ts" codeFormat="typescript"
|
|
272
514
|
import { createIntlayerCMS } from "@intlayer/api";
|
|
@@ -283,84 +525,17 @@ const cms = createIntlayerCMS({
|
|
|
283
525
|
const { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();
|
|
284
526
|
```
|
|
285
527
|
|
|
286
|
-
## الترقية
|
|
287
|
-
|
|
288
|
-
يجلب هذا الأمر أحدث الصور ويعيد تشغيل الحاويات باستخدام `docker compose pull && docker compose up -d`. يتم الاحتفاظ بالأحجام الموجودة (`mongo-data`، `redis-data`، `minio-data`) — دون فقدان للبيانات.
|
|
289
|
-
|
|
290
|
-
```sh
|
|
291
|
-
docker compose pull
|
|
292
|
-
docker compose up -d
|
|
293
|
-
```
|
|
294
|
-
|
|
295
|
-
## النسخ الاحتياطي والاستعادة
|
|
296
|
-
|
|
297
|
-
تعيش جميع البيانات الدائمة في ثلاثة أحجام Docker مسماة.
|
|
298
|
-
|
|
299
|
-
### النسخ الاحتياطي
|
|
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
|
-
### الاستعادة
|
|
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
|
-
# كرر لـ redis-data و minio-data
|
|
327
|
-
```
|
|
328
|
-
|
|
329
528
|
## القيود
|
|
330
529
|
|
|
331
|
-
-
|
|
332
|
-
-
|
|
333
|
-
-
|
|
334
|
-
|
|
335
|
-
## استكشاف الأخطاء وإصلاحها
|
|
336
|
-
|
|
337
|
-
### الخادم الخلفي يتعطل عند الإقلاع
|
|
338
|
-
|
|
339
|
-
يجب أن يكون MongoDB وRedis في حالة صحية قبل بدء تشغيل الخادم الخلفي. يستخدم ملف compose `depends_on` مع `condition: service_healthy`. إذا رأيت إعادات تشغيل متكررة للخادم الخلفي، تحقق من اجتياز فحوصات صحة `mongo` و`redis`:
|
|
340
|
-
|
|
341
|
-
```sh
|
|
342
|
-
docker compose ps
|
|
343
|
-
docker compose logs mongo
|
|
344
|
-
docker compose logs redis
|
|
345
|
-
```
|
|
346
|
-
|
|
347
|
-
ابحث عن `MongoDB connection error` بالقرب من أعلى السجل.
|
|
348
|
-
|
|
349
|
-
### لوحة التحكم لا تستطيع الوصول إلى API
|
|
350
|
-
|
|
351
|
-
تحقق من أن `VITE_BACKEND_URL` يطابق عنوان URL حيث يمكن الوصول إلى الخادم الخلفي من **المتصفح** (ليس شبكة Docker). إذا غيّرت منفذ الخادم الخلفي أو أضفت وكيلاً عكسياً، أعد بناء صورة لوحة التحكم:
|
|
352
|
-
|
|
353
|
-
### دلو MinIO مفقود
|
|
354
|
-
|
|
355
|
-
إذا لم تُشغَّل خدمة `minio-init` المؤقتة (أو شُغّلت قبل أن يكون MinIO جاهزاً)، أنشئ الدلو يدوياً:
|
|
356
|
-
|
|
357
|
-
```sh
|
|
358
|
-
docker compose run --rm minio-init
|
|
359
|
-
```
|
|
530
|
+
- **النطاقات المخصصة وإعادة تعيين المنافذ غير مدعومة بعد.** يتم تضمين جميع عناوين URL الخاصة بـ `VITE_*` الموجهة للمتصفح في لوحة التحكم أثناء وقت البناء، وتأتي الصور المنشورة (وتطبيق سطح المكتب) مع قيم `localhost` / Intlayer Cloud. يجب الوصول إلى لوحة التحكم على `http://localhost:3000`، والواجهة الخلفية على `:3100`، و MinIO على `:9000`. تتطلب الاستضافة على نطاق عام، أو توجيه تطبيق سطح المكتب إلى واجهة خلفية مستضافة ذاتيًا، إعادة البناء مع تضمين عناوين URL المستهدفة (باستخدام `--build-arg VITE_BACKEND_URL=… VITE_SITE_URL=… VITE_DOMAIN=…` في `docker/selfhost/Dockerfile`، أو عبر `docker-compose.build.yml`) وهذا غير مدعوم افتراضيًا.
|
|
531
|
+
- **يتطلب إرسال البريد الإلكتروني خادم بريد فعال.** يفرض إعداد التشغيل الأول التحقق من البريد الإلكتروني، لذلك يجب تكوين `RESEND_API_KEY` أو [مرحّل SMTP](#global-mailer) (`MAIL_SMTP_*`). بعد تسجيل دخول المسؤول الأول، يمكن لكل مؤسسة أيضًا تكوين خادم بريد SMTP أو Resend الخاص بها من لوحة التحكم.
|
|
532
|
+
- **يحتاج تطبيق سطح المكتب إلى Node.js على الجهاز لبدء خادمه المدمج.**
|
|
360
533
|
|
|
361
534
|
## روابط مفيدة
|
|
362
535
|
|
|
363
536
|
- [توثيق Intlayer CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/intlayer_CMS.md)
|
|
364
|
-
- [مرجع
|
|
365
|
-
- [CMS SDK
|
|
366
|
-
- [
|
|
537
|
+
- [مرجع التكوين](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/configuration.md)
|
|
538
|
+
- [CMS SDK: `@intlayer/api`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/intlayer_CMS.md#programmatic-access-with-the-intlayerapi-sdk)
|
|
539
|
+
- [إصدارات تطبيق سطح المكتب](https://github.com/aymericzip/intlayer/releases/latest)
|
|
540
|
+
- Docker Hub: [`intlayer/cms-all`](https://hub.docker.com/r/intlayer/cms-all)، [`intlayer/cms-frontend`](https://hub.docker.com/r/intlayer/cms-frontend)، [`intlayer/cms-backend`](https://hub.docker.com/r/intlayer/cms-backend)، مرآة GHCR: `ghcr.io/aymericzip/intlayer/`
|
|
541
|
+
- [`docker/selfhost/`](https://github.com/aymericzip/intlayer/tree/main/docker/selfhost): ملف Dockerfile، و `docker-compose.yml`، و `.env.template`
|