我流Firefish(on Docker)サーバー構築手順

オレオレFirefishインストール手順書

この記事は、なすきゃさん(@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
    • メモリ 2GB
    • swap 2GB
  • ドメイン、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

インストールが終わったら念のため確認します。

1
docker compose version

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です。

続いて、データベースの設定をします。

1
sudo -u postgres psql

ログインできたら以下を入力します。
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含め使ったことがない。)
まあ、あくまでこういうやり方で運用できるよという一例ということで。

それでは、良いお年を。

comments powered by Disqus
Built with Hugo
テーマ StackJimmy によって設計されています。