111 lines
5.5 KiB
Markdown
111 lines
5.5 KiB
Markdown
# 开发与发布
|
||
|
||
[首页](../README.md) · [部署指南](../deploy/DEPLOY.md) · [配置与使用](configuration.md)
|
||
|
||
## 仓库文件边界
|
||
|
||
提交源码、行为回归测试、锁文件、部署脚本、脱敏模板及数据库迁移/快照。以下内容仅在本地保留并独立备份,不提交:
|
||
|
||
- 实际 `.env`、文件数据、Telegram session、密钥和存储凭证。
|
||
- 数据库导出、备份、原始日志、依赖、构建产物及缓存。
|
||
|
||
`.gitignore` 不会取消已跟踪文件或清除历史秘密。不要用 `git clean -fdx` 清理部署目录;Docker 构建上下文另行排除测试与私有数据。
|
||
|
||
## 独立开发环境
|
||
|
||
使用独立克隆与开发数据库,不复用生产目录、数据库、文件挂载或 Telegram session。要求:
|
||
|
||
- Node.js 24 与 npm;两端分别使用自己的锁文件。
|
||
- PostgreSQL 16;生成或检查 schema 时还需要相同主版本的 `pg_dump`。
|
||
- ffmpeg:运行视频缩略图和转码功能时需要。
|
||
- 原生 npm 依赖缺少预编译包时,需要 Python 3、make 和 C/C++ 编译器。
|
||
|
||
从开发副本根目录安装依赖:
|
||
|
||
```bash
|
||
npm --prefix backend ci
|
||
npm --prefix frontend ci
|
||
```
|
||
|
||
在 `backend/.env` 中填写独立开发配置。下面的数据库连接仅展示格式,先创建自己的开发角色、密码与空数据库,再替换连接串;不要复制生产密码。密码含 URL 保留字符时需编码。
|
||
|
||
```dotenv
|
||
DATABASE_URL=postgresql://dev_user:replace-with-dev-password@127.0.0.1:5432/tgvault_dev
|
||
CORS_ORIGIN=http://localhost:5173
|
||
OAUTH_CALLBACK_BASE_URL=http://localhost:51947
|
||
OAUTH_FRONTEND_ORIGIN=http://localhost:5173
|
||
COOKIE_SECURE=false
|
||
COOKIE_SECURE_FORCE=false
|
||
```
|
||
|
||
后端从进程工作目录读取 `.env`,项目根目录的 Compose `.env` 不会自动成为 `backend/.env`。默认本地数据目录是 `backend/data`。内部密钥会持久保存,不要在重启或升级时替换。
|
||
|
||
### 初始化与迁移
|
||
|
||
后端启动只检查数据库版本,不执行 DDL。首次启动及拉取新迁移后,先构建,再在 `backend` 工作目录运行数据库 CLI:
|
||
|
||
```bash
|
||
npm --prefix backend run build
|
||
(cd backend && node dist/scripts/database.js status)
|
||
(cd backend && node dist/scripts/database.js plan)
|
||
(cd backend && node dist/scripts/database.js migrate)
|
||
(cd backend && node dist/scripts/database.js check)
|
||
```
|
||
|
||
`status`、`plan`、`check` 只读;只有 `migrate` 写入数据库。任一步失败即停止后续操作。生产升级还必须先备份并停止旧应用写入,参见[部署指南](../deploy/DEPLOY.md#数据库命令与手动升级)。不要手工执行历史 SQL,也不要用 `init.sql` 代替迁移账本。
|
||
|
||
### 启动开发服务器
|
||
|
||
分别在两个终端执行:
|
||
|
||
```bash
|
||
npm --prefix backend run dev
|
||
```
|
||
|
||
```bash
|
||
VITE_API_URL=http://localhost:51947 npm --prefix frontend run dev -- --host 127.0.0.1
|
||
```
|
||
|
||
访问 `http://localhost:5173`;若 Vite 使用其他端口,同步修改后端 `CORS_ORIGIN` 与 OAuth 前端地址。HTTP Cookie 配置只用于本地开发,不要带入生产,也不要把开发服务器暴露到公网。
|
||
|
||
## 检查与数据库快照
|
||
|
||
在独立开发副本根目录执行:
|
||
|
||
```bash
|
||
(cd backend && node --import tsx --test scripts/*.test.ts)
|
||
(cd frontend && node --experimental-strip-types --test scripts/*.test.ts)
|
||
npm --prefix backend run typecheck
|
||
npm --prefix backend run build
|
||
npm --prefix frontend run lint
|
||
npm --prefix frontend run build
|
||
npm --prefix backend audit --omit=dev --audit-level=high
|
||
npm --prefix frontend audit --omit=dev --audit-level=high
|
||
```
|
||
|
||
后端 `build` 不替代类型检查,同时打包数据库 CLI 与迁移资源。回归测试使用合成数据,无需真实 Telegram 或存储账号。
|
||
|
||
schema 快照检查会创建并删除临时数据库,**必须使用独立、可丢弃的 PostgreSQL 16 服务**,账号需有 `CREATE DATABASE` 权限。不要将它指向生产,即使命令名是 `check`。配置该服务的 `DATABASE_URL` 后运行:
|
||
|
||
```bash
|
||
npm --prefix backend run schema:check
|
||
```
|
||
|
||
`pg_dump` 必须可执行;不在 `PATH` 时通过 `PG_DUMP=/absolute/path/to/pg_dump` 指定。schema 变更使用新的迁移文件,随后运行 `schema:generate`,由 baseline 与迁移重放生成以下三个文件并一起提交:
|
||
|
||
- `backend/src/db/schema.sql`
|
||
- `backend/src/db/snapshot.json`
|
||
- 根目录 `init.sql`
|
||
|
||
不要手工编辑生成文件、修改已发布迁移,或使用旧的“复制 schema”脚本代替迁移重放。升级固定依赖 GramJS 2.26.22 前,必须重新验证下载分片、请求取消、sender 清理和账号隔离;项目适配层使用了其内部 API。
|
||
|
||
## GitHub 公开发布检查
|
||
|
||
1. 检查待提交文件与历史中的凭证、session、数据库导出及私有信息;截图与日志也需脱敏。秘密曾提交时先撤销或轮换,再协商清理历史,不能只删当前文件。
|
||
2. 提交完整新增源码与行为测试;两端 `package.json`、锁文件根版本及 `CHANGELOG.md` 保持一致。
|
||
3. 在无私有配置的干净副本完成上述检查,再以无敏感内容的小文件验证登录、上传与下载。
|
||
4. 推送默认分支会在 CI 通过后更新 GHCR `latest`;`v<版本>` 标签发布版本镜像,PR 不推送镜像。CI 同时生成 SBOM 和 provenance;首次发布确认两个 GHCR 包可公开拉取。
|
||
5. CI 通过且镜像就绪后创建 GitHub Release,说明取自更新日志对应版本。Fork 须同步修改镜像、部署来源和更新检测仓库。
|
||
|
||
提交、推送与服务器升级是独立操作;本地整理不会替换运行容器,升级见[部署指南](../deploy/DEPLOY.md)。
|