fix(openflare): Agent 上报 IP 后由 Server 自动解析节点地理位置

- 启动时按 of_options.GeoIPProvider 初始化 pkg/geoip(bootstrap + runtime)
- mmdb 模式从内置 GeoLite2 种子到 data/;保存归属方式后热刷新 Provider
- Agent/Relay 心跳在服务端根据 IP 写入 geo 字段,尊重 geo_manual_override
- ipinfo 归属名称改为 City, Region, Country 可读格式
This commit is contained in:
ryan
2026-06-20 19:36:17 +08:00
parent ec53629971
commit 498a9ed3ff
11 changed files with 287 additions and 35 deletions
+23
View File
@@ -10,6 +10,7 @@ import (
"time"
"github.com/Rain-kl/Wavelet/internal/apps/openflare/agent"
ofgeoip "github.com/Rain-kl/Wavelet/internal/apps/openflare/geoip"
"github.com/Rain-kl/Wavelet/internal/db"
"github.com/Rain-kl/Wavelet/internal/model"
)
@@ -52,6 +53,21 @@ func Heartbeat(ctx context.Context, node *model.OpenFlareNode, payload Heartbeat
changes["ip"] = payload.IP
node.IP = payload.IP
}
if !node.GeoManualOverride {
beforeGeo := node.GeoName
beforeLat := node.GeoLatitude
beforeLon := node.GeoLongitude
ofgeoip.ApplyNodeGeoFromIP(ctx, node, node.IP)
if node.GeoName != beforeGeo {
changes["geo_name"] = node.GeoName
}
if !coordinatesEqual(beforeLat, node.GeoLatitude) {
changes["geo_latitude"] = node.GeoLatitude
}
if !coordinatesEqual(beforeLon, node.GeoLongitude) {
changes["geo_longitude"] = node.GeoLongitude
}
}
if !previous.UpdateRequested {
delete(changes, "update_requested")
}
@@ -86,3 +102,10 @@ func Heartbeat(ctx context.Context, node *model.OpenFlareNode, payload Heartbeat
RelaySettings: BuildSettings(node, updateNow, updateChannel, updateTag),
}, nil
}
func coordinatesEqual(before *float64, after *float64) bool {
if before == nil || after == nil {
return before == after
}
return *before == *after
}