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