06・付録・Dockerを使ったMisskeyのセットアップ

作成 更新

#Fediverse #さばかんライフ! #雑録

 take様(Misskey:@take@misskey.takehi.to)にご寄稿いただきました。

Dockerを使う利点

Dockerを使うと、Misskeyのインストール・動作に必要な各種ソフトウェアを直接ホスト側のOSにインストールする必要がなく、また公式のDockerイメージを使うことで非常に簡単なコマンドだけでMisskeyのセットアップ、インストールが可能です。

また、必要なパッケージなどのビルドもする必要がないのでビルドするのに時間がかかってしまうような貧弱なCPUでも高速にセットアップすることができます。

さらに、サーバを移転する際にもDockerさえインストールできれば短時間でセットアップができるようになります。

ここで説明すること

以下の内容を説明します。

  • Dockerのインストール
  • Misskeyのインストール
  • Nginxのインストールとセットアップ
  • Docker環境における各データのバックアップ・リストア方法
  • Docker環境でのMisskeyのアップデート
  • ディスクの空き容量が少ない・・・?と思ったら

前提

以下の説明はUbuntu Desktop 24.04 LTSを利用していることを前提に記述されています。お使いの環境が異なる場合は、適宜読み替えてください。

dockerのインストール

まずは最新の公式ドキュメントを参照しましょう。英語ですが、書いてあるコマンドをそのまま実行していくだけです。

https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository

以下にコマンドを日本語の説明と共に記述しますが、このコマンドの内容が上記のURIのものと違っている場合は上記のURIの内容に従ってください。

ではターミナルを開いて以下のコマンドを入力しましょう!

#で始まっている行はただの説明なので、コピーせず、それ以外の場所をコピペしてEnterしてください。一度に複数行コピペしても大丈夫ですが、エラーが起きた際にどの行で起きたのかわかりにくくなるため、1行ずつ慎重に実行されることをお勧めします。

大丈夫です。怖くないですからね。。。

(途中、Password:という表示が出る場合がありますが、その場合はそのユーザのログインパスワードを入力後、Enterしてください。入力中に何もコンソール上は変化がありませんが、気にせず入力→Enterしてください)

Bash
# Docker公式GPG鍵を追加します。

sudo apt-get update



sudo apt-get install ca-certificates curl



sudo install -m 0755 -d /etc/apt/keyrings



sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc



sudo chmod a+r /etc/apt/keyrings/docker.asc
Bash
# 続いて、Aptソースをレポジトリに追加します

echo \

  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] 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
Bash
# Dockerのインストール

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

お疲れ様でした。ここまで来れたということは、Dockerのインストールは終わっています。念の為、以下のコマンドを打ってみて、Dockerがきちんと動作しているかどうか確認してみましょう。

Bash
sudo docker run hello-world

うまくインストールできていれば以下のメッセージが表示されるはずです。

Bash
$ sudo docker run hello-world



Hello from Docker!

This message shows that your installation appears to be working correctly.



To generate this message, Docker took the following steps:

 1. The Docker client contacted the Docker daemon.

 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.

    (amd64)

 3. The Docker daemon created a new container from that image which runs the

    executable that produces the output you are currently reading.

 4. The Docker daemon streamed that output to the Docker client, which sent

    it to your terminal.



To try something more ambitious, you can run an Ubuntu container with:

 $ docker run -it ubuntu bash



Share images, automate workflows, and more with a free Docker ID:

 https://hub.docker.com/



For more examples and ideas, visit:

 https://docs.docker.com/get-started/

このメッセージが表示されていればインストールは成功しています。

続いてDockerをroot権限なしで実行できるようにします。具体的にはsudoコマンドを入力しなくても、dockerコマンドを実行できるようにします。

例によって公式ドキュメント(英語)は以下の場所にありますが、ここでは日本語で説明いたします。

https://docs.docker.com/engine/install/linux-postinstall/

  1. dockerグループをつくります
Bash
sudo groupadd docker
  1. 現在のユーザをdockerグループに追加します
Bash
sudo usermod -aG docker $USER
  1. ログアウトして再度ログインするか、再起動します。再起動するならsudo rebootと打ってreturnします。

  2. 以下のコマンドを打ってみましょう。Dockerのインストールが終わった直後に打ったコマンドとほとんど同じですが、先頭にsudoがないことに注目してください。

Bash
docker run hello-world

先ほどと同じ結果が返ってきていれば問題なく設定に成功しています。やったね!!

Misskeyのインストール

公式ドキュメントは以下の場所にあります。

https://misskey-hub.net/ja/docs/for-admin/install/guides/docker/

が、なんのこっちゃ・・・となると思いますので以下に説明を記述します。

ソースコードの取得

まずはgitをインストールします。以下のコマンドです。

Bash
sudo apt update



sudo apt install git

次に、 GitHubから必要なソースコードを取得します。環境によってはダウンロードに少し時間がかかりますが、終わるまでコーヒーでも飲んで待ちましょう。

Bash
mkdir docker



cd docker



git clone -b master https://github.com/misskey-dev/misskey.git



cd misskey



git checkout master

設定ファイルの編集

ソースコードの取得が終わったら、設定ファイル(のサンプル)をコピーします。

Bash
cp .config/docker_example.yml .config/default.yml



cp .config/docker_example.env .config/docker.env



cp ./compose_example.yml ./compose.yml



# もし最後のコマンドがエラー(cp: cannot stat './compose_example.yml': No

such file or directory)になる場合は代わりに以下のコマンドを試してみてください(#は省いてコピペください)

# cp ./docker-compose_example.yml ./compose.yml

次に設定ファイルを編集します。テキストエディタとしては、nanoが一番簡単なためお勧めです。ここでは使い方について説明しませんが、この本の他の章や、以下のサイトなどを参考になさってください。

https://utakamo.com/article/linux/editor/nano/index.html

default.ymlの編集

まずは、default.ymlを編集しましょう。nanoを使うなら以下のコマンドです。

Bash
nano .config/default.yml

以下の箇所を探して編集します。url:の後を公開するURIへと修正してください。

YAML
# Final accessible URL seen by a user.

url: https://example.tld/

例えば公開先URIがhttps://mi.foo.bar/なら

YAML
# Final accessible URL seen by a user.

url: https://mi.foo.bar/

と書き換えます。

続いて、PostgreSQLの設定を変更します。以下の箇所を探してください。

Bash
#   ┌──────────────────────────┐

#───┘ PostgreSQL configuration └────────────────────────────────



db:

  host: db

  port: 5432



  # Database name

  db: misskey



  # Auth

  user: example-misskey-user

  pass: example-misskey-pass

ここで、userとpassの値を変更してください。なお、この値は後で使うため、どこかにメモしておいてください。

終わったら次はdocker.envの編集に進みましょう。

※今後フォロワーが増えたり、リレーに参加したりして他のサーバとの通信量が増えてきた場合、clusterLimitの値とdeliverJobConcurrency、deliverJobPerSec、inboxJobPerSecを調整する必要が出てくるかもしれません。今ここでやる必要性はありませんが、今後のために覚えておくと良いでしょう。

参考までに筆者のサーバ(たけすきー)では以下の設定値にしています。

YAML
# Number of worker processes(CPUのコア数-1ぐらいがおすすめかも?)

clusterLimit: 5



# Job concurrency per worker

deliverJobConcurrency: 16

# inboxJobConcurrency: 16



# Job rate limiter

deliverJobPerSec: 2048

inboxJobPerSec: 512

decker.envの編集

以下のコマンドで編集しちゃいましょう。

Bash
nano .config/docker.env

POSTGRES_PASSWORDはdefault.ymlで記述したpassの値を

POSTGRES_USERはuserの値を入れましょう。

他の値はそのままでOKです。

# db settings

POSTGRES_PASSWORD=example-misskey-pass

POSTGRES_USER=example-misskey-user

POSTGRES_DB=misskey

DATABASE_URL="postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}"

compose.ymlの編集

これも以下のコマンドで編集です。

Bash
nano compose.yml

今回はDockerの公式イメージを使いますので以下の箇所を修正してください。

YAML
services:

  web:

    build: .

    restart: always

となっている箇所を

YAML
services:

  web:

#    build: .

    image: misskey/misskey:latest

    restart: always

に修正します。

※半角スペースで、imageの位置がrestartと同じ場所に来るように必ず調整してください。

以上で全てのファイルの編集が終わりました。

Misskeyのデータベースの初期化と起動

続いて、データベースの初期化を行います。以下のコマンドを入力しましょう。

Bash
docker compose run --rm web pnpm run init

ここもしばらく時間がかかるかもしれません。コーヒーはさっき飲んでいるのでお菓子でも食べてゆっくりしましょう。

この作業が終わってちょっと一息できたらMisskeyを起動します。以下のコマンドを入力します。これもちょっとばかし時間がかかりますのでコンソールを眺めてみたり、鼻歌を歌ったりしながら時間をつぶしましょう。

Bash
docker compose up -d

おめでとうございます!

これでMisskeyのインストールが終わりましたよ。

3000番ポートでMisskeyにアクセスできる状態になっているはずです。

http://localhost:3000からアクセスできます。今は外部からアクセスできる状況にはないため、以下のコマンドを入力して確認しましょう。

Bash
curl http://localhost:3000

そうすると以下のような結果が返ってきます。(下記は一部を切り取っています。非常に長いため。)

HTML
$ curl http://localhost:3000

<!DOCTYPE html><!---

  _____ _         _

 |     |_|___ ___| |_ ___ _ _

 | | | | |_ -|_ -| '_| -_| | |

 |_|_|_|_|___|___|_,_|___|_  |

                         |___|

 Thank you for using Misskey!

 If you are reading this message... how about joining the development?

 https://github.com/misskey-dev/misskey



// 非常に長いため、以降のコンテンツは省略します

このように表示されたらセットアップとインストールが無事完了しています。

気を引き締めて、Nginxのセットアップへ進みましょう!

その他コマンドなど

DockerでMisskeyの起動・停止・ログ確認などをする場合、以下のコマンドを実行します。

その前に、compose.ymlがあるフォルダへ移動する必要があります。

ここまでの説明通りにセットアップしている場合、以下の場所にcompose.ymlがいるはずです。

Bash
cd docker/misskey



ls

以下のようにcompose.ymlがいる場所まで必ず移動してから次のMisskey起動・停止・ログ確認コマンドなどを打つようにしてください。正しい場所に移動していないと、これらのコマンドは正しく機能しません。

Bash
$ ls

CHANGELOG.md        LICENSE      assets       cypress                      files           package.json         scripts

CODE_OF_CONDUCT.md  Procfile     chart        cypress.config.ts            fluent-emojis   packages

CONTRIBUTING.md     README.md    codecov.yml  db                           healthcheck.sh  pnpm-lock.yaml

COPYING             ROADMAP.md   compose.yml  docker-compose.local-db.yml  locales         pnpm-workspace.yaml

Dockerfile          SECURITY.md  crowdin.yml  docker-compose_example.yml   misskey-assets  redis

Misskeyの起動

以下のコマンドで実行できます。

Bash
docker compose up -d

Misskeyの停止

以下のコマンドで実行できます。

以下のコマンドを入力すると、Ubuntuを再起動しても自動的にMisskeyが起動しなくなります。

Ubuntu起動時に自動的に起動したい場合は再度Misskeyの起動コマンドを実行するのを忘れないでください。

Bash
docker compose down

Misskeyのログ確認

以下のコマンドを入力します。

Bash
docker compose logs -f

ログの一覧表示を終了したい場合はCtrl+c(Ctrlキーを押しながらcを押します)で可能です。

Nginxのインストールとセットアップ

こちらの方法は、手動でMisskeyを建てるの章と同じような設定をすれば良いため説明を省略します。

リバースプロキシの設定や、Firewallの設定など最低限の設定は必ず行いましょう。

※必要そうなら追記します。

Docker環境における各データのバックアップ・リストア方法

Misskeyにおいて、データベースの定期的なバックアップと(可能ならリストア試験)はとても重要です。一度壊れてしまうと、そのドメインは二度と使えなくなってしまうためです。

本格的にMisskeyサーバを始める前に(他のサーバと連合する前に)まずはバックアップとリストアの方法を確認しておきましょう。(事前にcompose.ymlがあるフォルダまでcdで移動してください)

データベースのバックアップ方法

参考:

https://qiita.com/nexryai/items/a1a4d07fce338796535b

以下のコマンドでバックアップが取れます。非常に時間がかかることがあります。壊れてないから、大丈夫ですからね。

バックアップを取るコマンドの中のUserNameのところはdefault.ymlのuserの値を入力してください。

Bash
# Misskeyを停止する

docker compose down



# データベースだけ起動する

docker compose up -d db



# データベースのバックアップをとる

docker compose  exec -T db bash -c "pg_dump -Fc -U UserName -d misskey > /var/lib/postgresql/data/misskey_db.dump"



# バックアップしたデータをコピーする

sudo mv ./db/misskey_db.dump ./



# データベースを停止する

docker compose down

データベースのリストア方法

参考:

https://qiita.com/nexryai/items/a1a4d07fce338796535b

以下のコマンドでデータベースのリストアができます。上記コマンドで取ったバックアップをリストアしてみましょう。

リストアコマンドの中のUserNameのところはdefault.ymlのuserの値を入力してください。

Bash
# Misskeyを停止する

docker compose down



# 現在あるデータベースを一旦移動する

sudo mv db db_backup



# dbフォルダを作る

mkdir db



# データベースだけ起動する

docker compose up -d db



# データベースをリストアするためのバックアップデータをコピーする

docker cp misskey_db.dump misskey-db-1:/db.dump



# データベースをリストアする

docker compose exec -T db pg_restore -U UserName -d misskey /db.dump



# データベースを停止する

docker compose down

この後、Misskeyを起動してみて、curl http://localhost:3000の結果が先ほど試した結果と同じであれば正しくリストアできています。

おめでとう!

その他、バックアップが必要なファイル

以下のファイルのバックアップが必要です。

  • compose.yml

  • .config/default.yml

  • .config/docker.env

  • files

この中で、filesはオブジェクトストレージを設定していない場合にユーザがアップロードしたファイル(ドライブの中のファイル)などが保存されています。長年運営しているとサイズが大きくなっていくため早めにオブジェクトストレージを使用されることをお勧めします。

Docker環境でのMisskeyのアップデート

まず、compose.ymlがあるフォルダへ移動します。

Bash
cd docker/misskey

次に、misskeyを停止します。この時、データベースのバックアップを必ず取るようにしましょう。

※Misskeyを停止せずにデータベースのバックアップを取ることもできます。バックアップコマンドは同じです。

Bash
# Misskeyを停止する

docker compose down



# データベースだけ起動する

docker compose up -d db



# データベースのバックアップをとる

docker compose  exec -T db bash -c "pg_dump -Fc -U UserName -d misskey > /var/lib/postgresql/data/misskey_db.dump"



# バックアップしたデータをコピーする

sudo mv ./db/misskey_db.dump ./



# データベースを停止する

docker compose down

新しいDockerイメージを取得します。

Bash
docker pull misskey/misskey

最後に、Misskeyを起動します。この時Migrationなど必要な処理は自動的に行われます。(場合によっては時間がかかります。気になる場合はMisskeyのログを確認しましょう。)

Bash
docker compose up -d

ディスクの空き容量が少ない・・・?と思ったら

Dockerを使っていると、キャッシュなど不要なファイルが溜まってしまいディスクの容量を圧迫してしまうことがあります。そんな時は以下のコマンドで状況が確認できます。

Bash
docker system df

以下のような結果が出力されるはずです。

Bash
$ docker system df

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE

Images          4         4         3.075GB   7.799MB (0%)

Containers      5         3         17.68MB   0B (0%)

Local Volumes   0         0         0B        0B

Build Cache     0         0         0B        0B

以下のコマンドで必要とされていないデータを一括で削除することができますが、使用には注意が必要です。事前に何が削除されるのかはちゃんと表示されるので確認してから削除するようにしましょう。

Bash
docker system prune