Files
web/docs/migrate-to-bun.md
T
xuyueandClaude Opus 5.5 26f05d1d76
Deploy / deploy (build, debian, 22) (push) Canceled after 0s
Deploy / deploy (build:staging, school, 8822) (push) Canceled after 0s
refactor: 后端从 Django 换成 Bun + SQLite
Django 多个 worker 内存占用 1-2 GB,换成 Bun 单进程后约 25 MB,
同时去掉 Postgres 和 Redis,只剩 Caddy + Bun 两个容器。

- server/:Hono + bun:sqlite + Bun 原生 WebSocket,接口与原 django-ninja
  保持兼容;表结构、时间/UUID 存储格式、密码哈希与 Django 一致,旧数据可直接使用
- 评分加权、贝叶斯平滑、成绩册的计算结果与原实现逐位一致(复刻 Python round/sum)
- scripts/:Postgres → SQLite 迁移、新建超管、提示词层级标注、重算分数
- 前端:Django Admin 去掉后,用户新建/修改改为页面内弹窗;
  非超管的挑战公开按钮置灰
- 权限不足返回 JSON 403(原来是重定向到不存在的登录页)
- docker-compose / Caddyfile / dev.sh / CLAUDE.md 更新,删除 AGENTS.md
- 服务器切换步骤见 docs/migrate-to-bun.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 17:45:09 +08:00

76 lines
3.1 KiB
Markdown
Raw 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.
# 服务器切换到 Bun 后端(一次性)
后端从 Django + Postgres + Redis 换成了 Bun + SQLite,前后端也合并成了一个仓库
(`git.xuyue.cc:xuyue/web.git` / `github.com/yuetsh/web`)。
每台服务器(debian、school)都要按下面的步骤做一次,之后 push 到 `main` 就会自动部署。
切换时所有人需要重新登录一次(旧的登录会话在 Redis 里,不迁移)。密码不受影响。
## 0. GitHub 仓库设置
在 `yuetsh/web` 的 Settings → Secrets and variables → Actions 里添加和旧仓库一样的 `KEY`、`HOST`。
## 1. 备份
```bash
cd /root/WebPreview
docker compose exec webpreview-db sh -c 'pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB"' > /root/webpreview-$(date +%F).sql
```
`data/`(Postgres 数据目录)在整个过程中不会被修改,出问题可以随时回退。
## 2. 把目录变成新仓库的 clone
```bash
cd /root/WebPreview
git init -b main
git remote add origin git@git.xuyue.cc:xuyue/web.git
git fetch origin
git reset origin/main # 只建立 git 记录,不改动现有文件
git checkout -- . # 用仓库里的 docker-compose.yaml、Caddyfile 等覆盖旧文件
mv api /root/webpreview-api-old # 旧的 Django 后端,确认没问题后可删
git status # 应该是干净的(.env、data/、build/、media/ 都被忽略)
```
## 3. 迁移数据(Postgres → SQLite)
找一个没人用的时间做,先停掉旧后端,避免迁移期间有新数据写进 Postgres:
```bash
docker stop webpreview-api
docker compose --profile migrate up -d webpreview-db # 旧库本来就在运行的话不会有变化
docker compose build webpreview-api
docker compose run --rm --no-deps webpreview-api bun scripts/migrate-from-postgres.ts
```
脚本会逐表打印行数并做外键检查,最后输出 `导入完成` 才算成功。数据库文件在 `./sqlite/db.sqlite3`。
`.env` 里原有的 `POSTGRES_*` 变量就是脚本要用的,不需要改。
## 4. 启动新服务
```bash
docker compose up -d --remove-orphans # 启动 Caddy + Bun,顺带删掉不再需要的 Redis 容器
docker compose --profile migrate stop webpreview-db
docker stats --no-stream # webpreview-api 应该在几十 MB
```
打开网站登录确认一下。之后就可以 `docker compose --profile migrate rm webpreview-db`,
`data/` 目录建议留一段时间再删(属主是容器里的 postgres 用户,需要 root 才能删)。
## 回退
```bash
docker compose down
mv /root/webpreview-api-old api
git show 47d4679:docker-compose.yaml > docker-compose.yaml
git show 47d4679:Caddyfile > Caddyfile
docker compose up -d --build
```
## 以后的日常操作
- 部署:push 到 `main`,GitHub Actions 会构建前端并在服务器上 `git pull && docker compose up -d --build`
- 新建超级管理员:`docker compose exec webpreview-api bun scripts/create-superuser.ts <用户名> <密码>`
- 补标注提示词层级:`docker compose exec webpreview-api bun scripts/classify-prompts.ts`
- 备份:复制 `sqlite/` 目录即可(或 `sqlite3 sqlite/db.sqlite3 ".backup backup.sqlite3"`)