Docmost Docker Compose 部署指南
在 Ubuntu 服务器上以官方 Docker Compose 结构(Docmost 0.96.0 + PostgreSQL 18 + Redis 8)完整部署 Docmost 的实测指南:端口与网段预分配复核、国内镜像排障与官方 Release 包加载、首次初始化、HTTP/会话/上传落盘验证、日常运维与 8 类常见问题 FAQ,全部命令与回显来自真实部署。
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 版本升级
升级步骤(以升级到未来版本为例):
- 备份:
7.3 节的目录备份 + 数据库逻辑备份; - 修改
docker-compose.yml中 docmost 服务的image:版本号; - 获取新镜像(
docker compose pull或 Release tar 包 +docker load); docker compose up -d重建,应用启动时自动执行新增迁移;- 观察日志确认迁移完成与服务监听正常。
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,否则上传报错——这是实测中最容易踩的坑。
十、参考链接
- 官方安装文档:https://docmost.com/docs/installation
- 官方 docker-compose.yml:https://raw.githubusercontent.com/docmost/docmost/main/docker-compose.yml
- Release v0.96.0(含镜像 tar 资产):https://github.com/docmost/docmost/releases/tag/v0.96.0
- 环境变量文档:https://docmost.com/docs/self-hosting/environment-variables
- 《Docmost 0.96.0 介绍与选型指南》(本专栏)
- 《Docmost 0.96.0 配置参数详解》(本专栏)