自定义 IP 地理位置数据库 
Nezha 默认不自带有效 GeoIP 数据库,如需编译正确显示地理位置信息的 Dashboard,必须在 pkg/geoip/geoip.db 路径下放置符合 IPinfo 格式的 mmdb 数据库。
IPinfo 格式包含以下字段:
- 作为条目的 IP 子网
 continent:大洲代码continent_name:大洲名称country:国家/地区代码country_name:国家/地区名称
其中 Nezha 只需要用到 country 信息,其它字段可留空。
编辑数据库 
目前推荐使用 MaxMind 官方使用的 mmdbwriter 和 maxminddb-golang 这两个库进行 mmdb 的编辑操作。
如果你的主要目的是为了校正地理信息,建议直接在 IPinfo 原版数据库的基础上修改。类似的操作可以参考 sing-geoip 项目。
这里以校正 IPinfo 数据为例,你需要使用 ReplaceWith inserter(此为默认值)并写入 mmdbtype.Map 信息:
go
subnet := &net.IPNet{
    IP:   net.ParseIP("1.1.1.1")
    Mask: net.CIDRMask(32, 32)
}
countryMap := make(map[mmdbtype.String]mmdbtype.String)
countryMap[mmdbtype.String("country")] = mmdbtype.String("JP")
if err := writer.Insert(subnet, mmdbtype.Map(countryMap)); err != nil {
	return err
}其中 writer 为一个 *mmdbwriter.Tree 的实例,需要通过 mmdbwriter.New 方法创建。具体操作和插入其它字段的过程不再赘述。
编辑完成并将数据库信息写入到文件后,可以使用 mmdbinspect 命令行工具测试数据库信息。例如:
shell
$ mmdbinspect -db ./country.mmdb 1.1.1.1
[
    {
        "Database": "./country.mmdb",
        "Records": [
            {
                "Network": "1.1.1.1/32",
                "Record": {
                    "continent": "AS",
                    "continent_name": "Asia",
                    "country": "JP",
                    "country_name": "Japan"
                }
            }
        ],
        "Lookup": "1.1.1.1"
    }
]确定格式、信息无误后便可用于 Nezha 编译。之后可通过 grpcurl 或类似工具测试查询 API 是否工作正常:
shell
grpcurl -proto ./nezha/proto/nezha.proto -plaintext -H 'client_secret: test' -d '{"ip": "1.1.1.1"}' 127.0.0.1:5555 proto.NezhaService/LookupGeoIP