Docmost 简介
Docmost是一款开源的协作维基和文档管理软件,它旨在为团队提供一个集中化、高效且易于使用的平台来创建、共享以及管理信息。作为 Confluence 和 Notion 的开源替代品,Docmost 提供了强大的功能集以满足现代企业和组织对于知识管理和协同工作的需求。许可AGPL 3.0 (open source)
容器部署
image镜像获取
docker pull registry.cn-hangzhou.aliyuncs.com/megadotnet/redis:7.2-alpine && docker tag registry.cn-hangzhou.aliyuncs.com/megadotnet/redis:7.2-alpine redis:7.2-alpine
docker pull registry.cn-hangzhou.aliyuncs.com/megadotnet/postgres:16-alpine && docker tag registry.cn-hangzhou.aliyuncs.com/megadotnet/postgres:16-alpine postgres:16-alpine
docker pull registry.cn-hangzhou.aliyuncs.com/megadotnet/docmost.docmost:latest && docker tag registry.cn-hangzhou.aliyuncs.com/megadotnet/docmost.docmost:latest docmost/docmost:latest
Docker-compose.yml
services:
docmost:
image: docmost/docmost:latest
depends_on:
- db
- redis
environment:
APP_URL: 'http://localhost:3000'
APP_SECRET: 'ccEgK8RRg9MH48094qeC1Ekje4JKTQNmWXvcr5trr98LmYfF3uGQK9WVtL1Dmn8KwGjt5xowhnwwdz3pAV6vx'
DATABASE_URL: 'postgresql://docmost:STRONG_DB_PASSWORD@db:5432/docmost?schema=public'
REDIS_URL: 'redis://redis:6379'
ports:
- "3000:3000"
restart: unless-stopped
volumes:
- docmost:/data/docmost/storagedb:
image: postgres:16-alpine
environment:
POSTGRES_DB: docmost
POSTGRES_USER: docmost
POSTGRES_PASSWORD: STRONG_DB_PASSWORD
restart: unless-stopped
volumes:
- db_data:/data/docmost/postgresql/redis:
image: redis:7.2-alpine
restart: unless-stopped
volumes:
- redis_data:/data/docmostvolumes:
docmost:
db_data:
redis_data:
注意以上密钥需要自己生成,黄色字体部分,密钥32长度。
系统入口
http://192.168.83.130:3000/
以上是我的VM的IP,真实情况需要您自己IP与域名
部署后资源消耗情况

运行日志
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:42 AM LOG [NestFactory] Starting Nest application...
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:43 AM LOG [DatabaseModule] Establishing database connection
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:43 AM LOG [DatabaseModule] Database connection successful
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20240324T085400-uuid_v7_fn" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20240324T085500-workspaces" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20240324T085600-users" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20240324T085700-groups" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20240324T085900-spaces" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20240324T086100-add-workspace-fk" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20240324T086200-workspace_invitations" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20240324T086300-pages" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20240324T086400-page_history" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20240324T086600-comments" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20240324T086700-attachments" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20240324T086800-pages-tsvector-trigger" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20240707T145623-drop-redundant-pages-slug_id-index" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20240903T124647-user-tokens" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20241218T223249-backlinks" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20250106T195516-billing" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20250118T194658-sso-auth" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20250222T114520-add_license_key_to_workspace" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20250327T145832-add-contributorIds-to-pages" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20250408T191830-shares" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20250521T154949-file_tasks" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20250623T215045-more-billing-columns" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20250715T070817-mfa" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20250725T052004-add-new-comments-columns" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20250729T213756-add-unaccent-pg_trm-update-tsvector." executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20250831T191600-add-group-sync-to-auth-providers" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20250831T202306-ldap-auth" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [DatabaseMigrationService] Migration "20250901T184612-attachments-search" executed successfully
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [NestApplication] Nest application successfully started
docmost-1 | [Nest] 41 - 11/16/2025, 6:59:44 AM LOG [NestApplication] Listening on http://127.0.0.1:3000 / http://localhost:3000
redis-1 | 1:M 16 Nov 2025 07:04:31.085 * 100 changes in 300 seconds. Saving...
redis-1 | 1:M 16 Nov 2025 07:04:31.517 * Background saving started by pid 19
redis-1 | 19:C 16 Nov 2025 07:04:31.552 * DB saved on disk
redis-1 | 19:C 16 Nov 2025 07:04:31.553 * Fork CoW for RDB: current 4 MB, peak 4 MB, average 3 MB
redis-1 | 1:M 16 Nov 2025 07:04:31.620 * Background saving terminated with success
db-1 | 2025-11-16 07:04:33.357 UTC [54] LOG: checkpoint starting: time
db-1 | 2025-11-16 07:05:09.795 UTC [54] LOG: checkpoint complete: wrote 357 buffers (2.2%); 0 WAL file(s) added, 0 removed, 0 recycled; write=36.436 s, sync=0.002 s, total=36.439 s; sync files=210, longest=0.001 s, average=0.001 s; distance=1798 kB, estimate=1798 kB; lsn=0/1AE0450, redo lsn=0/1AE0418
Redis中数据
默认docker-compose的redis安全配置存在风险,没有密码,需要改进

DB数据库设计评估
我们让KIMI K2 帮助分析评估
点击链接查看和 Kimi 的对话 https://www.kimi.com/share/19a8bb98-01c2-8542-8000-000068d959f0

E-R图片段

与

功能测试
支持中文等多语言

安全认证与SSO 需要企业版
进入首页与空间后

可以快速生成外部链接
http://192.168.83.130:3000/share/r3x5ewy0s6/p/ai-VvhBr3UCYP
简单搜索功能

支持markdown语法生成目标导航,编辑器支持/调用 标题等

系统架构

技术组件

配置

邮件发送流程
配置完成后,系统会自动发送邮件。例如,当邀请用户加入工作空间时: workspace-invitation.service.ts:172-182
- 创建邀请记录
- 调用
sendInvitationMail()方法 workspace-invitation.service.ts:375-397 - 邮件被添加到 BullMQ 队列 mail.service.ts:37-49
- 队列处理器异步发送邮件 queue.module.ts:40-42
邮件系统支持重试机制,默认尝试 3 次,使用指数退避策略。 queue.module.ts:23-35

自动发送邮件配置
Docmost 使用邮件系统来发送邀请邮件、通知等。邮件配置通过环境变量完成,支持两种邮件驱动:SMTP 和 Postmark。 .env.example:27-41
配置步骤
1. 选择邮件驱动
在 .env 文件中设置 MAIL_DRIVER:
MAIL_DRIVER=smtp # 或 postmark
.env.example:28
2. SMTP 配置
如果使用 SMTP,需要配置以下参数: .env.example:32-38
SMTP_HOST=127.0.0.1 SMTP_PORT=587 SMTP_USERNAME=your_username SMTP_PASSWORD=your_password SMTP_SECURE=false SMTP_IGNORETLS=false
系统会读取这些环境变量并创建 SMTP 连接。 mail.provider.ts:28-49 如果提供了用户名和密码,会自动配置认证。 mail.provider.ts:29-38
认证概述
Docmost实现了多层次的认证系统,包括基础的邮箱密码认证、双因素认证(MFA)、单点登录(SSO)以及实时协作的认证。
主要认证方式
1. 基础登录认证
登录流程在apps/client/src/features/auth/hooks/use-auth.ts:38-61中实现。 use-auth.ts:38-61 当用户登录时,系统会检查是否需要MFA验证或MFA设置。 use-auth.ts:46-52
登录API调用在apps/client/src/features/auth/services/auth-service.ts:14-17中定义。 auth-service.ts:14-17
2. 双因素认证(MFA)
MFA设置界面在apps/client/src/ee/mfa/components/mfa-settings.tsx:14-43中实现。 mfa-settings.tsx:14-43 系统支持authenticator应用和备份代码两种MFA方式。 translation.json:426-430
工作区可以强制所有成员启用MFA,配置在apps/client/public/locales/zh-CN/translation.json:516-517中说明。 translation.json:516-517
3. 单点登录(SSO)
SSO支持多种协议,包括SAML、OIDC和LDAP。认证提供商的数据结构在apps/client/src/ee/security/types/security.types.ts:3-29中定义。 security.types.ts:3-29
LDAP配置表单在apps/client/src/ee/security/components/sso-ldap-form.tsx:110-226中实现,包括服务器URL、绑定DN、用户搜索过滤器等配置。 sso-ldap-form.tsx:110-153
工作区可以强制使用SSO登录,禁用邮箱密码登录。 enforce-sso.tsx:9-26 登录表单会根据enforceSso设置决定是否显示密码输入框。 login-form.tsx:73-109
SSO(单点登录)认证功能确实是企业版功能 security.tsx:45-52 。
从代码中可以看到,SSO功能的访问控制逻辑如下:
在云版本(Cloud)中:
- 需要Business计划才能使用SSO功能 security.tsx:45
在自托管版本(Self-hosted)中:
- 需要有效的企业许可证密钥(
hasLicenseKey)才能使用SSO功能 security.tsx:45
如果不满足这些条件,用户在设置侧边栏中会看到SSO相关菜单项被禁用,并显示"Available in enterprise edition"(企业版可用)的提示 settings-sidebar.tsx:151-156 settings-sidebar.tsx:230-240 。
SSO功能包括多种认证方式:
- SAML sso-saml-form.tsx:1-10
- OIDC sso-oidc-form.tsx:1-10
- Google OAuth sso-provider-modal.tsx:44-46
- LDAP sso-ldap-form.tsx:1-10
所有SSO相关的代码都位于apps/client/src/ee和apps/server/src/ee目录下,这些目录下的文件都受企业版许可证约束 README.md:38-45 。
4. 实时协作认证
实时协作使用独立的认证扩展,在apps/server/src/collaboration/extensions/authentication.extension.ts:28-81中实现。 authentication.extension.ts:28-81
开源版本(AGPL 3.0许可证)包含以下基础认证功能:
- 用户名密码登录: 标准的邮箱/密码认证方式 auth.controller.ts:38-88
- 密码重置: 忘记密码和密码重置功能 auth.controller.ts:115-148
- 密码修改: 已登录用户修改密码 auth.controller.ts:104-113
- 工作区初始化: 创建管理员账户和工作区 auth.controller.ts:90-102
密码哈希算法
Docmost使用bcrypt算法来存储用户密码。 utils.ts:8-11
具体实现细节:
- Salt轮数: 12轮 utils.ts:9
- 哈希函数:
bcrypt.hash(password, saltRounds)utils.ts:10
密码处理流程
1. 密码存储
当创建新用户时,UserRepo.insertUser()会调用hashPassword()函数对明文密码进行哈希处理后再存入数据库。 user.repo.ts:115
2. 密码验证
登录时使用comparePasswordHash()函数验证密码: utils.ts:13-18
该函数在AuthService.login()中被调用,用于比对用户输入的明文密码与数据库中存储的哈希值。 auth.service.ts:55-62
3. 密码修改
修改密码时同样使用hashPassword()对新密码进行哈希处理:
- 修改密码场景:
AuthService.changePassword()auth.service.ts:105-113 - 重置密码场景:
AuthService.passwordReset()auth.service.ts:184-195
密码哈希算法
Docmost使用bcrypt算法来存储用户密码。 utils.ts:8-11
具体实现细节:
- Salt轮数: 12轮 utils.ts:9
- 哈希函数:
bcrypt.hash(password, saltRounds)utils.ts:10
密码处理流程
1. 密码存储
当创建新用户时,UserRepo.insertUser()会调用hashPassword()函数对明文密码进行哈希处理后再存入数据库。 user.repo.ts:115
2. 密码验证
登录时使用comparePasswordHash()函数验证密码: utils.ts:13-18
该函数在AuthService.login()中被调用,用于比对用户输入的明文密码与数据库中存储的哈希值。 auth.service.ts:55-62
3. 密码修改
修改密码时同样使用hashPassword()对新密码进行哈希处理:
- 修改密码场景:
AuthService.changePassword()auth.service.ts:105-113 - 重置密码场景:
AuthService.passwordReset()auth.service.ts:184-195
许可证相关
客户端流程
在客户端,许可证的处理流程如下:
激活许可证: 用户通过
ActivateLicenseForm组件输入许可证密钥,调用activateLicense(licenseKey)函数将密钥发送到服务端/license/activate接口。 license-service.ts:9-14获取许可证信息: 通过
getLicenseInfo()调用/license/info接口获取已解密的许可证详情。 license-service.ts:4-7展示许可证信息:
LicenseDetails组件展示解密后的许可证信息,包括客户名称、座位数、发行日期、过期日期等。 license-details.tsx:30-62
服务端存储
许可证密钥以加密形式存储在 workspaces 表的 licenseKey 字段中。 db.d.ts:335 该字段在数据库迁移中被添加为 varchar 类型。 20250222T114520-add_license_key_to_workspace.ts:4-7
在返回给客户端时,服务端会将 licenseKey 字段转换为布尔值 hasLicenseKey,避免将原始密钥暴露给前端。 user.controller.ts:35-41
企业版模块
实际的许可证解密和验证逻辑位于企业版模块中。应用启动时会尝试加载 ./ee/ee.module 中的 EeModule。 app.module.ts:20-32
如果是云版本(CLOUD=true)但无法加载企业版模块,程序会退出。 app.module.ts:28-31
Notes
由于企业版代码(apps/server/src/ee)未包含在提供的代码片段中,无法查看具体的解密实现细节。通常这类许可证系统会使用非对称加密(如 RSA)或 JWT 签名来验证许可证的真实性和完整性,解密后会提取出客户信息、座位数、有效期等字段。
今天先到这儿,希望对AI,云原生,技术领导力, 企业管理,系统架构设计与评估,团队管理, 项目管理, 产品管理,信息安全,团队建设 有参考作用 , 您可能感兴趣的文章:
微服务架构设计
视频直播平台的系统架构演化
微服务与Docker介绍
Docker与CI持续集成/CD
互联网电商购物车架构演变案例
互联网业务场景下消息队列架构
互联网高效研发团队管理演进之一
消息系统架构设计演进
互联网电商搜索架构演化之一
企业信息化与软件工程的迷思
企业项目化管理介绍
软件项目成功之要素
人际沟通风格介绍一
精益IT组织与分享式领导
学习型组织与企业
企业创新文化与等级观念
组织目标与个人目标
初创公司人才招聘与管理
人才公司环境与企业文化
企业文化、团队文化与知识共享
高效能的团队建设
项目管理沟通计划
构建高效的研发与自动化运维
某大型电商云平台实践
互联网数据库架构设计思路
IT基础架构规划方案一(网络系统规划)
餐饮行业解决方案之客户分析流程
餐饮行业解决方案之采购战略制定与实施流程
餐饮行业解决方案之业务设计流程
供应链需求调研CheckList
企业应用之性能实时度量系统演变
如有想了解更多软件设计与架构, 系统IT,企业信息化, 团队管理 资讯,请关注我的微信订阅号:

作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog。