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してください)

 
# 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
 
 
# 続いて、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
 
 
# Dockerのインストール
 
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
 

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

 
sudo docker run hello-world
 

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

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

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

 
docker run hello-world
 

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

Misskeyのインストール

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

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

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

ソースコードの取得

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

 
sudo apt update
 
  
 
sudo apt install git
 

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

 
mkdir docker
 
  
 
cd docker
 
  
 
git clone -b master https://github.com/misskey-dev/misskey.git
 
  
 
cd misskey
 
  
 
git checkout master
 

設定ファイルの編集

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

 
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を使うなら以下のコマンドです。

 
nano .config/default.yml
 

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

 
# Final accessible URL seen by a user.
 
url: https://example.tld/
 

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

 
# Final accessible URL seen by a user.
 
url: https://mi.foo.bar/
 

と書き換えます。

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

 
#   ┌──────────────────────────┐
 
#───┘ PostgreSQL configuration └────────────────────────────────
 
  
 
db:
 
  host: db
 
  port: 5432
 
  
 
  # Database name
 
  db: misskey
 
  
 
  # Auth
 
  user: example-misskey-user
 
  pass: example-misskey-pass
 

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

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

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

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

 
# 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の編集

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

 
nano .config/docker.env
 

POSTGRES_PASSWORDdefault.ymlで記述したpassの値を

POSTGRES_USERuserの値を入れましょう。

他の値はそのままで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の編集

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

 
nano compose.yml
 

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

 
services:
 
  web:
 
    build: .
 
    restart: always
 

となっている箇所を

 
services:
 
  web:
 
#    build: .
 
    image: misskey/misskey:latest
 
    restart: always
 

に修正します。

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

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

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

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

 
docker compose run --rm web pnpm run init
 

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

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

 
docker compose up -d
 

おめでとうございます!

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

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

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

 
curl http://localhost:3000
 

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

 
$ 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がいるはずです。

 
cd docker/misskey
 
  
 
ls
 

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

 
$ 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の起動

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

 
docker compose up -d
 

Misskeyの停止

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

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

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

 
docker compose down
 

Misskeyのログ確認

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

 
docker compose logs -f
 

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

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

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

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

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

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

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

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

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

参考:

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

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

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

 
# 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.ymluserの値を入力してください。

 
# 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があるフォルダへ移動します。

 
cd docker/misskey
 

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

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

 
# 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イメージを取得します。

 
docker pull misskey/misskey
 

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

 
docker compose up -d
 

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

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

 
docker system df
 

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

 
$ 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
 

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

 
docker system prune
 

07・参考サイト一覧

05・鯖缶を卒業するとき