feat: add ops center and node onboarding flow

This commit is contained in:
Your Name
2026-04-18 23:52:51 +08:00
parent 246838ae4c
commit b9c29481b5
142 changed files with 89727 additions and 186 deletions

View File

@@ -0,0 +1,135 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
TEMPLATE_PATH="${SCRIPT_DIR}/templates/domaincheck-ops-center.env.example"
usage() {
cat <<'EOF'
usage:
bash domain-api/deploy/multi-region/init_ops_center_config.sh \
[config_path] [mainland_api_base_url] [overseas_api_base_url] [control_plane_base_url]
examples:
bash domain-api/deploy/multi-region/init_ops_center_config.sh
bash domain-api/deploy/multi-region/init_ops_center_config.sh /etc/default/domaincheck-ops-center \
http://121.204.244.188:8100 \
http://152.53.37.118:8100 \
https://api.example.com
notes:
- existing config files are preserved unless FORCE=true
- advanced fields can be overridden with env vars:
OPS_ACTIVE_PROFILE
OPS_PROFILE_NAMES
OPS_DEFAULT_REQUESTED_BY
OPS_DEFAULT_ISSUED_BY
OPS_DEFAULT_EXPIRES_IN_HOURS
OPS_DEFAULT_ROOT_DIR
OPS_REPORT_ROOT
EOF
}
if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
usage
exit 0
fi
TARGET_PATH="${1:-/etc/default/domaincheck-ops-center}"
MAINLAND_API_BASE_URL="${2:-${OPS_MAINLAND_API_BASE_URL:-http://127.0.0.1:8100}}"
OVERSEAS_API_BASE_URL="${3:-${OPS_OVERSEAS_API_BASE_URL:-http://127.0.0.1:8100}}"
CONTROL_PLANE_BASE_URL="${4:-${OPS_DEFAULT_CONTROL_PLANE_BASE_URL:-}}"
ACTIVE_PROFILE="${OPS_ACTIVE_PROFILE:-default}"
PROFILE_NAMES="${OPS_PROFILE_NAMES:-${ACTIVE_PROFILE}}"
DEFAULT_REQUESTED_BY="${OPS_DEFAULT_REQUESTED_BY:-cli/ops-center}"
DEFAULT_ISSUED_BY="${OPS_DEFAULT_ISSUED_BY:-ops-center}"
DEFAULT_EXPIRES_IN_HOURS="${OPS_DEFAULT_EXPIRES_IN_HOURS:-72}"
DEFAULT_ROOT_DIR="${OPS_DEFAULT_ROOT_DIR:-/opt/domaincheck}"
REPORT_ROOT="${OPS_REPORT_ROOT:-}"
NODE_AGENT_SERVICE_NAME="${OPS_NODE_AGENT_SERVICE_NAME:-domaincheck-node-agent}"
NODE_AGENT_ENV_FILE="${OPS_NODE_AGENT_ENV_FILE:-/etc/default/domaincheck-node-agent}"
FORCE_WRITE="${FORCE:-false}"
if [[ ! -f "${TEMPLATE_PATH}" ]]; then
echo "template not found: ${TEMPLATE_PATH}" >&2
exit 1
fi
mkdir -p "$(dirname "${TARGET_PATH}")"
if [[ ! -f "${TARGET_PATH}" || "${FORCE_WRITE}" == "true" ]]; then
cp "${TEMPLATE_PATH}" "${TARGET_PATH}"
fi
upsert_key() {
local key="$1"
local value="$2"
if grep -q "^${key}=" "${TARGET_PATH}"; then
sed -i "s#^${key}=.*#${key}=${value}#" "${TARGET_PATH}"
else
printf '%s=%s\n' "${key}" "${value}" >>"${TARGET_PATH}"
fi
}
upsert_commented_key() {
local key="$1"
local value="$2"
if [[ -z "${value}" ]]; then
return 0
fi
upsert_key "${key}" "${value}"
}
upsert_key "OPS_ACTIVE_PROFILE" "${ACTIVE_PROFILE}"
upsert_key "OPS_PROFILE_NAMES" "${PROFILE_NAMES}"
upsert_key "OPS_MAINLAND_API_BASE_URL" "${MAINLAND_API_BASE_URL}"
upsert_key "OPS_OVERSEAS_API_BASE_URL" "${OVERSEAS_API_BASE_URL}"
upsert_key "OPS_DEFAULT_CONTROL_PLANE_BASE_URL" "${CONTROL_PLANE_BASE_URL}"
upsert_key "OPS_DEFAULT_REQUESTED_BY" "${DEFAULT_REQUESTED_BY}"
upsert_key "OPS_DEFAULT_ISSUED_BY" "${DEFAULT_ISSUED_BY}"
upsert_key "OPS_DEFAULT_EXPIRES_IN_HOURS" "${DEFAULT_EXPIRES_IN_HOURS}"
upsert_key "OPS_DEFAULT_ROOT_DIR" "${DEFAULT_ROOT_DIR}"
upsert_key "OPS_NODE_AGENT_SERVICE_NAME" "${NODE_AGENT_SERVICE_NAME}"
upsert_key "OPS_NODE_AGENT_ENV_FILE" "${NODE_AGENT_ENV_FILE}"
upsert_commented_key "OPS_REPORT_ROOT" "${REPORT_ROOT}"
python3 - <<'PY' "${TARGET_PATH}"
import json
import sys
from pathlib import Path
config_path = Path(sys.argv[1])
keys = [
"OPS_ACTIVE_PROFILE",
"OPS_PROFILE_NAMES",
"OPS_MAINLAND_API_BASE_URL",
"OPS_OVERSEAS_API_BASE_URL",
"OPS_DEFAULT_CONTROL_PLANE_BASE_URL",
"OPS_DEFAULT_REQUESTED_BY",
"OPS_DEFAULT_ISSUED_BY",
"OPS_DEFAULT_EXPIRES_IN_HOURS",
"OPS_DEFAULT_ROOT_DIR",
"OPS_NODE_AGENT_SERVICE_NAME",
"OPS_NODE_AGENT_ENV_FILE",
"OPS_REPORT_ROOT",
]
values = {}
for line in config_path.read_text(encoding="utf-8").splitlines():
if not line or line.startswith("#") or "=" not in line:
continue
key, value = line.split("=", 1)
if key in keys:
values[key] = value
print(json.dumps({
"ok": True,
"config_path": str(config_path),
"summary": values,
"next_commands": [
"bash domain-api/deploy/multi-region/drive_ops_center.sh config",
"bash domain-api/deploy/multi-region/drive_ops_center.sh doctor-export",
"bash domain-api/deploy/multi-region/drive_ops_center.sh agent-check",
],
}, ensure_ascii=False, indent=2))
PY