Files
argus/src/web/build_tools/proxy/start-proxy-supervised.sh

99 lines
2.8 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
set -euo pipefail
echo "[INFO] Starting proxy under supervisor..."
TEMPLATE="/etc/nginx/nginx.conf.template"
TARGET="/etc/nginx/nginx.conf"
DNS_CONF_PRIVATE="/private/argus/etc/dns.conf"
DNS_CONF_SYSTEM="/etc/resolv.conf"
DNS_DIR="/private/argus/etc"
DNS_SCRIPT="${DNS_DIR}/update-dns.sh"
RUNTIME_UID="${ARGUS_BUILD_UID:-2133}"
RUNTIME_GID="${ARGUS_BUILD_GID:-2015}"
mkdir -p "$DNS_DIR"
chown -R "$RUNTIME_UID:$RUNTIME_GID" "$DNS_DIR" 2>/dev/null || true
if [[ -x "$DNS_SCRIPT" ]]; then
echo "[INFO] Running update-dns.sh before master starts"
# 若脚本存在则执行,保证容器使用 bind 作为 DNS
"$DNS_SCRIPT" || echo "[WARN] update-dns.sh execution failed"
else
echo "[WARN] DNS update script not found or not executable: $DNS_SCRIPT"
fi
# ========== 读取 DNS ==========
RESOLVERS=""
# 优先等待 /private/argus/etc/dns.conf 生成并读取其中的 IP
for i in $(seq 1 10); do
if [ -f "$DNS_CONF_PRIVATE" ]; then
RESOLVERS=$(awk '/^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/{print $1}' "$DNS_CONF_PRIVATE" | tr '\n' ' ')
fi
[ -n "$RESOLVERS" ] && break
sleep 1
done
# 若仍为空则回退到系统 resolv.conf
if [ -z "$RESOLVERS" ]; then
echo "未在 $DNS_CONF_PRIVATE 中找到有效 DNS,使用系统 /etc/resolv.conf"
RESOLVERS=$(awk '/^nameserver/ {print $2}' "$DNS_CONF_SYSTEM" | tr '\n' ' ')
fi
# 最后兜底:若仍为空,使用公共 DNS
if [ -z "$RESOLVERS" ]; then
echo "警告: 未找到任何 DNS,使用默认 8.8.8.8"
RESOLVERS="8.8.8.8"
fi
echo "检测到 DNS 服务器列表: $RESOLVERS"
# ========== 生成 nginx.conf ==========
if [ -f "$TEMPLATE" ]; then
echo "从模板生成 nginx.conf ..."
# 合并 Docker 内置 DNS 以保障解析 Compose 服务名
# 将 127.0.0.11 放在末尾,优先使用 /private/argus/etc/dns.conf 指向的 bind
if ! echo " $RESOLVERS " | grep -q " 127.0.0.11 "; then
RESOLVERS="${RESOLVERS} 127.0.0.11"
fi
sed "s|__RESOLVERS__|$RESOLVERS|" "$TEMPLATE" > "$TARGET"
else
echo "错误: 找不到 nginx.conf.template ($TEMPLATE)"
exit 1
fi
# 打印生成结果供排查
grep resolver "$TARGET" || true
# ========== 等待上游域名准备(避免启动即解析失败) ==========
UPSTREAM_DOMAINS=(
web.argus.com
grafana.metric.argus.com
prom.metric.argus.com
kibana.log.argus.com
alertmanager.alert.argus.com
master.argus.com
)
WAIT_MAX=15
WAITED=0
MISSING=()
while :; do
MISSING=()
for d in "${UPSTREAM_DOMAINS[@]}"; do
if [ ! -s "/private/argus/etc/${d}" ]; then
MISSING+=("$d")
fi
done
if [ ${#MISSING[@]} -eq 0 ] || [ "$WAITED" -ge "$WAIT_MAX" ]; then
break
fi
echo "[INFO] 等待上游域名记录生成(${WAITED}/${WAIT_MAX}) 缺失: ${MISSING[*]}"
sleep 1
WAITED=$((WAITED+1))
done
echo "[INFO] Launching nginx..."
# 启动 nginx 前台模式
exec /usr/sbin/nginx -g "daemon off;"