Skip to content

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

  1. 搭建 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;

  1. 创建 KV 命名空间 (notes-kv)进入 Workers & Pages -> KV -> Create a namespace。
    重要: 记下 id。将其填入 wrangler.toml 文件的 [[kv_namespaces]] 部分。
  2. 创建 R2 存储桶(notes-r2-bucket):
    进入 R2 -> Create bucket。
    重要: 记下 bucket_name。将其填入 wrangler.toml 文件的 [[r2_buckets]] 部分。
    第三步:部署 Worker 服务
  3. 打开 Workers & Pages,新建应用并选定 Continue with GitHub 类型;
  4. 关联刚刚准备完毕的 GitHub 仓库;
  5. 保存配置并启动部署。
    第四步:配置环境变量
    部署结束之后进入项目设置‑环境变量,依次添加下面参数:
    环境变量 参数说明
    USERNAME 后台登录账号
    PASSWORD 后台登录密码
    TELEGRAM_BOT_TOKEN (可选)TG 机器人密钥(选填)
    TELEGRAM_WEBHOOK_SECRET (可选)随机复杂字符,用于接口校验(选填)
    AUTHORIZED_TELEGRAM_IDS (可选)允许推送笔记的 TG 用户 ID(选填)
    参数保存之后重新部署一次项目,环境配置正式生效。
    第五步:开启 TG 机器人回调接口(可选)
    配置机器人参数之后需要激活 Webhook 实现消息推送:
  6. 获取你的笔记站点域名;
  7. 浏览器访问下方链接,替换密钥以及域名信息
    
    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;

Leave a Reply

Your email address will not be published. Required fields are marked *