时间:2025-11-16 17:04
人气:
作者:admin
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长度。
以上是我的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
默认docker-compose的redis安全配置存在风险,没有密码,需要改进
我们让KIMI K2 帮助分析评估
点击链接查看和 Kimi 的对话 https://www.kimi.com/share/19a8bb98-01c2-8542-8000-000068d959f0
与
支持中文等多语言
安全认证与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邮件系统支持重试机制,默认尝试 3 次,使用指数退避策略。 queue.module.ts:23-35
Docmost 使用邮件系统来发送邀请邮件、通知等。邮件配置通过环境变量完成,支持两种邮件驱动:SMTP 和 Postmark。 .env.example:27-41
在 .env 文件中设置 MAIL_DRIVER:
MAIL_DRIVER=smtp # 或 postmark
.env.example:28
如果使用 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)以及实时协作的认证。
登录流程在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
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
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)中:
在自托管版本(Self-hosted)中:
hasLicenseKey)才能使用SSO功能 security.tsx:45如果不满足这些条件,用户在设置侧边栏中会看到SSO相关菜单项被禁用,并显示"Available in enterprise edition"(企业版可用)的提示 settings-sidebar.tsx:151-156 settings-sidebar.tsx:230-240 。
SSO功能包括多种认证方式:
所有SSO相关的代码都位于apps/client/src/ee和apps/server/src/ee目录下,这些目录下的文件都受企业版许可证约束 README.md:38-45 。
实时协作使用独立的认证扩展,在apps/server/src/collaboration/extensions/authentication.extension.ts:28-81中实现。 authentication.extension.ts:28-81
开源版本(AGPL 3.0许可证)包含以下基础认证功能:
Docmost使用bcrypt算法来存储用户密码。 utils.ts:8-11
具体实现细节:
bcrypt.hash(password, saltRounds) utils.ts:10当创建新用户时,UserRepo.insertUser()会调用hashPassword()函数对明文密码进行哈希处理后再存入数据库。 user.repo.ts:115
登录时使用comparePasswordHash()函数验证密码: utils.ts:13-18
该函数在AuthService.login()中被调用,用于比对用户输入的明文密码与数据库中存储的哈希值。 auth.service.ts:55-62
修改密码时同样使用hashPassword()对新密码进行哈希处理:
AuthService.changePassword() auth.service.ts:105-113AuthService.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
由于企业版代码(apps/server/src/ee)未包含在提供的代码片段中,无法查看具体的解密实现细节。通常这类许可证系统会使用非对称加密(如 RSA)或 JWT 签名来验证许可证的真实性和完整性,解密后会提取出客户信息、座位数、有效期等字段。
如有想了解更多软件设计与架构, 系统IT,企业信息化, 团队管理 资讯,请关注我的微信订阅号:
作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog。