---
outline: deep
---
# 自定义 IP 地理位置数据库

Dashboard v0.18.3+ 采用离线数据库获取 GeoIP 信息，如需编译正确显示地理位置信息的 Dashboard，必须在 `pkg/geoip/geoip.db` 路径下放置符合 IPinfo 格式的 mmdb 数据库。

IPinfo 格式包含以下字段：

- 作为条目的 IP 子网
- `continent`：大洲代码
- `continent_name`：大洲名称
- `country`：国家/地区代码
- `country_name`：国家/地区名称

其中 Dashboard 只需要用到 `country` 信息，其它字段可留空。

## 编辑数据库

目前推荐使用 MaxMind 官方使用的 `mmdbwriter` 和 `maxminddb-golang` 这两个库进行 mmdb 的编辑操作。

如果你的主要目的是为了校正地理信息，建议直接在 IPinfo 原版数据库的基础上修改。类似的操作可以参考 [sing-geoip](https://github.com/SagerNet/sing-geoip) 项目。

这里以校正 IPinfo 数据为例，你需要使用 `ReplaceWith` inserter（此为默认值）并写入 `mmdbtype.Map` 信息：

```go
subnet := &net.IPNet{
    IP:   net.ParseIP("114.5.1.4")
    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 114.5.1.4
[
    {
        "Database": "./country.mmdb",
        "Records": [
            {
                "Network": "114.5.1.4/32",
                "Record": {
                    "continent": "AS",
                    "continent_name": "Asia",
                    "country": "JP",
                    "country_name": "Japan"
                }
            }
        ],
        "Lookup": "114.5.1.4"
    }
]
```

确定格式、信息无误后便可用于 Dashboard 编译。之后可通过 `grpcurl` 或类似工具测试查询 API 是否工作正常：

```shell
grpcurl -proto ./nezha/proto/nezha.proto -plaintext -H 'client_secret: test' -d '{"ip": "114.5.1.4"}' 127.0.0.1:5555 proto.NezhaService/LookupGeoIP
```