一个前后端分离的 monorepo,包含个人工具站点及其后端微服务。
- 前端:React 19、TypeScript、Vite、Vitest、Apollo Client、pnpm workspace
- 后端:Rust、Axum、async-graphql、Volo Thrift、Diesel
- 数据库:PostgreSQL
- 部署:Docker / Docker Compose
.
├── web/
│ ├── packages/
│ │ ├── portal/ # 主应用(Vite)
│ │ ├── bookmarks/ # 书签/小说管理前端模块
│ │ └── collections/ # 集合管理前端模块
│ └── common/ # 前端公共包(i18n、table、graphql、time 等)
├── server/
│ ├── packages/
│ │ ├── auth/ # 认证 Thrift 服务(80)
│ │ ├── login/ # 登录/WebAuthn HTTP 服务(8000)
│ │ ├── bookmarks/ # GraphQL 服务(8080)
│ │ └── collections/ # GraphQL 服务(8080)
│ └── common/ # Rust 公共库(thrift、middleware、xtask 等)
└── docker/
├── compose/ # docker-compose 与 .env
├── server/ # 各后端服务 Dockerfile
└── web/ # 历史 nginx 相关文件(当前网关使用 gateway 服务)
- Node.js LTS
- pnpm
- Rust stable(
cargo) - Docker(可选,用于一键编排)
pnpm install
cargo fetch启动 portal:
cd web/packages/portal
pnpm dev常用命令(仓库根目录):
pnpm format # oxfmt 写盘格式化
pnpm lint # format:check + oxlint + knip + tsc --build
pnpm test # vitest
pnpm build # 构建 web/packages/*在仓库根目录运行:
cargo build --workspace
cargo test --workspace
cargo clippy --all单服务运行示例:
cargo run -p auth
cargo run -p login
cargo run -p bookmarks
cargo run -p collections说明:
auth通过 Thrift 暴露在0.0.0.0:80loginHTTP 服务端口8000bookmarks/collectionsGraphQL 服务端口8080
docker/compose/.env 中可见的变量名包括:
USERNAMEPASSWORDSECRETPOSTGRES_USERPOSTGRES_PASSWORDBOOKMARKS_PGCOLLECTIONS_PGPOSTGRES_HOST_AUTH_METHOD
另外后端服务使用 Docker 服务名进行内部调用(如 auth)。
说明:当前入口网关是 gateway Rust 服务(镜像 suxiaoshao/gateway),不是 Nginx。
cd docker/compose
docker compose up -dcargo run -p xtask -- build
cargo run -p xtask -- composextask 其他常用命令:
cargo run -p xtask -- lint
cargo run -p xtask -- cert --out-dir docker/compose/certsxtask cert 会生成 ca.pem、ca.crt、fullchain.pem、fullchain.crt、privkey.pem。
cd web/packages/bookmarks && pnpm generate
cd web/packages/collections && pnpm generate- PR 到
main触发:前端 lint/test + Rust clippy/test(.github/workflows/ci.yaml) - Push 到
main且命中路径变更时,分别构建并推送后端镜像:authloginbookmarkscollections
当前前端请求地址和部分构建配置绑定了 *.sushao.top 域名(例如登录与 GraphQL 地址)。
如需纯本地联调,建议先统一抽离 API 基址配置再运行。