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.gitcd desksudo ./deploy/setup-server.sh --source . --domain support.acme.com --email you@acme.com脚本会:
- 以不回显的方式询问你的 ModelRiver API 密钥。也可以通过环境变量
MODELRIVER_API_KEY传入,但在命令行中输入的密钥会留在 shell 历史里。 - 生成
DESK_SECRET_KEY和DESK_IDENTITY_SECRET。 - 安装 Node.js、构建 Desk 并启动服务。
- 询问第一位管理员的邮箱、姓名和密码(也可以设置
ADMIN_EMAIL、ADMIN_NAME和ADMIN_PASSWORD)。 - 配置 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/desk | desk-update 每次更新前生成的备份,保留最近 3 份 |
选项
| 选项 | 作用 |
|---|---|
--sample-data | 以示例文章开始 |
--firewall | 开启 ufw,只放行 SSH、HTTP 和 HTTPS |
--no-tls | 不申请证书,适用于 HTTPS 在别处终止的情况 |
--no-nginx | 不安装 nginx,适用于已有反向代理的情况 |
--port | Desk 监听的端口(默认 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=resendRESEND_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是否等于前面代理的层数。