241 lines
7.0 KiB
Markdown
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
|
||
|
```
|