GitHub: https://github.com/vansour/submora
submora 是一个面向多用户订阅聚合场景的 Rust 项目。后端使用 Axum 0.8.8,前端使用 Vue 3 + Vite + TypeScript,提供最小管理台、订阅组维护,以及 GET /{username} 公共聚合路由。
- 前端:
web/ - 后端:
backend/ - 共享协议与校验:
backend/src/shared.rs、backend/src/core.rs - 仓库说明:
README.md
目录树说明:
.
├── web/ # Vue 3 + Vite 管理台
├── backend/ # Axum 服务、公共聚合路由、管理 API
├── scripts/ # 辅助脚本、测试运行脚本
├── Dockerfile # 生产镜像构建入口
└── compose.yml # 默认部署入口
- 管理员登录、登出、恢复会话
- 订阅组创建、删除、排序
- 逐行链接编辑、新增、删除、拖拽排序、本地格式校验
- 保存后使用服务端归一化结果回填
- 复制公共聚合入口链接
- 公共聚合入口
GET /{username},返回text/plain - 每次公共请求都实时抓取上游最新内容
- 不保留结果缓存、DNS 缓存、客户端缓存
前提:
- Docker
- Docker Compose
启动:
docker compose up -d --build停止:
docker compose down查看日志:
docker compose logs -f默认地址:
- 管理台:
http://127.0.0.1:8080 - 聚合路由:
http://127.0.0.1:8080/{username}
默认管理员账号:
- 用户名:
admin - 密码:
admin
生产环境建议在首次启动前通过 ADMIN_USER / ADMIN_PASSWORD 设置自定义管理员凭据。
Dockerfile 会在构建阶段同时生成:
web/dist/的 Vite 前端产物submora二进制
运行时环境变量默认使用:
Dockerfile中的镜像默认值backend/src/config.rs内置默认值
如果要覆盖默认值,直接在本地 compose.yml 增加 environment:,或通过 docker compose --env-file ... 提供环境变量即可。
HOST/PORTWEB_DIST_DIRDATABASE_URLCOOKIE_SECURESESSION_TTL_MINUTESSESSION_CLEANUP_INTERVAL_SECSTRUST_PROXY_HEADERSLOGIN_MAX_ATTEMPTSLOGIN_WINDOW_SECSLOGIN_LOCKOUT_SECSPUBLIC_MAX_REQUESTSPUBLIC_WINDOW_SECSDB_MAX_CONNECTIONSFETCH_TIMEOUT_SECSFETCH_HOST_OVERRIDESCONCURRENT_LIMITMAX_LINKS_PER_USERMAX_USERSADMIN_USERADMIN_PASSWORDCORS_ALLOW_ORIGIN
仓库不再提供 Makefile。如需直接校验源码,使用原生命令:
cargo check --workspace
cargo test --workspace
cd web && npm run check && npm run build && npm run test:unit && npm run test:e2e- 对外提供服务前,必须在首次启动前设置自定义
ADMIN_USER/ADMIN_PASSWORD;不要以admin/admin直接暴露公网。 - 生产环境应放在 HTTPS 反向代理之后,并设置
COOKIE_SECURE=true。 TRUST_PROXY_HEADERS默认值是false。只有当所有流量都经过你可控、且会清洗x-forwarded-for/x-real-ip的反向代理时,才应该设为true。data/是当前默认持久化边界,至少应纳入定时备份;升级前先做冷备份。- 当前运行模型以单机 SQLite 为主,适合单节点自托管。
- 当前公共聚合路由是“实时抓取”模型,不做结果缓存。若上游响应慢或不稳定,公共请求会直接体现这些延迟与失败。
当前版本已经按最小订阅整合工具收敛,边界如下:
- 保留前端与数据库
- 保留管理员登录、订阅用户管理、多链接编辑、公开聚合入口
- 不提供 diagnostics / cache / account 面板能力
- 数据库存储的是配置,不存储聚合结果
- 公共聚合路由每次实时抓取上游,不复用结果缓存、DNS 缓存、客户端缓存
- 去缓存不等于去安全,仍保留 SSRF 防护、重定向校验、抓取超时和体积限制
仓库不再保留独立 docs/ 目录,开发、测试、部署和运行说明统一维护在当前 README。