0、这都是啥玩意??
Cloudflare Tunnel 是由知名 CDN / 网站保护企业 Cloudflare 的隧道服务,通过 HTTPS 和 WebSocket 提供类似「内网穿透」的服务(往下读你就知道为什么了)。
Tangled 是搭建在 ATProto(就是 Bluesky 的去中心化协议)之上的 Git 「托管」平台。由于 Git 的特性,我们在拥有自己的 PDS 账号的同时,还需要链接 knot1 来存储 Git 仓库以及 Pull Requests。暂时还不清楚能否向官方索取 Tangled,所以咱们可以按照这个教程自托管 Knots。
你只需要一个 24 小时开着的机器,跟我一步一步操作就行了。这里,这个机器用了 Debian 12。别忘了禁止莫名而来的 SSH 登录!
1、登录,获取 DID
首先清楚你的 Bluesky 用户名(如果你不知道的话,那大多数时候是 <用户名>.bsky.social)。
打开网站 https://tangled.sh/login。
输入你的用户名后,点击 login(登录)按钮。此时会弹出你所在提供商的 OAuth 验证页面。
在 Password(密码)栏输入密码。可以勾选 Remember this account on this device(在这个设备记住这个账号)。
在接下来的对话框内,选择 Authorize(验证)。这样,你就有 Tangled 的账号了。点击右上角你的用户名,选择 settings(设置)。
记下 Decentralized Identifier (DID) 一栏。
如果有人知道你的 Handle,查 DID 轻而易举。因为 DID 并不是机密文件,DID 相当于比特币钱包的公钥。
2、设置 Go 语言相关环境,编译 knot 程序
咱们可以直接参考官方的安装教程。以手动教程为例:
Debian 12 内置的 Go 挺老的,我们可以直接从谷歌那里下个新的。
$ sudo apt autoremove golang
下载并安装 Go 语言,先在终端里输入
$ curl -O https://dl.google.com/go/go1.25.0.linux-amd64.tar.gz
$ sudo tar -C /usr/local -xzf go1.25.0.linux-amd64.tar.gz
然后处理 /etc/profile
文件
$ sudo nano /etc/profile
# 在最后加入
export PATH=$PATH:/usr/local/go/bin
编译并安装 knot
$ git clone https://tangled.sh/@tangled.sh/core
$ cd core
$ export CGO_ENABLED=1
$ go build -o knot ./cmd/knot
值得提一嘴,必须要解决权限问题,否则使用 git 功能的时候就会提示 Unsafe AuthorizedKeysCommand "/usr/local/bin/knot": bad ownership or modes for file /usr/local/bin/knot
强制使用密码。
$ sudo mv knot /usr/local/bin/knot
$ sudo chown root:root /usr/local/bin/knot
$ sudo chmod 755 /usr/local/bin/knot
添加 /etc/ssh/sshd_config.d/authorized_keys_command.conf
文件
$ sudo nano /etc/ssh/sshd_config.d/authorized_keys_command.conf
# 在最后加入
Match User git
AuthorizedKeysCommand /usr/local/bin/knot keys -o authorized-keys
AuthorizedKeysCommandUser nobody
安装,新建 git
账号
$ sudo systemctl reload ssh
$ sudo adduser git
3、带师级 Cloudflare Tunnel 教程
0、绑定域名
1、用你的眼睛看向 Cloudflare 页面左边,点击 Zero Trust
还是左边,点击「网络」「Tunnels」,然后视线转到右面点「创建隧道」
选择「使用 cloudflared」选项。
接下来为隧道命名。想命名啥命名啥。然后就是 cloudflared
的安装环节。如果连这种大白话都读不懂建议偷偷问豆包。如果连豆包都没把你说懂家里得请高人了。
然后添加公共主机名。按我的来。
然后回到主机,配置环境变量 ~git/.knot.env
和服务,然后开机
$ sudo nano ~git/.knot.env
KNOT_REPO_SCAN_PATH=/home/git
KNOT_SERVER_HOSTNAME=<没设子域就是域名,设了就是子域加半角句点再加上域>
APPVIEW_ENDPOINT=https://tangled.sh
KNOT_SERVER_OWNER=<填入你之前记着的 DID>
KNOT_SERVER_INTERNAL_LISTEN_ADDR=127.0.0.1:5444
KNOT_SERVER_LISTEN_ADDR=127.0.0.1:5555
$ sudo nano /etc/systemd/system/knotserver.service
# 粘贴进去
然后拿浏览器输入 <没设子域就是域名,设了就是子域加半角句点再加上域>
。出现 This is a knot server. More info at https://tangled.sh
就成功一大半了。
4、配置 knot
还是这张图。
这次我们点击 knots。
下面的 knot.example.com 填 <没设子域就是域名,设了就是子域加半角句点再加上域>
,然后点击 register 这个加号。
5、众多折腾带来的别扭之一
你知道吗,这个 knot 因为没有 SSH 功能算得上残废。幸亏 Cloudflare Tunnel 也考虑到了这一点,于是就拿 WebSocket 硬凹出了一个 SSH 通道。
再添加一个公共主机名。不一样的子域。类型填 SSH,URL 填 localhost
。
然后你就觉得,这不就完了吗?别忘了,你 SSH key 还没登记呢。
当然了,Git 得改「打开方式」。外部链接首先得用新子域的那个。另外还得在客户端电脑上安装 cloudflared
。然后配置你的 SSH:
Host <新子域,给 SSH 的那个玩意>
ProxyCommand /usr/local/bin/cloudflared access ssh --hostname %h
不管怎样,这自建 Knot 也是半吊子功能完整了。
6、总结
感谢跟我在 Discord 上对线的开发者 @oppi.li。
写稿的时候,发现这人还做过字体。
也感谢 Tangled 团队的作品。感谢 Bluesky,感谢 ATProto,我甚至想感谢 Sparrow He(最早一批搞 Bluesky 二开的中文圈人,虽然这人退出 Bluesky 了,他搭的 PDS 也没了)。
你是谁?请支持正版 Git 托管平台 GitHub!
这 WhiteWind 设完可见度不顺便保存一下?
Footnotes
-
需要登录,在第一章有写 ↩