文档

更新 Desk

Desk 的新版本会发布到 Docker 镜像 ghcr.io/modelriver/desk 和 GitHub 仓库。更新只需一条命令或点一下,每种方式也都可以按计划自动更新。

更新会改变什么

  • 数据保持不变。 文章、笔记、设置、品牌设置和对话都不会受影响。
  • 数据库会自动更新。 新版本启动时会自动完成所需的数据库变更。
  • 大版本跨度更新前先备份。 数据库更新后不支持退回旧版本,所以请先复制数据目录。
  • 大版本由你决定。 1 镜像标签会跟随所有 1.x 版本,2.x 版本不会自动到来。要固定在某个确切版本,请使用完整标签,如 1.0.1。

立即更新或定期更新

部署方式立即更新定期更新
Ubuntu 服务器sudo desk-update用 root 的 cron 定期运行它(见下文)
Docker Composedocker compose pull && docker compose up -dcron(见下文)
Fly.iofly deploy定时运行 fly deploy 的任务(见下文)
RenderManual Deploy → Deploy latest reference定时调用部署钩子的任务
RailwayRedeploySettings → Image Auto Updates
手动部署git pull && npm ci && npm run build,然后重启用 cron 定期运行

用 cron 每周更新(Docker Compose)

每周一 04:00,在 docker-compose.yml 所在目录中:

0 4 * * 1 cd /path/to/desk && docker compose pull -q && docker compose up -d

用 crontab -e 添加。如需每月更新,改用 0 4 1 * *。

用 GitHub Actions 每周更新(Fly.io)

用 fly tokens create deploy 创建部署令牌,在存放 fly.toml 的仓库中把它保存为仓库密钥 FLY_API_TOKEN,然后添加 .github/workflows/update-desk.yml:

YAML
1name: Update Desk
2on:
3 schedule:
4 - cron: '0 4 * * 1'
5 workflow_dispatch:
6jobs:
7 deploy:
8 runs-on: ubuntu-latest
9 steps:
10 - uses: actions/checkout@v4
11 - uses: superfly/flyctl-actions/setup-flyctl@master
12 - run: flyctl deploy --remote-only
13 env:
14 FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}

同样的计划也可以改为调用 Render 的部署钩子:把最后两个步骤换成 run: curl -fsS -X POST "${{ secrets.RENDER_DEPLOY_HOOK }}",并把钩子 URL 保存为 RENDER_DEPLOY_HOOK。

Ubuntu 服务器

setup-server.sh 会安装 desk-update,更新时不需要记住任何选项:

Bash
sudo desk-update --check # 查看已安装的版本和最新版本
sudo desk-update # 更新到当前主版本的最新发布
sudo desk-update 1.1.1 # 更新到指定版本,更新或更旧都可以
sudo desk-update --rollback # 回到上次更新之前的版本

每次更新会:

  1. 先备份:把 /var/lib/desk 和 /etc/desk 保存到 /var/backups/desk,并在 Desk 继续运行的同时生成一份一致的数据库副本。保留最近 3 份。
  2. 在正在运行的版本旁边构建新版本(位于 /opt/desk.next)。下载或构建失败时会在此停止,不做任何改动。
  3. 切换并重启,只停机几秒钟。原来的版本保留为 /opt/desk.prev。
  4. 检查是否正常响应。 新版本 30 秒内没有响应时,会自动切回原来的版本。

发布版本来自你安装时使用的代码仓库。新的主版本不会自动安装,需要你明确指定。设置、数据、nginx 和 HTTPS 都不会被改动。

每周一 04:00 自动更新,用 sudo crontab -e 添加:

0 4 * * 1 /usr/local/bin/desk-update

恢复备份时,请把它解压到一个空目录(不要直接解压到 /),在 Desk 停止时复制回去。先删除旧数据库的 -wal 和 -shm 文件,以免它们被重放到恢复后的数据库上:

Bash
sudo systemctl stop desk
sudo mkdir /tmp/desk-restore && sudo tar -xzf /var/backups/desk/FILE.tgz -C /tmp/desk-restore
sudo rsync -a /tmp/desk-restore/var/lib/desk/ /var/lib/desk/
sudo rm -f /var/lib/desk/desk.db-wal /var/lib/desk/desk.db-shm
sudo install -o desk -g desk -m 640 /tmp/desk-restore/desk.db /var/lib/desk/desk.db
sudo systemctl start desk

备份中还包含 etc/desk/env,需要时可以用它恢复设置。

Desk 1.1.2 之前安装的服务器还没有 desk-update。先从服务器上的代码仓库副本中获取一次,之后就可以一直使用它:

Bash
cd ~/desk && git pull && sudo install -m 755 deploy/update.sh /usr/local/bin/desk-update

更新之后

打开后台 → 设置 → System(仅管理员可见):页面会显示正在运行的版本。General 标签页会显示能否连接 ModelRiver。