🐱

apple containerでstrfryを動かす

に公開

はじめに

10Gbpsの回線を自宅に追加したので、wss://r.kojira.ioのリレーをGCPから、自宅のM4 Mac miniでstrfryを稼働させてCloudflare tunnelでの接続に変えました。
その中でそこそこ罠があったので、この記事が刺さる人はほとんど居ないと思うけど自分のための備忘も兼ねて書いておきます。

strfryって何?

strfryはC++で書かれたNostrのリレー実装の一つです。
それ以上の説明は省略。恐らくここにたどり着いたほとんどの人にとって詳しいリレーの説明は必要のない情報。

apple containerで動かすには

apple containerの準備自体は他にいくらでも記事があると思うので書きません。
なんでDockerを使わなかったって?新しいマシンにDockerを入れて重たくしたくなかったからです。
実際に軽いかどうかは知りません(でも軽そう)

普通にstrfryをcloneしてから

container builder start --cpus 4 --memory 12g

で、apple containerのbuildkitを用意しておき、

container build --arch arm64 -t strfry .

で恐らくビルドできるはずです。
もしデフォルトのbuildkitがある場合はメモリ不足でビルドに失敗するので

container stop buildkit
container rm buildkit
container builder start --cpus 4 --memory 12g

しないといけないかも。

その時に気をつけるのは、すでに稼働しているstrfryの構造をそのまま持ってきた場合、strfry-dbディレクトリにあるどでかいデータベースのファイルがあるとDockerfile内にあるCOPYコマンドでコンテナ内にカレントディレクトリを全部コピーしようとするので、ストレージ不足で死ぬ可能性があります。ビルド時には何処か別の場所に移動していきましょう。256GBしかないうちのMac miniは瀕死になりました。

現在のapple containerはホストとの共有ファイルはディレクトリ単位でしか設定できません。そのため、起動時にはこのようにして回避しました。
configディレクトリを作って、あらかじめstrfry.confをそこにおいて置きましょう。

container run -d --name strfry -v $(pwd)/config:/config:ro -v $(pwd)/strfry-db:/app/strfry-db:rw strfry:latest --config /config/strfry.conf relay

buildがメモリ不足で失敗する…

まだバグが多くてメモリリークかなにかしているのか、何度かビルドしているとメモリ不足が発生してビルドが止まることがあります。コマンドの実行結果もおかしくなっていたので、マシンの再起動をしたら直りました。
以下のようにbuildkitを再作成しても直るかもしれません。

container stop buildkit
container rm buildkit
container builder start --cpus 4 --memory 12g

リレーを公開するには

apple containerだとリレーをそのまま外部公開できません。
ポート転送したりしないと内部的なネットワークから出られないのです。
そしてわたしはそもそも外部公開用の固定IPが契約上持ててなかった(契約の時に固定IP欲しいって言ったのに!)ので、ポート転送だけではどうにもならず、結局cloudflare tunnelを利用することにしました。
cloudflare tunnelの方法はチャッピーにでも聞いて下さい

で、このファイル~/.cloudflared/config.ymlを編集し、

tunnel: 実際のtunnel id
credentials-file: /Users/ゆーざーめい/.cloudflared/(実際のtunnel id).json

ingress:
  - hostname: リレーのドメイン
    service: http://192.168.64.xx:7777
  - service: http_status:404

service: http://192.168.64.xx:7777のとこのxxを実際の稼働している内部ネットワークのIPアドレスにする必要があります。
IPアドレスはcontainer listで確認できます。

container list
ID        IMAGE                                               OS     ARCH   STATE    ADDR
strfry    strfry:latest                                       linux  arm64  running  192.168.64.10

この場合、xx10にすると繋がるようになるはずです。
このIPはコンテナを再起動するだけでも変わってしまうので気をつけましょう。
※ここを毎回書き換えるのは面倒なのでコンテナ内でcloudfalre tunnelを動かしてもいいと思います。

トンネルを動かすのは以下のコマンドです。

cloudflared tunnel run strfry

strfryの部分はトンネル作成時に指定したものを指定します。
上記はこのようにトンネルを作成した時のもの。

cloudflared tunnel route dns -f strfry 実際のどめいんめい(r.kojira.ioなど)

接続元IPアドレスの取得方法

そのままだと全部内部のIPアドレスからの接続になってしまい、どこから接続されたのかがログからわからなくなってしまうため、strfry.confrealIpHeaderを書き換えておきましょう。
realIpHeaderの行を探してこうしておきます。

realIpHeader = "cf-connecting-ip"

おまけ

ついでにrotatelogsを使って1日毎にログファイルを作成するようにしておきましょう。

mkdir logs

しておいてから

container logs --follow strfry | rotatelogs -l logs/strfry-%Y-%m-%d.log 86400 &

としておけばlogsディレクトリに日付ごとにログファイルが作成されると思います。

最後に

一番大変だったのが、使っていたstrfryのバージョンが古すぎてDBのバージョンが変わってしまっていて、DBをそのまま使えず起動に失敗するため、jsonlでエクスポートして新しいリレーにインポートしないといけなかったことです。2400万件以上あったのでエクスポートもインポートもめっちゃ時間かかりましたわ。もう二度とやりたくない!
マイグレーション用のツール作っておいてほしかったよhoytechさん!

そんじゃーね!

Discussion