From ffba35047dfb1b5b47a8437a33e3e546c08c2dfe Mon Sep 17 00:00:00 2001 From: zzjin Date: Wed, 18 Oct 2023 14:54:52 +0800 Subject: [PATCH 1/3] Rename adminer label. (#4112) * Rename adminer label to check. Signed-off-by: zzjin * add one more label. Signed-off-by: zzjin --------- Signed-off-by: zzjin --- controllers/db/adminer/controllers/adminer_controller.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/controllers/db/adminer/controllers/adminer_controller.go b/controllers/db/adminer/controllers/adminer_controller.go index 7e929677081..9fe2ba070ba 100644 --- a/controllers/db/adminer/controllers/adminer_controller.go +++ b/controllers/db/adminer/controllers/adminer_controller.go @@ -552,7 +552,8 @@ func isExpired(adminer *adminerv1.Adminer) bool { func buildLabelsMap(adminer *adminerv1.Adminer) map[string]string { labelsMap := map[string]string{ - "AdminerID": adminer.Name, + "cloud.sealos.io/app-adminer": adminer.Name, + "app": adminer.Name, } return labelsMap } From b6ef21704fd8b59a9b4cb49f733e1bdffc5fd65e Mon Sep 17 00:00:00 2001 From: zhujingyang <72259332+zjy365@users.noreply.github.com> Date: Thu, 19 Oct 2023 01:16:15 -0500 Subject: [PATCH 2/3] feat: language automatic detection (#4114) Signed-off-by: jingyang <3161362058@qq.com> --- frontend/desktop/next-i18next.config.js | 2 +- frontend/desktop/src/pages/index.tsx | 2 ++ frontend/desktop/src/pages/license/index.tsx | 2 +- frontend/desktop/src/pages/signin.tsx | 1 + frontend/packages/client-sdk/src/master.ts | 2 +- frontend/providers/applaunchpad/next-i18next.config.js | 4 ++-- frontend/providers/applaunchpad/src/pages/_app.tsx | 4 ++-- frontend/providers/applaunchpad/src/utils/cookieUtils.ts | 2 +- frontend/providers/applaunchpad/src/utils/i18n.ts | 2 +- frontend/providers/costcenter/next-i18next.config.js | 6 +++--- frontend/providers/costcenter/src/stores/session.ts | 2 +- frontend/providers/cronjob/next-i18next.config.js | 4 ++-- frontend/providers/cronjob/src/pages/_app.tsx | 2 +- frontend/providers/cronjob/src/utils/cookieUtils.ts | 2 +- frontend/providers/cronjob/src/utils/i18n.ts | 2 +- frontend/providers/dbprovider/next-i18next.config.js | 6 +++--- frontend/providers/dbprovider/src/pages/_app.tsx | 2 +- frontend/providers/dbprovider/src/utils/cookieUtils.ts | 2 +- frontend/providers/dbprovider/src/utils/i18n.ts | 2 +- frontend/providers/license/next-i18next.config.js | 4 ++-- frontend/providers/license/src/pages/_app.tsx | 2 +- frontend/providers/license/src/utils/cookieUtils.ts | 2 +- frontend/providers/template/next-i18next.config.js | 6 +++--- frontend/providers/template/src/pages/_app.tsx | 2 +- frontend/providers/template/src/utils/cookieUtils.ts | 2 +- frontend/providers/template/src/utils/i18n.ts | 2 +- 26 files changed, 37 insertions(+), 34 deletions(-) diff --git a/frontend/desktop/next-i18next.config.js b/frontend/desktop/next-i18next.config.js index d148cb66119..32b25590a8d 100644 --- a/frontend/desktop/next-i18next.config.js +++ b/frontend/desktop/next-i18next.config.js @@ -4,7 +4,7 @@ module.exports = { i18n: { - defaultLocale: 'en', + defaultLocale: 'zh', locales: ['en', 'zh'], localeDetection: false } diff --git a/frontend/desktop/src/pages/index.tsx b/frontend/desktop/src/pages/index.tsx index 1c0140c97f5..e3a4b3e1103 100644 --- a/frontend/desktop/src/pages/index.tsx +++ b/frontend/desktop/src/pages/index.tsx @@ -107,6 +107,8 @@ export default function Home({ export async function getServerSideProps({ req, res, locales }: any) { const lang: string = req?.headers?.['accept-language'] || 'zh'; const local = lang.indexOf('zh') !== -1 ? 'zh' : 'en'; + res.setHeader('Set-Cookie', `NEXT_LOCALE=${local}; Max-Age=2592000; Secure; SameSite=None`); + const sealos_cloud_domain = process.env.SEALOS_CLOUD_DOMAIN || 'cloud.sealos.io'; return { diff --git a/frontend/desktop/src/pages/license/index.tsx b/frontend/desktop/src/pages/license/index.tsx index cd46ad14460..f5830010c14 100644 --- a/frontend/desktop/src/pages/license/index.tsx +++ b/frontend/desktop/src/pages/license/index.tsx @@ -65,7 +65,7 @@ export default function LicensePage() { } export async function getServerSideProps({ req, res, locales }: any) { - const local = req?.cookies?.NEXT_LOCALE || 'en'; + const local = req?.cookies?.NEXT_LOCALE || 'zh'; return { props: { diff --git a/frontend/desktop/src/pages/signin.tsx b/frontend/desktop/src/pages/signin.tsx index 5e88304d2a4..a50f4e28a7f 100644 --- a/frontend/desktop/src/pages/signin.tsx +++ b/frontend/desktop/src/pages/signin.tsx @@ -8,6 +8,7 @@ export default function SigninPage() { export async function getServerSideProps({ req, res, locales }: any) { const lang: string = req?.headers?.['accept-language'] || 'zh'; const local = lang.indexOf('zh') !== -1 ? 'zh' : 'en'; + res.setHeader('Set-Cookie', `NEXT_LOCALE=${local}; Max-Age=2592000; Secure; SameSite=None`); const props = { ...(await serverSideTranslations(local, undefined, null, locales || [])) diff --git a/frontend/packages/client-sdk/src/master.ts b/frontend/packages/client-sdk/src/master.ts index 2f6edabca7d..43b7744b926 100644 --- a/frontend/packages/client-sdk/src/master.ts +++ b/frontend/packages/client-sdk/src/master.ts @@ -194,7 +194,7 @@ class MasterSDK { messageId: data.messageId, success: true, data: { - lng: getCookie('NEXT_LOCALE') || 'en' + lng: getCookie('NEXT_LOCALE') || 'zh' } }); } else { diff --git a/frontend/providers/applaunchpad/next-i18next.config.js b/frontend/providers/applaunchpad/next-i18next.config.js index d7c4b3e9be7..1a032fe9ec2 100644 --- a/frontend/providers/applaunchpad/next-i18next.config.js +++ b/frontend/providers/applaunchpad/next-i18next.config.js @@ -5,8 +5,8 @@ module.exports = { i18n: { - defaultLocale: 'en', + defaultLocale: 'zh', locales: ['en', 'zh'], localeDetection: false } -}; +} diff --git a/frontend/providers/applaunchpad/src/pages/_app.tsx b/frontend/providers/applaunchpad/src/pages/_app.tsx index 2ff4909dd76..868eb7cfe56 100644 --- a/frontend/providers/applaunchpad/src/pages/_app.tsx +++ b/frontend/providers/applaunchpad/src/pages/_app.tsx @@ -99,7 +99,7 @@ const App = ({ Component, pageProps }: AppProps) => { }, [setScreenWidth]); useEffect(() => { - const changeI18n = async (data: any) => { + const changeI18n = async (data: { currentLanguage: string }) => { const lastLang = getLangStore(); const newLang = data.currentLanguage; if (lastLang !== newLang) { @@ -132,7 +132,7 @@ const App = ({ Component, pageProps }: AppProps) => { }, [router.pathname]); useEffect(() => { - const lang = getLangStore() || 'en'; + const lang = getLangStore() || 'zh'; i18n?.changeLanguage?.(lang); }, [refresh, router.pathname]); diff --git a/frontend/providers/applaunchpad/src/utils/cookieUtils.ts b/frontend/providers/applaunchpad/src/utils/cookieUtils.ts index 8eb61c6c988..be69f2aaf0a 100644 --- a/frontend/providers/applaunchpad/src/utils/cookieUtils.ts +++ b/frontend/providers/applaunchpad/src/utils/cookieUtils.ts @@ -1,6 +1,6 @@ import Cookies from 'js-cookie'; -export const LANG_KEY = 'NEXT_LOCALE_LANG'; +export const LANG_KEY = 'NEXT_LOCALE'; export const setLangStore = (value: string) => { return Cookies.set(LANG_KEY, value, { expires: 30, sameSite: 'None', secure: true }); diff --git a/frontend/providers/applaunchpad/src/utils/i18n.ts b/frontend/providers/applaunchpad/src/utils/i18n.ts index 8e6d1544ac0..703a65b0b0f 100644 --- a/frontend/providers/applaunchpad/src/utils/i18n.ts +++ b/frontend/providers/applaunchpad/src/utils/i18n.ts @@ -3,7 +3,7 @@ import { LANG_KEY } from './cookieUtils'; export const serviceSideProps = (content: any) => { return serverSideTranslations( - content.req.cookies[LANG_KEY] || 'en', + content.req.cookies[LANG_KEY] || 'zh', undefined, null, content.locales diff --git a/frontend/providers/costcenter/next-i18next.config.js b/frontend/providers/costcenter/next-i18next.config.js index 745f9f71e97..1a032fe9ec2 100644 --- a/frontend/providers/costcenter/next-i18next.config.js +++ b/frontend/providers/costcenter/next-i18next.config.js @@ -5,8 +5,8 @@ module.exports = { i18n: { - defaultLocale: 'en', - locales: ['en', 'zh', 'zh-Hans'], + defaultLocale: 'zh', + locales: ['en', 'zh'], localeDetection: false } -}; +} diff --git a/frontend/providers/costcenter/src/stores/session.ts b/frontend/providers/costcenter/src/stores/session.ts index 5a2c7c1a9ed..093764a2cd2 100644 --- a/frontend/providers/costcenter/src/stores/session.ts +++ b/frontend/providers/costcenter/src/stores/session.ts @@ -21,7 +21,7 @@ const useSessionStore = create()( persist( immer((set, get) => ({ session: {} as SessionV1, - locale: 'en', + locale: 'zh', setSession: (ss: SessionV1) => set({ session: ss }), setSessionProp: (key: keyof SessionV1, value: any) => { set((state) => { diff --git a/frontend/providers/cronjob/next-i18next.config.js b/frontend/providers/cronjob/next-i18next.config.js index d7c4b3e9be7..1a032fe9ec2 100644 --- a/frontend/providers/cronjob/next-i18next.config.js +++ b/frontend/providers/cronjob/next-i18next.config.js @@ -5,8 +5,8 @@ module.exports = { i18n: { - defaultLocale: 'en', + defaultLocale: 'zh', locales: ['en', 'zh'], localeDetection: false } -}; +} diff --git a/frontend/providers/cronjob/src/pages/_app.tsx b/frontend/providers/cronjob/src/pages/_app.tsx index 74464bf5f83..7121035ab89 100644 --- a/frontend/providers/cronjob/src/pages/_app.tsx +++ b/frontend/providers/cronjob/src/pages/_app.tsx @@ -121,7 +121,7 @@ function App({ Component, pageProps }: AppProps) { }, [router.pathname]); useEffect(() => { - const lang = getLangStore() || 'en'; + const lang = getLangStore() || 'zh'; i18n?.changeLanguage?.(lang); }, [refresh, router.asPath]); diff --git a/frontend/providers/cronjob/src/utils/cookieUtils.ts b/frontend/providers/cronjob/src/utils/cookieUtils.ts index 8eb61c6c988..be69f2aaf0a 100644 --- a/frontend/providers/cronjob/src/utils/cookieUtils.ts +++ b/frontend/providers/cronjob/src/utils/cookieUtils.ts @@ -1,6 +1,6 @@ import Cookies from 'js-cookie'; -export const LANG_KEY = 'NEXT_LOCALE_LANG'; +export const LANG_KEY = 'NEXT_LOCALE'; export const setLangStore = (value: string) => { return Cookies.set(LANG_KEY, value, { expires: 30, sameSite: 'None', secure: true }); diff --git a/frontend/providers/cronjob/src/utils/i18n.ts b/frontend/providers/cronjob/src/utils/i18n.ts index 8e6d1544ac0..703a65b0b0f 100644 --- a/frontend/providers/cronjob/src/utils/i18n.ts +++ b/frontend/providers/cronjob/src/utils/i18n.ts @@ -3,7 +3,7 @@ import { LANG_KEY } from './cookieUtils'; export const serviceSideProps = (content: any) => { return serverSideTranslations( - content.req.cookies[LANG_KEY] || 'en', + content.req.cookies[LANG_KEY] || 'zh', undefined, null, content.locales diff --git a/frontend/providers/dbprovider/next-i18next.config.js b/frontend/providers/dbprovider/next-i18next.config.js index 745f9f71e97..1a032fe9ec2 100644 --- a/frontend/providers/dbprovider/next-i18next.config.js +++ b/frontend/providers/dbprovider/next-i18next.config.js @@ -5,8 +5,8 @@ module.exports = { i18n: { - defaultLocale: 'en', - locales: ['en', 'zh', 'zh-Hans'], + defaultLocale: 'zh', + locales: ['en', 'zh'], localeDetection: false } -}; +} diff --git a/frontend/providers/dbprovider/src/pages/_app.tsx b/frontend/providers/dbprovider/src/pages/_app.tsx index e0885154472..ffb2294bbf1 100644 --- a/frontend/providers/dbprovider/src/pages/_app.tsx +++ b/frontend/providers/dbprovider/src/pages/_app.tsx @@ -126,7 +126,7 @@ function App({ Component, pageProps }: AppProps) { }, [router.pathname]); useEffect(() => { - const lang = getLangStore() || 'en'; + const lang = getLangStore() || 'zh'; i18n?.changeLanguage?.(lang); }, [refresh, router.asPath]); diff --git a/frontend/providers/dbprovider/src/utils/cookieUtils.ts b/frontend/providers/dbprovider/src/utils/cookieUtils.ts index 8eb61c6c988..be69f2aaf0a 100644 --- a/frontend/providers/dbprovider/src/utils/cookieUtils.ts +++ b/frontend/providers/dbprovider/src/utils/cookieUtils.ts @@ -1,6 +1,6 @@ import Cookies from 'js-cookie'; -export const LANG_KEY = 'NEXT_LOCALE_LANG'; +export const LANG_KEY = 'NEXT_LOCALE'; export const setLangStore = (value: string) => { return Cookies.set(LANG_KEY, value, { expires: 30, sameSite: 'None', secure: true }); diff --git a/frontend/providers/dbprovider/src/utils/i18n.ts b/frontend/providers/dbprovider/src/utils/i18n.ts index 8e6d1544ac0..703a65b0b0f 100644 --- a/frontend/providers/dbprovider/src/utils/i18n.ts +++ b/frontend/providers/dbprovider/src/utils/i18n.ts @@ -3,7 +3,7 @@ import { LANG_KEY } from './cookieUtils'; export const serviceSideProps = (content: any) => { return serverSideTranslations( - content.req.cookies[LANG_KEY] || 'en', + content.req.cookies[LANG_KEY] || 'zh', undefined, null, content.locales diff --git a/frontend/providers/license/next-i18next.config.js b/frontend/providers/license/next-i18next.config.js index d7c4b3e9be7..1a032fe9ec2 100644 --- a/frontend/providers/license/next-i18next.config.js +++ b/frontend/providers/license/next-i18next.config.js @@ -5,8 +5,8 @@ module.exports = { i18n: { - defaultLocale: 'en', + defaultLocale: 'zh', locales: ['en', 'zh'], localeDetection: false } -}; +} diff --git a/frontend/providers/license/src/pages/_app.tsx b/frontend/providers/license/src/pages/_app.tsx index abc63550c10..d19d2bd86f5 100644 --- a/frontend/providers/license/src/pages/_app.tsx +++ b/frontend/providers/license/src/pages/_app.tsx @@ -121,7 +121,7 @@ function App({ Component, pageProps }: AppProps) { }, [router.pathname]); useEffect(() => { - const lang = getLangStore() || 'en'; + const lang = getLangStore() || 'zh'; i18n?.changeLanguage?.(lang); }, [refresh, router.asPath]); diff --git a/frontend/providers/license/src/utils/cookieUtils.ts b/frontend/providers/license/src/utils/cookieUtils.ts index 8eb61c6c988..be69f2aaf0a 100644 --- a/frontend/providers/license/src/utils/cookieUtils.ts +++ b/frontend/providers/license/src/utils/cookieUtils.ts @@ -1,6 +1,6 @@ import Cookies from 'js-cookie'; -export const LANG_KEY = 'NEXT_LOCALE_LANG'; +export const LANG_KEY = 'NEXT_LOCALE'; export const setLangStore = (value: string) => { return Cookies.set(LANG_KEY, value, { expires: 30, sameSite: 'None', secure: true }); diff --git a/frontend/providers/template/next-i18next.config.js b/frontend/providers/template/next-i18next.config.js index 745f9f71e97..1a032fe9ec2 100644 --- a/frontend/providers/template/next-i18next.config.js +++ b/frontend/providers/template/next-i18next.config.js @@ -5,8 +5,8 @@ module.exports = { i18n: { - defaultLocale: 'en', - locales: ['en', 'zh', 'zh-Hans'], + defaultLocale: 'zh', + locales: ['en', 'zh'], localeDetection: false } -}; +} diff --git a/frontend/providers/template/src/pages/_app.tsx b/frontend/providers/template/src/pages/_app.tsx index 6dc9dfb95cf..dd646aae60d 100644 --- a/frontend/providers/template/src/pages/_app.tsx +++ b/frontend/providers/template/src/pages/_app.tsx @@ -113,7 +113,7 @@ const App = ({ Component, pageProps, domain }: AppProps & { domain: string }) => }, [router.pathname]); useEffect(() => { - const lang = getLangStore() || 'en'; + const lang = getLangStore() || 'zh'; i18n?.changeLanguage?.(lang); }, [refresh, router.pathname]); diff --git a/frontend/providers/template/src/utils/cookieUtils.ts b/frontend/providers/template/src/utils/cookieUtils.ts index 8eb61c6c988..be69f2aaf0a 100644 --- a/frontend/providers/template/src/utils/cookieUtils.ts +++ b/frontend/providers/template/src/utils/cookieUtils.ts @@ -1,6 +1,6 @@ import Cookies from 'js-cookie'; -export const LANG_KEY = 'NEXT_LOCALE_LANG'; +export const LANG_KEY = 'NEXT_LOCALE'; export const setLangStore = (value: string) => { return Cookies.set(LANG_KEY, value, { expires: 30, sameSite: 'None', secure: true }); diff --git a/frontend/providers/template/src/utils/i18n.ts b/frontend/providers/template/src/utils/i18n.ts index 8e6d1544ac0..703a65b0b0f 100644 --- a/frontend/providers/template/src/utils/i18n.ts +++ b/frontend/providers/template/src/utils/i18n.ts @@ -3,7 +3,7 @@ import { LANG_KEY } from './cookieUtils'; export const serviceSideProps = (content: any) => { return serverSideTranslations( - content.req.cookies[LANG_KEY] || 'en', + content.req.cookies[LANG_KEY] || 'zh', undefined, null, content.locales From 00726c66bb59be88fe8bcc41a844e1ab3ab50cea Mon Sep 17 00:00:00 2001 From: Jiahui <4543bxy@gmail.com> Date: Thu, 19 Oct 2023 16:23:50 +0800 Subject: [PATCH 3/3] Fix/cloud scripts (#4115) * optimize prompt; optimize pull image before; * optimize install.sh fix controller TARGETARCH --- .github/workflows/controllers.yml | 4 +- scripts/cloud/install.sh | 121 +++++++++++++++++++----------- 2 files changed, 79 insertions(+), 46 deletions(-) diff --git a/.github/workflows/controllers.yml b/.github/workflows/controllers.yml index 835b3a3254d..44576355271 100644 --- a/.github/workflows/controllers.yml +++ b/.github/workflows/controllers.yml @@ -103,14 +103,14 @@ jobs: - name: Build ${{ matrix.module.name }} amd64 working-directory: controllers/${{ matrix.module.path }} run: | - GOARCH=amd64 make build + GOARCH=amd64 TARGETARCH=amd64 make build mv bin/manager bin/controller-${{ matrix.module.name }}-amd64 chmod +x bin/controller-${{ matrix.module.name }}-amd64 - name: Build ${{ matrix.module.name }} arm64 working-directory: controllers/${{ matrix.module.path }} run: | - GOARCH=arm64 make build + GOARCH=arm64 TARGETARCH=arm64 make build mv bin/manager bin/controller-${{ matrix.module.name }}-arm64 chmod +x bin/controller-${{ matrix.module.name }}-arm64 diff --git a/scripts/cloud/install.sh b/scripts/cloud/install.sh index ea0395a39da..91e280e1b17 100644 --- a/scripts/cloud/install.sh +++ b/scripts/cloud/install.sh @@ -5,7 +5,7 @@ set -e # Configurations CLOUD_DIR="/root/.sealos/cloud" SEALOS_VERSION="v4.3.5" -CLOUD_VERSION="v0.0.1" +CLOUD_VERSION="latest" #mongodb_version="mongodb-5.0" #master_ips= #node_ips= @@ -18,6 +18,7 @@ CLOUD_VERSION="v0.0.1" #input_cert= #cert_path= #key_path= +#local_install=y/n kubernetes_version=1.25.6 cilium_version=1.12.14 cert_manager_version=1.8.0 @@ -33,8 +34,10 @@ metrics_server_version=0.6.4 declare -A PROMPTS_EN PROMPTS_CN PROMPTS_EN=( + ["pre_prompt"]="Depends on iptables, please make sure iptables is installed, multi-node needs to configure ssh password-free login or the same password, using self-signed certificate to complete the installation requires self-trust certificate" + ["pull_image"]="Pulling images" ["install_sealos"]="Sealos CLI is not installed. Do you want to install it now? (y/n): " - ["input_master_ips"]="Please enter Master IPs (comma separated, at least one required): " + ["input_master_ips"]="Please enter Master IPs (press Enter to skip this step for local installation; comma separated for multiple master nodes, e.g: 192.168.0.1,192.168.0.2,192.168.0.3)" ["invalid_ips"]="Invalid IPs or no IPs provided. Please try again." ["input_node_ips"]="Please enter Node IPs (comma separated, leave empty if none): " ["pod_subnet"]="Please enter pod subnet (default: 100.64.0.0/10): " @@ -48,7 +51,7 @@ PROMPTS_EN=( ["enter_choice"]="Enter your choice (1/2): " ["k8s_installation"]="Installing Kubernetes cluster." ["ingress_installation"]="Installing ingress-nginx-controller and kubeblocks." - ["patching_ingress"]="Patching ingress-nginx-controller tolerations to allow it to run on master node. If you don't want it to run on master node, please skip this step." + ["patching_ingress"]="Patching ingress-nginx-controller tolerations to allow it to run on master node." ["installing_cloud"]="Installing sealos cloud." ["avx_not_supported"]="CPU does not support AVX instructions" ["ssh_private_key"]="Please configure the ssh private key path, press Enter to use the default value '/root/.ssh/id_rsa' " @@ -61,31 +64,33 @@ Linux kernel >= 4.19.57 or equivalent (e.g., 4.18 on RHEL8)" ) PROMPTS_CN=( + ["pre_prompt"]="依赖iptables,请确保iptables已经安装,多节点需要配置ssh免密登录或密码一致, 使用自签证书安装完成后需要自信任证书" + ["pull_image"]="正在拉取镜像" ["install_sealos"]="Sealos CLI没有安装,是否安装?(y/n): " - ["input_master_ips"]="请输入Master IPs (多个master节点使用逗号分隔, 例:192.168.0.1,192.168.0.2,192.168.0.3) \n" + ["input_master_ips"]="请输入Master IPs (单节点本地安装可回车跳过该步骤;多个master节点使用逗号分隔, 例: 192.168.0.1,192.168.0.2,192.168.0.3): " ["invalid_ips"]="IP无效或没有提供IP,请再试一次。" ["input_node_ips"]="请输入Node IPs (多个node节点使用逗号分隔,可跳过): " ["pod_subnet"]="请输入pod子网 (回车使用默认值: 100.64.0.0/10): " ["service_subnet"]="请输入service子网 (回车使用默认值: 10.96.0.0/22): " - ["cloud_domain"]="请输入云域名:(例:127.0.0.1.nip.io) \n " + ["cloud_domain"]="请输入云域名:(例:127.0.0.1.nip.io) " ["cloud_port"]="请输入云端口 (回车使用默认值: 443): " - ["input_certificate"]="您要输入证书吗?(y/n): " + ["input_certificate"]="请输入证书吗?(y/n): " ["certificate_path"]="请输入证书路径: " ["private_key_path"]="请输入私钥路径: " - ["choose_language"]="选择语言:" + ["choose_language"]="请选择语言:" ["enter_choice"]="请输入您的选择 (1/2): " ["k8s_installation"]="正在安装Kubernetes集群。" ["ingress_installation"]="正在安装ingress-nginx-controller和kubeblocks。" - ["patching_ingress"]="正在修改ingress-nginx-controller的容忍度,以允许它在主节点上运行。如果您不希望它在主节点上运行,请跳过此步骤。" + ["patching_ingress"]="正在修改ingress-nginx-controller的容忍度,以允许它在主节点上运行。" ["installing_cloud"]="正在安装sealos cloud。" ["avx_not_supported"]="CPU不支持AVX指令" ["ssh_private_key"]="如需免密登录请配置ssh私钥路径,回车使用默认值'/root/.ssh/id_rsa' " - ["ssh_password"]="请输入ssh密码,配置免密登录可回车跳过\n" + ["ssh_password"]="请输入ssh密码,配置免密登录可回车跳过" ["wait_cluster_ready"]="正在等待集群就绪, 如果您想跳过此步骤,请输入'1'" - ["cilium_requirement"]="正在使用Cilium作为网络插件,主机系统必须满足以下要求: + ["cilium_requirement"]="正在使用Cilium作为网络插件,主机系统必须满足以下要求: 具有AMD64或AArch64架构的主机 Linux内核> = 4.19.57或等效版本(例如,在RHEL8上为4.18)" - ["mongo_avx_requirement"]="MongoDB 5.0版本依赖支持 AVX 指令集的 CPU,当前环境不支持avx,所以仅可使用mongo4.0版本,更多信息查看:https://www.mongodb.com/docs/v5.0/administration/production-notes/" + ["mongo_avx_requirement"]="MongoDB 5.0版本依赖支持 AVX 指令集的 CPU,当前环境不支持avx,所以仅可使用mongo4.0版本,更多信息查看:https://www.mongodb.com/docs/v5.0/administration/production-notes/" ) # Choose Language @@ -102,6 +107,7 @@ get_prompt "choose_language" echo "1. English" echo "2. 中文" read -p "$(get_prompt "enter_choice")" lang_choice +echo -ne "\033[4F\033[2K" if [[ $lang_choice == "2" ]]; then LANGUAGE="CN" @@ -111,11 +117,13 @@ fi #TODO mongo 5.0 need avx support, if not support, change to 4.0 setMongoVersion() { - grep avx /proc/cpuinfo > /dev/null + set +e + grep avx /proc/cpuinfo > /dev/null 2>&1 if [ $? -ne 0 ]; then get_prompt "mongo_avx_requirement" mongodb_version="mongodb-4.0" fi + set -e } # Initialization @@ -136,6 +144,19 @@ init() { else echo "Sealos CLI is already installed." fi + + get_prompt "pre_prompt" + get_prompt "pull_image" + sealos pull -q docker.io/labring/kubernetes:v${kubernetes_version#v:-1.25.6} >/dev/null + sealos pull -q docker.io/labring/cilium:v${cilium_version#v:-1.12.14} >/dev/null + sealos pull -q docker.io/labring/cert-manager:v${cert_manager_version#v:-1.8.0} >/dev/null + sealos pull -q docker.io/labring/helm:v${helm_version#v:-3.12.0} >/dev/null + sealos pull -q docker.io/labring/openebs:v${openebs_version#v:-3.4.0} >/dev/null + sealos pull -q docker.io/labring/ingress-nginx:v${ingress_nginx_version#v:-1.5.1} >/dev/null + sealos pull -q docker.io/labring/kubeblocks:v${kubeblocks_version#v:-0.6.2} >/dev/null + sealos pull -q docker.io/labring/metrics-server:v${metrics_server_version#v:-0.6.4} >/dev/null + sealos pull -q docker.io/labring/kubernetes-reflector:v${reflector_version#v:-7.0.151} >/dev/null + sealos pull -q docker.io/labring/sealos-cloud:${CLOUD_VERSION} >/dev/null } collect_input() { @@ -151,35 +172,52 @@ collect_input() { } # Master and Node IPs - while :; do - read -p "$(get_prompt "input_master_ips")" master_ips - if validate_ips "$master_ips" && [[ ! -z "$master_ips" ]]; then - break - else - get_prompt "invalid_ips" - fi - done - while :; do - read -p "$(get_prompt "input_node_ips")" node_ips - if validate_ips "$node_ips"; then - break - else - get_prompt "invalid_ips" + if [[ $local_install != "y" ]]; then + while :; do + read -p "$(get_prompt "input_master_ips")" master_ips + if validate_ips "$master_ips"; then + if [[ -z "$master_ips" ]]; then + local_install="y" + fi + break + else + get_prompt "invalid_ips" + fi + done + fi + if [[ $local_install != "y" ]]; then + while :; do + read -p "$(get_prompt "input_node_ips")" node_ips + if validate_ips "$node_ips"; then + break + else + get_prompt "invalid_ips" + fi + done + read -p "$(get_prompt "ssh_private_key")" ssh_private_key + + if [[ -z "$ssh_private_key" ]]; then + ssh_private_key="${HOME}/.ssh/id_rsa" fi - done - read -p "$(get_prompt "ssh_private_key")" ssh_private_key - if [[ -z "$ssh_private_key" ]]; then - ssh_private_key="${HOME}/.ssh/id_rsa" + read -p "$(get_prompt "ssh_password")" ssh_password + fi - read -p "$(get_prompt "ssh_password")" ssh_password + read -p "$(get_prompt "pod_subnet")" pod_cidr + read -p "$(get_prompt "service_subnet")" service_cidr + read -p "$(get_prompt "cloud_domain")" cloud_domain + read -p "$(get_prompt "cloud_port")" cloud_port + read -p "$(get_prompt "input_certificate")" input_cert + if [[ $input_cert == "y" || $input_cert == "Y" ]]; then read -p "$(get_prompt "certificate_path")" cert_path + read -p "$(get_prompt "private_key_path")" key_path + fi } @@ -227,17 +265,13 @@ spec: " echo "$ingress_config" > $CLOUD_DIR/ingress-nginx-config.yaml - echo "master_ips= ${master_ips}" sealos_gen_cmd="sealos gen labring/kubernetes:v${kubernetes_version#v:-1.25.6}\ - --masters $master_ips\ + ${master_ips:+--masters $master_ips}\ + ${node_ips:+--nodes $node_ips}\ --pk=${ssh_private_key:-$HOME/.ssh/id_rsa}\ --passwd=${ssh_password} -o $CLOUD_DIR/Clusterfile" - if [ -n "$node_ips" ]; then - sealos_gen_cmd+=" --nodes $node_ips" - fi - - command -v kubelet || $sealos_gen_cmd + command -v kubelet > /dev/null 2>&1 || $sealos_gen_cmd # Modify Clusterfile with sed sed -i "s|100.64.0.0/10|${pod_cidr:-100.64.0.0/10}|g" $CLOUD_DIR/Clusterfile @@ -274,17 +308,16 @@ loading_animation() { } execute_commands() { - get_prompt "k8s_installation" - command -v kubelet || sealos apply -f $CLOUD_DIR/Clusterfile - command -v helm || sealos run "labring/helm:v${helm_version#v:-3.12.0}" + command -v kubelet > /dev/null 2>&1 || (get_prompt "k8s_installation" && sealos apply -f $CLOUD_DIR/Clusterfile) + command -v helm > /dev/null 2>&1 || sealos run "labring/helm:v${helm_version#v:-3.12.0}" get_prompt "cilium_requirement" - if kubectl get no | grep NotReady &>/dev/null; then + if kubectl get no | grep NotReady > /dev/null 2>&1; then sealos run "labring/cilium:v${cilium_version#v:-1.12.14}" fi wait_cluster_ready sealos run "labring/cert-manager:v${cert_manager_version#v:-1.8.0}" sealos run "labring/openebs:v${openebs_version#v:-3.4.0}" - kubectl create -f - < /dev/null 2>&1 || kubectl create -f - < /dev/null 2>&1 || collect_input prepare_configs execute_commands