Docmost Docker Compose 部署指南

在 Ubuntu 服务器上以官方 Docker Compose 结构(Docmost 0.96.0 + PostgreSQL 18 + Redis 8)完整部署 Docmost 的实测指南:端口与网段预分配复核、国内镜像排障与官方 Release 包加载、首次初始化、HTTP/会话/上传落盘验证、日常运维与 8 类常见问题 FAQ,全部命令与回显来自真实部署。

DocmostDocmost2026/10/18

Docmost Docker Compose 部署指南

目标:在一台 Ubuntu 服务器上以官方 Docker Compose 方式完整部署 Docmost 0.96.0(应用 + PostgreSQL 18 + Redis 8),覆盖端口预分配、自定义网段、镜像获取、首次初始化、功能验证与常见排障。本文全部命令与回显均来自 2026-10-18 的真实部署实测;组件背景与选型对比见《Docmost 0.96.0 介绍与选型指南》,逐项环境变量调优见《Docmost 0.96.0 配置参数详解》。

一、环境信息

项目值
服务器 IP(内网)192.168.146.128(网卡 ens33)
操作系统Ubuntu Linux(内核 6.x,x86_64)
Docker 版本29.8.1
Docker Compose 版本v5.5.1
内存 / 磁盘32 GB / 数据盘充足(df -h /opt/data 余量 > 50G)
Docmost 版本0.96.0(官方镜像 docmost/docmost:0.96.0)
数据库PostgreSQL 18(官方镜像 postgres:18)
缓存/队列Redis 8(官方镜像 redis:8)
部署目录/opt/data/quzuo/docmost-0.96.0/
对外端口预分配 8107 → 已占用 → 实际使用 8108 → 3000(启动前 ss -ltn 复核,见三章)
自定义网段预分配 10.89.36.0/24 → 已占用 → 实际使用 10.89.37.0/24
管理员账号admin(admin@example.com)/ q1w2e3r4
应用访问地址http://192.168.146.128:8108

💡 端口与网段顺延说明:按批次规划 Docmost 预分配宿主端口 8107、网段槽位 10.89.36.0/24。实测发现 8107 已被同服务器上先部署的 Teable(teable-1-10-0-mem-app,监听 0.0.0.0:8107)占用,10.89.36.0/24 已被 bookstack_default 网络占用,按约定顺延使用 8108 与 10.89.37.0/24,本文所有配置与回显均以实际值记录。

二、版本说明

本次部署的三个软件组件及版本依据(2026-10-18 查询):

  • Docmost 0.96.0:GitHub 最新稳定 Release(v0.96.0,2026-09-08 发布,含安全修复官方建议升级)。官方 Docker 镜像发布于 Docker Hub docmost/docmost,本次实测加载后本地标签为 0.96.0 与 latest 两个。
  • PostgreSQL 18:官方 compose 默认搭配(官方 docker-compose.yml 中 db 服务即 postgres:18),页面内容、用户、空间、全文检索(tsvector)与企业版 pgvector 向量检索均依赖 PostgreSQL。
  • Redis 8:官方 compose 默认搭配,承担 BullMQ 异步任务队列(邮件发送、文件处理等)与协作状态。

官方 compose 三服务结构(摘自 https://raw.githubusercontent.com/docmost/docmost/main/docker-compose.yml ):docmost(应用,端口 3000)+ db(PostgreSQL 18,挂载 /var/lib/postgresql)+ redis(Redis 8,--appendonly yes --maxmemory-policy noeviction,挂载 /data)。本文在该结构基础上做三处适配:宿主端口 8107→3000 顺延为 8108→3000、显式固定网段 10.89.37.0/24 与固定 IP、数据目录落盘到 /opt/data/quzuo/docmost-0.96.0/。

三、部署前准备

3.1 创建部署目录

三个服务的数据目录统一放在部署目录下,便于备份与迁移:

mkdir -p /opt/data/quzuo/docmost-0.96.0/{storage,db,redis}

3.2 生成应用密钥

APP_SECRET 是会话签名与数据加密密钥,官方要求至少 32 个字符:

openssl rand -hex 32

回显:

f35f9bba2a2204a026106e40fec4d3fd9d4a854708464ec522505ad88a058cc2

💡 该密钥决定登录会话有效性,更换后所有用户需重新登录;务必妥善保管,不要提交到代码仓库。

3.3 端口与网段复核(启动前必做)

先复核预分配端口 8107 是否空闲:

ss -ltn | grep -E ':(8107|8112|8108)\s'

回显:

LISTEN 0      4096         0.0.0.0:8107         0.0.0.0:*
LISTEN 0      4096            [::]:8107            [::]:*
LISTEN 0      4096         0.0.0.0:8112         0.0.0.0:*
LISTEN 0      4096            [::]:8112            [::]:*

回显中 8107、8112 均已有监听,而 8108 无任何监听行——预分配的 8107 不可用,首个空闲端口为 8108。确认 8107/8112 的占用归属:

docker ps --format '{{.Names}} -> {{.Ports}}' | grep -E '8107|8112'

回显:

bookstack-26-09-1-app -> 443/tcp, 0.0.0.0:8112->80/tcp, [::]:8112->80/tcp
teable-1-10-0-mem-app -> 0.0.0.0:8107->3000/tcp, [::]:8107->3000/tcp

8107 与 8112 分别被 Teable 与 BookStack 占用,确定使用空闲的 8108 作为 Docmost 对外端口。

再复核预分配网段 10.89.36.0/24 是否已被其他网络占用:

docker network inspect bookstack_default --format '{{range .IPAM.Config}}{{.Subnet}}{{end}}'

回显:

10.89.36.0/24

10.89.36.0/24 已被 BookStack 的网络占用,顺延使用 10.89.37.0/24(本文后续配置均使用该网段)。

3.4 获取镜像(含国内网络排障)

直接拉取官方镜像在本环境失败:

docker pull docmost/docmost:v0.96.0

回显(失败):

Error response from daemon: error from registry: 🚫 👀-> https://github.com/DaoCloud/public-image-mirror/issues/2328 🔗 这镜像不在白名单. this image is not in the allowlist.

改用 docker.io 全限定名重试仍走同一加速通道,结果相同:

docker pull docker.io/docmost/docmost:v0.96.0

回显(失败):

Error response from daemon: error from registry: 🚫 👀-> https://github.com/DaoCloud/public-image-mirror/issues/2328 🔗 这镜像不在白名单. this image is not in the allowlist.

原因:本环境 Docker 配置了 DaoCloud 国内镜像加速,其白名单不包含 docmost/docmost 仓库。解决:改从 GitHub Release 官方资产下载镜像 tar 包(走代理),再用 docker load 加载:

curl -x http://192.168.1.62:7897 -L --max-time 580 \
  -o docmost-amd64.docker.tar.gz \
  "https://github.com/docmost/docmost/releases/download/v0.96.0/docmost-amd64.docker.tar.gz"

下载完成后核验文件(约 209 MB):

ls -lh docmost-amd64.docker.tar.gz

回显:

-rw-r--r-- 1 root root 209M 10月 18 21:42 /opt/data/quzuo/docmost-0.96.0/docmost-amd64.docker.tar.gz

加载镜像:

docker load -i docmost-amd64.docker.tar.gz

回显:

Loaded image: docmost/docmost:0.96.0
Loaded image: docmost/docmost:latest

PostgreSQL 与 Redis 镜像不在加速白名单限制内,可直接 docker pull postgres:18、docker pull redis:8 拉取。核验三个镜像均已就位:

docker images | grep -E 'docmost|postgres:18|redis:8'

回显:

docmost/docmost   0.96.0    17946a58951d   1.19GB
docmost/docmost   latest    17946a58951d   1.19GB
postgres:18       18        74935e722416   650MB
redis:8           8         2c2dff791878   213MB

四、编写部署配置

在部署目录创建 docker-compose.yml,内容如下(在官方结构基础上:对外端口 8108→3000、固定网段 10.89.37.0/24 与各服务固定 IP、数据目录落盘):

services:
  docmost:
    image: docmost/docmost:0.96.0
    container_name: docmost-0-96-0-app
    depends_on:
      - db
      - redis
    environment:
      APP_URL: 'http://192.168.146.128:8108'
      APP_SECRET: 'f35f9bba2a2204a026106e40fec4d3fd9d4a854708464ec522505ad88a058cc2'
      DATABASE_URL: 'postgresql://docmost:q1w2e3r4@db:5432/docmost'
      REDIS_URL: 'redis://redis:6379'
    ports:
      - "8108:3000"
    restart: unless-stopped
    volumes:
      - /opt/data/quzuo/docmost-0.96.0/storage:/app/data/storage
    networks:
      default:
        ipv4_address: 10.89.37.10

  db:
    image: postgres:18
    container_name: docmost-0-96-0-db
    environment:
      POSTGRES_DB: docmost
      POSTGRES_USER: docmost
      POSTGRES_PASSWORD: q1w2e3r4
    restart: unless-stopped
    volumes:
      - /opt/data/quzuo/docmost-0.96.0/db:/var/lib/postgresql
    networks:
      default:
        ipv4_address: 10.89.37.11

  redis:
    image: redis:8
    container_name: docmost-0-96-0-redis
    command: ["redis-server", "--appendonly", "yes", "--maxmemory-policy", "noeviction"]
    restart: unless-stopped
    volumes:
      - /opt/data/quzuo/docmost-0.96.0/redis:/data
    networks:
      default:
        ipv4_address: 10.89.37.12

networks:
  default:
    name: docmost-0-96-0-net
    ipam:
      config:
        - subnet: 10.89.37.0/24

关键参数说明:

  • APP_URL:对外访问地址,必须与实际访问 URL 一致(协议 + IP/域名 + 端口),否则资源引用与邮件链接会指向错误地址。
  • APP_SECRET:3.2 节生成的 64 位十六进制串(≥32 字符,启动时强校验,过短会启动失败,见 8.6 节)。
  • DATABASE_URL:postgresql://用户:密码@db:5432/库名,db 为 compose 内 db 服务名;用户名/密码/库名需与 db 服务的 POSTGRES_* 三项一致。
  • REDIS_URL:redis://redis:6379;如给 Redis 设置了密码,格式为 redis://:密码@redis:6379。
  • 端口映射 8108:3000:宿主 8108 → 应用内部 3000(应用固定监听 3000,除非另设 PORT 变量)。
  • 存储/数据库/Redis 三个数据目录均使用宿主目录绑定挂载,重建服务不丢数据。
  • 固定 IP 10.89.37.10/11/12 便于防火墙放行与日志审计。

五、部署实施

启动整套服务(在部署目录执行):

cd /opt/data/quzuo/docmost-0.96.0
docker compose up -d

回显:

 Network docmost-0-96-0-net Creating
 Network docmost-0-96-0-net Created
 Container docmost-0-96-0-redis Creating
 Container docmost-0-96-0-db Creating
 Container docmost-0-96-0-redis Created
 Container docmost-0-96-0-db Created
 Container docmost-0-96-0-app Creating
 Container docmost-0-96-0-app Created
 Container docmost-0-96-0-redis Starting
 Container docmost-0-96-0-db Starting
 Container docmost-0-96-0-redis Started
 Container docmost-0-96-0-db Started
 Container docmost-0-96-0-app Starting
 Container docmost-0-96-0-app Started

首次启动时应用自动执行数据库迁移(数据库中记录 52 个迁移,从 20240324T085400-uuid_v7_fn 到 20260904T171920-public-spaces),完成后监听服务端口。观察启动日志:

docker logs docmost-0-96-0-app --since 2m

回显(末尾关键行):

{"level":"info","time":"2026-10-18T14:08:31.083Z","pid":45,"hostname":"0ff3e17d3ab2","context":"DatabaseMigrationService","msg":"No pending database migrations"}
{"level":"info","time":"2026-10-18T14:08:31.098Z","pid":45,"hostname":"0ff3e17d3ab2","context":"NestApplication","msg":"Nest application successfully started"}
{"level":"info","time":"2026-10-18T14:08:31.103Z","pid":45,"hostname":"0ff3e17d3ab2","context":"NestApplication","msg":"Listening on http://127.0.0.1:3000 / http://192.168.146.128:8108"}

💡 说明:上面三行取自数据卷已初始化后的重建启动,因此迁移一行显示 "No pending database migrations";全新部署首次启动该行位置会逐条输出 52 个迁移(名称形如 20240324T085400-uuid_v7_fn、20260904T171920-public-spaces,可用 7.4 节方法核验迁移表),随后同样出现 "Nest application successfully started"。启动日志最后一段会按 APP_URL 回显双地址:Listening on http://127.0.0.1:3000 / http://192.168.146.128:8108,可用它确认端口与 URL 配置是否生效。

确认三个服务运行状态:

docker compose ps --format 'table {{.Name}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}'

回显:

NAME                   IMAGE                    STATUS          PORTS
docmost-0-96-0-app     docmost/docmost:0.96.0   Up 12 minutes   0.0.0.0:8108->3000/tcp, [::]:8108->3000/tcp
docmost-0-96-0-db      postgres:18              Up 37 minutes   5432/tcp
docmost-0-96-0-redis   redis:8                  Up 12 minutes   6379/tcp

六、验证与测试

6.1 HTTP 服务验证

curl -si --max-time 10 http://localhost:8108 | head -12

回显:

HTTP/1.1 200 OK
access-control-allow-origin: *
accept-ranges: bytes
cache-control: public, max-age=0
last-modified: Sun, 18 Oct 2026 14:08:30 GMT
etag: W/"a4f-1a14f57b6ec"
content-type: text/html; charset=utf-8
content-length: 2639
x-frame-options: SAMEORIGIN
Date: Sun, 18 Oct 2026 14:21:43 GMT
Connection: keep-alive
Keep-Alive: timeout=72

HTTP 200,且默认响应带 x-frame-options: SAMEORIGIN(禁止被第三方页面嵌套引用,如需放开见《Docmost 0.96.0 配置参数详解》IFRAME_EMBED_ALLOWED 一节)。

6.2 网段与宿主路由验证

确认自定义网段与固定 IP 生效:

docker network inspect docmost-0-96-0-net --format '{{.Name}} {{range .IPAM.Config}}{{.Subnet}}{{end}}'

回显:

docmost-0-96-0-net 10.89.37.0/24

确认新增网段未影响宿主机默认路由(到 192.168.1.62 仍走 ens33 物理网卡):

ip route get 192.168.1.62

回显:

192.168.1.62 via 192.168.146.2 dev ens33 src 192.168.146.128 uid 0
    cache

6.3 首次初始化(创建工作区与管理员)

首次访问 Web 界面会自动进入初始化向导,按界面提示填写即可。本文为留痕采用与向导等价的 API 方式调用(POST /api/auth/setup,仅在工作区不存在时可用)。

初始化前未建工作区时,业务接口统一返回 404(全局工作区守卫),例如:

curl -s http://localhost:8108/api/users/me

回显:

{"message":"Workspace not found","error":"Not Found","statusCode":404}

执行初始化(工作区名 DocmostDemo,管理员名称 admin、邮箱 admin@example.com、密码 q1w2e3r4):

curl -s -X POST http://localhost:8108/api/auth/setup \
  -H 'Content-Type: application/json' \
  -d '{"name":"admin","email":"admin@example.com","password":"q1w2e3r4","workspaceName":"DocmostDemo"}'

回显(节选):

{"workspace":{"id":"01a14f42-c55d-7421-8613-c1e172a123a3","name":"DocmostDemo",...},"user":{"name":"admin","email":"admin@example.com","role":"owner",...},"defaultSpaceId":"01a14f42-c563-7656-a7f7-201f90b4a2c2"}

同时响应头下发登录态(实测头部,令牌主体截断显示):

set-cookie: authToken=eyJhbGciOiJIUzI1NiJ9....; Path=/; Expires=Sat, 16 Jan 2027 14:36:39 GMT; HttpOnly; SameSite=Lax

(JWT 令牌,HttpOnly + SameSite=Lax;实测解码令牌 exp - iat = 7776000 秒,即默认有效期 90 天,Cookie 有效期同步为 90 天。)

浏览器访问 http://192.168.146.128:8108 即以 admin 身份进入工作区 DocmostDemo;若通过界面初始化,提交表单后同样自动登录进入首页。

6.4 登录与会话验证

模拟正常登录并保存会话 Cookie:

curl -s -X POST http://localhost:8108/api/auth/login \
  -H 'Content-Type: application/json' \
  -d '{"email":"admin@example.com","password":"q1w2e3r4"}' \
  -c /tmp/docmost_cookies.txt \
  -o /dev/null -w 'login -> %{http_code}\n'

回显:

login -> 200

带会话查询当前用户:

curl -s -X POST -b /tmp/docmost_cookies.txt http://localhost:8108/api/users/me

回显(节选):

{"data":{"user":{"id":"01a14f42-c55a-768b-864a-3e0725d1e852","email":"admin@example.com","name":"admin","emailVerifiedAt":"2026-10-18T13:45:38.240Z","avatarUrl":null,"role":"owner","workspaceId":"01a14f42-c55d-7421-..."}}

会话有效,管理员角色为 owner。

6.5 页面创建与存储落盘验证

在默认空间创建一篇验证页面:

curl -s -X POST -b /tmp/docmost_cookies.txt http://localhost:8108/api/pages/create \
  -H 'Content-Type: application/json' \
  -d '{"title":"部署验证页","spaceId":"01a14f42-c563-7656-a7f7-201f90b4a2c2","format":"markdown","content":"# 部署验证\n\nDocmost 0.96.0 部署成功。"}'

回显(节选):

{"data":{"id":"01a14f45-5b2f-7950-b6c2-d38e4b04550c","slugId":"uqKQBA6rJd","title":"部署验证页",...}}

再验证附件上传落盘(先造一个 100KB 测试文件;注意 multipart 字段 pageId 要放在文件字段之前):

dd if=/dev/urandom of=/tmp/smallfile.bin bs=1K count=100 2>/dev/null
curl -s -b /tmp/docmost_cookies.txt \
  -F "pageId=01a14f45-5b2f-7950-b6c2-d38e4b04550c" \
  -F "file=@/tmp/smallfile.bin" \
  http://localhost:8108/api/files/upload

回显(节选):

{"id":"01a14f72-795a-731c-bbfd-68b7e4e22234","fileName":"up2.bin","filePath":"01a14f42-c55d-7421-8613-c1e172a123a3/files/01a14f72-795a-731c-bbfd-68b7e4e22234/up2.bin","fileSize":102400,"fileExt":".bin","mimeType":"application/octet-stream","type":"file",...}

(上传接口响应 fileSize: 102400 与源文件一致,filePath 即存储相对路径。)

确认文件真实落盘到宿主存储目录(结构:storage/<工作区ID>/files/<附件ID>/<文件名>):

find /opt/data/quzuo/docmost-0.96.0/storage -type f

回显:

/opt/data/quzuo/docmost-0.96.0/storage/01a14f42-c55d-7421-8613-c1e172a123a3/files/01a14f72-795a-731c-bbfd-68b7e4e22234/up2.bin

⚠️ 首次上传如遇 Error uploading file to drive,是存储目录属主与运行用户(uid 1000)不一致所致,处理见 8.4 节。

6.6 数据落盘分布核验

三个持久化目录的内容分布:

ls /opt/data/quzuo/docmost-0.96.0/db/ ; ls /opt/data/quzuo/docmost-0.96.0/redis/

回显:

18
appendonlydir  dump.rdb
  • db/18/:PostgreSQL 18 的数据目录(版本号目录,含 52 张迁移表与全部业务表)。
  • redis/:dump.rdb 快照 + appendonlydir/ AOF 增量目录(官方 compose 启用了 --appendonly yes)。
  • storage/:附件与上传文件(见 6.5 节)。

七、日常运维

7.1 启停与重启

cd /opt/data/quzuo/docmost-0.96.0
docker compose stop      # 停止(保留容器与数据)
docker compose start     # 再次启动
docker compose restart   # 重启全部服务
docker compose down      # 停止并移除容器与网络(数据目录保留,数据不丢)

💡 docker compose down 不会删除绑定的宿主数据目录(storage/db/redis),重建 up -d 后数据完整;本文实测中多次重建服务,工作区、页面、附件均保留(迁移表 52 条不重复执行,对应日志 "No pending database migrations")。

7.2 版本升级

升级步骤(以升级到未来版本为例):

  1. 备份:7.3 节 的目录备份 + 数据库逻辑备份;
  2. 修改 docker-compose.yml 中 docmost 服务的 image: 版本号;
  3. 获取新镜像(docker compose pull 或 Release tar 包 + docker load);
  4. docker compose up -d 重建,应用启动时自动执行新增迁移;
  5. 观察日志确认迁移完成与服务监听正常。

7.3 备份与恢复

冷备(停机窗口内,直接打包三个数据目录):

cd /opt/data/quzuo/docmost-0.96.0
docker compose stop docmost
tar czf /backup/docmost-$(date +%F).tar.gz storage db redis
docker compose start docmost

热备(不停机,仅备份数据库逻辑导出 + 附件目录):

docker exec docmost-0-96-0-db pg_dump -U docmost -d docmost > /backup/docmost-db-$(date +%F).sql
tar czf /backup/docmost-storage-$(date +%F).tar.gz storage

恢复:空目录解包数据 + psql -U docmost -d docmost < 备份.sql 重建库,再 docker compose up -d。

7.4 日志查看

docker logs -f docmost-0-96-0-app          # 应用日志(JSON 行,含 context 字段)
docker logs docmost-0-96-0-db --tail 50    # PostgreSQL 日志
docker logs docmost-0-96-0-redis --tail 50 # Redis 日志

八、常见问题(FAQ)

8.1 拉取镜像报「不在白名单」或 TLS 超时

现象:docker pull docmost/docmost:0.96.0 报 docker.m.daocloud.io ... EOF 或 registry-1.docker.io ... TLS handshake timeout。 原因:国内镜像加速站白名单未收录 docmost/docmost 仓库,直连 Docker Hub 受网络阻断。 解决:从 GitHub Release 下载官方镜像 tar 包经代理导入:

curl -x http://<代理地址> -L -o docmost-amd64.docker.tar.gz \
  "https://github.com/docmost/docmost/releases/download/v0.96.0/docmost-amd64.docker.tar.gz"
docker load -i docmost-amd64.docker.tar.gz

8.2 宿主端口被占用导致启动失败

现象:docker compose up -d 时 docmost 服务报 port is already allocated。 排查:ss -ltnp | grep :8107 找到占用方(本文场景为 Envoy/Teable 占 8107、BookStack 占 8112)。 解决:改用空闲端口(本文顺延为 8108),同步修改 ports: 映射与 APP_URL,并 docker compose up -d 重建。

8.3 预分配网段已被占用

现象:docker compose up -d 报 Pool overlaps with other one on this address space。 原因:10.89.36.0/24 已被其他 compose 网络使用。 解决:顺延为 10.89.37.0/24(改 networks.default.ipam.config.subnet 与三个固定 IP),重建后用 docker network inspect 与 ip route get 192.168.1.62 双重复核(网段生效 + 宿主默认路由不受影响)。

8.4 附件上传报 Error uploading file to drive

现象:页面附件上传失败,应用日志出现 context":"AttachmentService","msg":"Error uploading file to drive" 与 Permission denied。 原因:应用进程以 uid 1000(node 用户)运行,而宿主挂载的 storage/ 目录由 root 创建,属主不匹配导致写入被拒。 解决:

chown -R 1000:1000 /opt/data/quzuo/docmost-0.96.0/storage

随后重试上传即可成功落盘。

8.5 首次访问业务接口报 Workspace not found

现象:GET /api/users/me 返回 {"message":"Workspace not found","error":"Not Found","statusCode":404}。 原因:尚未完成首次初始化(工作区不存在),所有业务接口被全局工作区守卫拦截。 解决:访问 Web 首页走初始化向导(工作区名 + 管理员账号),或按 6.3 节调用 POST /api/auth/setup 完成初始化。初始化只能执行一次,重复调用会因工作区已存在被拒绝。

8.6 APP_SECRET 不合规导致启动失败

现象:应用反复重启,日志出现:

The Environment variables has failed the following validations: {"minLength":"APP_SECRET must be longer than or equal to 32 characters"}
Please fix the environment variables and try again. Exiting program...

原因:APP_SECRET 少于 32 字符,或仍为官方 compose 中的占位值(REPLACE_WITH_LONG_SECRET 也在黑名单中)。 解决:用 openssl rand -hex 32 生成合规密钥替换,docker compose up -d 重建。注意更换密钥后既有登录会话全部失效。

8.7 忘记管理员密码且未配置邮件

现象:点「忘记密码」提示成功但收不到邮件。 原因:默认邮件驱动为 log(日志驱动),生产环境下邮件不入队不实发;未配置 SMTP 时密码重置邮件无法送达。 解决:配置 SMTP(MAIL_DRIVER=smtp + SMTP_HOST/SMTP_PORT/SMTP_USERNAME/SMTP_PASSWORD)或由管理员在后台用户管理中直接重置密码;驱动行为详见《Docmost 0.96.0 配置参数详解》。

8.8 compose 文件报 YAML 解析错误

现象:docker compose up -d 报 mapping values are not allowed in this context 或变量重复告警。 原因:手改 YAML 时同一键出现两次(本文实测中曾把 REDIS_URL 写重),YAML 同映射重复键会导致覆盖或解析失败。 解决:docker compose config 校验配置(会明确指出错误行),清理重复键后重建。

九、要点总结

  • 官方三件套结构一次拉齐:Docmost 0.96.0 + PostgreSQL 18 + Redis 8,数据全部落在 /opt/data/quzuo/docmost-0.96.0/ 三个目录,备份迁移成本低。
  • 端口与网段必须启动前复核:本环境 8107/8112 已被占用、10.89.36.0/24 已被占用,顺延为 8108 与 10.89.37.0/24,并验证宿主默认路由不受影响。
  • 国内网络拉不到官方镜像时,走 GitHub Release 官方 tar 包 + docker load 是可靠替代路径。
  • 首次初始化等价 API 是 POST /api/auth/setup(仅一次),管理员获得 owner 角色,登录会话为 JWT Cookie(HttpOnly,默认 90 天)。
  • 附件本地落盘结构 storage/<工作区ID>/files/<附件ID>/<文件名>,存储目录属主必须是 uid 1000,否则上传报错——这是实测中最容易踩的坑。

十、参考链接

  1. 官方安装文档:https://docmost.com/docs/installation
  2. 官方 docker-compose.yml:https://raw.githubusercontent.com/docmost/docmost/main/docker-compose.yml
  3. Release v0.96.0(含镜像 tar 资产):https://github.com/docmost/docmost/releases/tag/v0.96.0
  4. 环境变量文档:https://docmost.com/docs/self-hosting/environment-variables
  5. 《Docmost 0.96.0 介绍与选型指南》(本专栏)
  6. 《Docmost 0.96.0 配置参数详解》(本专栏)