Files
Test User 5152086668
CI / Docker build (push) Has been cancelled
CI / Frontend test and build (push) Has been cancelled
CI / Rust test (push) Has been cancelled
Release / Build and publish release (push) Has been cancelled
Initial browser fingerprint app with Gitea CI
2026-07-04 03:15:26 +08:00

119 lines
3.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 浏览器暴露画像
一个纯 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。