github.com/deoxxa/donを試してみた

はじめに

deoxxa/don: Less than half of mastodon. はGoによる tootsuite/mastodon の実装です。 まだ開発中で、タイトルによるとmastodonの機能の半分以下らしいです。

この記事はdonをとりあえず動かしてみたメモです。

nginxとSSL証明書の設定

Production-guide.md のnginx にそって設定し、SSL証明書も設定します。

私は hnakamur/mastadon-ansible-playbook: さくらのVPSでmastodonをセットアップするAnsibleプレイブック で構築した環境で systemctl stop mastodon-web でmastodonのサービスを止めた状態で試しました。

donのバイナリを取得

deoxxa/don: Less than half of mastodon.Prebuilt Binaries でlinux/amd64のバイナリをダウンロードしました。

curl --create-dirs -Lo ~/bin/don_dev 'https://bintray.com/deoxxa/don/download_file?file_path=don_dev_linux-amd64'
chmod +x ~/bin/don_dev

READMEを読んで最初 --public_url オプションのみ指定したのですが、 --cookie_signing_key オプションも必須だというエラーになりました。

ubuntu@naruh:~$ ~/bin/don_dev --public_url https://mstdn.naruh.com
don_dev: error: required flag --cookie_signing_key not provided, try --help

コードを見ると --cookie_signing_key オプションと --cookie_encryption_key オプションは16進数文字列で指定するようです。 --cookie_encryption_key オプションにも Required() がついているのでこれも必須です。

don/main.go#L48-L49

cookieSigningKey      = app.Flag("cookie_signing_key", "Key for signing cookies.").Envar("COOKIE_SIGNING_KEY").Required().HexBytes()
cookieEncryptionKey   = app.Flag("cookie_encryption_key", "Key for encrypting cookies.").Envar("COOKIE_ENCRYPTION_KEY").Required().HexBytes()

使っている個所は don/main.go#L126

ss := sessions.NewCookieStore(*cookieSigningKey, *cookieEncryptionKey)

で、 don/main.go#L19 を見ると gorilla/sessions を使っていました。

sessions.NewCookieStore のドキュメント を見ると、キーペアの最初のキーが認証用で2つ目のキーが暗号化用とのことです。

認証用キーは32バイトか64バイトで、暗号化キーは16, 24, 32バイトのどれかが推奨となっていて、キーは securecookie.GenerateRandomKey で生成すれば良いそうです。

ということで以下のコードを書いてキーを生成しました。

package main

import (
    "encoding/hex"
    "fmt"

    "github.com/gorilla/securecookie"
)

func generateRandomKey(length int) string {
    return hex.EncodeToString(securecookie.GenerateRandomKey(length))
}

func main() {
    signingKey := generateRandomKey(64)
    encryptingKey := generateRandomKey(32)
    fmt.Printf("--cookie_signing_key=%s --cookie_encryption_key=%s\n", signingKey, encryptingKey)
}
$ go run main.go
    --cookie_signing_key=5072237fbdb086f2541cac0fb007e97f9e6ab90b28e9045e3a754ce329591fc5158f9e46843baf975a6a7caa7bce04f835a9f2ce7113682a26d29e7d76eb5081 --cookie_encryption_key=580bab08ccbc59c98ad43dd2d13d199c79a0033d54e284f8198383c1d8fac196

実行

以下のように実行すると、今度は起動しました (実際に実行するときはドメインは適宜調整してください)。

$ ~/bin/don_dev \
  --cookie_signing_key=5072237fbdb086f2541cac0fb007e97f9e6ab90b28e9045e3a754ce329591fc5158f9e46843baf975a6a7caa7bce04f835a9f2ce7113682a26d29e7d76eb5081 \
  --cookie_encryption_key=580bab08ccbc59c98ad43dd2d13d199c79a0033d54e284f8198383c1d8fac196 \
  --addr ":3000" --public_url https://mstdn.example.com

サインアップフォームからアカウント名、メールアドレス、パスワードを入力すると、メールが送られることなくそのままサインアップ完了となりました。

サインアップしてみると以下のような画面になりました。

.. image:: {attach}/images/2017/04/21/don.png :width: 544px :height: 110px :alt: don top page

This is a ridiculously simple, read-only StatusNet node. Mostly an experiment. Source code is available. と書かれていて、今はリードオンリーなStatusNetのノードとして動いている状態らしいです。

なるほど、読みと書きのうち読みだけなので、Less than half of mastodon というわけなんですね。 以上、とりあえず試してみました!