2023-06-20 / @syui

bluesky

blueskyの連合を試してみた

今回の目標は、bluesky-social/pds, bluesky-social/atprotoの統合です。

pdsは、連合のsandbox環境ですが、様々な設定ができません。個人的には、AVAILABLE_USER_DOMAINSをsandbox環境でも有効にしたいと考え、構築してみました。これを有効にすると、handleがその設定のものになります。例えば、.aiと設定すれば、登録されるユーザーのhandleはuser.aiとなります。

これがsandboxの連合環境でも動作するのか確かめたかったという理由です。

通常は不可能ですが、plc.bsky-sandbox.devに登録できたので、希望があると考えました。

$ curl -sL plc.bsky-sandbox.dev/export|jq -r ".operation|.services.atproto_pds.endpoint,.alsoKnownAs"
https://at.syui.ai
[
  "at://syui.ai"
]

結論から言うと、有効に動作させることに成功しましたが、現在のsandboxは定員がいっぱいなのか、plc, bgs側で何らかが制限されている気がします。

pdsのdockerをそのまま構築しても、自身のプロフィールにはアクセスできず、投稿も見れません。フォローやリプライは送ることができますが、記録されていないように感じます。最初は普通にできました。ただ、その後できなくなりました。

設定のExperiment: Use AppView Proxyから切り替えられます。プロフィールを編集したければoffにし、連合のfeedを見たければ、onにするという感じです。

sandboxも初期の頃は連合が機能していたようですが、最新では参加できない感じになっているのかもしれません。

pds

今回は、pds + atproto/pds + docker-compose + cloudflare(zero-trust)という構成です。archlinux上で構築します。

dbにpostgresを使用します。pdsにあるcaddy, watchtowerを利用します。pds自体はatproto/pdsから再構築します。atproto/packages/pds/Dockerfileにあるものをatproto/Dockerfileにおいてdocker buildしても動きません。したがって、独自にbuildしたものを使います。

version: '3.9'
services:
  caddy:
    container_name: caddy
    image: caddy:2
    network_mode: host
    depends_on:
      - pds
    restart: unless-stopped
    volumes:
      - type: bind
        source: /pds/caddy/data
        target: /data
      - type: bind
        source: /pds/caddy/etc/caddy
        target: /etc/caddy
  pds:
    container_name: pds
    image: syui/bluesky-social/pds:latest
    build: /pds/atproto
    network_mode: host
    restart: unless-stopped
    volumes:
      - type: bind
        source: /pds
        target: /pds
      - type: bind
        source: /pds/image
        target: /image

    env_file:
      - /pds/pds.env

  watchtower:
    container_name: watchtower
    image: containrrr/watchtower:latest
    network_mode: host
    volumes:
      - type: bind
        source: /var/run/docker.sock
        target: /var/run/docker.sock
    restart: unless-stopped
    environment:
      TZ: "US/Pacific"
      WATCHTOWER_CLEANUP: true
      WATCHTOWER_SCHEDULE: "@midnight"

  db:
    image: postgres:latest
    container_name: postgres
    ports:
      - 5432:5432
    volumes:
      - db-store:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=pass

volumes:
  db-store:

postgresのpasswordは変更しておいてください

atproto/pds

#.env
HOSTNAME=""
PDS_VERSION="v1.3.3"
EMAIL_FROM_ADDRESS="[email protected]"
AVAILABLE_USER_DOMAINS=".ai"
PORT="3000"
INVITE_REQUIRED="true"
PUBLIC_URL="https://syui.ai"
BLOB_CACHE_LOC="/pds/image"

SMTP_HOST="smtp.gmail.com"
SMTP_USERNAME="gmail_user"
SMTP_PASSWORD="app_pass"
EMAIL_SMTP_URL="smtps://${gmail_user}:${app_pass}@smtp.gmail.com"

DID_PLC_URL="https://plc.bsky-sandbox.dev"
BSKY_APP_VIEW_ENDPOINT="https://api.bsky-sandbox.dev"
BSKY_APP_VIEW_DID="did:web:api.bsky-sandbox.dev"
CRAWLERS="https://bgs.bsky-sandbox.dev"
#DB_SQLITE_LOCATION="/pds/pds.sqlite"
DB_POSTGRES_URL="postgres://postgres:pass@postgres:5432/postgres"
DB_POSTGRES_URL="postgres://postgres:[email protected]:5432/postgres"
BLOBSTORE_DISK_LOCATION="/pds/blocks"	

ADMIN_PASSWORD=""
JWT_SECRET=""
REPO_SIGNING_KEY_K256_PRIVATE_KEY_HEX=""
PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX=""

nodeはどのプロジェクトでもそうですが、ほとんどのケースでerrorが出て依存関係を処理できません。どのようなerrorが出て動かないのかは、その人の環境によります。したがって、参考になりそうなものを書いておきます。通常は、yarn installだけでokです。

$ git clone https://github.com/bluesky-social/atproto
$ cd atproto

$ nvm use v18
$ npm i -g npm
$ npm i -g node-gyp
$ npm i -g lerna

$ yarn install
$ make build
#Dockerfile
FROM node:18.14.1-buster
RUN mkdir -p /app

WORKDIR /app
ADD ./ ./

WORKDIR /app/packages/pds
CMD ["node", "dist/bin.js"]
$ sudo docker build -t syui/bluesky-pds/pds:latest .
$ sudo docker run -it syui/bluesky-pds/pds:latest
$ curl 127.0.0.1:3000/xrpc/_health

cloudflare(zero-trust)

基本的にtunnelを作成して、cloudflareのdockerを起動しておくと、localhostをdomainに通すことができます。

systemdのunitに書いておくといいでしょう。

[Unit]
Description=Cloudflare Tunnel Service
Documentation=https://developers.cloudflare.com/cloudflare-one/connections/connect-apps
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/pds
ExecStart=/usr/bin/docker run -d cloudflare/cloudflared:latest tunnel --no-autoupdate run --token xxx
ExecStop=/usr/bin/docker ps -a -q --filter ancestor=cloudflare/cloudflared:latest

[Install]
WantedBy=default.target
$ sudo systemctl daemon-reload
$ sudo systemctl start cloudflare
$ sudo systemctl stop cloudflare

start pds

$ sudo systemctl start pds

fly.io

関係ないですが、fly.ioの設定の一部を載せておきます。smtpなどでportを開ける必要がでてくるかも。

[[services]]
  protocol = "tcp"
  internal_port = 3000

  [[services.ports]]
    port = 3000

  [[services.ports]]
    port = 80
    handlers = ["http"]

  [[services.ports]]
    port = 443
    handlers = ["tls", "http"]

  [[services.ports]]
    port = 465
    handlers = ["tls"]

  [[services.ports]]
    port = 587