99 lines
2.8 KiB
Bash
99 lines
2.8 KiB
Bash
#!/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;"
|