410を返すものをLambdaとCloudfrontで作った

はじめに

これはCalckeyとMisskeyのサーバーを閉じる際に410を返す処理をLambdaとCloudFrontを組み合わせて作った時の備忘録です。

 

そのため詳細な部分はカットしてあるのであまり参考にならないかと思います。

 

やったこと

まずこの記事を参考にHTTPSエンドポイントを設定したLambdaを作成しました。

 

dev.classmethod.jp

 

変更箇所としては返すステータスを410に変え、Bodyを「410 Gone」に変えたくらいです。

 

次に、以下の記事を参考にLambdaを呼び出すCloudFrontのディストリビューションを作成しました。

 

dev.classmethod.jp

 

POSTリクエストにも対応したかったので、許可するHTTPメソッドの部分だけ変更しています。

 

またCloudfront側のドメインと実際に運用していたCalckeyなどのサーバーのドメインとを紐づける作業も別途対応しました。

 

対応した内容としては

  • CloudFront側で割り当てる別ドメインの設定を追加
  • その際にACMでの証明書発行を対応(DNS周りの設定も対応)
  • 最期に、CNAMEでCloudFront側のドメインを渡すようにDNSの設定を変更

という感じです。

 

これでPOSTでもGETでも410を返すものができた感じですね。

 

おわりに

この記事だと他の人の参考にならなさそうなので何かしら別の機会により詳細な記事にまとめておきたい......

MastodonサーバーにTwitterっぽいカスタムテーマを追加してみた

はじめに

GitHubで何か面白いものはないかなぁと探していたところ、以下のリポジトリを見つけたのがきっかけ。

github.com

 

デモの画面などをみて「思ったよりもTwitterっぽいなー」とか思ってました。

 

で、どうもカスタムテーマとしても導入できそうだったので導入してみたという感じです。

 

導入したカスタムテーマ

以下のような「Twitter」というTwitter風のカスタムテーマを追加してみました。

 

思ったよりTwitterっぽくなってて驚きました。

 

で、導入した背景は

  • 直近のTwitterのごたごたでFediverseに移住してくる人が増えた
  • そうした人にはTwitterのUIに近いもののほうがなじみやすいのではないか?
  • あと面白そう

という感じですね

 

あと現状うちのサーバーは新規登登録を開放してませんが、今後アカウント作成する方が出てきたときのために導入しておいてもいいかなと思ったので入れてみました。

 

やったこと

基本的には以下のPRを見て頂ければ、わかる方にはわかるかと思います。

github.com

 

やってることとしてはGitのSubmoduleとしてTwitter風のCSSライブラリを指定の位置に配置し、それをカスタムテーマとして呼び出せるようにしているだけですねー。

 

なので導入コストはかなり低めな感じです。

 

今後

現状追加したTwitter風のカスタムテーマはダークテーマをベースにしているので、ライトテーマをベースにしたTwitter風のカスタムテーマも導入してみたいと思っています。

 

あと、微妙にCSSがうまく当たっていないところとかもあるのでその辺はパッチを投げてみたいですねー。

軽量なActivityPub対応のHonkをお一人様サーバーとして建ててみた

はじめに

以下の記事を以前読んでからHonk鯖建立をやってみたいなぁと思い、建ててみました。

www.coelacanth-dream.com

 

建てたサーバー

honk.gamelinks007.net

 

建てるにあたってやったこと

サーバーの用意

サーバー自体はCreatodonの運用関係で利用しているさくらのVPSサーバーを併用することにしました。

 

VPSのスペックとしては

  • Ubuntu 22.04
  • メモリ 1GB
  • CPU 仮想2Core
  • SSD 50GB

という感じです。

 

実際にHonkを建ててみた印象では、メモリ512MBでもサクサク動きそうなのでGoogle Cloud PlatformのCoumpute EngineやApp Engineなどでもスペック的には十分そうでした。

 

なので新規でサーバーを建てられる場合はVPSではなく、そちらのクラウドサービス上にサーバーを用意しても良いかもしれません。

 

DNS周りの設定

さくらのVPSをすでに借りていたので、IPアドレスを控えておきました。

あとはDNS設定でサブドメインとして「honk.gamelinks007.net」を作成し、そのアドレスとIPアドレスを紐づけておきました。

 

先にこちらの手順をやっておくと後で証明書の発行するのが楽なので、このタイミングでやっといた感じですねー。

 

必要な依存関係のインストール

 

HonkではSQLite3をデータベースとして利用しています。

そのためビルド時にSQLite3周りのライブラリが必要になるのでインストールしておきます。

sudo apt install libsqlite3-dev

 

僕の場合はすでにBotなどを動かしていた関係で依存関係はこれだけで済んでいますが、まっさらなサーバーからHonkを建てる場合はおそらくほかにも依存関係が必要になるかと思います。

 

Goのインストール

次に、Goをインストールします。

後々Honkで利用するGoのバージョンが変更になることも考慮して、今回はgoenvを利用しました。

 

github.com

 

詳細は省きますが、以下のコマンドをすべて実行すればHonkのビルドに必要なGoがインストールされます。

git clone https://github.com/syndbg/goenv.git ~/.goenv

echo 'export GOENV_ROOT="$HOME/.goenv"' >> ~/.bashrc
echo 'export PATH="$GOENV_ROOT/bin:$PATH"' >> ~/.bashrc

echo 'eval "$(goenv init -)"' >> ~/.bashrc

exec $SHELL

goenv install 1.16.15

goenv global 1.16.15

 

Honkのビルド

まずはHonkのソースコードを落としてきます。

wget https://humungus.tedunangst.com/r/honk/d/honk-0.9.91.tgz -O honk.tgz

tar -xvf honk.tgz

mv honk-0.9.91 honk

 

次に、Honkのビルドを行います。honkディレクトリに移動し、makeコマンドを実行すればOKです。

cd honk

make

 
Honkの初期設定

Honkのビルドが完了したら、honk initコマンドで初期設定を行います。

./honk init

 

すると以下の設定をプロンプトで確認されます。

  • ユーザーID(アンダーバーなどの一部記号はログインできなくなるので利用できないです)
  • パスワード
  • listenするポート(localhost:3000のように設定)
  • サーバー名(honk.gamelinks007.netのように実際に利用するドメインを指定)

以上の項目を入力すると初期設定は完了です。

 

証明書の発行

次に証明書の発行を行います。

 

まずはletsencryptをインストールします。

sudo apt install letsencrypt

 

次に、指定したドメイン名で証明書の発行を行います。

sudo letsencrypt certonly --standalone -d honk.gamelinks007.net

 

正常に処理が終了すれば証明書の発行は完了です。

 

Nginxの設定

次に、Nginxの設定を進めます。

 

まずはNginxをインストールします。

sudo apt install nginx

 

次に、以下のコマンドでHonk用のNginxの設定ファイルを追加します。

sudo vi /etc/nginx/sites-enabled/honk.gamelinks007.net.conf

 

設定ファイルには以下の内容を貼り付けました。

server {
  server_name honk.gamelinks007.net;

  location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }

  listen 443 ssl; # managed by Certbot

  ssl_certificate /etc/letsencrypt/live/honk.gamelinks007.net/fullchain.pem; # managed by Certbot
  ssl_certificate_key /etc/letsencrypt/live/honk.gamelinks007.net/privkey.pem; # managed by Certbot
  include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
}

server {
  if ($host = honk.gamelinks007.net) {
    return 301 https://$host$request_uri;
  } # managed by Certbot

  listen 80;

  server_name honk.gamelinks007.net;

  return 404; # managed by Certbot
}

 

証明書へのパスやhttp://honk.gamelinks007.netへアクセスされた際のリダイレクト処理などを追加しています。

 

Nginxの設定に関しては以下の記事を参考にしています。

rud.is

 

あとはNginxの設定を再読み込みさせます。

sudo systemctl reload nginx

 

サービスの追加と起動

最期にHonkをsystemdで実行できるようにサービスを追加します。

以下のコマンドでサービスを追加します。

sudo vi /etc/systemd/system/honk.service

 

サービスには以下の内容を張り付けました。

[Unit]
Description=honk
After=network.target

[Service]
Type=simple
User=honk
WorkingDirectory=/home/honk/honk
ExecStart=/home/honk/honk/honk
TimeoutSec=15
Restart=always

[Install]
WantedBy=multi-user.target

 

あとは以下のコマンドで追加したサービスを有効化し、実行すればOKです。

sudo systemctl enable honk

sudo systemctl start honk

 

これで指定したドメインにアクセスすればHonkサーバーが利用できるようになっているかと思います。

 

Honkサーバーを建てみて

連合周りがまだよくわかっていない(フォロー・フォロワー周り)感じではありますが、かなり軽量なのがいいですねー。

 

特にBotとかガンガン動かしてメモリかつかつなサーバーでもサクサク動く感じなのは非常に良い感じです。

 

あと、基本的に外部からの通知などは受け取る部分がない(というより表示箇所がわかっていないというのもありますが......)ので壁打ちで考え事を書くには非常にいい感じですねー。

ただ、公開範囲の設定などは見当たらないので誰にも見られたくない壁打ちという意味合いでは使いにくいかもです。

 

あと何よりも他のActivityPub対応のものに比べると圧倒的に簡単に建てれるのは良いですねー。

最近CalckeyやMisskey を建てた時も「簡単で良いな」と思ったんですが、それをはるかに上回る簡単さでした。

 

なので、特に通知や交流などが必要ないお一人様サーバーとしてはかなり建てやすいのでいいかもしれないです。

CalckeyとMisskey のサーバーを建ててみた

はじめに

ノリと勢いでCalckeyとMisskey のサーバーを建ててみた話です。

Mastodon やPleromaなどのサーバーは建てたことはあるんですが、CalckeyやMisskey のサーバーはまだだったのでやってみました。

 

妖怪自鯖はいいぞとしても、その辺建てたことがないのにオススメするというのはどうかなと思ったのでやってみました。

 

建てたサーバー

2023/05/03に爆破される予定の以下のサーバーを建てました。

kujira.gamelinks007.net

 

semi.gamelinks007.net

 

鯨と蝉になれるというネタサーバーです。

5/3に爆破するのでそれに了承できる方であればアカウント登録していただいて構いません。

 

やったこと

まずはGCP上にGoogle Compute EngineのVMを建て、VMへのIPを各サブドメインに割り当てました。

 

OSはUbuntu 22.04LTSを使い、メモリ1.7GBでCPUは0.5~1v CPU(共有コア)を利用しました。

 

Calckeyのほうは以下のスクリプトを実行し、利用するサブドメインなどを随時入力するだけでした。

codeberg.org

 

Misskeyのほうも同じように以下のスクリプトを実行して、必要な情報を入力するだけでした。

 

misskey-hub.net

 

あとは管理アカウントを作成して、サーバーの説明とかを追加したくらいです。

 

やってみて

建てるだけであればサーバーとドメインを準備しておけばサクッと行けるので良さそうでした。

アップデートもスクリプトを使ってアップデートできるようなのでそこら辺も楽そうだと思いました。

 

RedisとかPostgreSQLとかのメジャーアップデートだけ大変かもくらい。

 

 

 

ChatGPT-3.5でMastodonの使い方とかの問い合わせを自動で返してくれるBotを作ってみた

はじめに

運営しているMastodonサーバーで前々からMastodonの使い方とかを自動で返信してくれるBotとか作れないかなと考えていたのがきっかけ。

 

で、Rubyでいい感じにOpenAIのAPIが実行できるライブラリを見つけたので実際に作ってみた感じです。

 

github.com

 

作ったもの

github.com

 

メンションで問い合わせされた内容を元に自動で返信するようにしている感じです。

 

Streaming APIを使う方法も考えたんですが、そもそもmastodon-apiRuby 2.7以降に対応できていないですし、ドキュメントなどもあまりない状況だったので通知からメンションのみを取得するようにしています。

 

また同じサーバー内のユーザーからしか問い合わせを受け付けないようにチェックなども入れています。

 

実際の挙動とか

こんな感じでMastodonについて教えてくれたりします。

 

現状の課題

 

リプライが連続した問い合わせの際に、その内容をいい感じに保持する仕組みがないです。

なので、さらに追加の質問が来た場合に対応がうまくいかない可能性がありそうです。

 

また、Mastodon以外の質問なども受け付けるようになっているので普通に大喜利に使われておしまいになりそうというのもあります。

現状だとフリートライアル分まで稼働させる予定なので問題はないんですが、本格的に動かすとなると大喜利で使いつぶされると辛いのでその辺も何かしらで対応できるようにしたいですね。

 

 

手元のPCから定期的にMasotodonへランダムに呟く

はじめに

最近ホスティングサービスなどで自分のMastodonサーバーを作られた方が、ご自身の作品を定期的に投稿できるBotを作られようとしていたのがこの記事を書くきっかけ。

その方は以下のるびまの記事を元にAWS Lambdaで定期実行をさせようとしていたんだけど、記事の内容はRuby 2.5とすでにLambdaではサポートされていないバージョンだった。 ちなみに僕の書いた記事だったりするので世間は広いようで狭い。

magazine.rubyist.net

しかも、Lambdaが現在サポートしているRubyのバージョンは2.7のみ。

docs.aws.amazon.com

さらにRuby 2.7は今年2023年3月に最終リリースがされており、セキュリティパッチなどは今後リリースされない状況。

www.ruby-lang.org

また記事中のMastodon APIを利用できるgemはRuby 2.7以降は動作しないという.......。

github.com

一応、これも僕のほうでだいぶ前にPRを投げているんだけどまだマージされていない状況。

github.com

ソースコードからビルドすれば問題はないけど、ホスティングサービスを使ってMastodonサーバーを建てられた方には中々に厳しい道のり......。

というわけで簡単に定期投稿Botを作れないか調査して、使えるようにしたのがこの記事になります。

作ったもの

n8nというコードをあまり書かずに色々なAPIやサービスのピタゴラスイッチを作れるものをベースにMastodonへと定期投稿できるようにしてみました。

n8n.io

で、以下のようなワークフローを作成した感じです。

  • Schedule Trigger で定期的に実行するインターバルを設定し、Read Binary File でPC内のCSVファイルを読み取る。
  • で、Spreadsheet Fileでバイナリとして読み込んだCSVをテキストに変換し、Codeで簡単なコードを追加してランダムに投稿内容を選択。
  • 最後にHTTP Requestで定期的に投稿を投げたいサーバーへリクエストを投げる。

という感じのワークフローになっています。

作り方

n8n のインストール

まずはn8nをPCにインストールします。 以下のリンクから利用しているOSに合わせてインストール用の実行ファイルをダウンロードします。

docs.n8n.io

実行ファイルをダウンロード後、インストールしましょう。

CSVの作成

以下のようなCSVを作成します。

text,
てすと,
テスト,
あり,
HALO,

今回はテキストだけを投稿する想定で進めます。 (たんに画像付きの場合どうすればいいかが思いつかなかっただけとも言います......)

この後CSVファイルの保存場所までのパスを利用するので、CSVファイル作成をパスをひかえておきましょう。

Botの作成

ワークフローの作成

まずは以下の画面からワークフローを追加します。

すると以下のような画面に切り替わります。

インストールしたばかりだと上のような画面になっているのでワークフローの追加は不要かもしれないので注意してください。

Schedule Triggerを設定

次にSchedule Triggerを追加します。

先ほどの画像内の「Add first step....」をクリックすると以下のような画面に変化します。 追加する処理を検索できるようになっている感じです。

「Search nodes....」と書かれているところに「Schedule Trigger」と入力すると以下のようにSchedule Triggerが表示されるので、それをクリックします。

クリック後、以下のような画面に切り替わります。

あとは以下のようにTrigger Intervalなどを設定します。

最後に「Execute node」をクリックするとワークフローにSchedule Triggerが追加されます。 「Back to canvas」と書かれた部分をクリックし、ワークフローの画面に戻りましょう。

すると以下のような画面になっているかと思います。

これでSchedule Triggerは追加できました。

Read Binary Fileの設定

次に先ほどの画像のSchedule Triggerの先についている「+」をクリックします。

すると先ほど同様に追加する処理を検索できるようになるので「Read Binary File」を検索します。

ここで気を付けてほしいのが「Read Binary Files」ではなく「Read Binary File」を必ず選択してください。 今回は複数のファイルを読み込むわけではないので単数形のほうを選択します。

選択すると以下の画面が表示されます。

「File Path」の部分に読み込ませたいCSVファイルまでのパスを渡し、「Property Name」に「text」と入力します。

この後「Execute node」をクリックするとワークフローにRead Binary FIleが追加されます。 「Back to canvas」と書かれた部分をクリックし、ワークフローの画面に戻りましょう。

以下の画面のようになっていればOKです。

Spreadsheet Fileの設定

次に、Read Binary Fileで読み込んだCSVファイルをコードで処理するためのテキストデータに変換していきます。 先ほどの画像のRead Binary Fileの先についている「+」をクリックします。

先ほどと同様に検索欄に「Spreadsheet File」と入力してSpreadsheet Fileを選択します。

選択すると以下のような画面に切り替わります。

こちらは特に設定は不要です。 そのまま「Execute node」をクリックするとSpreadsheet Fileが追加され、先ほど作成したCSVファイルが読み取られているかと思います。

「Back to canvas」と書かれた部分をクリックし、ワークフローの画面に戻りましょう。

以下のような画面になっていればOKです。

Codeの設定

次に、読み込んだCSVファイルをコードで処理していきます。 先ほどの画像のSpreadsheet Fileの先についている「+」をクリックします。

先ほどと同様に検索欄に「Code」と入力してCodeを選択します。

以下のような画面に切り替わりますので、「JavaScript」と書かれている部分にあるコードをすべて消します。

すべてコードを消した後に以下のコードを貼り付けます。

// ランダムなインデックスの値を取得
function getRandomNum(max) {
  return Math.floor(Math.random() * max);
}

// 全データを取得
const items = $input.all();

// ランダムに選択されたインデックスを取得
const index = getRandomNum(items.length);

// 該当のインデックスのデータを後続の処理に渡す
return items[index];

そのまま「Execute node」をクリックするとCodeが追加され、データの中からどれか一つがランダムに選択されていると思います。

「Back to canvas」と書かれた部分をクリックし、ワークフローの画面に戻りましょう。

以下のような画面になっていればOKです。

HTTP Requestの設定

次に、Mastodonへ投稿する処理を追加していきます。 先ほどの画像のCodeの先についている「+」をクリックします。

先ほどと同様に検索欄に「HTTP Request」と入力してHTTP Requestを選択します。

選択すると、以下のような画面に切り替わります。

あとは以下のように各項目を変更してきます。

  • 「Method」を「POST」に変更
  • 「URL」に「https://gamelinks007.net/api/v1/statuses?access_token=token」のようなアドレスを渡す
  • 「Send Body」にチェックを入れる
  • 「Body Parameters」の各項目を入力する
    • 「Name」は「status」
    • Value」は「Expresstion」を選択し「{{ $json.text }}」と入力します

そのまま「Execute node」をクリックするとHTTP Requestが追加され、データの中からどれか一つがランダムに選択されていると思います。

「Back to canvas」と書かれた部分をクリックし、ワークフローの画面に戻りましょう。

以下のような画面になっていればOKです。

定期投稿処理を実行する

画面右上の以下の画像の部分に注目してください。

「inactive」と書かれている部分をクリックすると以下のモーダルが表示されます。

「Got it」をクリックすると定期投稿処理が実行されるようになります。

これでPC上のn8nを動かしているタイミングで自動的にMastodonへ定期投稿を行うことができます。

おわりに

n8nを使うとテキストでの定期投稿は意外と簡単にできました。 が、画像とかその辺はまだ未検証なのでその辺はおいおいやっていきたいですね。

この記事を読んだ人が定期投稿とかを簡単にできるようになれば幸いです。

なお、記事に関する質問は以下のMasotodonアカウントまでDMなどしていただければと思います。

gamelinks007.net

Twitterのアーカイブデータ内の呟きを雑にMastodon へとインポートできるようにしてみた

はじめに

表題のようにTwitterアーカイブデータを元に呟きを雑にMastodonへとインポートできるようにしてみた記事です。

 

なお、この記事で紹介する実装は負荷などは考慮されておらず、ただ呟きをインポートできるようにしてみただけになっています。

そのためこの記事を参考に運営しているMastodonサーバーへ導入する場合は、自己責任でお願いします。

 

きっかけ

タイムライン上で「Twitterの投稿データをMastodonに移行出来たらなぁ」という話題が流れてきたので、興味本位で実装してみた感じです。

 

実装

とりあえず以下のPRにまとめてあります。

 

github.com

 

逐次で処理してるので負荷とかかかりそうなので、実際に使えるものにするのであれば

  • バルクインサートに対応
  • 公開範囲などの考慮
  • Retweetsの場合のインポートはどうするか

などを詰める必要はありそうです。

 

ただ思ったより実装自体はシンプルにできたので、うまいことやれば実用的なものにできる可能性はありそうです。

 

使い方

まず以下の記事を参考にTwitterからダウンロードしてきたアーカイブの中にあるtweet.jsをスプレッドシートなどでインポートできるJSONファイルに変換します。

 

powervbadesktop.com

 

次に加工したJSONファイルをスプレッドシートなどにインポートします。

僕は以下の記事参考にスプレッドシート上に呟きをインポートし、必要な情報(呟きの内容と添付メディア)をインポートしました。

 

haya-nori.com

 

具体的にはJSONファイルの中の「tweet.full_text」と「tweet.entities.media」内にある配列の中の「media_url_https」をインポートしています。

 

あとはインポートしたスプレッドシートの一行目(CSVのヘッダー部分)をインポート機能に合わせて書き換えます。

 

例えば「呟きの内容」であれば「text」、呟きに添付していた画像であれば「image_0」から「image_3」のように書き換えます。

 

これでインポート用のCSVは生成できたので、あとは以下の画面からデータをインポートするだけです。

 

 

あとはサーバー側で諸々インポートの処理が実行され、完了するとTwitterで呟いたものがMastodon上にインポートされているはずです。

 

おわりに

興味本位でやってみてサクッと動けるものはできたので良かったですね。

ただ、実際に自分が運営しているサーバーに導入するかどうかでいくと厳しいかなぁと

 

というのも

  • そもそも既存のユーザーからはメリットがない
    • 既に移住しているユーザーからすると今更Twitterで投げた呟きをインポートする意味はない
  • 投稿データをインポートする仕様なのでサーバーへの負荷がかかる
    • 特に件数が多い場合は辛い
    • また連合先にも負荷が行く可能性がある
  • Retweetsやリプライなどがインポートされても、どういった経緯だったかなどはよくわからない
    • ただ履歴としてデータが存在するだけなので意味はない
  • notestockというサービスですでにTwitterアーカイブデータをインポートできるようになっている
    • そのためそっちにインポートするのが良さそう

といった理由から導入するうまみはないかなと個人的に考えています。

 

ただ、新規ユーザーで以前までTwitterで使っていたデータをいい感じに移行したいという人はいると思います。

そういう人向けにはあってもいいのかもしれないですね。