この記事は、なすきゃさん(@dev@post.naskya.net)主催のFirefish Advent Calendar 2023
12月3日の記事です。
はじめまして、またはこんにちは。なっかあ(@nakkaa@misskey.7ka.org)と申します。
上記のMisskeyサーバーかんなすきーの他に、Firefishサーバーであるちらのーとの運用もやっています。
今回は我流Firefishサーバー構築について書きます。この手順を真似するとちらのーとが出来上がります。
Dockerを使うとNodejsとRustのビルド環境を用意しなくて済むし、ダウンタイム短めにバージョンアップができてお得。
ただ、正式なインストール手順を踏んでないので玄人向けかも。
VPSはお値段が高めですが、Xserverが提供しているシンVPSが個人的にはスペック良くておすすめです。
(回し者ではないです。最低契約期間が3ヶ月だったりと気になる点はあると思うので、よく吟味されてください。)
メモリ2GBとスワップ領域さえあれば良いので、他のVPSサービスでも全く問題はないです。
前提条件
- Ubuntu22.04
- ドメイン、DNSの設定をしてあること
Dockerのインストール
Install Docker Engine on Ubuntu | Docker Docsを参考にします。
DockerのレポジトリをApt sourcesに登録します。
1
2
3
4
5
6
7
8
9
10
11
12
|
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
|
Dockerをインストールします。
1
|
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
インストールが終わったら念のため確認します。
Docker Compose version v2.x.x
のような文字列が表示されたらOKです。
Postgresqlのインストール
データベースであるPostgresqlをインストールします。
Ubuntu版Misskeyインストール方法詳説 | Misskey Hubを参考にします。
1
2
3
4
5
|
sudo apt install -y postgresql-common
sudo sh /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh -i -v 15;
sudo systemctl status postgresql
|
Active: active (exited)
ならばOKです。
続いて、データベースの設定をします。
ログインできたら以下を入力します。
password
の部分はデータベースユーザーのパスワードとなるため変えてください。
今回はfirefish-userというユーザーとfirefish-dbというデータベースを作成します。
1
2
3
|
CREATE ROLE "firefish-user" LOGIN PASSWORD 'password';
CREATE DATABASE "firefish-db" OWNER "firefish-user";
¥q
|
Postgresqlのチューニング
Postgresqlの設定ファイルをPGTuneを使って軽くチューニングします。
/etc/postgresql/15/main/postgresql.conf
を開いて、以下の項目の値を変更してください。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
max_connections = 100
shared_buffers = 256MB
effective_cache_size = 768MB
maintenance_work_mem = 64MB
checkpoint_completion_target = 0.9
wal_buffers = 7864kB
default_statistics_target = 100
random_page_cost = 1.1
effective_io_concurrency = 200
work_mem = 1310kB
huge_pages = off
min_wal_size = 1GB
max_wal_size = 4GB
|
終わったら、Postgresqlを再起動します。
1
|
sudo systemctl restart postgresql
|
Redisのインストール
FirefishでもRedis7が必須になりました。
これもUbuntu版Misskeyインストール方法詳説 | Misskey Hubを参考にします。
1
2
3
4
5
6
7
8
9
10
11
|
sudo apt install -y curl ca-certificates gnupg2 lsb-release
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt update
sudo apt install -y redis
sudo systemctl status redis-server
|
Active: active (running)
ならばOKです。
nginxのインストール
Webサーバーとしてnginxをインストールします。
これもUbuntu版Misskeyインストール方法詳説 | Misskey Hubを参考にします。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
sudo apt install ubuntu-keyring
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" | sudo tee /etc/apt/preferences.d/99nginx
sudo apt update
sudo apt install -y nginx
|
nginxを起動します。
1
2
3
4
5
|
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx
|
Active: active (running)
ならばOKです。
(VPSによってはあらかじめapache2がインストールされていることがあり、80番ポートがバッティングして起動しないことがある。)
nginxの設定
README.md · develop · firefish / firefish · GitLabを参考に設定します。
example.tldの部分は自身のドメインにする必要があります。
1
2
3
4
5
6
|
Run sudo cp ./firefish.nginx.conf /etc/nginx/sites-available/ && cd /etc/nginx/sites-available/
Edit firefish.nginx.conf to reflect your server properly
Run sudo ln -s ./firefish.nginx.conf ../sites-enabled/firefish.nginx.conf
Run sudo nginx -t to validate that the config is valid, then restart the NGINX service.
|
SSL化については、私はCloudfalreを使っているため、Ubuntu版Misskeyインストール方法詳説 | Misskey Hubの
手順を Certbot (Let’s Encrypt) の設定
まで実施しています。
Firefishのインストール
git cloneします。
1
2
3
|
git clone https://git.joinfirefish.org/firefish/firefish.git
cd ./firefish
|
インストールしたいバージョンを選びます。
今回は最新のRC版であるv1.0.5-rcを使うため、beta branchを使います。
1
2
|
git checkout beta
git pull
|
設定ファイルの作成
example.ymlを参考に設定ファイルを作成します。
1
|
cp .config/example.yml .config/default.yml
|
以下は変える必要がある。
- url: https://example.com/
- db
- db: firefish -> データベース名
- user: example-firefish-user -> データベースのユーザー名
- pass: example-firefish-pass -> データベースのパスワード
(任意)jemallocのインストール
これは任意の作業です。
メモリアロケータにjemallocを使うと、メモリ消費量が抑えられると聞いたため、お守り程度にインストールします。
パッチファイルを作成します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
cat <<EOF > /tmp/jemalloc.patch
diff --git a/Dockerfile b/Dockerfile
index 1b94fc9b43..212fff1f94 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -52,7 +52,7 @@ FROM node:20
WORKDIR /firefish
# Install runtime dependencies
-RUN apt-get update && apt-get install -y libvips-dev zip unzip tini ffmpeg
+RUN apt-get update && apt-get install -y libvips-dev zip unzip tini ffmpeg libjemalloc2 libjemalloc-dev
COPY . ./
@@ -72,6 +72,7 @@ COPY --from=build /firefish/packages/backend/assets/instance.css /firefish/packa
COPY --from=build /firefish/packages/backend/native-utils/built /firefish/packages/backend/native-utils/built
RUN corepack enable && corepack prepare pnpm@latest --activate
+ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so
ENV NODE_ENV=production
VOLUME "/firefish/files"
ENTRYPOINT [ "/usr/bin/tini", "--" ]
EOF
|
パッチファイルを適用します。
1
|
patch -p1 < /tmp/jemalloc.patch
|
docker composeファイルの用意
firefishのコンテナのみを起動するdocker-compose.ymlを作ります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
cat <<EOF > docker-compose-single.yml
version: "3"
services:
web:
build: .
container_name: firefish_web
restart: always
network_mode: "host"
environment:
NODE_ENV: production
volumes:
- ./files:/firefish/files
- ./.config:/firefish/.config:ro
- ./assets:/firefish/custom/assets
command: bash -c "pnpm run gulp; pnpm run migrateandstart"
EOF
|
Firefishのビルド
Firefishをビルドします。
この処理にはVPSのスペックによりますが、20分程度かかります。
1
|
sudo docker compose -f docker-compose-single.yml build
|
Firefishの起動
Firefishを起動します。
1
|
sudo docker compose -f docker-compose-single.yml up
|
Firefishのロゴが起動したらOKです。
Ctrl + C
で起動を停止し、バックグラウンドで起動しなおします。
1
|
sudo docker compose -f docker-compose-single.yml up -d
|
Firefishを停止したい時は以下のコマンドを実行します。
1
|
sudo docker compose -f docker-compose-single.yml down
|
Firefishのバージョンアップ
git checkoutでバージョンを指定し、docker compose build、down、upで起動できます。
(ビルド中もFirefishを使えます。)
1
2
3
4
5
6
|
git pull
sudo docker compose -f docker-compose-single.yml build
sudo docker compose -f docker-compose-single.yml down && \
sudo docker compose -f docker-compose-single.yml up -d
|
アクセス確認
自身のドメインでアクセスできることを確認できたら、完了です。
運用に向けたあれこれ
- オブジェクトストレージは使った方がメディアの管理が楽ちんです。
- リモートキャッシュファイルは無効化しないと、VPSのストレージを消費していきます。
- データベースのバックアップは定期的に取ることをおすすめします。
- ファイアウォールはVPSサービスが提供しているものを使うため未設定です。
データベースのバックアップ
私は自宅サーバーにs3互換のminioを構築し、cronで毎日深夜にデータベースのバックアップを行っています。
スクリプトはこんな感じ。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#!/bin/bash
PRX=example.com
BKDIR=/tmp
FILE=${PRX}-`date "+%Y%m%d-%H%M%S"`
cp /var/lib/redis/dump.rdb ${BKDIR}/${FILE}-redis.rdb
/usr/bin/pg_dump -Fc -U "firefish-user" -d "firefish-db" > ${BKDIR}/${FILE}-sql.dump
/usr/bin/s3cmd -c /root/.s3cfg put ${BKDIR}/${FILE}-redis.rdb s3://${PRX}/
/usr/bin/s3cmd -c /root/.s3cfg put ${BKDIR}/${FILE}-sql.dump s3://${PRX}/
rm ${BKDIR}/${FILE}-sql.dump
rm ${BKDIR}/${FILE}-redis.rdb
|
s3cmdのインストールと、.s3cfgと.pgpassの設定が必要です。
データベースのリストア
実行前にdrop databaseとcreate databaseする必要があります。
1
|
pg_restore -U "firefish-user" -d "firefish-db" /tmp/dump
|
あとがき
自分ではそこまで手間ではないと思ってましたが、こう書いてみると手順多くて手間ですね。
これらを自動でやってくれるインストールスクリプトは大変便利なので、それらを使った方が良いです。(私はMisskey含め使ったことがない。)
まあ、あくまでこういうやり方で運用できるよという一例ということで。
それでは、良いお年を。