にせねこメモ

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

Pleromaのサーバ移行ログ(2021-04-25)

やったこと

Pleromaのサーバを、別のサーバに移行した。
nixeneko.info
nixeneko.info

モチベーション

2018年にPleroma (nixeneko.info)のサーバを立てた。詳しくは次の記事を参照:

…のだが、OSがUbuntu 16.04だったので、OSのサポートが今年(2021年)4月で切れてしまう。そのため、サーバ移行しないとまずいと思って移行をした。

流れ

  • 新サーバセットアップ
  • 旧→新サーバにデータベースバックアップ(一応…)
  • 新サーバにPleromaをインストール
  • 旧サーバのPleromaを新サーバのと同じバージョンに更新
  • 旧サーバ止める
  • 旧→新サーバにデータベースをバックアップ、データ移行
  • 新サーバでデータベースのリストア
  • 新サーバでPleromaのセットアップを続行
  • ドメインIPアドレス変更
  • Let'senctyptの証明書の設定
  • 起動~

作業ログ

新サーバセットアップ

新しいVPSを契約した。

  • Conoha
  • メモリ 512 MB, ストレージ 30 GB
  • Ubuntu 20.04
SSHで接続

以下NEW_SERVER_IP_ADDRESSはサーバのIPで読み替えてください。

ローカルから

ssh root@NEW_SERVER_IP_ADDRESS
ユーザー作成
apt update
apt upgrade
adduser workuser
gpasswd -a workuser sudo
su workuser
SSH設定
cd ~
mkdir .ssh
chmod 700 .ssh
cd .ssh
touch authorized_keys
chmod 600 authorized_keys
nano authorized_keys

ローカルの公開鍵をコピペ、保存

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

設定を適当に変更して次のようにした

port 10022 #コメントアウト、変更

LoginGraceTime 30 #コメントアウト、変更
PermitRootLogin no #変更
StrictModes yes #コメントアウト、変更
MaxAuthTries 3 #コメントアウト、変更
MaxSessions 4 #コメントアウト、変更

PubkeyAuthentication yes #コメントアウト

IgnoreRhosts yes #コメントアウト

PasswordAuthentication no #そのまま
PermitEmptyPasswords no #コメントアウト 

保存し、再起動

sudo sshd -t
sudo service sshd restart
rootのauthorized_keysを消す
sudo su root
rm ~/.ssh/authorized_keys

まあそもそもVPSを作成する際にrootに公開鍵登録する必要なかったのではという気もする。
ログアウト。

サーバーに接続できることを確認

ローカルから

ssh -p 10022 workuser@NEW_SERVER_IP_ADDRESS

として、新しい設定でログインし直す。

ファイアウォール(ufw)を設定
sudo ufw allow 80
sudo ufw allow 443
sudo ufw limit 10022/tcp
sudo ufw enable
sudo ufw status

参考: https://qiita.com/hana_shin/items/a630871dce209cff04f3

Pleromaのセットアップ

新サーバにPleromaをセットアップする。
参考: Installing on Debian Based Distributions - Pleroma Documentation

いろいろインストール
 sudo apt install postgresql postgresql-contrib elixir erlang-dev erlang-nox libmagic-dev git build-essential cmake nginx certbot imagemagick ffmpeg exiftool

Ubuntu 20.04ではElixirのバージョンが足りてるっぽいのでそのまま入れた。

Pleroma用ユーザの追加
sudo useradd -r -s /bin/false -m -d /var/lib/pleroma -U pleroma
  • -r システムアカウントを作成
  • -s /bin/false ログインシェルを指定
  • -m ホームディレクトリを作成
  • -d /var/lib/pleroma ユーザのホームディレクトリの場所
  • -U ユーザと同名のグループを作成

参考: 【 useradd 】コマンド――新規ユーザーを作成する:Linux基本コマンドTips(255) - @IT
ユーザpleromaでのコマンドの実行はsudo -Hu pleroma commandとする

Pleromaのインストール
sudo mkdir -p /opt/pleroma
sudo chown -R pleroma:pleroma /opt/pleroma
sudo -Hu pleroma git clone -b stable https://git.pleroma.social/pleroma/pleroma /opt/pleroma
cd /opt/pleroma
sudo -Hu pleroma mix deps.get

hexのインストールをするかどうかにはyを入力

sudo -Hu pleroma mix pleroma.instance gen

rebar3のインストールをするか→yを入力
この後いろいろな質問がなされる。まあ適当に書く。

データベース名、データベース用のユーザー名、パスワード、を旧サーバーに合わせる。

  • データベース名がpleroma-dev
  • データベースに繋ぐユーザーがpleroma
  • データベースに繋ぐパスワードは旧サーバのprod.secret.exsに合わせる
  • アップロードファイル名の匿名化はyにした
sudo -Hu pleroma mv config/generated_config.exs config/prod.secret.exs
sudo -Hu pleroma nano config/prod.secret.exs

前の設定ファイルを参考に編集する。

  secret_key_base: "前の設定ファイルと合わせる?",
  #…
  limit: 400,
  registrations_open: false

config :pleroma, Pleroma.Repo,
  #…  
  password: "前のやつと合わせる",
  database: "pleroma_dev",

旧サーバから新サーバにバックアップ

念のため。

sshfsを使ってリモートサーバに書き出す方法、いらなかったけど残しておく。

そんな空き容量ないと思っていたので、ネットワーク越しにバックアップデータを出力させたけど、データをcustomフォーマットでダンプしたら300 MB程度だったので、正直sshfsでリモートに書き出さなくても手元で書き出せばよかった。

旧サーバにログイン

sshfsのインストール
sudo apt install sshfs
sshfsでマウント

初期設定

screen
mkdir remote
sudo nano /etc/fuse.conf

user_allow_otherコメントアウト、保存
参考: sshfsで別サーバのディレクトリをマウントする | server-memo.net
参考: ssh - sshfs mount, sudo gets permission denied - Unix & Linux Stack Exchange
マウント

sshfs workuser@NEW_SERVER_IP_ADDRESS:/home/workuser/share /home/workuser/remote -p 10022 -o allow_other

バックアップ

cd /home/pleroma/pleroma/
sudo -Hu postgres pg_dump -d pleroma_dev --format=custom -f /home/workuser/remote/pleroma.pgdump
旧サーバのPleromaをアップデート

developブランチだった。新サーバにインストールしたバージョンに合わせてv2.3.0にアップデート

sudo su pleroma
git pull
git checkout -b backup v2.3.0
MIX_ENV=prod mix deps.get
MIX_ENV=prod mix ecto.migrate
exit
sudo systemctl restart pleroma
データベースをダンプ

参考: Backup/Restore/Move/Remove your instance - Pleroma Documentation

sudo systemctl stop pleroma
cd /home/pleroma/pleroma
mkdir /home/workuser/bkup
chmod 777 /home/workuser/bkup
sudo -Hu postgres pg_dump -d pleroma_dev -v --format=plain -f /home/workuser/bkup/pleroma_dev.sql
scp -P 10022 ~/bkup/pleroma_dev.sql workuser@NEW_SERVER_IP_ADDRESS:~/share/pleroma_dev.sql

後で書くが、手順書に従って--format=customとしたが、うまくリストアできなかったので(今考えるとオプションの-1外したらうまく行ったかもしれないが…)、--format=plainにした。そしたら容量が3 GB程度になった。容量に余裕なければsshfs使うと良いかも。他にも方法はあるっぽいが。

ファイルのバックアップ

新サーバで

sudo -Hu pleroma chmod 777 /opt/pleroma/uploads
sudo -Hu pleroma chmod 777 /opt/pleroma/config

旧サーバで

scp -P 10022 -r uploads uploads/ workuser@NEW_SERVER_IP_ADDRESS:/opt/pleroma
scp -P 10022 config/setup_db.psql workuser@NEW_SERVER_IP_ADDRESS:/opt/pleroma/config/setup_db.psql.old

新サーバで

sudo chown -R pleroma:pleroma /opt/pleroma/uploads
sudo chown pleroma:pleroma /opt/pleroma/config/setup_db.psql.old
sudo -Hu pleroma chmod 775 /opt/pleroma/uploads
sudo -Hu pleroma chmod 775 /opt/pleroma/config
sudo -Hu nano /opt/pleroma/config/setup_db.psql

setup_db.psql.oldを参考に編集(必要があれば)。ユーザー、パスワード等をあわせる

データベースの復旧

新サーバで

cd /opt/pleroma
#sudo -Hu postgres psql -c 'DROP DATABASE pleroma_dev;'; sudo -Hu postgres psql -c 'DROP USER pleroma;'
sudo -Hu postgres psql -f config/setup_db.psql
sudo -Hu postgres psql -a -f /home/workuser/share/pleroma_dev.sql -d pleroma_dev

(2行目の#で始まる行は既にデータベースを作っちゃっていた場合に実行する)

最初、手順書どおりに--fomrat==customで出力してpg_restoreでやってたらうまくリストアできなくて、次のようなエラーが出た。

pg_restore: error: could not execute query: ERROR:  schema "public" already exists
Command was: CREATE SCHEMA public;

って出た。ので代りに--format=plainで出力してpsqlでリストアしたらうまくいったっぽい。PostgreSQLのバージョンが9.6→12.6とかなり離れてたのが原因かもしれない。

(2021-08-05追記: ここでVACUUM ANALYZEやっておくといいっぽい: Pleromaのホームタイムラインが500エラー返すようになってた - にせねこメモ)

データベースのマイグレーション

まあ一応…

sudo -Hu pleroma MIX_ENV=prod mix ecto.migrate
動くか確認
sudo -Hu pleroma MIX_ENV=prod mix phx.server

動くのを確かめたら、Ctrl-C→aで終了

ドメインDNSレコードを更新

ドメインDNSレコード設定でIPアドレスを旧サーバ→新サーバに変更

Nginxの設定

新サーバにて行う

SSL証明書を設定
sudo mkdir -p /var/lib/letsencrypt/
sudo systemctl stop nginx.service
sudo certbot certonly --email EMAIL_ADDRESS -d SERVER_DOMAIN --standalone

EMAIL_ADDRESSSERVER_DOMAINは環境に合わせる。
/etc/letsencryptに保存される。

…と、これ、やったけど、証明書はドメインに対して発行されるので、IP変わっても旧サーバからコピーしてくればそれで済むっぽい。

NginxへのPleromaの設定
sudo cp /opt/pleroma/installation/pleroma.nginx /etc/nginx/sites-available/pleroma.nginx
sudo ln -s /etc/nginx/sites-available/pleroma.nginx /etc/nginx/sites-enabled/pleroma.nginx

設定の編集

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

次のように変更。SERVER_DOMAINドメイン名に変える。

    server_name SERVER_DOMAIN;
    #…
    server_name SERVER_DOMAIN;
    #…
    ssl_trusted_certificate   /etc/letsencrypt/live/SERVER_DOMAIN/chain.pem;
    ssl_certificate           /etc/letsencrypt/live/SERVER_DOMAIN/fullchain.pem;
    ssl_certificate_key       /etc/letsencrypt/live/SERVER_DOMAIN/privkey.pem;

(2022-01-07追記)
certbot --webrootで証明書を更新するためには、Nginxの設定を変更する必要があったらしい。
まず

sudo mkdir -p /var/lib/letsencrypt/.well-known/

ディレクトリを作成して、そのあと
pleroma.nginxの次掲部分の

    # Uncomment this if you need to use the 'webroot' method with certbot. Make sure
    # that the directory exists and that it is accessible by the webserver. If you followed
    # the guide, you already ran 'mkdir -p /var/lib/letsencrypt' to create the folder.
    # You may need to load this file with the ssl server block commented out, run certbot
    # to get the certificate, and then uncomment it.
    #
    # location ~ /\.well-known/acme-challenge {
    #     root /var/lib/letsencrypt/;
    # }

この設定部分のコメントアウトを外す:

    location ~ /\.well-known/acme-challenge {
        root /var/lib/letsencrypt/;
    }

これによりcertbot --webrootで証明書を更新できるようになった。
多分自動更新ができる。
(2022-01-07追記終わり)

Nginx起動
sudo systemctl enable --now nginx.service
sudo cp /opt/pleroma/installation/pleroma.service /etc/systemd/system/pleroma.service

必要に応じて/etc/systemd/system/pleroma.serviceを編集

sudo systemctl enable --now pleroma.service

let'sencryptの自動更新、設定した覚えないけど/etc/cron.d/certbotに何か入ってる…。これでそのまま使えるのかな。更新されなかったら更新スクリプトを設定する必要があるかも。
(2021-08-02追記:
certbotの設定で、authenticator = standaloneになってたため、Nginxが起動している間は更新できない状態になっていたので、証明書が期限切れになった。
/etc/letsencrypt/renewal/SERVER_DOMAIN.confを編集して、

authenticator = standalone

authenticator = webroot

に変更、

renew_hook = /usr/bin/systemctl reload nginx.service
webroot_path = /var/lib/letsencrypt,

[[webroot_map]]
SERVER_DOMAIN = /var/lib/letsencrypt

になっていることを確認、または変更(なければ追加)する(SERVER_DOMAINは環境に合わせる)。
参考: Let's Encrypt更新!certbot renewコマンドでうまくいかなかったときの対処法 - Qiita
これで大丈夫かな…) (2022-01-07: webroot_path, webroot_mapを変更) (2022-04-07: post_hookを追加) (2023-02-02: post_hookのコマンドが間違っていたので修正、ついでにrenew_hookに変更)

Static Dir

参考: Static Directory - Pleroma Documentation

config :pleroma, :instance,
  #…
  static_dir: "instance/static/"

mix ecto.migrateして再起動

復元
  • instance/static/static/terms-of-service.html
  • instance/static/instance/panel.html
  • instance/static/instance/thumbnail.jpeg
  • instance/static/static/logo.png

問題点

動いた。何とか…

なんかわからんけどハッシュタグタイムラインが開けないっぽい。何が悪いのかわからんので困る。それ以外は動いているのでとりあえず様子見…。