にせねこメモ

はてなダイアリーがUTF-8じゃないので移ってきました。

Pleromaのお一人様インスタンスをUbuntu 16.04で立てた作業ログ

https://nixeneko.infoにPleromaのおひとり様インスタンスを立ててみた。
Mastodon等やっている方は、よければ@nixeneko@nixeneko.infoをリモートフォローしてください。
(※20181227追記: この記事は古くなってるので、多分今はそのまま使えません。)

概要

Pleromaという、GNU SocialやMastodon互換のマイクロブログSNSソフトウェアがある。機能としてはTwitterに近い。
これは自分でサーバを用意して動かす(インスタンスを立てる)こともでき、インスタンスが異なっても互いにフォローできる*1ので、自分専用のインスタンスとして使っても問題ない。
Twitterという一企業のサービスに依存しないのも良いなあと思って、VPSを借りて立ててみた。


以降は2018/3/6に作業したログという感じなので、まとまっていないし、現在では変わっている部分もあるかもしれない。

実際に立ててみたい場合には、Pleroma公式Wikiのインストールガイドや次のページなどを参照するとよいと思う。

下準備

  • ドメインを取得した(nixeneko.info)。
  • ConoHaで一番安いメモリ512MBのVPSを借りた。
    • OSはUbuntu 16.04(.4 LTS)にし、SSH用にローカルで作成した公開鍵を登録しておいた(とはいえ、別に作業用のユーザを作成したので後で削除した)。接続許可ポートはすべて許可にした。
  • VPSIPアドレスを確認し、取得したドメインVPSIPアドレスを指すようにドメインのAレコードを設定した。

作業ログ(2018/3/6)

初期設定

上のページを参考にサーバの初期設定を行った。

rootでSSHでログインして(公開鍵を設定してない場合はConoHaのコンソールから作業することになると思う)、ソフトウェアを更新する。

apt update
apt upgrade

と更新したら、設定がリポジトリでインストールしたデフォルトから変更されてるよって言われて置き換えるか聞かれたが、/etc/cloud/cloud.cfgはそのまま残した(これは初回起動時に実行されるものらしいので、たぶんどっちでもよい)。

作業ユーザの追加

rootユーザで

adduser workuser
gpasswd -a workuser sudo

とし、作業ユーザを追加しsudoできるようにした。

su workuser

rootから作業ユーザに切り替える。

sudo: unable to resolve host回避

その後、sudoする度に“sudo: unable to resolve host (ホスト名)”と表示されるので、/etc/hostsに

127.0.1.1       (ホスト名)

を追記したら表示されなくなった。
参考: sudo: unable to resolve host が表示されたら - Qiita

作業ユーザへのSSH公開鍵の設定
cd ~
mkdir .ssh
chmod 700 .ssh
cd .ssh
touch authorized_keys
chmod 600 authorized_keys
nano authorized_keys

authorized_keysにローカルで作成した公開鍵をペーストし保存した。

sshdの設定
sudo nano /etc/ssh/sshd_config

/etc/ssh/sshd_configを開き、ルートログイン禁止とsshのポートの変更を行った。
ルートログイン禁止:

PermitRootLogin no

SSHポートの変更:

Port 10022

以上のように書き換え(sudo sshd -tで構文チェックができる)、sshdを再起動。

sudo service sshd restart
rootユーザに対して追加されていた公開鍵を消す
sudo su root
rm ~/.ssh/ authorized_keys

設定が済んだら作業用ユーザでログインし直す(ポートも変更したものに合わせる)

Pleromaのインストール

公式のWikiに載ってるのに従ってやっていく。

PostgreSQL 9.6のインストール

9.6以上のバージョンが標準リポジトリにないので、PostgreSQLの公式ページに従ってインストールする。

sudo nano /etc/apt/sources.list.d/pgdg.list

以下を書いて保存する。

deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main

その後、次のコマンドを実行してインストールする。

wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt update 
sudo apt install postgresql-9.6 postgresql-contrib-9.6
Elixir 1.5+

参照: Installing Elixir - Elixir

wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb
sudo apt update
sudo apt install elixir
他に必要なものをインストール

他の必要なパッケージをインストールする。

sudo apt install erlang-dev erlang-parsetools erlang-xmerl git build-essential nginx
ユーザ作成
sudo adduser pleroma
sudo usermod -aG sudo pleroma
su pleroma
ソースコードを持ってきて必要なプログラムをインストールしたり設定をする
cd ~
git clone https://git.pleroma.social/pleroma/pleroma
cd pleroma
mix deps.get

Hexをインストールするか聞かれたらyを入力。

設定ファイルを作成
mix generate_config

rebar3をインストールするか聞かれるのでy。
他にも、ドメイン名、インスタンス名、adminのEメールアドレスを入力する。
mediaproxyを有効にするか聞かれ、nとした。

作成された設定ファイルをリネームする。

mv config/generated_config.exs config/prod.secret.exs
データベースの作成・マイグレーション
sudo su postgres -c 'psql -f config/setup_db.psql'
MIX_ENV=prod mix ecto.migrate
起動テスト
MIX_ENV=prod mix phx.server

これで起動するが確かめたらCtrl-Cで停止する。

SSL証明書取得

Let's EncryptでSSL証明書を取得する。(ここらへんよくわかってない)

sudo add-apt-repository ppa:certbot/certbot
sudo apt update
sudo apt install python-certbot-nginx
sudo certbot certonly -d (ドメイン名)

すると色々聞かれるので入力すると、 /etc/letsencrypt/live/(ドメイン名)/ 以下に証明書が生成された。
(Pleromaのサイトによると証明書の取得についてより先にnginxの設定がきているので、その順番でやっていたが、certbot --nginxというふうに証明書を取得しようとしたところ、nginxの設定で指定されている証明書がないよ、とエラーが出て動かせなかった。最初は--standaloneで証明書取得を行った方が楽かもしれない)

nginxの設定

設定ファイルをコピーし、設定を変更する。

sudo cp /home/pleroma/pleroma/installation/pleroma.nginx /etc/nginx/sites-enabled/pleroma.nginx
sudo nano /etc/nginx/sites-enabled/pleroma.nginx

サーバのドメインを指定し、cert pathsも取得した証明書にあわせて修正する。

sudo systemctl restart nginx.service
サービスの設定
sudo cp /home/pleroma/pleroma/installation/pleroma.service /lib/systemd/system/pleroma.service
sudo nano /lib/systemd/system/pleroma.service

/lib/systemd/system/pleroma.serviceを開き、[Service]のところに

Environment="MIX_ENV=prod"

を書き加える。

sudo systemctl start pleroma.service

サービスを起動する。

自分用のアカウントを作る

設定したドメインにアクセスし、自分で使うためのPleromaのユーザを作成する。

登録の停止
nano ~/pleroma/config/prod.secret.exs

を編集し

  limit: 400,
  registrations_open: false

に変更して登録を停止した。またついでに投稿辺りの文字数の上限を何となく400文字とした。

設定の反映・自動起動設定

再起動してPleromaの設定を反映

sudo systemctl restart pleroma.service

Pleromaのサービスを自動起動するように設定

sudo systemctl enable pleroma.service
iptablesの設定

firewall有効化

sudo ufw enable

Ubuntuファイアウォールはデフォルトでufwなのであるが、iptablesの方が設定ファイルの流用がしやすいのでiptables使って設定ファイルを編集した。ufwコマンドで設定する方が筋がいいかもしれない。

このサイトの記述を元に設定を書いたテキストファイル(~/iptables)を作成する。sshのポートをsshd_configで設定したものに合わせて変える。(最終的に、http, https, sshの接続を許可した)

設定を反映し、永続化させる。

sudo iptables-restore < ~/iptables
sudo apt install iptables-persistent

ここで、iptablesの設定の反映は次のコマンドでできるっぽい。

sudo /etc/init.d/iptables-persistent save 

参考: Ubuntuでiptablesの設定をiptables-persistentで永続化する

let'sencryptの自動更新
/usr/bin/certbot renew --post-hook "service httpd restart"

を動かしてみてちゃんと動くか確認する。(証明書取得してすぐだと更新されないが、Cert not yet due for renewalと出れば問題ない)

cronに更新用のコマンドを設定する。

sudo nano /etc/cron.d/letsencrypt

で開き、内容は次のようにする。これは毎週火曜日16時33分に発動する設定になっている。

33 16 * * 2 root /usr/bin/certbot renew --post-hook "service httpd restart"

参考: Let&#39;s Encryptを使ってSSL証明書を自動更新する(AWS/Amazon Linux/Apache) - Qiita

こまごまとした設定

Instance specific panelの表示
nano ~/pleroma/priv/static/static/config.json

  "showInstanceSpecificPanel": true

のようにtrueに変更する。

Instance specific panelの内容の設定は~/pleroma/priv/static/instance/panel.htmlを弄るとできる。

nano ~/pleroma/priv/static/instance/panel.html

として開いて、適当に書き換える。

インスタンスのサムネイル画像の差し替え

また、 ~/pleroma/priv/static/instance/thumbnail.jpeg を置き換えると、 Pleroma Instances などで表示されるアイコンが、デフォルトの暗灰色にπλήρωμαの文字の画像から変更できる。

ロゴの変更

ロゴ、つまりブラウザでPleromaを開いたとき上部真ん中に表示される画像が標準で ~/pleroma/priv/static/static/logo.png となっているので、これを入れ替えるとPleromaフロントエンドの真ん中上部に表示される画像を変更できる。
なお、ロゴ画像ファイルの位置は ~/pleroma/priv/static/static/config.json で指定されている。

チャットの削除

チャットはお一人様インスタンスでは意味がないので消す。 ~/pleroma/config/prod.secret.exs を開き、

nano ~/pleroma/config/prod.secret.exs

次の内容を最後に書き加える。

config :pleroma, :chat,
  enabled: false

設定が終わったらPleromaを再起動する。

sudo systemctl restart pleroma.service

Pleroma最新版への更新(2018/3/17)

2018/3/8あたりでPleromaにActivityPubによるfederationが追加された。私がインストールしたのは3/6なので更新したが、やや面倒だった。更新でなくて一から入れ直すのであれば必要ない手順だと思う。

Pleromaの更新

このページに書かれているように、Pleromaのサービスを止め、最新版のコードにし、マイグレーションを行った。

sudo systemctl stop pleroma.service
cd ~/pleroma/
git pull
MIX_ENV=prod mix ecto.migrate
Nginxの設定を変える

に従って、

sudo nano /etc/nginx/sites-enabled/pleroma.nginx

と /etc/nginx/sites-enabled/pleroma.nginx に次のように書き加える。

        proxy_set_header Host $http_host;
ActivityPub対応

に従って

MIX_ENV=prod mix deps.clean --build mime

を実行し、NginxとPleromaを再起動する。

sudo systemctl restart nginx.service
sudo systemctl restart pleroma.service

感想

PleromaはRaspberryPiでも動かせる! という触れ込みだったのでメモリ512MBのVPSにインストールしたみたのだが、今のところ問題なく動いているようだ。メモリ2GB程度無いと安定動作が難しいMastodonと比べると軽さが際立つ感じがする。

リソース使用量

2018/3/20現在、11アカウントをフォローし、10アカウントからフォローされている。
基本的に、リソース使用料はインストール時を除いて安定しているように思う。しばらく様子見。

CPU

f:id:nixeneko:20180320145001p:plain

ディスクIO

f:id:nixeneko:20180320145127p:plain

転送量

f:id:nixeneko:20180320145043p:plain

*1:このようにサーバーやインスタンスが異なっても「連合」(federation)して互いにフォローすることができる。連合しているSNSネットワークのことをfediverseという。