文档

在 Ubuntu 服务器上部署 Desk

deploy/setup-server.sh 一条命令即可在全新的 Ubuntu 22.04 或更高版本服务器上部署 Desk:

  • Node.js,版本取自 .nvmrc,并对照 nodejs.org 的校验和检查
  • 一个拥有应用和数据的 desk 系统用户
  • systemd 服务,停止后会自动重启
  • 在 Desk 前面、带按 IP 限流的 nginx
  • Let's Encrypt 证书,自动续期

这是运行 Desk 最轻量的方式,不需要容器运行时,适合小内存服务器(运行需要 512 MB,构建时约 1 GB)。开始前请先阅读所有部署方式的共同要求。

1. 把域名指向服务器

为 Desk 的域名(例如 support.acme.com)添加指向服务器的 A 记录(IPv6 再加 AAAA 记录)。在云服务商的防火墙中开放 80 和 443 端口:Let's Encrypt 会通过 80 端口验证域名。

2. 运行脚本

在服务器上:

Bash
git clone https://github.com/modelriver/desk.git
cd desk
sudo ./deploy/setup-server.sh --source . --domain support.acme.com --email you@acme.com

脚本会:

  1. 以不回显的方式询问你的 ModelRiver API 密钥。也可以通过环境变量 MODELRIVER_API_KEY 传入,但在命令行中输入的密钥会留在 shell 历史里。
  2. 生成 DESK_SECRET_KEY 和 DESK_IDENTITY_SECRET。
  3. 安装 Node.js、构建 Desk 并启动服务。
  4. 询问第一位管理员的邮箱、姓名和密码(也可以设置 ADMIN_EMAIL、ADMIN_NAME 和 ADMIN_PASSWORD)。
  5. 配置 nginx 并申请证书。

--email 用于申请证书,传入即表示接受 Let's Encrypt 的条款。打开 https://support.acme.com/dashboard 登录,首次登录会设置双重认证。

文件位置

位置内容
/opt/desk应用本身,每次更新都会替换
/var/lib/desk你的数据:data/(文章和笔记)、desk.db 和 support.config.json。请备份这里
/etc/desk/env设置和密钥,仅 root 可读
/etc/nginx/sites-available/desk反向代理配置,只写入一次;certbot 会在其中加入 HTTPS
/usr/local/bin/desk-update更新命令(见下文)
/var/backups/deskdesk-update 每次更新前生成的备份,保留最近 3 份

选项

选项作用
--sample-data以示例文章开始
--firewall开启 ufw,只放行 SSH、HTTP 和 HTTPS
--no-tls不申请证书,适用于 HTTPS 在别处终止的情况
--no-nginx不安装 nginx,适用于已有反向代理的情况
--portDesk 监听的端口(默认 3000)
--node-version使用其他 Node.js 版本(26.12.1 或更高)
--repo、--branch从 fork 或其他分支克隆,代替 --source
--dry-run打印每条命令但不执行

--help 列出全部选项。

设置邮件

推荐设置。提交和回复工单、账户查询的邮箱验证以及团队通知都需要邮件(没有邮件会怎样)。可使用 Resend、Postmark 或 Amazon SES,EMAIL_FROM 需使用邮件服务已验证的域名,SUPPORT_REPLY_TO 设为团队会查看的邮箱。

用 sudoedit /etc/desk/env 把设置添加到 /etc/desk/env:

Bash
EMAIL_PROVIDER=resend
RESEND_API_KEY=re_…
EMAIL_FROM="Acme Support <[email protected]>"
SUPPORT_REPLY_TO=support@acme.com

然后重启:sudo systemctl restart desk。

然后在 后台 → 设置 → Send a test email(发送测试邮件) 中检查。

日常运维

  • 修改设置: sudoedit /etc/desk/env,然后 sudo systemctl restart desk。不要修改 DESK_SECRET_KEY。
  • 新增管理员,或忘记密码、丢失手机: sudo /opt/desk/deploy/create-admin.sh。对已有账号会设置新密码并重置双重认证。
  • 日志: journalctl -u desk -f。
  • 备份: 复制 /var/lib/desk(例如 sudo tar czf desk-data.tgz -C /var/lib/desk .)。
  • 更新: sudo desk-update。它会先备份数据,在正在运行的版本旁边构建新版本,切换时只重启几秒钟;新版本无法启动时会自动回到原来的版本。可以先用 sudo desk-update --check 查看有哪些更新。参见更新。

故障排查

  • 申请证书失败。 通常是域名还没有指向服务器,或云服务商的防火墙关闭了 80 端口。修复后再次运行脚本即可。
  • Node.js 无法启动:libatomic.so.1: cannot open shared object file。 精简版系统镜像(例如 Lightsail)缺少 Node.js 需要的一个库。Desk 1.1.1 及更高版本的脚本会自动安装它;使用旧脚本时,请运行 sudo apt-get install -y libatomic1,然后重新运行脚本。
  • 构建时内存不足。 在 1 GB 的服务器上,请先添加交换空间:sudo fallocate -l 2G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile。
  • 无法登录后台。 后台只能通过 HTTPS 使用。如果 HTTPS 在另一层代理终止,请检查它是否转发到 Desk,以及 /etc/desk/env 中的 TRUST_PROXY_HOPS 是否等于前面代理的层数。