やったこと
Pleromaのサーバを、別のサーバに移行した。
nixeneko.info
nixeneko.info
モチベーション
2018年にPleroma (nixeneko.info)のサーバを立てた。詳しくは次の記事を参照:
…のだが、OSがUbuntu 16.04だったので、OSのサポートが今年(2021年)4月で切れてしまう。そのため、サーバ移行しないとまずいと思って移行をした。
流れ
作業ログ
新サーバセットアップ
新しいVPSを契約した。
- Conoha
- メモリ 512 MB, ストレージ 30 GB
- Ubuntu 20.04
ユーザー作成
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
として、新しい設定でログインし直す。
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 phx.server
動くのを確かめたら、Ctrl-C→aで終了
Nginxの設定
新サーバにて行う
SSL証明書を設定
sudo mkdir -p /var/lib/letsencrypt/ sudo systemctl stop nginx.service sudo certbot certonly --email EMAIL_ADDRESS -d SERVER_DOMAIN --standalone
EMAIL_ADDRESS
とSERVER_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