119 lines
3.7 KiB
Markdown
119 lines
3.7 KiB
Markdown
# 浏览器暴露画像
|
||
|
||
一个纯 Rust 后端托管 TanStack 前端的单进程版本。前端使用 Vite + React + TanStack Router/Query 编译成静态文件,Rust/Axum 同时提供 `/api/*` 和前端静态文件,并把匿名扫描结果写入 SQLite。
|
||
|
||
## 本地运行
|
||
|
||
```bash
|
||
cd frontend
|
||
pnpm install
|
||
pnpm build
|
||
|
||
cd backend
|
||
cargo run
|
||
```
|
||
|
||
打开 `http://localhost:8787`。后端默认监听 `0.0.0.0:8787`,数据库为 `backend/fingerprints.db`,并自动查找 `frontend/dist`。
|
||
|
||
## 开发模式
|
||
|
||
需要热更新时可以开两个终端:
|
||
|
||
1. `cd backend && cargo run`
|
||
2. `cd frontend && pnpm dev`
|
||
|
||
Vite dev server 会把 `/api` 和 `/health` 代理到 `http://127.0.0.1:8787`。
|
||
|
||
## 后端配置
|
||
|
||
- `DATABASE_URL`: SQLite 地址,默认 `sqlite://fingerprints.db`
|
||
- `BIND_ADDR`: 监听地址,默认 `0.0.0.0:8787`
|
||
- `ASSETS_DIR`: 前端编译产物目录,默认自动查找 `frontend/dist`、`../frontend/dist`、`dist`
|
||
- `GEOIP_CITY_DB`: 可选,指定城市级 MMDB 文件;默认自动加载 `backend/data/dbip-city-ipv4.mmdb` 和 `backend/data/dbip-city-ipv6.mmdb`
|
||
- `GEOIP_ASN_DB`: 可选,指定 ASN/ISP MMDB 文件;默认自动加载 `backend/data/origin-asn.mmdb`
|
||
|
||
本仓库已本地化开源 IP 数据库文件到 `backend/data/`。刷新数据库:
|
||
|
||
```bash
|
||
./scripts/download-geoip-mmdb.sh
|
||
```
|
||
|
||
当前默认数据源来自 GitHub 上的 `sapics/ip-location-db` Releases:
|
||
|
||
- `dbip-city-ipv4.mmdb` / `dbip-city-ipv6.mmdb`: DB-IP Lite 城市库,CC BY 4.0
|
||
- `origin-asn.mmdb`: origin ASN 库,PDDL
|
||
|
||
后端只做本地文件查询,不把访客 IP 发送给第三方 IP 查询 API。
|
||
|
||
## API
|
||
|
||
- `POST /api/scan`: 接收匿名检测结果
|
||
- `GET /api/stats`: 返回总次数、平均分、高风险数量和命中信号排行
|
||
- `GET /api/network/probe`: 返回服务端可见的请求来源、Cloudflare/代理头、WebRTC 阶段会用到的本地 IP 数据库查询结果;该接口不落库
|
||
- `GET /health`: 健康检查
|
||
|
||
## Docker
|
||
|
||
从仓库根目录构建:
|
||
|
||
```bash
|
||
docker build -f backend/Dockerfile -t browser-fingerprint .
|
||
docker run --rm -p 8787:8787 -v "$PWD/data:/data" browser-fingerprint
|
||
```
|
||
|
||
容器内 Rust 服务会托管 `/app/frontend/dist`,SQLite 写到 `/data/fingerprints.db`。
|
||
|
||
## Gitea CI 与 Release
|
||
|
||
仓库使用 Gitea Actions,workflow 位于 `.gitea/workflows/`:
|
||
|
||
- `ci.yml`: main 分支和 PR 运行前端测试/构建、Rust 格式检查/测试、Docker 构建。
|
||
- `release.yml`: 推送 `v*` tag 时构建 release 资产,并通过 Gitea API 创建或更新 release。
|
||
|
||
本地打包:
|
||
|
||
```bash
|
||
VERSION=v0.1.0 BUILD_DOCKER=1 ./scripts/package-release.sh
|
||
```
|
||
|
||
手动发布到 Gitea:
|
||
|
||
```bash
|
||
GITEA_TOKEN=... \
|
||
GITEA_API_URL=https://git.aiot.ml/api/v1 \
|
||
GITEA_REPOSITORY=kanshan/browser-fingerprint \
|
||
RELEASE_TAG=v0.1.0 \
|
||
./scripts/publish-gitea-release.sh release/*
|
||
```
|
||
|
||
更多细节见 `docs/release.md`。
|
||
|
||
## 部署到 VPS
|
||
|
||
默认部署目标是 `92.119.167.24`,服务会监听公网 80 端口,SQLite 数据保存在服务器
|
||
`/opt/browser-fingerprint/data/fingerprints.db`。
|
||
|
||
服务器需要先安装 Docker 和 Docker Compose 插件。SSH 连通后从本机仓库根目录执行:
|
||
|
||
```bash
|
||
./scripts/deploy-vps.sh
|
||
```
|
||
|
||
如果 SSH 用户或端口不同:
|
||
|
||
```bash
|
||
DEPLOY_USER=root DEPLOY_PORT=22 ./scripts/deploy-vps.sh
|
||
```
|
||
|
||
脚本会自动优先使用 `~/.ssh/termius_deploy_ed25519`。也可以显式指定:
|
||
|
||
```bash
|
||
DEPLOY_KEY=~/.ssh/termius_deploy_ed25519 ./scripts/deploy-vps.sh
|
||
```
|
||
|
||
部署完成后访问 `http://92.119.167.24/`。
|
||
|
||
后续绑定 Cloudflare 时,把域名的 `A` 记录指向 `92.119.167.24`。先用
|
||
`DNS only` 确认源站正常,再切到代理模式;源站当前走 HTTP 80,后续加证书或
|
||
Cloudflare Origin Certificate 后再开放 HTTPS。
|