Nostr のプロフィールを GitHub リポジトリで管理する
概要
Nostr で BOT を作る際にプロフィール (kind 0) の管理をどうするか悩む方も多いかと思いますが GitHub リポジトリを使ってバージョン管理しておくと手軽に更新ができて便利です。
プロフィール JSON
まずはプロフィール用の JSON (kind 0 content
の中身)を用意してコミットします。
後で JSON に変換すれば良いので YAML やその他のフォーマットでも構いません。
{
"name": "<name>",
"about": "<description>",
"picture": "<url>",
"nip05": "<local-name@domain>",
"bot": true
}
イベントへ変換して送信
kind 0 イベントに変換して各リレーへ送信するワークフローです。
各項目の説明は後述します。
初回は手動で実行してあげてください。
次回以降は metadata.json が更新される度に実行されます。
(paths
に .github/workflows/metadata.yml
を足しても良いのですがバージョンの更新でも走ってしまうので除外してあります)
name: Metadata
on:
push:
branches:
- main
paths:
- metadata.json
workflow_dispatch:
permissions: {}
jobs:
run:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
- id: metadata
run: |
json=$(cat metadata.json | jq -c)
echo "json=${json}" >> "$GITHUB_OUTPUT"
- uses: snow-actions/nostr@v1.7.0
with:
kind: 0
content: ${{ steps.metadata.outputs.json }}
relays: |
wss://relay1.example.com/
wss://relay2.example.com/
private-key: ${{ secrets.NOSTR_PRIVATE_KEY }}
トリガー
main ブランチで metadata.json が更新された際にワークフローを実行します。
workflow_dispatch
で手動でも実行できるようにしておきます。
on:
push:
branches:
- main
paths:
- metadata.json
workflow_dispatch:
metadata.json の読み込み
metadata.json を読み込んでステップの出力パラメーターに設定します。
JSON 以外のフォーマットを使用している場合はここで JSON に変換してあげてください。
- uses: actions/checkout@v4
- id: metadata
run: |
json=$(cat metadata.json | jq -c)
echo "json=${json}" >> "$GITHUB_OUTPUT"
イベントへ変換して送信
snow-actions/nostr を使ってイベントへ変換して送信します。
Secrets に NOSTR_PRIVATE_KEY
として BOT の秘密鍵を保存しておきます。
- uses: snow-actions/nostr@v1.7.0
with:
kind: 0
content: ${{ steps.metadata.outputs.json }}
relays: |
wss://relay1.example.com/
wss://relay2.example.com/
private-key: ${{ secrets.NOSTR_PRIVATE_KEY }}
リレーもバージョン管理する場合
リレーのリストも Git 管理したい場合は JSON でコミットしておきます。
[
"wss://relay.nostr.band",
"wss://relay.damus.io",
"wss://nos.lol",
"wss://relay.nostr.wirednet.jp",
"wss://nostr-relay.nokotaro.com"
]
JSON から読み込み。
- id: relays
run: |
echo "data<<EOF" >> "$GITHUB_OUTPUT"
cat relays.json | jq -c -r '.[]' >> "$GITHUB_OUTPUT"
echo "EOF" >> "$GITHUB_OUTPUT"
読み込んだ JSON を使用。
- uses: snow-actions/nostr@v1.7.0
with:
kind: 0
content: ${{ steps.metadata.outputs.json }}
- relays: |
- wss://relay1.example.com/
- wss://relay2.example.com/
+ relays: ${{ steps.relays.outputs.data }}
private-key: ${{ secrets.NOSTR_PRIVATE_KEY }}
id: publish
送信したイベントをコミットしたい場合
リポジトリに送信した kind 0 イベントをコミットしておきたい場合は permissions
に contents: write
を追加するのと snow-actions/nostr のステップに id
を追加します。
- permissions: {}
+ permissions:
contents: write
jobs:
run:
steps:
- uses: snow-actions/nostr@v1.7.0
with:
kind: 0
content: ${{ steps.metadata.outputs.json }}
relays: |
wss://relay1.example.com/
wss://relay2.example.com/
private-key: ${{ secrets.NOSTR_PRIVATE_KEY }}
+ id: publish
出力された JSON を適当な場所へコミットします。
- run: echo "$event" | jq > docs/metadata.json
env:
event: ${{ steps.publish.outputs.event }}
- uses: snow-actions/git-config-user@v1.0.0
- run: |
set -x
git add docs/
git commit -m 'Update metadata.json'
git push
応用
metadata.json を PR で更新する場合はバリデーション CI を用意しておくとパースエラーを減らせそうです。
kind 0 以外のイベントにも応用できるので Nostr クライアントを使わずに BOT の管理ができるようになります。
こちらはすべてを GitHub Actions で管理している BOT の一例です。
Discussion