本当にどうでもいいメモなどをたまに書く程度。

Debian stretch で Misskey インスタンスを立ててみた

日付:

今年 ActivityPub 対応して Mastodon 等とも互換性ができた Misskey インスタンスを立ててみた。

ドキュメントは非常にさらっと書かれていて、Mastodon や Pleroma のようにリバースプロキシを使うのかどうかさえよくわからない。
そのあたりは設定ファイルに書かれていて、インスタンスを立てるような者は必ず見るはずなのでドキュメントには書いていないということかな。


まず

  • Nginx
  • build-essential
  • Node.js
  • MongoDB
  • Redis

を入れる。
ここでは Nginx、Node.js、MongoDB について Debian 収録物ではなく各上流のリポジトリから入れているが、特に MongoDB は 3.6 以上が要求されるため、Debian 収録物では古い点に注意。

% wget -O - https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
% echo 'deb http://nginx.org/packages/debian/ stretch nginx' | sudo tee /etc/apt/sources.list.d/nginx.list
% wget -O - https://deb.nodesource.com/setup_10.x | sudo -E bash -
% sudo apt install dirmngr
% sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4
% echo "deb http://repo.mongodb.org/apt/debian stretch/mongodb-org/4.0 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list
% sudo apt update
% sudo apt install nginx build-essential nodejs mongodb-org redis-server
% sudo systemctl enable mongod
% sudo systemctl start mongod

dirmngr は MongoDB のアーカイブキーをインポートするのに必要。


Misskey インストール。ドキュメント通り。

% su misskey
% cd
% git clone -b master git://github.com/syuilo/misskey.git
% cd misskey
% git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)
% npm install

Mongo まわり。ドキュメント通り。

% sudo mongo
> use misskey
> db.users.save({dummy:"dummy"})
> db.createUser({user:"misskey", pwd:"(略)", roles:[{role:"readWrite", db:"misskey"}]})

設定ファイルを書いてビルド。基本的にドキュメント通り。

% cp .config/example.yml .config/default.yml
% nano .config/default.yml
% npm run build

nginx でリバースプロキシ。

/etc/nginx/conf.d/example.com.conf
(nginx 公式リポジトリからインストールした場合の配置。Debian の流儀とは異なっている)

server {
	server_name example.com;
	listen 80;
	listen [::]:80;
	if ($https != on) {
		return 301 https://$host$request_uri;
	}

	listen 443 ssl http2;
	listen [::]:443 ssl http2;
	ssl_certificate (略);
	ssl_certificate_key (略);

	root /home/example/www;
	index index.html index.htm;
	location / {
		try_files $uri @proxy;
	}
	location @proxy {
		proxy_pass_header Server;
		proxy_pass http://localhost:5000;
		proxy_buffering off;
		proxy_redirect off;
		proxy_http_version 1.1;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection "upgrade";
		tcp_nodelay on;
	}

	access_log /home/example/log/access;
	error_log /home/example/log/error warn;
}

重要なのは location @proxy ブロックの proxy_http_version、proxy_set_header の計3行で、要するに WebSocket。これがないとログイン後いつまでたっても右下に「再接続中...」が表示され、投稿もできない。


Misskey は更新頻度が非常に高いので、更新用スクリプトを書いた。
update-misskey.sh

#!/usr/bin/env bash
function update_misskey() {
	git fetch
	git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)
	npm install
	NODE_ENV=production npm run build
	popd
	exit 0
}

pushd ~/misskey/
git checkout .
if [ $# -eq 1 ] && [ $1 = '-f' ]; then
	echo "Forced updating Misskey..."
	update_misskey
fi

MISSKEY_CURRENT_VERSION=`git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1`
git fetch
MISSKEY_NEW_VERSION=`git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1`
if [ $MISSKEY_CURRENT_VERSION = $MISSKEY_NEW_VERSION ]; then
	echo "Misskey is not updated."
	popd
	exit 1
else
	echo "Updating Misskey..."
	update_misskey
fi

$? に更新したら0、すでに最新で更新しなかったら1が返るので、こんな感じのを root で cron に仕込んでおけば楽かも。

#!/bin/sh
sudo -u misskey ~misskey/update-misskey.sh
if [ $? -eq 0 ]; then
	systemctl restart misskey
fi
comments powered by Disqus