【开源】kep-worker,在cf worker上搭建个人私人论坛,0成本部署
← 返回列表

当前位置: 作者:pbox · 2026-06-10 11:05:34

#1 pbox · 2026-06-10 11:05:34
stalltrix

之前就说要搞一个worker实现的论坛程序,最近写出来的。还没有充分测试bug,欢迎各位测试下

github仓库地址




简单说下部署方法:



1.把这三个文件传到cf worker里面





---

2.绑定2个KV与1个速率限制器到worker





速率限制器设置为300次/60s

---

3.添加下面变量到worker





变量可以选纯文本与密钥,这里为了示例,使用纯文本

---

4.添加静态资源



把官方的三个静态资源绑定到/static/*上

`ui.html`,`markdown.html`,`manager.html`也是官方仓库拷过来的。可以自己跟随上游更新

---

5.其他



变量解释



- domain: kep验证域名,联机时候用,单机随便填
- enable_limit: 开启速率限制
- USER: 登录用户名
- PASSWD: 登录密码
- mainkey_base64: `openssl base64 -in mainkey.pub -out mainkey.txt`获取
- pubkey_base64: `openssl base64 -in pkey.pub -out pkey.txt`获取
- privkey_base64: `openssl base64 -in pkey.priv -out privkey.txt`获取
- sigkey_base64: `openssl base64 -in pkey.sig -out sginkey.txt`获取

4个base64 key,使用kep-cli生成。`kepcli -act gen`,会生成新的密钥到当前目录。

mainkey与pkey的TXT记录,需要绑定在domain上才能联机。单机使用只用填进去就行。




教程比较简单,其实程序实现也不复杂。各位探索下,反馈下bug。

#2 gege · 2026-06-10 11:46:23
stalltrix
卧槽,,竟然没鸽。间隔一个星期竟然真的搞出来发布了
#3 hua · 2026-06-10 12:16:45
stalltrix
哈哈,大佬牛逼,改天有空帮你测试下看看。
#4 pbox · 2026-06-10 12:21:32
stalltrix
@gege(lbmy6w) 此话怎讲,为什么觉得我会放鸽子呢
#5 e · 2026-06-10 12:26:12
stalltrix
@pbox(cmdnlm) 这个老兄的名字就叫“鸽鸽”(gege),当然会觉得别人会放鸽子了
#6 gege · 2026-06-10 12:32:54
stalltrix
@pbox(cmdnlm) 哈哈哈,不是这个。之前有很多坛友也说过要出项目/教程之类,结果等很多天就全没影了。没想到楼主竟然真的出了
#7 duso · 2026-06-10 12:47:23
stalltrix
感谢大佬分享,改天试试
#8 kanshan · 2026-06-11 07:57:23
stalltrix
给个建议,楼主可以把ping-PONG指令完善下。这种用来互联测活的。现在好像没有ping-PONG指令。
#9 hua · 2026-06-11 09:42:51
stalltrix
今天上班摸鱼的时候帮你测试了下,说几点问题:

1.能收到消息,发不了消息。可能是sendMsg函数问题,我改了下sendMs函数就能收到了。



之前楼主使的是await Promise.all误用+直接fetch,没有返回值。测试发现也没有发出消息。感觉是提前退出了。我改成 await fetch就成功发出去了。

下面我改的sendMsg函数,楼主可以参考下

```js
async function sendMsg(env, bodybuf,skiptoken="") {
let apiMap = await env.NerAPI.get("api", "json") || {};
let str = "";
for (const [url, token] of Object.entries(apiMap)) {
if (token===skiptoken) continue;
let url1=url+"/v1/messages";
url1 = url1.replace(/\/\/+/g, '/');
let res = await fetch(url1, {
method: "POST",
headers: {
"Content-Type": "application/octet-stream",
"X-Msg-Type": "data",
"Authorization": "Bearer " + token
},
body: bodybuf
});
str += `url=${url1} status=${res.status}\n`;
}
console.log("debug::", str);
}
```

2.此外,还有一段:


```js
if (!ok || ok.length > 6){
//返回无效
}
```

这种判断,感觉莫名其妙,长度大于6就无效了?感觉是写错了。
#10 pbox · 2026-06-11 10:05:34
stalltrix
感谢楼上两位老哥的意见以及bug反馈,已修复了。
#11 2077朋克 · 2026-06-11 12:22:31
stalltrix
感谢大佬分享。不过问下大佬,这个项目是不是没有完全写完啊?

今天看到试了一下,前台操作这些基本功能完全正常。但是“管理员后台”这里只有“邻居网络”这个功能能用。其他的全部提示“not realize”(未实现)

只有这个正常:

#12 pbox · 2026-06-12 02:38:23
stalltrix
@2077朋克(nqcpjw) worker无法持久化,现在是用KV当全局变量,但是感觉有点浪费KV额度。这些功能暂时没有想出如何实现。只实现了基本功能。
#13 ouplan · 2026-06-13 02:56:31
stalltrix
尝试了下楼主的实现,确实不错。不过给个建议:建议把api token这种敏感数据 mask下,不要直接返回前端。这种会导致密码泄露=关键token泄露。官方go实现的是mask过的
#14 pbox · 2026-06-13 11:14:43
stalltrix
@2077朋克(nqcpjw) @ouplan(hxod2d)
这两个功能更新了,添加了mask token以及一些额外功能。

完善了管理员界面的"用户封禁"、"分类管理","权限管理"三个功能。加上"邻居网络",后台一共有4个可以用了。前台基本上是完善的了。




没精力再完善了,如果有大佬接手欢迎接手。先发布v1.0版本了。
#15 kanshan · 2026-06-15 01:08:11
stalltrix
楼主确实写的不错,不过建议把csrf token这个完善下,现阶段是没有实现原版csrf token的。如果是担心server-side stateless无法持久化而浪费KV额度问题。使用Double-verify Submit & Cookie这种方法就行了,虽然cookie会被自动提交,但是Submit者是无法知道cookie的
#16 2077朋克 · 2026-06-15 03:07:37
stalltrix
补充一下获取base64的方法:大佬默认是openssl base64 -in mainkey.pub -out mainkey.txt获取base64的

windows环境下没有openssl,不好使用,折腾的时候找到了另一种方法,记录下

certutil -encode mainkey.pub mainkey.txt



会得到base64,但是会加上
```
-----BEGIN CERTIFICATE-----
base64
-----END CERTIFICATE-----
```

把文件头尾去掉,只取中间的base64就行




改天把我折腾worker的记录再出一个教程
#17 pbox · 2026-06-15 04:41:46
stalltrix
感谢各位建议与测试,抽空又补充了一下csrf token以及登录持久化。不知道有没有问题。各位帮忙测试下
#18 hua · 2026-06-15 09:07:12
stalltrix
帮你粗略测了一下,基本没啥bug。不过提一个小建议,auth认证那里,检测到null提前跳过比较好,不用每次都算hash再对比。
#19 kanshan · 2026-06-15 09:23:43
stalltrix
对了,又看了下楼主现在添加了hash方法实现了stateless-session,不过无法过期,如果想实现session过期又想保持stateless设计。给一个思路:可以把timestamp放进hash一起算,外部标出deadline时间
#20 pbox · 2026-06-15 10:02:42
stalltrix
@kanshan(yqqeby) 大佬太牛逼了,之前想过session过期方法没想出来怎么实现,后面认为只能依靠KV了,就放弃了没有实现session过期。没想到还有这种


哈哈,按照这个思路实现了session过期,各位再测一下新版本有没有问题
#21 星河 · 2026-06-15 12:36:02
stalltrix
我看了一下逻辑。说一下我发现的:不知道是不是bug还是特别设计的。当登录状态有效的时候,访问/login会更新session。也就是说使用旧session代替密码获取了新session。

不知道这种设计是feature还是没考虑到的bypass
#22 2077朋克 · 2026-06-16 13:30:36
stalltrix
楼主更新下支持一下meta信息吧,现在worker版不会显示头像以及昵称。只显示一个域名,感觉怪怪的。
#23 pbox · 2026-06-22 03:41:49
stalltrix
v1.1更新了metadata显示,可以显示用户名与自定义头像了,与原版基本兼容。各位可以试试有没有什么bug。

开启meta方法



默认是保持原样,是不开启的。如果要开启,设置一个变量enable_metadata值为1

创建速率一个限制器metaLimit规则为 1 request per 10s






配置完毕后会长这样











后记



这个东西比我想象的复杂的多,当初以为比较简单,就写为了一个文件,结果越写越大了。

如果继续开发肯定要文件以降低复杂度,不过我也暂时不想继续扩展了,这个功能就作为最终版本吧。基本上完全能用了。
#24 2077朋克 · 2026-06-22 08:42:57
stalltrix
@pbox(cmdnlm) 感谢大佬更新,我试了下完全没有问题。用户名与头像也正常显示了
#25 hua · 2026-06-23 12:51:13
stalltrix
给个建议,看了下现在代码好像没有消息去重功能。可以加个去重功能,不用太麻烦,直接修改addTopic/addReply这两个函数就行了,在put之前检查下是否存在就行。
#26 pbox · 2026-06-29 09:31:23
stalltrix
@hua(gk2s6c) 之前一直没看到这个回复,这个去重方法确实高效,我都没想到这种。

我按照这个思路补上去了,各位可以试试有没有新bug
#27 unkman · 2026-07-02 11:32:23
stalltrix
建议楼主写一个wrangler.json配置文件方便直接部署,之前按照坛友的部署教程,直接栽坑里了

下面是我参考文档写的,没测过不知道能不能行,给楼主参考参考:

```json
{
"name": "worker-forum",
"main": "worker.js",
"compatibility_date": "2026-07-02",
"workers_dev": false,
"kv_namespaces": [
{
"binding": "FORUM",
"id": "mykv100"
},
{
"binding": "NerAPI",
"id": "mykv101"
}
],
"ratelimits": [
{
"name": "NerLimit",
"namespace_id": "10",
"simple": {
"limit": 300,
"period": 60
}
},
{
"name": "metaLimit",
"namespace_id": "11",
"simple": {
"limit": 1,
"period": 10
}
}
],
"assets": {
"directory": "./static/",
"binding": "ASSETS"
}
}
```
#28 pbox · 2026-07-05 10:58:34
stalltrix
@unkman(l33xco) 今天在更新wrangler的一键部署配置,然后发现官方上游也恰巧更新了,花了点时间把程序同步到官方上游最新UI了。先发布v1.3版本了,这个应该是最终版本了。
#29 e · 2026-07-05 11:24:12
stalltrix
@pbox(cmdnlm) “最终版本”?我不信,你v1.0就是这么说的,还是偷偷摸摸的更新到了v1.3
#30 2077朋克 · 2026-07-05 11:49:37
stalltrix
@pbox(cmdnlm) 用了这么多天了回来感谢下楼主,楼主真是太厉害了,我现在已经全部迁移到worker了,服务器程序我都没用了。

这个worker感觉太好用了,甚至比原版还好用。原版要配置两个程序,挺麻烦的。
#31 kanshan · 2026-07-05 13:27:54
stalltrix
@2077朋克(nqcpjw) 软件行业有一个二八定律,20%的功能承担了80%的需求。

看了下,这个worker虽然实现功能远远小于原版,但是却覆盖了90%以上常用功能。正常用起来确实感觉不到缺陷,反而还会觉得挺好用的
#32 unkman · 2026-07-22 11:33:55
stalltrix
今天发现kepcli更新了v0.1.9版本了,可以直接获取base64。不再需要openssl或者certutil 了。楼主可以更新下新方法说明

注册

或使用第三方注册

登录

没有账号? 立即注册
技术
闲聊
开发
正在提交...