浏览器暴露画像
一个纯 Rust 后端托管 TanStack 前端的单进程版本。前端使用 Vite + React + TanStack Router/Query 编译成静态文件,Rust/Axum 同时提供 /api/* 和前端静态文件,并把匿名扫描结果写入 SQLite。
本地运行
cd frontend
pnpm install
pnpm build
cd backend
cargo run
打开 http://localhost:8787。后端默认监听 0.0.0.0:8787,数据库为 backend/fingerprints.db,并自动查找 frontend/dist。
开发模式
需要热更新时可以开两个终端:
cd backend && cargo runcd frontend && pnpm dev
Vite dev server 会把 /api 和 /health 代理到 http://127.0.0.1:8787。
后端配置
DATABASE_URL: SQLite 地址,默认sqlite://fingerprints.dbBIND_ADDR: 监听地址,默认0.0.0.0:8787ASSETS_DIR: 前端编译产物目录,默认自动查找frontend/dist、../frontend/dist、distGEOIP_CITY_DB: 可选,指定城市级 MMDB 文件;默认自动加载backend/data/dbip-city-ipv4.mmdb和backend/data/dbip-city-ipv6.mmdbGEOIP_ASN_DB: 可选,指定 ASN/ISP MMDB 文件;默认自动加载backend/data/origin-asn.mmdb
本仓库已本地化开源 IP 数据库文件到 backend/data/。刷新数据库:
./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.0origin-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
从仓库根目录构建:
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。
本地打包:
VERSION=v0.1.0 BUILD_DOCKER=1 ./scripts/package-release.sh
手动发布到 Gitea:
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 连通后从本机仓库根目录执行:
./scripts/deploy-vps.sh
如果 SSH 用户或端口不同:
DEPLOY_USER=root DEPLOY_PORT=22 ./scripts/deploy-vps.sh
脚本会自动优先使用 ~/.ssh/termius_deploy_ed25519。也可以显式指定:
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。