118 lines
4.7 KiB
Bash
118 lines
4.7 KiB
Bash
#!/bin/bash
|
||
set -euo pipefail
|
||
|
||
echo "[INFO] Starting Grafana under supervisor..."
|
||
|
||
DOMAIN=grafana.metric.argus.com
|
||
|
||
# 记录容器 IP
|
||
IP=$(ifconfig | awk '/inet / && $2 != "127.0.0.1" {print $2; exit}')
|
||
echo "current IP: ${IP}"
|
||
echo "${IP}" > /private/argus/etc/${DOMAIN}
|
||
chmod +x /private/argus/etc/${DOMAIN}
|
||
|
||
# 确保必要目录存在(权限已在 Dockerfile 中设置)
|
||
mkdir -p /private/argus/metric/grafana/data
|
||
mkdir -p /private/argus/metric/grafana/logs
|
||
mkdir -p /private/argus/metric/grafana/plugins
|
||
mkdir -p /private/argus/metric/grafana/provisioning/datasources
|
||
mkdir -p /private/argus/metric/grafana/provisioning/dashboards
|
||
mkdir -p /private/argus/metric/grafana/data/sessions
|
||
mkdir -p /private/argus/metric/grafana/data/dashboards
|
||
mkdir -p /private/argus/metric/grafana/config
|
||
mkdir -p /var/log/grafana
|
||
mkdir -p /etc/grafana/provisioning/datasources
|
||
mkdir -p /var/lib/grafana
|
||
|
||
# 复制主配置文件到持久化目录
|
||
if [ -f "/tmp/grafana.ini" ]; then
|
||
echo "[INFO] Copying grafana.ini to /private/argus/metric/grafana/config/"
|
||
cp /tmp/grafana.ini /private/argus/metric/grafana/config/grafana.ini
|
||
echo "[INFO] Grafana configuration copied successfully"
|
||
fi
|
||
|
||
# 检查配置文件来源(优先级:挂载目录 > 容器内配置 > 默认配置)
|
||
if [ -f "/private/argus/metric/grafana/config/grafana.ini" ]; then
|
||
echo "[INFO] Using grafana.ini from /private/argus/metric/grafana/config/"
|
||
CONFIG_FILE="--config=/private/argus/metric/grafana/config/grafana.ini"
|
||
elif [ -f "/etc/grafana/grafana.ini" ]; then
|
||
echo "[INFO] Using custom grafana.ini from /etc/grafana/"
|
||
CONFIG_FILE="--config=/etc/grafana/grafana.ini"
|
||
else
|
||
echo "[INFO] Using default configuration"
|
||
CONFIG_FILE=""
|
||
fi
|
||
|
||
# 复制数据源配置文件到挂载目录
|
||
DS_OUT="/private/argus/metric/grafana/provisioning/datasources/datasources.yml"
|
||
PROM_DOMAIN="prom.metric.argus.com:9090"
|
||
|
||
if [ -f "/tmp/datasources.yml" ] && [ ! -f "$DS_OUT" ]; then
|
||
echo "[INFO] Initializing datasource provisioning file from /tmp"
|
||
cp /tmp/datasources.yml "$DS_OUT"
|
||
fi
|
||
|
||
# 统一将数据源 URL 规范为 prom.metric.argus.com:9090
|
||
if [ -f "$DS_OUT" ]; then
|
||
sed -i -E "s#^\s*url:\s*http://[^[:space:]]+# url: http://$PROM_DOMAIN#g" "$DS_OUT" || true
|
||
echo "[INFO] Datasource URL normalized to http://$PROM_DOMAIN"
|
||
elif [ -d "/etc/grafana/provisioning/datasources" ] && [ "$(ls -A /etc/grafana/provisioning/datasources)" ]; then
|
||
echo "[INFO] Found datasource provisioning files in /etc/grafana/provisioning/datasources"
|
||
# 确保数据源配置目录权限正确
|
||
chown -R grafana:grafana /etc/grafana/provisioning/datasources
|
||
else
|
||
echo "[INFO] No datasource provisioning files found, using manual configuration"
|
||
fi
|
||
|
||
# 复制仪表板配置文件到挂载目录
|
||
if [ -f "/tmp/dashboards.yml" ]; then
|
||
echo "[INFO] Copying dashboard configuration to /private/argus/metric/grafana/provisioning/dashboards/"
|
||
cp /tmp/dashboards.yml /private/argus/metric/grafana/provisioning/dashboards/dashboards.yml
|
||
echo "[INFO] Dashboard configuration copied successfully"
|
||
fi
|
||
|
||
# 复制默认仪表板到挂载目录(按需,不覆盖已存在文件)
|
||
copy_dashboard_if_missing() {
|
||
local src="$1"; local dst_name="$2"
|
||
local dst_dir="/private/argus/metric/grafana/provisioning/dashboards"
|
||
local dst="$dst_dir/$dst_name"
|
||
if [ -f "$src" ]; then
|
||
if [ ! -f "$dst" ]; then
|
||
echo "[INFO] Installing dashboard: $dst_name"
|
||
cp "$src" "$dst"
|
||
else
|
||
echo "[INFO] Dashboard exists, skip: $dst_name"
|
||
fi
|
||
fi
|
||
}
|
||
|
||
copy_dashboard_if_missing "/tmp/default_dashboard.json" "default_dashboard.json"
|
||
copy_dashboard_if_missing "/tmp/default_cluster_dashboard.json" "default_cluster_dashboard.json"
|
||
copy_dashboard_if_missing "/tmp/default_dashboard_by_instance.json" "default_dashboard_by_instance.json"
|
||
|
||
# 规范面板中的数据源字段:将字符串 "prometheus" 替换为 null(使用默认数据源)
|
||
DB_DIR="/private/argus/metric/grafana/provisioning/dashboards"
|
||
if [ -d "$DB_DIR" ]; then
|
||
for f in "$DB_DIR"/*.json; do
|
||
[ -f "$f" ] || continue
|
||
sed -i -E 's/"datasource"\s*:\s*"prometheus"/"datasource": null/g' "$f" || true
|
||
done
|
||
echo "[INFO] Normalized dashboard datasource to default (null)"
|
||
fi
|
||
|
||
# 启动 Grafana
|
||
if [ -n "$CONFIG_FILE" ]; then
|
||
echo "[INFO] Starting Grafana with custom configuration..."
|
||
exec /usr/share/grafana/bin/grafana server \
|
||
--homepath=/usr/share/grafana \
|
||
--packaging=docker \
|
||
$CONFIG_FILE
|
||
else
|
||
echo "[INFO] Starting Grafana with default configuration..."
|
||
exec /usr/share/grafana/bin/grafana server \
|
||
--homepath=/usr/share/grafana \
|
||
--packaging=docker \
|
||
cfg:default.log.mode=console \
|
||
cfg:default.log.level=info
|
||
fi
|