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/storage

  db:
     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/docmost

volumes:
   docmost:
   db_data:
   redis_data:

      注意以上密钥需要自己生成,黄色字体部分,密钥32长度。

系统入口

http://192.168.83.130:3000/

以上是我的VM的IP,真实情况需要您自己IP与域名


部署后资源消耗情况

image


运行日志

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安全配置存在风险,没有密码,需要改进

image

DB数据库设计评估

我们让KIMI K2 帮助分析评估

点击链接查看和 Kimi 的对话 https://www.kimi.com/share/19a8bb98-01c2-8542-8000-000068d959f0

image

E-R图片段

image

image

功能测试

支持中文等多语言

image

安全认证与SSO 需要企业版

进入首页与空间后

image

可以快速生成外部链接

http://192.168.83.130:3000/share/r3x5ewy0s6/p/ai-VvhBr3UCYP

简单搜索功能

image

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

image

系统架构

image

技术组件

image


配置

image

邮件发送流程

配置完成后,系统会自动发送邮件。例如,当邀请用户加入工作空间时: workspace-invitation.service.ts:172-182

  1. 创建邀请记录
  2. 调用 sendInvitationMail() 方法 workspace-invitation.service.ts:375-397
  3. 邮件被添加到 BullMQ 队列 mail.service.ts:37-49
  4. 队列处理器异步发送邮件 queue.module.ts:40-42

邮件系统支持重试机制,默认尝试 3 次,使用指数退避策略。 queue.module.ts:23-35

image

自动发送邮件配置

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/eeapps/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


许可证相关

客户端流程

在客户端,许可证的处理流程如下:

  1. 激活许可证: 用户通过 ActivateLicenseForm 组件输入许可证密钥,调用 activateLicense(licenseKey) 函数将密钥发送到服务端 /license/activate 接口。 license-service.ts:9-14

  2. 获取许可证信息: 通过 getLicenseInfo() 调用 /license/info 接口获取已解密的许可证详情。 license-service.ts:4-7

  3. 展示许可证信息: 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,企业信息化, 团队管理 资讯,请关注我的微信订阅号:

_thumb_thumb_thumb_thumb_thumb_thumb

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

posted on 2025-11-16 17:04  PetterLiu  阅读(6)  评论(0)    收藏  举报