refactor: config/apps 目录重组、文档重构、架构图收窄

- 中央:config/(prometheus,alertmanager,grafana)、apps/(tile-cache,topology-editor)
- 边缘:config/(vmagent,blackbox,targets)、apps/(onvif-exporter)
- env: TRAEFIK_PROVIDER、prometheus/env.example 详细说明
- 文档:README/doc 重构,EDGE_CACHE 合并到 EDGE_AGENT_CONFIG
- targets.csv 更新流程说明,ARCHITECTURE 图收窄

Made-with: Cursor
This commit is contained in:
2026-02-28 22:05:43 -05:00
parent 650e5145f1
commit ab1515dffb
48 changed files with 2071 additions and 509 deletions

View File

@@ -45,6 +45,36 @@ PROMETHEUS_REMOTE_WRITE_CAPACITY=${PROMETHEUS_REMOTE_WRITE_CAPACITY:-20000}
PROMETHEUS_REMOTE_WRITE_MAX_SHARDS=${PROMETHEUS_REMOTE_WRITE_MAX_SHARDS:-10}
GRAFANA_DEFAULT_LANGUAGE=${GRAFANA_DEFAULT_LANGUAGE:-zh-Hans}
GRAFANA_DEFAULT_THEME=${GRAFANA_DEFAULT_THEME:-light}
TRAEFIK_PROVIDER=${TRAEFIK_PROVIDER:-external}
# 根据 TRAEFIK_ENABLED 与 TRAEFIK_PROVIDER 设置网络
if [ "${TRAEFIK_ENABLED:-false}" = "true" ]; then
case "${TRAEFIK_PROVIDER}" in
internal)
export NETWORK_NAME=${NETWORK_NAME:-central_default}
export EXTERNAL_NETWORK=${EXTERNAL_NETWORK:-false}
export TRAEFIK_NETWORK=${TRAEFIK_NETWORK:-central_default}
export COMPOSE_PROFILES="${COMPOSE_PROFILES:-},traefik-internal"
export COMPOSE_PROFILES="${COMPOSE_PROFILES#,}"
;;
external)
export NETWORK_NAME=${NETWORK_NAME:-traefik}
export EXTERNAL_NETWORK=${EXTERNAL_NETWORK:-true}
export TRAEFIK_NETWORK=${TRAEFIK_NETWORK:-traefik}
;;
*)
echo "⚠️ TRAEFIK_PROVIDER 应为 internal 或 external当前为 ${TRAEFIK_PROVIDER}"
export NETWORK_NAME=${NETWORK_NAME:-traefik}
export EXTERNAL_NETWORK=${EXTERNAL_NETWORK:-true}
export TRAEFIK_NETWORK=${TRAEFIK_NETWORK:-traefik}
;;
esac
else
# 不使用 Traefik使用 compose 默认网络,直连端口访问
export NETWORK_NAME=${NETWORK_NAME:-central_default}
export EXTERNAL_NETWORK=${EXTERNAL_NETWORK:-false}
export TRAEFIK_NETWORK=${TRAEFIK_NETWORK:-central_default}
fi
# 将相对路径转换为绝对路径Docker 需要绝对路径)
# 获取脚本所在目录的绝对路径
@@ -140,12 +170,12 @@ fi
echo ""
# 从模板生成 prometheus.yml
if [ -f "prometheus.yml.template" ]; then
echo "📝 从模板生成 prometheus.yml..."
if [ -f "config/prometheus/prometheus.yml.template" ]; then
echo "📝 从模板生成 config/prometheus/prometheus.yml..."
# 检查是否有 envsubst 命令
if command -v envsubst &> /dev/null; then
envsubst < prometheus.yml.template > prometheus.yml
echo "✅ prometheus.yml 已生成"
envsubst < config/prometheus/prometheus.yml.template > config/prometheus/prometheus.yml
echo "✅ config/prometheus/prometheus.yml 已生成"
else
echo "⚠️ envsubst 命令未找到,尝试使用 sed 替换..."
# 使用 sed 进行简单的变量替换
@@ -156,22 +186,22 @@ if [ -f "prometheus.yml.template" ]; then
-e "s/\${PROMETHEUS_REMOTE_WRITE_MAX_SAMPLES}/${PROMETHEUS_REMOTE_WRITE_MAX_SAMPLES}/g" \
-e "s/\${PROMETHEUS_REMOTE_WRITE_CAPACITY}/${PROMETHEUS_REMOTE_WRITE_CAPACITY}/g" \
-e "s/\${PROMETHEUS_REMOTE_WRITE_MAX_SHARDS}/${PROMETHEUS_REMOTE_WRITE_MAX_SHARDS}/g" \
prometheus.yml.template > prometheus.yml
echo "✅ prometheus.yml 已生成(使用 sed"
config/prometheus/prometheus.yml.template > config/prometheus/prometheus.yml
echo "✅ config/prometheus/prometheus.yml 已生成(使用 sed"
fi
elif [ ! -f "prometheus.yml" ]; then
echo "❌ 配置文件 prometheus.yml 不存在,且未找到模板文件"
elif [ ! -f "config/prometheus/prometheus.yml" ]; then
echo "❌ 配置文件 config/prometheus/prometheus.yml 不存在,且未找到模板文件"
exit 1
fi
# 检查配置文件
if [ ! -f "alert_rules.yml" ]; then
echo "❌ 配置文件 alert_rules.yml 不存在"
if [ ! -f "config/prometheus/alert_rules.yml" ]; then
echo "❌ 配置文件 config/prometheus/alert_rules.yml 不存在"
exit 1
fi
if [ ! -f "alertmanager/alertmanager.yml" ]; then
echo "❌ 配置文件 alertmanager/alertmanager.yml 不存在"
if [ ! -f "config/alertmanager/alertmanager.yml" ]; then
echo "❌ 配置文件 config/alertmanager/alertmanager.yml 不存在"
exit 1
fi
@@ -199,18 +229,23 @@ export GRAFANA_DOMAIN
export PROMETHEUS_DOMAIN
export ALERTMANAGER_DOMAIN
# 检查 Traefik 网络(docker-compose.yml 中总是会引用此网络,无论是否启用
# 检查 Traefik 网络(仅 TRAEFIK_PROVIDER=external 时需已存在
echo "🔍 检查 Traefik 网络..."
TRAEFIK_NET=${TRAEFIK_NETWORK:-traefik}
if ! docker network inspect "$TRAEFIK_NET" &> /dev/null; then
if [ "${TRAEFIK_ENABLED:-false}" != "true" ]; then
echo "✅ 未启用 Traefik使用 compose 默认网络"
elif [ "${TRAEFIK_PROVIDER}" = "internal" ]; then
echo "✅ 本编排启动 Traefik将自动创建网络 $TRAEFIK_NET"
elif ! docker network inspect "$TRAEFIK_NET" &> /dev/null; then
echo "⚠️ Traefik 网络 '$TRAEFIK_NET' 不存在,正在创建..."
if docker network create "$TRAEFIK_NET" 2>/dev/null; then
echo "✅ Traefik 网络 '$TRAEFIK_NET' 已创建"
else
echo "❌ 无法创建 Traefik 网络 '$TRAEFIK_NET'"
echo " 请确保:"
echo " 1. Traefik 已运行并创建了网络"
echo " 2. 或手动创建网络: docker network create $TRAEFIK_NET"
echo " 1. 外部 Traefik 已运行并创建了网络"
echo " 2. 或改为 TRAEFIK_PROVIDER=internal 由本编排启动 Traefik"
echo " 3. 或手动创建网络: docker network create $TRAEFIK_NET"
echo ""
read -p "是否继续部署?(y/N): " -n 1 -r
echo
@@ -220,7 +255,7 @@ if ! docker network inspect "$TRAEFIK_NET" &> /dev/null; then
fi
fi
else
echo "✅ Traefik 网络 '$TRAEFIK_NET' 已存在"
echo "✅ Traefik 网络 '$TRAEFIK_NET' 已存在(外部 Traefik"
fi
echo ""
@@ -229,9 +264,9 @@ echo "📁 创建数据目录..."
mkdir -p "${PROMETHEUS_DATA_DIR}"
mkdir -p "${GRAFANA_DATA_DIR}"
mkdir -p "${VICTORIAMETRICS_DATA_DIR}"
mkdir -p grafana/dashboards
mkdir -p grafana/provisioning/datasources
mkdir -p grafana/provisioning/dashboards
mkdir -p config/grafana/dashboards
mkdir -p config/grafana/provisioning/datasources
mkdir -p config/grafana/provisioning/dashboards
# 设置目录权限
# Prometheus 需要写权限
@@ -293,15 +328,17 @@ echo ""
# 检查是否启用 Traefik
if [ "${TRAEFIK_ENABLED:-false}" = "true" ]; then
echo "🔗 访问地址(通过 Traefik 反向代理):"
if [ "${TRAEFIK_PROVIDER}" = "internal" ]; then
echo " - Traefik 由本编排启动,监听 80/443 端口"
fi
echo " - Grafana仪表板: http://${GRAFANA_DOMAIN:-grafana.example.com} (admin/${GRAFANA_ADMIN_PASSWORD}) [${GRAFANA_DEFAULT_LANGUAGE}界面]"
echo " - Prometheus: http://${PROMETHEUS_DOMAIN:-prometheus.example.com} [英文界面]"
echo " - Alertmanager: http://${ALERTMANAGER_DOMAIN:-alertmanager.example.com} [英文界面]"
echo " - VictoriaMetrics: http://localhost:${VICTORIAMETRICS_PORT} [英文界面,边缘节点直接连接]"
echo ""
echo "⚠️ 请确保:"
echo " 1. DNS 已正确解析域名到 Traefik 服务器"
echo " 2. Traefik 网络 (${TRAEFIK_NETWORK:-traefik_default}) 已创建"
echo " 3. 边缘节点可以访问此服务器的${VICTORIAMETRICS_PORT}端口VictoriaMetrics 不通过 Traefik"
echo " 1. DNS 已正确解析域名到本机"
echo " 2. 边缘节点可以访问此服务器的${VICTORIAMETRICS_PORT}端口VictoriaMetrics 不通过 Traefik"
else
echo "🔗 访问地址:"
echo " - Grafana仪表板: http://localhost:${GRAFANA_PORT} (admin/${GRAFANA_ADMIN_PASSWORD}) [${GRAFANA_DEFAULT_LANGUAGE}界面]"