+++ date = "2023-06-20" tags = ["bluesky"] title = "blueskyの連合を試してみた" slug = "bluesky" +++ 今回の目標は、[bluesky-social/pds](https://github.com/bluesky-social/pds/), [bluesky-social/atproto](https://github.com/bluesky-social/atproto/)の統合です。 ![](https://raw.githubusercontent.com/syui/img/master/other/bluesky_atproto_pds_20230620_03.13.png) ![](https://raw.githubusercontent.com/syui/img/master/other/bluesky_atproto_pds_20230620_04.03.png) ![](https://raw.githubusercontent.com/syui/img/master/other/bluesky_atproto_pds_20230620_04.13.png) ![](https://raw.githubusercontent.com/syui/img/master/other/bluesky_atproto_pds_20230620_10.11.png) pdsは、連合のsandbox環境ですが、様々な設定ができません。個人的には、`AVAILABLE_USER_DOMAINS`をsandbox環境でも有効にしたいと考え、構築してみました。これを有効にすると、handleがその設定のものになります。例えば、`.ai`と設定すれば、登録されるユーザーのhandleは`user.ai`となります。 これがsandboxの連合環境でも動作するのか確かめたかったという理由です。 通常は不可能ですが、`plc.bsky-sandbox.dev`に登録できたので、希望があると考えました。 ```sh $ 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したものを使います。 ```yaml:compose.yaml 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 ```sh #.env HOSTNAME="" PDS_VERSION="v1.3.3" EMAIL_FROM_ADDRESS="test@test.ai" 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:pass@0.0.0.0: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です。 ```sh $ 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"] ``` ```sh $ 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に書いておくといいでしょう。 ```sh:/etc/systemd/system/cloudflare.service [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 ``` ```sh $ sudo systemctl daemon-reload $ sudo systemctl start cloudflare $ sudo systemctl stop cloudflare ``` #### start pds ```sh $ sudo systemctl start pds ``` #### fly.io 関係ないですが、fly.ioの設定の一部を載せておきます。smtpなどでportを開ける必要がでてくるかも。 ```toml:fly.toml [[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 ```