proposal/design/en/helm-globals.md
Your design can be split into two clear tracks:
ConfigMap: solves runtime read/injection for entrypoint.sh.globals.yaml: solves horizontal Helm values aggregation and unified feature switches.These two tracks are not replacements; they are layered:
globals.yaml handles declarative aggregation.ConfigMap handles runtime injection/discovery.Current configuration has two different dimensions:
entrypoint.sh scripts need a consistent place to read base parameters (for example sealos-config).Goal: serve entrypoint.sh and ensure modules can auto-read runtime parameters during install/upgrade.
Typical flow:
entrypoint.sh reads params via kubectl get configmap.--set-string args or environment variables.Typical sources already used:
sealos-config: base platform params (domain/port/region/db/jwt/salt)cert-config: certificate modenm-agent-config: traffic Mongo entryobjectstorage-config: object storage account entrysealos-cloud-admin: initial admin password storageGoal: aggregate horizontal feature configs and unify multi-module switches/defaults.
Typical flow:
/root/.sealos/cloud/values/globals.yaml.globals.yaml via yq.globals file for horizontal features.feature_gates + feature_configs.gpu_hami, online_ide, import_ide, gitea_template, nfs./root/.sealos/cloud/values/globals.yaml/root/.sealos/cloud/values/core/<module>-values.yaml/root/.sealos/cloud/values/apps/devbox/xxx.yamlsealos-config usage needs one shared contract (fields, precedence, fallback logic).yq to parse globals.yaml.globals.yaml Draft (v1)globals:
version: v1alpha1
feature_gates:
gpu_hami: false
online_ide: true
import_ide: false
gitea_template: false
nfs: false
feature_configs:
gpu_hami:
webui_config_map: hami-webui-config
namespace: sealos-system
online_ide:
startup_config_map: devbox-startup
registry_config_map: devbox-config
namespace: sealos-system
import_ide:
enabled_sources: ["git", "tar", "registry"]
max_package_size_mb: 2048
gitea_template:
endpoint: ""
org: "templates"
repo: "sealos-templates"
branch: "main"
nfs:
storage_class: "nfs-client"
provisioner: ""
mount_options: []
charts/<module>/values.yaml/root/.sealos/cloud/values/globals.yaml/root/.sealos/cloud/values/apps/<module>/*-values.yaml (optional)/root/.sealos/cloud/values/core/<module>-values.yamlHELM_OPTIONS/--set/--set-string/root/.sealos/cloud/values/core/<module>-values.yaml/root/.sealos/cloud/values/apps/<module>/*-values.yaml/root/.sealos/cloud/values/globals.yamlcharts/<module>/values.yamlglobals.feature_gates.<feature> first.false, ignore feature_configs.<feature> and module-local same-name switches.true, merge feature config into module values.Example A: entrypoint.sh reads base variables from sealos-config
varCloudDomain=$(kubectl get configmap sealos-config -n sealos-system -o jsonpath='{.data.cloudDomain}')
varCloudPort=$(kubectl get configmap sealos-config -n sealos-system -o jsonpath='{.data.cloudPort}')
varRegionUID=$(kubectl get configmap sealos-config -n sealos-system -o jsonpath='{.data.regionUID}')
varDatabaseGlobalCockroachdbURI=$(kubectl get configmap sealos-config -n sealos-system -o jsonpath='{.data.databaseGlobalCockroachdbURI}')
varDatabaseLocalCockroachdbURI=$(kubectl get configmap sealos-config -n sealos-system -o jsonpath='{.data.databaseLocalCockroachdbURI}')
varDatabaseMongodbURI=$(kubectl get configmap sealos-config -n sealos-system -o jsonpath='{.data.databaseMongodbURI}')
varPasswordSalt=$(kubectl get configmap sealos-config -n sealos-system -o jsonpath='{.data.passwordSalt}')
varJwtInternal=$(kubectl get configmap sealos-config -n sealos-system -o jsonpath='{.data.jwtInternal}')
varJwtRegional=$(kubectl get configmap sealos-config -n sealos-system -o jsonpath='{.data.jwtRegional}')
varJwtGlobal=$(kubectl get configmap sealos-config -n sealos-system -o jsonpath='{.data.jwtGlobal}')
Example B: read globals using yq (yq path: ~/.sealos/cloud/bin/yq)
YQ_BIN="${HOME}/.sealos/cloud/bin/yq"
GLOBALS_FILE="/root/.sealos/cloud/values/globals.yaml"
# Read switch: globals.feature_gates.gpu_hami
gpuHamiEnabled=$("${YQ_BIN}" e -r '.globals.feature_gates.gpu_hami // false' "${GLOBALS_FILE}")
# Read parameter: globals.feature_configs.nfs.storage_class
nfsStorageClass=$("${YQ_BIN}" e -r '.globals.feature_configs.nfs.storage_class // "nfs-client"' "${GLOBALS_FILE}")
# Read parameter: globals.feature_configs.online_ide.startup_config_map
onlineIDEStartupCM=$("${YQ_BIN}" e -r '.globals.feature_configs.online_ide.startup_config_map // "devbox-startup"' "${GLOBALS_FILE}")
Multiple styles currently coexist:
charts/${MODULE_PATH}/values.yamlcharts/${MODULE_PATH}-controller/values.yamlcharts/${MODULE_PATH}-frontend/values.yamlNext step should unify naming rules (at least one consistent "module + role suffix" convention) and provide one module-to-chart-path mapping table as the single source of truth for scripts and docs.