1
0
hugo/content/blog/2023-06-20-bluesky.md
2024-04-23 22:21:26 +09:00

241 lines
7.0 KiB
Markdown

+++
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
```