最终排查结果为MaxMind没有成功下载,中间试了几种方案都不行,后面用的下面的方法,我总结整理一下。
1、先进入容器
./launcher enter app
2、进入容器后直接执行下面完整命令。
cd /var/www/discourse/vendor/data
# 多镜像回退下载函数
download_mmdb () {
local out="$1"; shift
for url in "$@"; do
echo "==> try: $url"
if curl -fSL --connect-timeout 20 --max-time 300 -o "$out" "$url"; then
local sz=$(stat -c%s "$out" 2>/dev/null || echo 0)
if [ "$sz" -gt 10000000 ]; then
echo "==> OK: $out ($(du -h $out | cut -f1))"
return 0
else
echo "==> too small, drop"
rm -f "$out"
fi
fi
done
echo "!! all sources failed for $out"
return 1
}
# GeoLite2-City.mmdb (Discourse 国家/城市统计必备)
download_mmdb GeoLite2-City.mmdb \
"https://raw.gitmirror.com/adysec/IP_database/main/geolite/GeoLite2-City.mmdb" \
"https://cdn.jsdelivr.net/gh/Athlon1600/maxmind-download@master/databases/GeoLite2-City.mmdb" \
"https://mirror.ghproxy.com/https://github.com/Chen-ce/geoip-mirror/releases/latest/download/GeoLite2-City.mmdb" \
"https://github.com/Chen-ce/geoip-mirror/releases/latest/download/GeoLite2-City.mmdb"
# GeoLite2-ASN.mmdb (ISP/ASN 展示用,可选但建议一起)
download_mmdb GeoLite2-ASN.mmdb \
"https://raw.gitmirror.com/adysec/IP_database/main/geolite/GeoLite2-ASN.mmdb" \
"https://cdn.jsdelivr.net/gh/Athlon1600/maxmind-download@master/databases/GeoLite2-ASN.mmdb" \
"https://mirror.ghproxy.com/https://github.com/Chen-ce/geoip-mirror/releases/latest/download/GeoLite2-ASN.mmdb" \
"https://github.com/Chen-ce/geoip-mirror/releases/latest/download/GeoLite2-ASN.mmdb"
# 权限必须给 discourse 用户(否则 Rails 读不到)
chown -R discourse:discourse /var/www/discourse/vendor/data
chmod 644 /var/www/discourse/vendor/data/*.mmdb
echo "--- result ---"
ls -lh /var/www/discourse/vendor/data/*.mmdb
3、退出容器并重启
exit
cd /var/discourse
./launcher restart app
4、验证
./launcher enter app
rails c
# 推荐:带缓存的公开入口
DiscourseIpInfo.get("113.88.240.205")
# 或者显式拿实例调 lookup
DiscourseIpInfo.instance.lookup("113.88.240.205")
# => {:country=>"China", :country_code=>"CN", :city=>"Shenzhen", ...}