🍮

GitpodでMisskeyをはじめよう

2021/12/03に公開

はじめに

おばんです黒ヰ樹です。
今回は拙作Gitpod Misskeyの紹介をします。

https://gitlab.com/acefed/gitpod-misskey

最初に公開したのは2021年3月13日で、PostgreSQLを使うことができるgitpod/workspace-postgresコンテナイメージを使用していた際、Homebrew(Linuxbrew)を使えばPostgreSQL以外のDBを導入できることに気づいたので試しにジョブキューパッケージで広く使われていたRedisを入れてみたのがきっかけです。
MisskeyではジョブキューパッケージとしてOptimalBits/bullを使用しています。

$ brew install redis
$ redis-server --daemonize yes
$ git clone -b master https://github.com/misskey-dev/misskey.git
$ cd misskey
$ git checkout master
$ echo "url: $(gp url 8080)" > .config/default.yml
$ cat ../default.yml.example >> .config/default.yml
$ yarn install
$ NODE_ENV=production yarn build
$ yarn run init
$ NODE_ENV=production yarn start

このようにコマンドを叩けばMisskeyも動かせるので、これを.gitpod.ymlファイルで自動化したものがGitpod Misskeyです。

image: gitpod/workspace-postgres
tasks:
  - before: |
      brew install redis
      if [ -z $GITTAG ]; then export GITTAG=master; fi
      redis-server --daemonize yes
    init: |
      git clone -b $GITTAG https://github.com/misskey-dev/misskey.git
      cd misskey
      git checkout $GITTAG
      echo "url: $(gp url 8080)" > .config/default.yml
      cat ../default.yml.example >> .config/default.yml
      yarn install
      NODE_ENV=production yarn build
      yarn run init
      cd ..
    command: |
      cd misskey
      NODE_ENV=production yarn start
ports:
  - port: 8080
    visibility: public
    onOpen: open-preview
  - port: 5432
    onOpen: ignore
  - port: 6379
    onOpen: ignore
vscode:
  extensions:
    - mtxr.sqltools
    - mtxr.sqltools-driver-pg

設定ファイル.config/default.ymlはGitpod用のdefault.yml.exampleを事前に用意しておきコピーすることで自動化しています。

# url: https://8080-acefed-gitpodmisskey-<id>.<region>.gitpod.io
port: 8080
db:
  host: 127.0.0.1
  port: 5432
  db: postgres
  user: gitpod
  pass: 
redis:
  host: 127.0.0.1
  port: 6379
id: 'aid'

ちなみにmisskey-dev/misskeyだけではなく、mei23/misskeymei23/dolphinも用意しているので、めいすきーとめいどるふぃんも建てることができます。

ただ常時起動することができず、開発のため一時的にMisskeyを建てる際に使用できるものですが、Gitpodで建てることによってどのようなメリットがあるか紹介したいと思います。

メリット

まずGitpodとはなにか紹介したいと思います。

https://www.gitpod.io/

GitpodとはGithub Codespacesみたいなもので、GitリポジトリをURLからプルすることで簡単にワークスペースを作成しクラウドコーディングができるサービスです。

https://www.gitpod.io/gitpod-vs-github-codespaces

なのでローカルに開発環境を作らなくても簡単にプログラミングができたりFLOSSをビルドしたりできます。

https://www.gitpod.io/vs/local-development

Github Codespacesとは異なりGitpodはセルフホスティングできるので、MastodonやMisskeyと同じようにサービスに不満があったり所有しているドメイン上で建てたいときはDockerとKubernetesを使って自分で建てることができます。
もちろんGKE、EKS、AKSを使用して建てることもできますし、ライセンスを遵守すればGitpodのコードを変更することもできるのでGithub Codespacesより自由度が高いメリットがあります。
ちなみにワークスペースはデフォルトでgitpod/workspace-fullからコンテナイメージをプルして作成しており、最初からNode.jsやYarn、Homebrewなどたくさんのプログラミングツールを使用できるので多くの手間を省くことができます。

1クリックで建てることができる

なんといっても最大のメリットはボタンを1回押すだけでよいところです。
プログラミングやコマンド入力の知識がなくてもMisskeyを建てることができます。

高いスペックのサーバーで起動できる

Gitpodは高CPUメモリ64GB大容量SSDを搭載しているので低スペックでサーバーに異常が発生するといったことがまずありません。

spec

誰でもAdminになれる

ユーザー0人のMisskeyでは最初に登録する人が必ず管理者になれるよう専用の登録画面を用意しております。
そのためいつも通り登録するだけで簡単に管理者権限を持つことができます。コマンド入力は必要ありません。
管理者権限があれば管理ページを見ることができたり自分で作ったユーザーを自分でBANしたり簡単に独裁者になれるので建てたインスタンスはあなたの好きなようにできます。

SQLTools拡張機能で簡単にDBの中身を確認できる

通常DBを確認するためにはSQLコマンド入力が必要だったり別途DBクライアントを導入する必要があるのですが、Gitpod MisskeyはSQLTools拡張機能を自動的にインストールして設定もGitpodデフォルトのものを自動的に読み込んでいるため簡単にDBの中身を見ることができます。

sql

Misskeyでユーザー登録を行った際DBがどう変わるのか、リアクションをつけた場合どのカラムが変わるのかといった内容も直感的に調べることができるので是非SQLToolsを使ってMisskeyの仕組みに興味をもってみてください。
またsqlファイル上でショートカットキーCtrl+E&Ctrl+Eを使えば記述したSQLコマンドを叩くこともでき、そのまま結果を表示したりcsvやjsonで出力することもできるので他のツールとも相性がよいです。
例えば私は以下のSQL文を叩き、出力された情報をcsvで出力してスマホのGoogle スプレッドシートで通勤時間に確認したりしています。

SELECT * FROM information_schema.columns;

db

スマホでも建てることができる

ボタンを1回押すだけでよいので、スマホでも建てることができます。

pic
2021年8月11日 19時15分頃撮影

上の写真は実際にスマホでMisskeyを建てて、Bluetoothキーボードを使用しコードを変更したりターミナルへコマンド入力を行っている様子です。
AndroidのChromeからアクセスしており、VSCodeのショートカットキーを使うことができるのでPCと比較してできないことはそんなにないと思っております。
画面が小さいものの、F11キーを使えば全画面モードにすることができますし、Ctrl+Jを使うことでコードエディタとターミナルを切り替えることもできるのでショートカットキーを学ぶ機会にもなりスマホでのMisskey開発はオススメできます。
マウス操作をしたい場合は画面をタップすればいいので是非Bluetoothキーボードを買いましょう。

Dockerも使える

内部でdockerコマンドも使えるため様々な機能を追加しているDocker版Redisを使用したり、Docker版Misskeyを建てることもできます。
これは情報が不十分でまだやったことないので今後やってみたいと思います。

プライベートリポジトリでも使える

git連携するサービスでありがちなのがURLを知っていれば誰でもアクセスできるオープンリポジトリでしか使用できないという制限で、Gitpodも当初はそのような制限がありましたが現在はプライベートリポジトリでも使用できるようになっています。
AGPLライセンスの関係で使える範囲は限られていますがDockerを使用して別途configファイルを用意する場合はプライベートリポジトリからプルした方が安全なので便利です。

デメリット

たくさんメリットがありますね!
ただデメリットも紹介しないと実際に使ってみた人がガッカリしてしまうこともあると思うので少しだけ紹介したいと思います。

常時起動することができない

なにも操作せずに30分ぐらい放置すると自動的に停止する仕様なので24時間365日動かすサーバー用としては使えません。あくまで開発用です。

無料プランの場合月50時間しか使用できない

Gitpodは無料では月50時間しか使えません。もっとたくさん使いたい人はお金を払う必要があります。

ドメインが一部変わってしまうことがある

Gitpodはリージョンごとに分散提供しているため、ドメインが変わってしまうことがあります。
Gitpod Misskeyでは設定ファイルのドメインを書き換えるmigrate.shファイルを用意しているので$ bash ../migrate.shとコマンド入力すればとりあえずアクセスできるようにはなるのですが、DBに保存されているURLに含まれるドメインなどはそのままなのでリンク先が見つからなかったりするため注意が必要です。

Gitpod外のサーバーと連合しても通信できないことがほとんど

今までつらつらとデメリットを書いていきましたが、デメリットの多くは仕様であり、通常とは異なる建てかたをしているので、Gitpod外のサーバーからはGitpod Misskeyで建てたサーバーへ通信しようとしても停止していることがほとんどです。
Gitpod Misskeyの使い方は人それぞれですし、似たような方法でMisskeyを建てている人もいるので別にいいのですが、他サーバーのジョブキューが増えたりDBにゴミがたまってしまう原因になると思うので大量に建てて連合しまくるみたいな使い方はオススメできないです。
実際私もアウトバウンドネットワーキングのテストとして数回連合しただけで、それ以外はGitpod内でMisskeyを複数建てて連合させてどのような動きをしているか確認したり、ActivityPub実装を自作する際のテスト環境として建てることがほとんどなので、そういった使い方をしてFediverseに興味をもつきっかけになってほしいです。

MisskeyはAGPLなのでコードを変更してオープンせずに外部通信するとライセンス違反になってしまう

これに関してはあまり詳しくないのですが、どうやらAGPLはプログラムを改変した場合、リモートでコンピュータネットワークを介し対話的にやりとりするすべてのユーザに対してソースコードを開示しなければならないので、サーバーへアクセスできるリンクを公開したり他サーバーと連合したりするとライセンス違反になってしまうケースがあるようです。
なので先程紹介したようにGitpod内でMisskeyを複数建てて連合させてどのような動きをしているか確認したり、ActivityPub実装を自作する際のテスト環境として建てる分にはたとえコードを変更していても問題ないです。
サーバーへアクセスできるリンクを公開したりGitpod外のサーバーと連合しても全ソースコードを逐一コミットしてリポジトリをオープンにするか、コードを変更しなければ問題ないです。
MastodonでAGPL違反を行ったことがあるあの人やあの人やあの人みたいにならないよう気をつけましょう。

  1. リモートネットワークインタラクション、および GNU 一般公衆利用許諾書との利用
    本許諾書に含まれる他の条件に関わらず、あなたが『プログラム』を改変した場合、改変したバージョンは、そのバージョンとリモートでコンピュータネットワークを介し対話的にやりとりする(あなたのソフトウェアがそのようなインタラクションをサポートしている場合)すべてのユーザに対して、ネットワークサーバから、あなたのバージョンに『対応するソース』にアクセスする手段を、無償、かつソフトウェアのコピーを円滑に行う上で標準的、慣習的に用いられる方法で提供することにより、ユーザが『対応するソース』を受け取る機会を明示的に与えなければなければならない。ここでいう『対応するソース』には、次の段落に従って取り込まれた、GNU 一般公衆利用許諾書のバージョン3で保護されるすべての作品も含まれる。
    本許諾書に含まれる他の条件に関わらず、あなたには、『保護された作品』を GNU 一般公衆利用許諾書バージョン3の下で許諾された作品とリンクまたは結合して単一の結合物とし、その結果物を伝達する許可が与えられる。本許諾書の条項は『保護された作品』である部分に関してはそのまま適用されるが、結合された側の作品は、GNU 一般公衆利用許諾書のバージョン3によって保護され続ける。

https://gpl.mhatta.org/agpl.ja.html より引用しました
原文はこちらです https://www.gnu.org/licenses/agpl-3.0.ja.html

おわりに

最初に述べたように、当初はGitpod内でRedisを使えるみたいだし試しに作って公開してみた程度なので、ほとんどMisskey内では宣伝してこなかったツールです。
しかしながら数ヵ月経過して、どこからともなくGitpod Misskeyを発見して使用しているMisskeyユーザーを見つけて、MisskeyやFediverseに興味をもつきっかけとなったことを知り、とても嬉しかったので今回ちゃんとした紹介記事を書くことにしました。

https://acefed.gitlab.io/gitpod-misskey

今回の記事を見てGitpodを知った方、MisskeyやFediverseを知った方、プログラミングやActivityPub実装の開発に興味がある方に使ってもらい、何かのきっかけになれば幸いです。
とりとめのない長文をお読みいただきありがとうございました。


2021/12/04追記:
全然Misskey関係ない話で恐縮ですが知人の墓場人夜さんが「Who To Follow For Mastodon & Pleroma」というFLOSSを公開したらしいのでダイマしておきます。

https://gitlab.com/hakabahitoyo/who-to-follow-for-mastodon

https://whotofollow.tk/

Discussion