文档

用 Docker Compose 部署 Desk

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. 下载两个文件

在服务器上的一个空目录中(目录名会成为数据卷名称的一部分):

Bash
curl -fsSLO https://raw.githubusercontent.com/modelriver/desk/main/docker-compose.yml
curl -fsSL https://raw.githubusercontent.com/modelriver/desk/main/deploy/docker/env.example -o .env

3. 填写 .env

设置以下三项:

变量示例
DESK_DOMAINsupport.acme.com,Caddy 会为它申请证书
APP_URLhttps://support.acme.com
MODELRIVER_API_KEY你的项目 API 密钥

然后生成两个密钥:

Bash
sed -i "s|^DESK_SECRET_KEY=.*|DESK_SECRET_KEY=$(openssl rand -base64 32)|" .env
sed -i "s|^DESK_IDENTITY_SECRET=.*|DESK_IDENTITY_SECRET=$(openssl rand -base64 48 | tr -d '\n')|" .env

.env 中还有可选设置:邮件(推荐设置,参见设置邮件)、允许嵌入聊天窗口的网站、限流,以及已归档对话的保留时长。

4. 启动

Bash
docker compose up -d
docker compose exec desk node scripts/create-admin.ts

第二条命令会询问第一位管理员的邮箱、姓名和密码。打开 https://support.acme.com/dashboard 登录,首次登录会设置双重认证。

运行的内容

容器作用
deskDesk 本身,以无特权用户运行,没有任何额外的 Linux 权限。读取完整的 .env
caddyHTTPS 以及从 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:

Bash
EMAIL_PROVIDER=resend
RESEND_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 时:
Bash
docker run --rm -v desk_desk-data:/data -v "$PWD":/backup alpine tar czf /backup/desk-data.tgz -C /data .
  • 品牌设置: 在后台 → 设置中设置标志、颜色、字体、标题和网站图标,无需重启。这些设置的默认值在数据卷上的 support.config.json 中,logo 也在旁边。要修改默认值,请复制出来、编辑、复制回去并重启:
Bash
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 加上本地端口,再让你的代理指向它:

YAML
1 ports:
2 - "127.0.0.1:3000:3000"

前面只有一层代理时保留 TRUST_PROXY_HOPS=1,这样限流才能识别真实的访客地址。

用自己修改过的代码构建

如果修改过 Desk,可以从你的仓库副本构建镜像,而不是拉取:

Bash
docker compose -f docker-compose.yml -f docker-compose.source.yml up -d --build

请在与开发目录不同的目录中运行:开发用的 .env 不应给 Docker 使用。