解决Discourse系统国家区域不显示的问题

最终排查结果为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", ...}