Cloudflare搭建Memos-Worker私人知识库,永久免费
第一步:创建专属 GitHub 仓库 项目地址:https://github.com/souvenp/memos-worker
这里存在两种创建方案,大家根据后续更新需求挑选:
方案 A:Fork 上游源码(优先推荐)
优势:你的仓库绑定原版项目,后续作者更新功能、修复漏洞,能够一键同步新版本。
短板:仓库属性为公开;账号密码、密钥全部存放于环境变量当中,源码会暴露私密参数,安全风险低(但通常也不会有什么事)。
操作:点击项目主页右上角 Fork 按钮即可。
方案 B:模板生成私有仓库
优势:新建独立私有仓库,外人无法浏览你的源代码。
短板:和上游源码断开关联,后续升级新版本只能手动执行 Git 命令合并代码,操作繁琐。
操作:点击 Use this template → Create a new repository。
第二步:前往 Cloudflare 后台创建所需资源
登录控制面板,依次创建 D1 数据库、KV 命名空间、R2 文件桶,资源参数参考下表:
资源类型 推荐命名 绑定变量名称
D1 数据库 notes-db DB
KV 命名空间 notes-kv NOTES_KV
R2 存储桶 notes-r2-bucket NOTES_R2_BUCKET
- 搭建 D1 数据库 (notes-db)
进入 Workers & Pages‑D1‑Create database;
打开数据库控制台,复制项目内 schema.sql 的全部代码并且运行,初始化数据表;
记录数据库 ID、数据库名称,填写入 wrangler.toml 文件的 [[d1_databases]] 部分。
CREATE TABLE tags (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE
);
CREATE TABLE notes (
id INTEGER PRIMARY KEY,
content TEXT NOT NULL,
files TEXT DEFAULT ‘[]’,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
is_pinned BOOLEAN DEFAULT 0,
is_favorited INTEGER DEFAULT 0 NOT NULL,
is_archived INTEGER DEFAULT 0 NOT NULL,
pics TEXT,
videos TEXT DEFAULT ‘[]’
);
CREATE TABLE note_tags (
note_id INTEGER NOT NULL,
tag_id INTEGER NOT NULL,
PRIMARY KEY (note_id, tag_id),
FOREIGN KEY (note_id) REFERENCES notes(id) ON DELETE CASCADE,
FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
);
CREATE TABLE nodes (
id TEXT PRIMARY KEY,
type TEXT NOT NULL,
title TEXT NOT NULL,
content TEXT,
parent_id TEXT,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
FOREIGN KEY (parent_id) REFERENCES nodes(id) ON DELETE CASCADE
);
— =============================================
— Section 2: Full-Text Search Virtual Table
— (This is the only FTS-related statement you need)
— =============================================
CREATE VIRTUAL TABLE notes_fts USING fts5(
content,
files,
content=’notes’,
content_rowid=’id’
);
— =============================================
— Section 3: Triggers to keep FTS in sync
— =============================================
CREATE TRIGGER notes_after_insert AFTER INSERT ON notes BEGIN
INSERT INTO notes_fts(rowid, content, files) VALUES (new.id, new.content, new.files);
END;
CREATE TRIGGER notes_after_delete AFTER DELETE ON notes BEGIN
INSERT INTO notes_fts(notes_fts, rowid, content, files) VALUES (‘delete’, old.id, old.content, old.files);
END;
CREATE TRIGGER notes_after_update AFTER UPDATE ON notes BEGIN
INSERT INTO notes_fts(notes_fts, rowid, content, files) VALUES (‘delete’, old.id, old.content, old.files);
INSERT INTO notes_fts(rowid, content, files) VALUES (new.id, new.content, new.files);
END;
- 创建 KV 命名空间 (notes-kv)进入 Workers & Pages -> KV -> Create a namespace。
重要: 记下 id。将其填入 wrangler.toml 文件的 [[kv_namespaces]] 部分。 - 创建 R2 存储桶(notes-r2-bucket):
进入 R2 -> Create bucket。
重要: 记下 bucket_name。将其填入 wrangler.toml 文件的 [[r2_buckets]] 部分。
第三步:部署 Worker 服务 - 打开 Workers & Pages,新建应用并选定 Continue with GitHub 类型;
- 关联刚刚准备完毕的 GitHub 仓库;
- 保存配置并启动部署。
第四步:配置环境变量
部署结束之后进入项目设置‑环境变量,依次添加下面参数:
环境变量 参数说明
USERNAME 后台登录账号
PASSWORD 后台登录密码
TELEGRAM_BOT_TOKEN (可选)TG 机器人密钥(选填)
TELEGRAM_WEBHOOK_SECRET (可选)随机复杂字符,用于接口校验(选填)
AUTHORIZED_TELEGRAM_IDS (可选)允许推送笔记的 TG 用户 ID(选填)
参数保存之后重新部署一次项目,环境配置正式生效。
第五步:开启 TG 机器人回调接口(可选)
配置机器人参数之后需要激活 Webhook 实现消息推送: - 获取你的笔记站点域名;
- 浏览器访问下方链接,替换密钥以及域名信息
https://api.telegram.org/bot/setWebhook?url=https://your-project.pages.dev/api/telegram_webhook/&secret_token=
替换链接中的 和 为你自己的真实密钥值。按下回车。如果你看到 {“ok”:true,”result”:true,”description”:”Webhook was set”} 的返回信息,即代表设置成功!你现在可以给你的机器人发送消息了。
🔍 重建搜索索引 (推荐)
如果你是从旧版本(20260206之前版本)更新的,并且想要实现搜索文件名的功能,你需要重建全文搜索 (FTS) 索引。
进入 Cloudflare Dashboard -> Workers & Pages -> D1。
选择你的数据库 (例如 notes-db)。
点击 Console 选项卡。
复制本项目中 src/migrate_fts.sql 文件的完整内容并粘贴到控制台。
点击 Execute。
这将更新你的搜索索引以包含文件名,并刷新所有现有数据。
— 1. 删除旧的同步触发器
DROP TRIGGER IF EXISTS notes_after_insert;
DROP TRIGGER IF EXISTS notes_after_delete;
DROP TRIGGER IF EXISTS notes_after_update;
— 2. 删除旧的全文搜索表
DROP TABLE IF EXISTS notes_fts;
— 3. 创建包含 ‘files’ 列的新全文搜索虚拟表
CREATE VIRTUAL TABLE notes_fts USING fts5(
content,
files,
content=’notes’,
content_rowid=’id’
);
— 4. 从 notes 表中同步现有数据到新的 notes_fts 表
— 这会让之前的文件名也变得可以搜索
INSERT INTO notes_fts(rowid, content, files) SELECT id, content, files FROM notes;
— 5. 重新创建同步触发器
CREATE TRIGGER notes_after_insert AFTER INSERT ON notes BEGIN
INSERT INTO notes_fts(rowid, content, files) VALUES (new.id, new.content, new.files);
END;
CREATE TRIGGER notes_after_delete AFTER DELETE ON notes BEGIN
INSERT INTO notes_fts(notes_fts, rowid, content, files) VALUES (‘delete’, old.id, old.content, old.files);
END;
CREATE TRIGGER notes_after_update AFTER UPDATE ON notes BEGIN
INSERT INTO notes_fts(notes_fts, rowid, content, files) VALUES (‘delete’, old.id, old.content, old.files);
INSERT INTO notes_fts(rowid, content, files) VALUES (new.id, new.content, new.files);
END;