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
許可證相關
客户端流程
在客户端,許可證的處理流程如下:
-
激活許可證: 用户通過
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。