docker-compose.yml 运行已发布的镜像 ghcr.io/modelriver/desk(支持 amd64 和 arm64),前面由 Caddy 获取并续期 HTTPS 证书。Node.js、SQLite 和 Caddy 都在容器里:服务器上只需要 Docker 和 Compose 2.23 或更高版本,不需要代码副本。开始前请先阅读所有部署方式的共同要求。
1. 把域名指向服务器
为 Desk 的域名(例如 support.acme.com)添加指向服务器的 A 记录(IPv6 再加 AAAA 记录),并开放 80 和 443 端口。
2. 下载两个文件
在服务器上的一个空目录中(目录名会成为数据卷名称的一部分):
curl -fsSLO https://raw.githubusercontent.com/modelriver/desk/main/docker-compose.ymlcurl -fsSL https://raw.githubusercontent.com/modelriver/desk/main/deploy/docker/env.example -o .env3. 填写 .env
设置以下三项:
| 变量 | 示例 |
|---|---|
DESK_DOMAIN | support.acme.com,Caddy 会为它申请证书 |
APP_URL | https://support.acme.com |
MODELRIVER_API_KEY | 你的项目 API 密钥 |
然后生成两个密钥:
sed -i "s|^DESK_SECRET_KEY=.*|DESK_SECRET_KEY=$(openssl rand -base64 32)|" .envsed -i "s|^DESK_IDENTITY_SECRET=.*|DESK_IDENTITY_SECRET=$(openssl rand -base64 48 | tr -d '\n')|" .env.env 中还有可选设置:邮件(推荐设置,参见设置邮件)、允许嵌入聊天窗口的网站、限流,以及已归档对话的保留时长。
4. 启动
docker compose up -ddocker compose exec desk node scripts/create-admin.ts第二条命令会询问第一位管理员的邮箱、姓名和密码。打开 https://support.acme.com/dashboard 登录,首次登录会设置双重认证。
运行的内容
| 容器 | 作用 |
|---|---|
desk | Desk 本身,以无特权用户运行,没有任何额外的 Linux 权限。读取完整的 .env |
caddy | HTTPS 以及从 HTTP 的跳转。它只拿到 DESK_DOMAIN,看不到你的密钥 |
| 内容 | 位置 |
|---|---|
| 设置 | docker-compose.yml 旁边的 .env |
| 你的数据 | desk-data 数据卷:data/(文章和笔记)、desk.db 和 support.config.json |
| 证书 | caddy-data 数据卷 |
设置邮件
推荐设置。提交和回复工单、账户查询的邮箱验证以及团队通知都需要邮件(没有邮件会怎样)。可使用 Resend、Postmark 或 Amazon SES,EMAIL_FROM 需使用邮件服务已验证的域名,SUPPORT_REPLY_TO 设为团队会查看的邮箱。
把设置添加到 .env:
EMAIL_PROVIDER=resendRESEND_API_KEY=re_…EMAIL_FROM="Acme Support <[email protected]>"SUPPORT_REPLY_TO=support@acme.com然后应用:docker compose up -d。
然后在 后台 → 设置 → Send a test email(发送测试邮件) 中检查。
日常运维
- 日志:
docker compose logs -f desk。 - 修改设置: 编辑
.env,然后运行docker compose up -d。 - 新增管理员,或忘记密码、丢失手机:
docker compose exec desk node scripts/create-admin.ts。 - 备份: 数据卷的完整名称以目录名开头(
docker volume ls可以查看)。目录名为desk时:
docker run --rm -v desk_desk-data:/data -v "$PWD":/backup alpine tar czf /backup/desk-data.tgz -C /data .- 品牌设置: 在后台 → 设置中设置标志、颜色、字体、标题和网站图标,无需重启。这些设置的默认值在数据卷上的
support.config.json中,logo 也在旁边。要修改默认值,请复制出来、编辑、复制回去并重启:
docker compose cp desk:/data/support.config.json .docker compose cp support.config.json desk:/data/docker compose restart desk- 示例文章: 首次启动前在
.env中设置DESK_SAMPLE_DATA=true。 - 更新:
docker compose pull && docker compose up -d。如需定期更新,参见更新。
版本
1 标签会跟随所有 1.x 版本。要固定在某个版本,在 .env 中设置 DESK_VERSION=1.0.1。
用自己的反向代理代替 Caddy
删除 caddy 服务和 configs 部分,为 desk 加上本地端口,再让你的代理指向它:
1 ports:2 - "127.0.0.1:3000:3000"前面只有一层代理时保留 TRUST_PROXY_HOPS=1,这样限流才能识别真实的访客地址。
用自己修改过的代码构建
如果修改过 Desk,可以从你的仓库副本构建镜像,而不是拉取:
docker compose -f docker-compose.yml -f docker-compose.source.yml up -d --build请在与开发目录不同的目录中运行:开发用的 .env 不应给 Docker 使用。