分散SNS実装「Kibou」を動かしてみた

ActivityPubを実装した新たな分散SNS「Kibou」が登場したので実際にサーバーを動かしてみました。

Kibou とは?

Kibou is a lightweight federated social networking server based on open protocols. It is written in Rust, utilizes Rocket as it’s web framework and Diesel as it’s database driver. The project’s objective is to provide a highly customizable multi-protocol social networking server. Currently supported is the commonly used ActivityPub protocol.

Furthermore Kibou implements Mastodon’s REST API, this means that all applications for Mastodon should also work with Kibou. > https://git.cybre.club/kibouproject/kibou/src/branch/master/README.md

Rust 製のActivityPubをサポートした軽量分散ソーシャルネットワーキングサーバーです。 将来的には別のプロトコルもサポートしたいそうです。

Mastodon API互換を謳っていますが、今のところv2.3.0相当でまだまだ開発が始まったばかりのようです。

インストール手順

以下はおおむね実際に試した際の手順になります。基本的には公式の通りですが、何箇所か詰まるところがありました。

環境は Debian GNU/Linux stretch(9.9) x86_64 です。

準備

apt update && apt upgrade -y
apt install build-essential pkg-config libssl-dev curl git

PostgreSQL のインストール

echo "deb http://apt.postgresql.org/pub/repos/apt/ stretch-pgdg main" > /etc/apt/sources.list.d/pgdg.list
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
apt update
apt install postgresql libpq-dev

コンパイルに libpq-dev が必要なので忘れずに入れます。

実行用ユーザーの作成

adduser kibou
su kibou
cd

このときは作業用にも使ってしまいましたが、本来は実行専用のシステムユーザーでいいと思います。

Kibou はコンパイルされたバイナリで動作するので、Mastodonのようにインタプリタ実行環境を備えたユーザーを用意する必要はありません。

useradd --system

Rust のインストール

公式の手順に従います。

ビルドするユーザーは実行ユーザーと同一でなくても問題ありません。

curl -sf -L https://static.rust-lang.org/rustup.sh | sh
# > nightly ブランチを選択
source .cargo/env

執筆時点ではRustのNightlyブランチの機能が必要ということで、インストール時に選択するか、インストール後に以下のコマンドを実行します。

rustup default nightly

Kibou のビルド

cargo install diesel_cli --no-default-features --features "postgres"

git clone https://git.cybre.club/kibouproject/kibou.git ./live
cd live
cargo build

何度か躓いた箇所は下のほうにまとめてあります。

データベースの準備

公式インストールガイドの通りです。

sudo pg_ctlcluster 11 main start

sudo -u postgres psql
postgres=# create database kibou_dev;
postgres=# create user kibou with encrypted password 'dbpassword';
postgres=# grant all privileges on database kibou_dev to kibou;
postgres=# \q

echo DATABASE_URL=postgres://kibou:dbpassword@localhost/kibou_dev > .env
diesel migration run

設定ファイルの編集

こちらも公式の通りです。

cp env.sample.toml env.development.toml
nano env.development.toml

[database] ディレクティブには、データベースの準備で設定した値を入れます。

systemd サービスの設定

contrib/kibou.service が使えます。中のパスは適宜書き換えます。

nano contrib/kibou.service
sudo cp contrib/kibou.service /etc/systemd/system/kibou.service
sudo systemctl daemon-reload
#sudo systemctl enable kibou.service

実行する

sudo systemctl start kibou.service

または

<git cloneしたパス>/target/debug/kibou_server

設定ファイルで弄っていなければ、localhost:8000 で待ち受けます。

これでひとまずは完成です。インターネットから接続したい場合は、続いてリバースプロキシを設定します。

リバースプロキシ設定

ガイドでは Nginx 使えばいいんじゃない?的な感じになっていますが、今回は実験目的なので Caddy で済ませます。

# kibou.caddyfile  
https://kibou.example.com {
        log / /var/log/caddy/kibou.example.com.log "{combined}" {  
                rotate_age 90
                except /static
        }
        tls kibou@example.com
        proxy / localhost:8000 {
                transparent
        }
}
$ caddy -conf kibou.caddyfile

これだけで動きます。便利ですね。

アクセスログを見ているとアセットの200で埋め尽くされていたので、log ディレクティブに except /static を追加して静的ファイルへのアクセスは無視するようにしました。

実際に動かしてみた

ここ


詰まったところ

ビルドに失敗する(1)

$ cargo build 
warning: the cargo feature `default-run` is now stable and is no longer necessary to be listed in the manifest 
(中略)
error: failed to run custom build command for `openssl-sys v0.9.46`

Caused by:
  process didn't exit successfully: `/home/kibou/live/target/debug/build/openssl-sys-4cd042e33f700a77/build-script-main` (exit code: 101)
--- stdout
cargo:rustc-cfg=const_fn
cargo:rerun-if-env-changed=X86_64_UNKNOWN_LINUX_GNU_OPENSSL_LIB_DIR
X86_64_UNKNOWN_LINUX_GNU_OPENSSL_LIB_DIR unset
cargo:rerun-if-env-changed=OPENSSL_LIB_DIR
OPENSSL_LIB_DIR unset
cargo:rerun-if-env-changed=X86_64_UNKNOWN_LINUX_GNU_OPENSSL_INCLUDE_DIR
X86_64_UNKNOWN_LINUX_GNU_OPENSSL_INCLUDE_DIR unset
cargo:rerun-if-env-changed=OPENSSL_INCLUDE_DIR
OPENSSL_INCLUDE_DIR unset
cargo:rerun-if-env-changed=X86_64_UNKNOWN_LINUX_GNU_OPENSSL_DIR
X86_64_UNKNOWN_LINUX_GNU_OPENSSL_DIR unset
cargo:rerun-if-env-changed=OPENSSL_DIR
OPENSSL_DIR unset
run pkg_config fail: "Failed to run `\"pkg-config\" \"--libs\" \"--cflags\" \"openssl\"`: No such file or directory (os error 2)"

--- stderr
thread 'main' panicked at '

Could not find directory of OpenSSL installation, and this `-sys` crate cannot
proceed without this knowledge. If OpenSSL is installed and this crate had
trouble finding it,  you can set the `OPENSSL_DIR` environment variable for the
compilation process.

Make sure you also have the development packages of openssl installed.
For example, `libssl-dev` on Ubuntu or `openssl-devel` on Fedora.

If you're in a situation where you think the directory *should* be found
automatically, please open a bug at https://github.com/sfackler/rust-openssl
and include information about your system as well as this message.

$HOST = x86_64-unknown-linux-gnu
$TARGET = x86_64-unknown-linux-gnu
openssl-sys = 0.9.46


It looks like you're compiling on Linux and also targeting Linux. Currently this
requires the `pkg-config` utility to find OpenSSL but unfortunately `pkg-config`
could not be found. If you have OpenSSL installed you can likely fix this by
installing `pkg-config`.

', /home/kibou/.cargo/registry/src/github.com-1ecc6299db9ec823/openssl-sys-0.9.46/build/find_normal.rs:150:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.

warning: build failed, waiting for other jobs to finish...
error: build failed 

最初は OpenSSL が見つからないエラーかと思いましたが、よく見ると pkg-config が無いだけでした。

sudo apt install pkg-config で解決。

ビルドに失敗する(2)

error[E0432]: unresolved import `std::boxed::FnBox`
 --> /home/kibou/.cargo/registry/src/github.com-1ecc6299db9ec823/rocket-0.4.1/src/fairing/ad_hoc.rs:2:5
  |
2 | use std::boxed::FnBox;
  |     ^^^^^^^^^^^^^^^^^ no `FnBox` in `boxed`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0432`.
error: Could not compile `rocket`.
warning: build failed, waiting for other jobs to finish...
error: build failed

Webフレームワークの Rocket が、執筆時点でのnightlyと噛み合わせが悪いことによるエラーでした。

https://github.com/SergioBenitez/Rocket/issues/1042

cargo update すると Rocket が 0.4.2 に上がって動作するようになりました。 依存パッケージは Cargo.toml に記述されているので、これを直接編集してもいいかもしれません。


まとめ

連合できるようになったらまた呼んでくれ

おわり