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/
dockerグループをつくります
sudo groupadd docker
- 現在のユーザを
dockerグループに追加します
sudo usermod -aG docker $USER
-
ログアウトして再度ログインするか、再起動します。再起動するなら
sudo rebootと打ってreturnします。 -
以下のコマンドを打ってみましょう。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
ここで、userとpassの値を変更してください。なお、この値は後で使うため、どこかにメモしておいてください。
終わったら次はdocker.envの編集に進みましょう。
※今後フォロワーが増えたり、リレーに参加したりして他のサーバとの通信量が増えてきた場合、clusterLimitの値とdeliverJobConcurrency、deliverJobPerSec、inboxJobPerSecを調整する必要が出てくるかもしれません。今ここでやる必要性はありませんが、今後のために覚えておくと良いでしょう。
参考までに筆者のサーバ(たけすきー)では以下の設定値にしています。
# 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_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の編集
これも以下のコマンドで編集です。
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+c(Ctrlキーを押しながらcを押します)で可能です。
Nginxのインストールとセットアップ
こちらの方法は、手動でMisskeyを建てるの章と同じような設定をすれば良いため説明を省略します。
リバースプロキシの設定や、Firewallの設定など最低限の設定は必ず行いましょう。
※必要そうなら追記します。
Docker環境における各データのバックアップ・リストア方法
Misskeyにおいて、データベースの定期的なバックアップと(可能ならリストア試験)はとても重要です。一度壊れてしまうと、そのドメインは二度と使えなくなってしまうためです。
本格的にMisskeyサーバを始める前に(他のサーバと連合する前に)まずはバックアップとリストアの方法を確認しておきましょう。(事前にcompose.ymlがあるフォルダまでcdで移動してください)
データベースのバックアップ方法
参考:
https://qiita.com/nexryai/items/a1a4d07fce338796535b
以下のコマンドでバックアップが取れます。非常に時間がかかることがあります。壊れてないから、大丈夫ですからね。
バックアップを取るコマンドの中のUserNameのところはdefault.ymlのuserの値を入力してください。
# 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の値を入力してください。
# 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