CryptPad:自托管加密协作文档平台,端对端加密的 Google Docs 替代

CryptPad 是一款完全开源的端对端加密协作文档平台,提供富文本文档、电子表格、幻灯片、看板、代码编辑器等多种文档类型。与 Google Docs、Microsoft 365 等商业云服务不同,CryptPad 的核心设计哲学是"零知识"——服务器端无法读取任何用户数据,所有内容在客户端加密后才上传存储。这意味着即使服务提供商被黑客攻击或遭受法律传票,用户数据依然无法被读取。

对于注重数据隐私的个人、律师事务所、医疗机构、新闻媒体或企业团队,CryptPad 是 Google Docs 的理想替代方案。它支持实时多人协作编辑、文档历史版本、团队空间(Drive)、访问权限控制、匿名共享链接等完整功能,且无需注册账号即可使用部分功能。本文将使用 Docker Compose + Caddy 完成 CryptPad 的自托管部署。

相较于官方托管的 CryptPad.fr,自托管版本拥有完全的数据主权,不受存储空间限制,还可以在内网环境下运行,适合对合规要求较高的企业场景。


服务器配置

CryptPad 是纯 Node.js 应用,内存占用适中,主要负载来自文件存储 I/O 和并发 WebSocket 连接。对于 10-50 人的小团队,2 核 4GB 机型可以流畅运行,磁盘空间建议根据预期文档量适当预留。

推荐使用雨云服务器部署 CryptPad,注册填优惠码 2026off 领 5 折优惠券,2 核 4GB 机型性价比极高,完全满足中小团队的自托管需求。

推荐配置:

项目 规格
CPU 2 核
内存 4 GB
磁盘 40 GB SSD(存储加密文档数据)
操作系统 Ubuntu 22.04 LTS
带宽 5 Mbps 及以上

环境要求

  • Docker 24.0+
  • Docker Compose v2.20+
  • 已解析到服务器的域名(CryptPad 强制要求 HTTPS)
  • 开放 80/443 端口

安装 Docker 环境:

curl -fsSL https://get.docker.com | sh
systemctl enable --now docker
docker --version && docker compose version

准备工作

创建目录结构

mkdir -p /opt/cryptpad
cd /opt/cryptpad
mkdir -p data/blob data/block data/customize data/data \
         data/files data/logs data/onlyoffice-dist \
         data/onlyoffice-conf

生成必要的密钥

CryptPad 配置文件需要一组随机密钥,可以用 openssl 生成:

# 生成管理员密钥(保存好这个值)
openssl rand -hex 32

部署配置

创建 /opt/cryptpad/docker-compose.yml

version: "3.9"

services:
  cryptpad:
    image: cryptpad/cryptpad:latest
    container_name: cryptpad
    restart: unless-stopped
    ports:
      - "127.0.0.1:3000:3000"
      - "127.0.0.1:3001:3001"
    environment:
      CPAD_MAIN_DOMAIN: "https://pad.yourdomain.com"
      CPAD_SANDBOX_DOMAIN: "https://sandbox.yourdomain.com"
      CPAD_CONF: "/cryptpad/config/config.js"
      CPAD_INSTALL_ONLYOFFICE: "yes"
    volumes:
      - ./data/blob:/cryptpad/blob
      - ./data/block:/cryptpad/block
      - ./data/customize:/cryptpad/customize
      - ./data/data:/cryptpad/data
      - ./data/files:/cryptpad/datastore
      - ./data/logs:/cryptpad/log
      - ./data/onlyoffice-dist:/cryptpad/www/common/onlyoffice/dist
      - ./data/onlyoffice-conf:/cryptpad/onlyoffice-conf
      - ./config.js:/cryptpad/config/config.js:ro
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000"]
      interval: 30s
      timeout: 10s
      retries: 3

创建 /opt/cryptpad/config.js 配置文件:

module.exports = {
  httpUnsafeOrigin: 'https://pad.yourdomain.com',
  httpSafeOrigin: 'https://sandbox.yourdomain.com',

  httpAddress: '::',
  httpPort: 3000,

  websocketPort: 3001,

  // 管理员密钥(填写你生成的密钥)
  adminKeys: [
    // '[admin@yourdomain.com/keys]...'
  ],

  // 存储路径
  filePath: './datastore/',
  archivePath: './data/archive',
  pinPath: './data/pins',
  taskPath: './data/tasks',
  blockPath: './block',
  blobPath: './blob',
  blobStagingPath: './data/blobstage',
  decreePath: './data/decrees',
  logPath: './log',

  // 日志级别
  logLevel: 'info',
  logToStdout: true,

  // 注册与访客设置
  restrictRegistration: false,
  allowSubscriptions: false,

  // 最大上传大小 (MB)
  maxUploadSize: 20 * 1024 * 1024,
  premiumUploadSize: 100 * 1024 * 1024,

  // 存储限制(每用户 1GB)
  defaultStorageLimit: 1 * 1024 * 1024 * 1024,
};

启动服务:

cd /opt/cryptpad
docker compose up -d
docker compose logs -f cryptpad

Caddy 反向代理

CryptPad 需要同时代理主域名沙盒域名两个域。沙盒域名是安全隔离机制的核心,不可省略。

编辑 /etc/caddy/Caddyfile

pad.yourdomain.com {
    reverse_proxy localhost:3000

    # 必要的安全响应头
    header {
        X-XSS-Protection "1; mode=block"
        X-Content-Type-Options "nosniff"
        X-Frame-Options "SAMEORIGIN"
        Referrer-Policy "same-origin"
    }

    encode gzip
}

sandbox.yourdomain.com {
    reverse_proxy localhost:3000

    header {
        X-Frame-Options "ALLOW-FROM https://pad.yourdomain.com"
    }

    encode gzip
}

重载 Caddy:

systemctl reload caddy

DNS 配置提醒: 需要将 pad.yourdomain.comsandbox.yourdomain.com 都解析到服务器 IP。


核心功能配置

配置管理员账号

  1. 注册账号后,进入「设置」→「账户」,将页面底部的「公钥」字符串复制
  2. 编辑 config.js,将公钥填入 adminKeys 数组
  3. 重启容器:docker compose restart cryptpad
  4. 刷新页面,顶部导航栏会出现「管理员」入口

配置 SMTP 邮件通知

config.js 中添加邮件配置:

// 邮件通知(可选)
emailPath: './data/email',
  
// 在管理后台的「通知」页面配置 SMTP
// 或在 config.js 中直接配置:
adminEmail: 'admin@yourdomain.com',

进入管理员后台 → 「通知」→ 配置 SMTP 服务器即可启用邮件通知。

配置存储配额

在管理员后台中可以:

  • 全局调整默认存储限制
  • 为特定用户分配更大空间
  • 查看全局存储使用情况统计

启用 OnlyOffice 集成

CryptPad 可选集成 OnlyOffice 引擎,提供更好的 .docx.xlsx.pptx 编辑体验:

# 查看 OnlyOffice 安装状态
docker compose exec cryptpad ls /cryptpad/www/common/onlyoffice/dist/

# 若目录为空,手动触发安装
docker compose exec cryptpad npm run install:onlyoffice

使用技巧

创建团队空间(Drive)

注册登录后,点击左侧「团队」→「创建团队」,可以建立共享工作空间,团队成员通过邀请链接加入后共享文件夹和文档。

文档分享方式

CryptPad 提供三种链接:

  • 编辑链接:接收者可编辑文档(包含完整密钥)
  • 查看链接:只读访问
  • 安全链接:通过密码保护,适合敏感文档外部分享

离线访问

CryptPad 的 PWA 支持离线缓存,安装到桌面后可在无网络时查看已缓存的文档。

定期备份

# 备份所有数据
tar czf /backup/cryptpad-$(date +%Y%m%d).tar.gz /opt/cryptpad/data/

# 建议配合 cron 定时执行
crontab -e
# 0 3 * * * tar czf /backup/cryptpad-$(date +\%Y\%m\%d).tar.gz /opt/cryptpad/data/

常见问题

Q:访问时报"Cross-domain iframe"或空白页面

A:检查 sandbox.yourdomain.com 的 DNS 解析是否生效,以及 Caddy 配置中两个域名都已配置。CryptPad 对沙盒域名要求严格,两个域名必须都走 HTTPS。

Q:上传文件失败或大文件无法上传

A:检查 config.jsmaxUploadSize 的设置,同时确保 Caddy 没有限制请求体大小:

pad.yourdomain.com {
    request_body {
        max_size 200MB
    }
    reverse_proxy localhost:3000
}

Q:WebSocket 连接断开,实时协作不工作

A:Caddy 默认支持 WebSocket 升级,但需要确认防火墙没有阻断长连接。检查 3001 端口的代理配置是否正确。

Q:管理员密钥配置后无法显示管理员面板

A:公钥格式必须完全正确(包含方括号和斜杠),重启容器后清除浏览器缓存再尝试。

Q:如何迁移数据到新服务器

A:直接打包 /opt/cryptpad/data/ 目录传输到新服务器,保持相同的目录结构,修改 config.js 中的域名即可。由于数据是端对端加密的,迁移过程无需担心数据泄露。


CryptPad 提供了市面上罕见的"真正零知识"协作体验,服务器管理员也无法读取用户数据。如果你的团队对数据隐私有严格要求,或者希望摆脱 Google/Microsoft 的云服务依赖,自托管 CryptPad 是目前最成熟的选择。整个部署过程约需 15-30 分钟,建议在雨云服务器的 2 核 4GB 机型上运行,注册填优惠码 2026off 即可领取 5 折优惠券,长期运行成本非常低廉。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐