自建云同步部署指南

Cognote 不提供官方云端。要在多设备间同步笔记,需要在你自己的服务器上部署同步服务端—— 一个零依赖的 Node.js 单文件程序,本文给出从下载到上线的完整步骤(含 systemd、nginx、客户端配置)。

为什么要自建

重要说明:Cognote 是本地优先的笔记应用,不提供、也不运营任何官方云服务。 本地功能(检索 / 编辑 / 公式 / 主题 / 分享 / PDF)无需任何服务器即可完整使用。 只有当你需要「多设备同步」时,才需要自己部署下述同步服务端——你的笔记只会保存在你自己的服务器上。

  • 数据主权:同步数据存放在你的 VPS / 内网机器 / NAS,任何人(包括作者)都无法访问;
  • 零成本:服务端只用 Node.js 内置模块,无需数据库、无需 npm install,1核512M 的小机器即可跑;
  • 可迁移:data/ 目录就是全部状态——就是普通文件,随时备份、换机器、用文件管理器查看。

架构一览

┌──────────────┐ ┌──────────────┐ │ 电脑 A │ │ 电脑 B │ │ Cognote │ │ Cognote │ │ (本地笔记) │ │ (本地笔记) │ └──────┬───────┘ └───────┬──────┘ │ HTTPS/HTTP + Token │ └───────────┬────────────┘ ▼ ┌─────────────────────────┐ │ 你的服务器 │ │ ┌───────────────────┐ │ │ │ nginx (80 端口) │ │ │ │ /knowledge-sync/ │ │ │ └────────┬──────────┘ │ │ ▼ 127.0.0.1:8600 │ ┌───────────────────┐ │ │ │ 同步服务端 │ │ │ │ (Node.js 零依赖) │ │ │ │ data/files/ 笔记 │ │ │ │ data/shares.json │ │ │ └───────────────────┘ │ └─────────────────────────┘ ▲ │ 分享链接(公开阅读页) 访问者 / 手机浏览器

1. 准备

  • 一台服务器:公网 VPS(推荐)或内网机器/NAS;需已安装 Node.js ≥ 16(推荐 18/20/22)。
  • 验证:node -v 输出版本号即可。没有 Node 的话,CentOS/宝塔可用「Node 版本管理器」安装,Ubuntu 可用 apt install nodejs npm 或 nvm。
  • 下载同步服务端包:Cognote-Sync-Server-v1.0.0.zip(18 KB,含 server.js / share-viewer.html / 部署 README);也可从 GitHub 仓库 的 sync-server/ 目录获取源码。

2. 安装与配置

① 上传并解压

mkdir -p /www/wwwroot/cognote-sync
# 将压缩包解压到该目录(server.js、share-viewer.html、package.json 等应在本层)
cd /www/wwwroot/cognote-sync
unzip Cognote-Sync-Server-v1.0.0.zip -d .

② 生成配置

复制示例配置为 config.json,并生成一个随机 Token(Token 相当于密码,务必保密):

cp config.example.json config.json

# 生成随机 Token(32 位十六进制)
TOKEN=$(node -e "console.log(require('crypto').randomBytes(24).toString('hex'))")
echo $TOKEN

# 编辑 config.json,至少填入 token;其余按需
cat > config.json <
配置项说明
token客户端访问凭证,泄露即等于泄露全部笔记,可随时改掉并重启
port / host建议保持 127.0.0.1:8600 只监听本机,由 nginx 对外(见第 4 步)
dataDir可选,数据目录;默认为程序目录下的 data/
maxFileMb单文件大小上限(默认 20 MB),附件/图片同步受此限制

③ 前台试运行

node server.js
# [sync] 数据目录: /www/wwwroot/cognote-sync/data
# [sync] 已同步文件数: 0, 版本: 1

另一个终端验证连通性(替换成你的 Token):

curl "http://127.0.0.1:8600/api/ping?token=你的TOKEN"
# {"ok":true,"serverTime":...,"version":1,"fileCount":0}

看到 "ok":true 即成功,Ctrl+C 停止,进入下一步。

3. systemd 守护(开机自启 + 崩溃自动重启)

cat > /etc/systemd/system/cognote-sync.service <<'UNIT'
[Unit]
Description=Cognote Cloud Sync Server
After=network.target

[Service]
Type=simple
WorkingDirectory=/www/wwwroot/cognote-sync
ExecStart=/usr/bin/node /www/wwwroot/cognote-sync/server.js
Restart=always
RestartSec=3
User=www
Group=www

[Install]
WantedBy=multi-user.target
UNIT

systemctl daemon-reload
systemctl enable --now cognote-sync
systemctl status cognote-sync    # 应显示 active (running)

说明:ExecStart 中的 node 路径用 which node 查询后填入(宝塔 Node 版本管理器通常为 /www/server/nodejs/vXX/bin/node);用 node 直接运行而非 systemd 托管也可以, 但不保证断线重连与开机自启。

4. nginx 反向代理(走 80 端口)

推荐通过 nginx 把同步服务挂到 /knowledge-sync/ 子路径,客户端只填一个 HTTP 地址,后续加 HTTPS 也只需改这一处:

cat > /www/server/panel/vhost/nginx/cognote-sync.conf <<'NGINX'
server {
    listen 80;
    server_name 你的服务器IP或域名;

    client_max_body_size 100m;   # 同步与附件上传大小

    location = /knowledge-sync { return 301 /knowledge-sync/; }

    location /knowledge-sync/ {
        proxy_pass http://127.0.0.1:8600/;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_connect_timeout 30s;
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;
    }
}
NGINX

nginx -t && nginx -s reload    # 宝塔: /www/server/nginx/sbin/nginx -t && ... -s reload

若不想用 nginx,也可把 config.json 的 host 改为 0.0.0.0 直接开放 8600 端口, 客户端地址填 http://你的服务器IP:8600——但这样是明文裸奔且无 HTTPS 可能,推荐还是走 nginx。

5. 客户端配置(Cognote 应用内)

启动 Cognote → 右上角「⚙️ 设置」→「☁️ 云端同步」:

配置项填写内容
启用云端同步勾选
云端服务器地址http://你的服务器IP/knowledge-sync(注意结尾不要带斜杠)
云端访问 Token第 2 步 config.json 里的 token
本地云端同步目录留空 = 程序目录下的 云端同步/;也可指定任意本地目录
自动同步间隔默认 60 秒

保存后目录树会出现「☁️ 云端同步」根分类:在它下面新建的分类与笔记会自动上传; 其它电脑用相同地址 + Token、相同的本地同步目录,即可同步同一份云端笔记。

6. 验证

  1. 设备 A:在「☁️ 云端同步」下新建一条笔记,等待一个同步周期(或手动点同步);
  2. 打开服务器数据目录确认文件已落盘:ls -R /www/wwwroot/cognote-sync/data/files/;
  3. 设备 B:配置相同地址与 Token → 目录树应出现同一条笔记;
  4. 断网/冲突场景:双方同时修改同一笔记时,修改时间新者胜出,落败方自动保存为「冲突副本」,数据不丢。

笔记分享

同步服务端同时承担分享能力(依赖云端目录中的笔记)。在 Cognote 中右键笔记或目录 → 分享:

  • 生成「链接 + 查看密码」的公开阅读页,无需账号即可在手机浏览器打开;
  • 有效期可选 1 / 7 / 30 天或长期,可随时停用(410)、恢复或删除;
  • 密码错误 10 次锁定同 IP 10 分钟;附带浏览统计(打开次数、按天、每篇笔记阅读数);
  • 分享链接格式:http://你的服务器IP/knowledge-sync/s/viewer?id=<分享id>

分享页依赖 nginx 的 client_max_body_size(建议 ≥ 100m)与 proxy_read_timeout(建议 ≥ 300s), 见第 4 步配置;笔记中的相对路径图片会随分享一并打包,分享页可正常显示。

安全建议

  • Token 即密码:不要提交到公开仓库、不要写进截图;泄露后改 config.json 的 token 并 systemctl restart cognote-sync;
  • 建议 HTTPS:公网上 HTTP 传输可被窃听。宝塔可一键申请证书,启用后客户端地址改为 https://域名/knowledge-sync;
  • 防火墙 / 安全组:只需放行 80(或你选择的端口),保持 host: 127.0.0.1 不直接暴露 8600;
  • 备份:定期打包 data/ 目录即完成全部备份;
  • 系统与 Node.js 保持更新;不要把服务端目录放进 nginx 可直接下载的静态站点根(本部署为反代,不涉及)。

常见问题

客户端提示 401 / 同步失败

Token 不匹配:核对客户端填写的 Token 与服务器 config.json 完全一致(无空格、无引号);改完需重启服务。也检查地址结尾不要多带 /。

客户端提示 404 / 连接失败

① 地址是否少了 /knowledge-sync;② curl "http://127.0.0.1:8600/api/ping?token=…" 在服务器本机是否通;③ nginx 是否 reload、防火墙/云安全组是否放行 80。

两台设备内容不一样 / 出现「冲突副本」

这是保护机制:双方同时改同一笔记时保留两份——新版本生效,旧版本存为「冲突副本」文件,打开对比后手动合并、删除副本即可。

可以同步图片 / 附件吗?

可以。png/jpg/gif/webp/svg 等图片与常见文档类型都在同步范围内,受 maxFileMb(默认 20MB)限制。笔记中 figures/… 相对路径图片会随笔记一起同步。

不用公网服务器,能在家里内网自建吗?

可以。在内网一台常开机器(含 NAS、树莓派)部署,设备在同一局域网即可同步;出门在外则需配合内网穿透(如 Tailscale / frp)或端口映射,方式与本文相同。

同步服务端要收流量费吗?

服务端程序免费(MIT)。它跑在你自己的服务器上,产生的流量与磁盘占用就是你服务器本身的资源,与作者无关,也不存在任何订阅费。

部署完成 🎉 回到 Cognote 首页 · 或 下载客户端