在 atproto 上自建 Tangled:代码托管不再孤岛

关注博客文章如何为 atproto 自托管 PDS(个人数据服务器),账户存在于自己的服务器上,同时还能与诸如蓝天以及pckt.blog我想写一点关于如何为纠结.

注意:《魔发奇缘》团队正在开发新一代组件,包括结2,磨坊,以及基于梭芯.会有某种形式的迁移路径,但目前都在积极开发中。

《魔发奇缘》基本上就是Atproto上的Github。换句话说,《魔发奇缘》提供了仓库托管、配置项操作和社交编码功能。它们的不同之处在于,《魔发奇缘》还没有私人仓库(我们都屏息以待许可数据而《魔发奇谈》允许你在参与社交功能的同时,自托管基础设施。如果你正在举办一个锻造或吉泰亚比如,或者说一直在想,这真的是致命功能。其他自托管的 Github 替代品有个副作用,就是“隔离”你,因为没有共享位置能找到所有自托管实例,而且要与仓库交互、创建问题或 PR,用户必须为每个实例创建新账户。在 Tangled 中,你可以运行自己的结和纺锤,但用户可以在共享的应用视图中查找并与它们互动。

那么,让我们来看看如何自托管当前的两个 Tangled 组件:knot 和 spindle。注意这份指南只列出了一种运行方式,你需要调整一些内容使其更适合自己。

Knot,仓库服务器

要按照本指南操作,你需要一个可以指向应用的域名,以及一个拥有公共IP的服务器。我会用 Docker Compose,但文档中还包含了 NixOS 的说明。

就像PDS一样,我们设置了一个反向代理来终止TLS,我这里用的是Caddy,因为它不需要太多配置。创作Caddyfile在你的项目目录中,有这些内容。

knot.example.com {
   reverse_proxy knot:5555
}

和PDS不同,这里的配置不多。KNOT_SERVER_OWNER应该设置为你想拥有该结的AtProto账户的DID。该账户随后可以授权访问其他账户。没人能在未被邀请的情况下使用你的结。

这里最重要的是你在结上打开的接口。反向代理处理 API 请求,但 Knot 的主要工作是读写仓库,这会通过 SSH 完成。Knot自带一个嵌入式的OpenSSH服务器,只支持极少数与git相关的操作。

下面的例子是把那个开端口放在:2222但如果你已经把服务器上的SSH端口移开了:22或者你用像Tailscale SSH这样的工具,它不使用那个端口,你可以让结拥有:22.

services:
  knot:
    image: atcr.io/tangled.org/knot:latest
    restart: always
    environment:
      KNOT_SERVER_HOSTNAME: knot.example.com
      KNOT_SERVER_OWNER: did:plc:YOUR_DID
      KNOT_SERVER_DB_PATH: /app/knotserver.db
      KNOT_REPO_SCAN_PATH: /home/git/repositories
      KNOT_SERVER_INTERNAL_LISTEN_ADDR: localhost:5444
    volumes:
      - ./keys:/etc/ssh/keys
      - ./repositories:/home/git/repositories
      - ./server:/app
    ports:
      - "2222:22"

  caddy:
    image: caddy:2
    restart: always
    ports: ["80:80", "443:443"]
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data

volumes:
  caddy_data:

该atcr.io/tangled.org/knot:latest图片由社区维护,linux/amd64所以如果你更喜欢自己搭建,或者像我一样运行ARM服务器,可以看看Cove.town 的工作流程.我打算写一份关于如何设置atcr.io也请预留,准备自助托管的容器注册表!

好,接下来开始作曲。

docker compose up -d

一旦你的服务器运行并验证了,你就能看到This is a knot server当你在浏览器里打开时会有提示。看看https://knot.cove.town举个例子说明你应该看到的。

好了,现在该在《魔发奇缘》应用视图中注册了。

用你的拥有者账号登录《Tangled》,如果账号运行在你自己的PDS上,那就更好了,然后去“结→设置”。在这里,你可以通过输入域名来注册你的结。

确保显示“已验证”,并添加你想要的额外成员。现在,当你或这些成员中的任何成员去创建新仓库时,你会看到你的结作为托管选项。

注意,如果你不把结绳打在上面:22创建仓库后显示的 git-over-SSH 路径无法复制粘贴,你需要自己构建远程 URL,比如ssh://git@knot.example.com:2222/did:plc:string.

主轴,工作流程运行器

既然你已经建立了仓库,我们来聊聊CI。Tangled提供了官方的主轴来运行你的工作流程,但如果你正在读这篇文章,你可能想知道如何运行自己的主轴。

除了它有趣你可能想这样做以获得更强大的机器、特定架构,OpenBao 的秘密管理或者只是为了绕过官方主轴上15分钟的工作流程运行上限。

你必须牢记,工作流程运行者是在你的机器上执行代码和命令的。锁定一个工作流运行器以便安全运行不受信任的代码是个非常困难的问题。

幸运的是,主轴只能被批准的用户使用,如果有人在你的仓库上做了PR,工作流程除非得到所有者明确批准,否则不会运行。此外,仓库中设置的秘密不会注入运行在分支仓库PR上的工作流程中,这和Github的工作原理类似。

安全警告结束后,我们开始安装主轴吧!先从添加新的凯迪拉克唱片开始。

   spindle.example.com {
       reverse_proxy spindle:6555
   }

没有像 knot 那样的社区主轴镜像,但我们可以从 source 构建 compose。将新服务添加到你现有的 compose 和新卷中。

  spindle:
    build:
      context: https://tangled.org/tangled.org/core.git#v1.16.0-alpha
      dockerfile: localinfra/spindle.Dockerfile
    restart: always
    environment:
      SPINDLE_SERVER_HOSTNAME: spindle.example.com
      SPINDLE_SERVER_OWNER: did:plc:YOUR_DID
      SPINDLE_SERVER_DB_PATH: /data/spindle.db
      SPINDLE_SERVER_LOG_DIR: /var/log/spindle
    volumes:
      - spindle_data:/data
      - spindle_logs:/var/log/spindle
      - /var/run/docker.sock:/var/run/docker.sock

volumes:
  spindle_data:
  spindle_logs:

nixery 引擎需要访问 Docker 接口来启动运行工作流的容器。开始你的合成作文。

docker compose up -d

好了,现在我们再重复一次同样的过程。登录《魔发奇缘》,进入设置,找到主轴部分,注册你的主轴。验证后,你可以访问你拥有的任何仓库,在仓库设置里添加那个主轴。

这里有一个测试流程,证明它有效,创建它.tangled/workflows/hello.yml.

when:
  - event: ["push", "manual"]
    branch: ["main"]
engine: "nixery"
steps:
  - name: "hello"
    command: echo "running on my own spindle"

就是它。一个运行在自主机主轴上的自主机结的工作流程。魔法!

改进

Knots 还支持加固安全模式,尽管说明书中没有涉及 docker。你可能想关注这一点,因为知识会执行git命令,以及任意git脆弱也变成了你脆弱。

由于结仅限成员,这限制了你添加成员的表面积,但这点值得注意。

主轴的表面积很大,我无法覆盖整个配置表面积。你有两个不同的工作流程引擎:nixery以及microvm.microvm可以看作是对旧发动机的改进,但需要访问/dev/kvm而这些通常在VPS上无法提供。

你可以通过大量不同的环境变量来调整它的行为和功能。我建议你限制访问权限,并尝试直到你觉得服务器的行为符合你预期,因为一个异常的工作流程运行器可能会以多种方式干扰你的服务器。

医生里有很多工作流程定义示例,想要灵感,或者为什么不看看我之前关于如何运行标准 Elixir Phoenix 工作流程在《魔发奇缘》中。

一如既往,务必设置备份!你需要为这里所有卷设置好这个功能,以避免丢失数据的风险。纠结镜像你的结,但不要依赖这个,要有备用的!

结论

希望你读这个系列时和我写作时一样喜欢。能够自主机,同时还能与他人协作互动,这其中有一种神奇的感觉。接下来我打算写写的内容atcr.io以及如何自我托管保持.

添加评论
点赞收藏
点踩分享查看原文
评论
?
参与讨论