Discourseの画像とインストールサイズ。/var/lib/docker/overlay2をクリーンアップしますか?

こんにちは、新しい専用マシンに Discourse をインストールしました。インストール手順は discourse/docs/INSTALL-cloud.md at main · discourse/discourse · GitHub のガイドに従いました。

サーバーのディスク容量は 15GB ですが、本番環境ではない(ユーザー数が 10 人未満、添付ファイルなし、いくつかの投稿が作成・削除された程度)にもかかわらず、インストールサイズがかなり大きいようです。

#df -kh
Filesystem                         Size  Used Avail Use% Mounted on
udev                               950M     0  950M   0% /dev
tmpfs                              199M  1.3M  198M   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   15G   11G  3.2G  78% /
tmpfs                              994M     0  994M   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
tmpfs                              994M     0  994M   0% /sys/fs/cgroup
/dev/sda2                          976M  203M  707M  23% /boot
/dev/loop0                          56M   56M     0 100% /snap/core18/2066
/dev/loop1                          56M   56M     0 100% /snap/core18/2074
/dev/loop2                          33M   33M     0 100% /snap/snapd/12398
/dev/loop3                          33M   33M     0 100% /snap/snapd/12159
/dev/loop4                          68M   68M     0 100% /snap/lxd/20326
overlay                             15G   11G  3.2G  78% /var/lib/docker/overlay2/ef92e2dc7a656c20eccbbdd40e660c76631ef48b6989f9ded3889a929eb*****/merged
/dev/loop6                          71M   71M     0 100% /snap/lxd/21029
tmpfs                              199M     0  199M   0% /run/user/1000
# du -csh /var/lib/docker/overlay2
580M    51d029d96e73b67e449f0b0570be47b6292da46c8c69b9f0dc6df35db85*****
2.3G    ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****
76M     d1b8d94d2ecfa140794c61e2a81ad4a09eba1646d764018cf5afd433b51*****
4.5G    ef92e2dc7a656c20eccbbdd40e660c76631ef48b6989f9ded3889a929eb*****
40K     ef92e2dc7a656c20eccbbdd40e660c76631ef48b6989f9ded3889a929eb*****-init
24K     l
7.4G    total
# du -shc /var/lib/docker/overlay2/*/diff
580M    /var/lib/docker/overlay2/51d029d96e73b67e449f0b0570be47b6292da46c8c69b9f0dc6df35db85*****/diff
2.3G    /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****/diff
76M     /var/lib/docker/overlay2/d1b8d94d2ecfa140794c61e2a81ad4a09eba1646d764018cf5afd433b51*****/diff
996M    /var/lib/docker/overlay2/ef92e2dc7a656c20eccbbdd40e660c76631ef48b6989f9ded3889a929eb*****/diff
20K     /var/lib/docker/overlay2/ef92e2dc7a656c20eccbbdd40e660c76631ef48b6989f9ded3889a929eb*****-init/diff
3.9G    total
# docker images -a
REPOSITORY            TAG       IMAGE ID       CREATED        SIZE
local_discourse/app   latest    b29b7073fea2   2 months ago   2.69GB
<none>                <none>    30e4746e631e   3 months ago   2.23GB
docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          1         1         2.689GB   0B (0%)
Containers      1         1         950.4MB   0B (0%)
Local Volumes   0         0         0B        0B
Build Cache     0         0         0B        0B

以下を試しましたが、効果はありませんでした。

# /var/discourse/launcher cleanup
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B

本番環境になった際に、インストールがさらに多くの領域を消費して破綻してしまうのではないかと心配しています。
Docker イメージとインストールの通常のサイズはどのくらいなのか、また、空き容量を確保するために何ができるかご教示いただけますでしょうか。
よろしくお願いいたします。

「いいね!」 1

<none> Docker イメージの意味が気になります。(編集:このようになっていますが、docker images -a<none> イメージが表示されてもあまり重要ではありませんが、docker images で表示される場合はスペースの無駄です。launcher のクリーンアップが役立つことを願っていましたが、あなたには役立っていないようですね…)

なお、df で確認できるオーバーレイファイルシステムの使用量は、ルートファイルシステムの使用量と一致します。多くのデータが重複して使用されているため、二重にカウントしないよう注意が必要です。あなたのケースでは、利用可能なスペースは 3.2GB で、これが問題となる数字です。いくつかの整理が必要なかもしれません。

以下に、私と同様の統計情報を示します。私は 2 つのフォーラムを持っており、それぞれ異なるホスト上で動作しています。一方のホストには 20GB、もう一方には 25GB のスペースがあります。15GB は非常に厳しいかもしれません。特に、更新プロセスが開始前に 5GB の空き容量を必要とする場合です。

# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        25G   19G  5.1G  79% /

# docker images -a
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
local_discourse/app   latest              8da0107aba03        2 months ago        2.7GB
discourse/base        2.0.20210415-1332   30e4746e631e        3 months ago        2.23GB
<none>                <none>              1e6bf44c2762        5 months ago        2.46GB
discourse/base        2.0.20201221-2020   c0704d4ce2b4        7 months ago        2.11GB


# du -shc /var/lib/docker/overlay2/*/diff
2.2G	/var/lib/docker/overlay2/05fa0e4df2...
76M 	/var/lib/docker/overlay2/58b000b1f5c...
20K 	/var/lib/docker/overlay2/6271023fc7a...
1.1G	/var/lib/docker/overlay2/6271023fc7...
2.3G	/var/lib/docker/overlay2/91d6adf7ad...
481M	/var/lib/docker/overlay2/b6b06a7cee...
592M	/var/lib/docker/overlay2/d81e44d563...
76M 	/var/lib/docker/overlay2/fb98649680b...
6.8G	total


# du -shc /var/lib/docker/overlay2/*
2.2G	/var/lib/docker/overlay2/05fa0e4df2...
76M 	/var/lib/docker/overlay2/58b000b1f5c...
4.7G	/var/lib/docker/overlay2/6271023fc7...
40K 	/var/lib/docker/overlay2/6271023fc7a...
2.3G	/var/lib/docker/overlay2/91d6adf7ad...
481M	/var/lib/docker/overlay2/b6b06a7cee...
592M	/var/lib/docker/overlay2/d81e44d563...
76M 	/var/lib/docker/overlay2/fb98649680b...
36K 	/var/lib/docker/overlay2/l
11G	total


# docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              4                   1                   5.155GB             4.689GB (90%)
Containers          1                   1                   1.059GB             0B (0%)
Local Volumes       0                   0                   0B                  0B
Build Cache         0                   0                   0B                  0B

また、ディスク満杯後の Discourse の修復も参照してください:

さらに、Discourse を使用するための最小要件も参照してください:

そして、2.6.0 beta 3 の更新がディスクおよび/またはメモリ容量で失敗も参照してください:

「いいね!」 1

追記:バックアップを取得し、更新を実行した後、クリーンアップも実行しました。

Docker イメージを管理するためのツールは、/var/lib/docker/overlay2 への直接操作よりも優れていると確信しています。また、自動クリーンアップは、それらのツールよりも優れています。(ただし、リンクされた投稿で指摘されているように、ディスク容量を消費する他の要因もあります:バックアップ、スワップファイル、ジャーナルファイル、アップロード、インポート、ログファイルなど)

以下は、上記で示した「前」の状態に対する「後」の状態です。なお、開始時の空き容量が低いのは、おそらくバックアップの影響によるものです。

# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        25G   19G  5.1G  79% /
# docker images -a
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
local_discourse/app   latest              8da0107aba03        2 months ago        2.7GB
discourse/base        2.0.20210415-1332   30e4746e631e        3 months ago        2.23GB
<none>                <none>              1e6bf44c2762        5 months ago        2.46GB
discourse/base        2.0.20201221-2020   c0704d4ce2b4        7 months ago        2.11GB
# /var/discourse/launcher cleanup
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: discourse/base:2.0.20201221-2020
untagged: discourse/base@sha256:e18*
deleted: sha256:1e6*
deleted: sha256:a22*
deleted: sha256:c07*
deleted: sha256:9b7*
deleted: sha256:87c*
untagged: discourse/base:2.0.20210415-1332
untagged: discourse/base@sha256:b3b*

Total reclaimed space: 2.456GB
# docker images -a
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
local_discourse/app   latest              8da0107aba03        2 months ago        2.7GB
<none>                <none>              30e4746e631e        3 months ago        2.23GB
# docker images 
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
local_discourse/app   latest              8da0107aba03        2 months ago        2.7GB
# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        25G   17G  7.8G  68% /
# docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              1                   1                   2.699GB             0B (0%)
Containers          1                   1                   1.13GB              0B (0%)
Local Volumes       0                   0                   0B                  0B
Build Cache         0                   0                   0B                  0B
# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        25G   17G  7.8G  68% /
# du -shc /var/lib/docker/overlay2/*
4.9G	/var/lib/docker/overlay2/627*
40K 	/var/lib/docker/overlay2/627*-init
2.3G	/var/lib/docker/overlay2/91d*
592M	/var/lib/docker/overlay2/d81*
76M 	/var/lib/docker/overlay2/fb9*
24K 	/var/lib/docker/overlay2/l
7.8G	total
# du -shc /var/lib/docker/overlay2/*/diff
20K 	/var/lib/docker/overlay2/627*-init/diff
1.2G	/var/lib/docker/overlay2/627*/diff
2.3G	/var/lib/docker/overlay2/91d*/diff
592M	/var/lib/docker/overlay2/d81*/diff
76M 	/var/lib/docker/overlay2/fb9*/diff
4.2G	total
「いいね!」 1

少なくとも25GBが必要だと思いますが、@Ed_S さんは20GBでも動作させたとのことです。私の経験では、25GBでも少し厳しいですね。

「いいね!」 1

みなさんこんにちは、
返信ありがとうございます。

journalctl を以下で確認しました。

# journalctl --disk-usage
Archived and active journals take up 1.5G in the file system.

そして、空き容量を確保するために以下のコマンドを実行しました。
# journalctl --vacuum-time=10d

これで 1GB の空き容量が確保できました。
私の純粋な疑問は、Discourse が実際に必要とする容量についてです。
実際、私のバックアップ(本番環境ではないため)は 10MB 程度で、合計 3 件のバックアップ(30MB)です。

アップデート中の容量の必要性は理解していますが、稼働中は現在のバージョンを保存しつつ、古いバージョンを削除できる余地があるはずです。
オーバーレイ内のすべての差分データが必要なのでしょうか、それとも容量を回復するために何かしらの方法で内容をマージできるのでしょうか?また、マウントされたボリュームは見当たらないため、Discourse がすべてのデータをそこに保存していると考えています。

@Ed_S 以下がコマンドの結果です。

~# du -kx / | sort -n | tail -33
431172  /usr/bin
482000  /var/lib/snapd
499660  /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****/diff/var/www/discourse/vendor/bundle/ruby/2.7.0/gems
533056  /var/lib/docker/overlay2/51d029d96e73b67e449f0b0570be47b6292da46c8c69b9f0dc6df35db85*****/diff/var/www/discourse
533060  /var/lib/docker/overlay2/51d029d96e73b67e449f0b0570be47b6292da46c8c69b9f0dc6df35db85*****/diff/var/www
556800  /usr/lib/firmware
570876  /usr/lib/modules
574032  /var/lib/docker/overlay2/51d029d96e73b67e449f0b0570be47b6292da46c8c69b9f0dc6df35db85*****/diff/var
593840  /var/lib/docker/overlay2/51d029d96e73b67e449f0b0570be47b6292da46c8c69b9f0dc6df35db85*****/diff
593856  /var/lib/docker/overlay2/51d029d96e73b67e449f0b0570be47b6292da46c8c69b9f0dc6df35db85*****
626400  /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****/diff/var/www/discourse/vendor/bundle/ruby/2.7.0
626404  /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****/diff/var/www/discourse/vendor/bundle/ruby
626408  /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****/diff/var/www/discourse/vendor/bundle
634964  /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****/diff/var/www/discourse/vendor
845496  /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****/diff/usr/lib
863600  /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****/diff/var/www/discourse
863612  /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****/diff/var/www
936876  /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****/diff/var
1004276 /var/lib/docker/overlay2/ef92e2dc7a656c20eccbbdd40e660c76631ef48b6989f9ded3889a929eb*****/diff/var/www/discourse
1004284 /var/lib/docker/overlay2/ef92e2dc7a656c20eccbbdd40e660c76631ef48b6989f9ded3889a929eb*****/diff/var/www
1032452 /var/lib/docker/overlay2/ef92e2dc7a656c20eccbbdd40e660c76631ef48b6989f9ded3889a929eb*****/diff/var
1091584 /var/lib/docker/overlay2/ef92e2dc7a656c20eccbbdd40e660c76631ef48b6989f9ded3889a929eb*****/diff
1091604 /var/lib/docker/overlay2/ef92e2dc7a656c20eccbbdd40e660c76631ef48b6989f9ded3889a929eb*****
1426272 /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****/diff/usr
1579980 /usr/lib
2398720 /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****/diff
2398736 /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****
2607528 /usr
4161292 /var/lib/docker/overlay2
4171308 /var/lib/docker
4816636 /var/lib
5509688 /var
10220684        /
「いいね!」 1

関連スレッドでは、./launcher cleanup では効果がなかったが、docker system prune --all --volumes --force で解決した事例が見られます。なぜそうなるのかは私にもわかりません。

Docker イメージのスタックアップの仕組み、diff ディレクトリがなぜそれほど大きくなるのか、あるいは Docker のディスク使用量が Docker が報告するサイズよりもずっと大きくなる理由が理解できていません。

ただし、ディスク使用量を最小化するには労力が必要である点に留意する価値があります。Docker も Discourse も、ディスク使用量の最小化を優先事項としていません。両プロジェクトとも、製品の改善とシンプルさの維持を優先しています。

私は 20 GB インスタンスで正常に運用しています。アップグレード用に 5 GB を空けておく必要があるため、実際には使用可能なディスク容量は 15 GB が限界となります。あなたのケースでは、15 GB インスタンスを使用しているため、使用量を 10 GB 以内に抑える必要があります。これはより困難になることが予想され、場合によっては不可能かもしれません。もちろん、最低限の容量は存在するはずです。

Docker と Discourse をすべて削除し、サイト設定とデータベースのみを残して再インストールするというアドバイスがあったスレッドを確かに見た記憶があります。ただし、その作業は軽率に行うべきではなく、特にバックアップなしで行うべきではありません。残念ながら、そのスレッドを現在見つけることができていません。

「docker volume ls」は空です。これは、ユーザーがボリュームをマウントしたかどうかによって異なります。

公式の仕様やインストールに必要な容量についての期待値がもう少し明記されると良いのですが、どこかにあるのかもしれませんが、私は見つけられませんでした。

現代の環境では20GBはさほど大きくないように思えるかもしれませんが、バックアップ、リモート転送、複製などを考えると、これは無駄なスペースです。最初からどのようにこのスペースを節約するかを知っていれば、避けられたかもしれません。

Docker以外のインストールも可能ですが、問題が発生した場合のサポートは提供されていないと認識しています。

そして、25GB は Digital Ocean を利用する典型的な初心者や低予算ユーザーが得られる容量です。これがまさにターゲット層です。

25GB 未満のディスク容量を管理する専門知識を持ちながら、25GB のディスク容量を買う予算がない人の数は非常に少ないです。過去 5 年でそのようなリクエストをしたのは、あなたが初めてだと思います。

自分でバックアップを管理し、リモートにバックアップを取れば、少しは節約できるかもしれません。単一のバックアップには、3 つのコピーが必要です。古いコピー、新しい非圧縮コピー、そして新しい圧縮コピーです。私が思いつく中で最も容量を節約できる方法ですが、Docker に関する特別な知識を豊富に持っているわけではありません。

また、一時的なサーバー上で新しいイメージをリモートで構築し、それをリポジトリにプッシュすることも考えられます。そうすれば、ローカルに余分な Docker 用の容量は不要になります。おそらくそれが最善策ですが、それを達成するための明確に文書化された方法はなく、主にサポートされていません(ただし、Docker 非インストール環境よりはサポートされています)。もし私にその作業を依頼すれば、10GB のディスク容量のコストの何年分もの費用がかかるでしょう。そのようなイメージを構築するサービス(本質的にはよりサポートの整った Bitnami のようなもの)を考えたことはありますが、開発時間を正当化する市場が存在しないと考えたため、着手していません。

15G サーバーのコストと供給元について知りたいです。私の 25G マシンは Digital Ocean で月額 6 ドル、20G マシンは Hetzner で 3 ドルです。

システムログからの動作のデバッグを期待しない場合、ジャーナルの整理は非常に厳しく行うことができます。

# journalctl --rotate
# journalctl --vacuum-time=1s

ただし、私が行ったのはポリシーの変更です。

/etc/systemd/journald.conf:
[Journal]
SystemMaxUse=50M

非常に小さな低アクティビティのフォーラムが動作している 20G マシンのディスク使用量は以下の通りです。

# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        19G  9.9G  8.1G  56% /

オペレーティングシステム:

15M /bin
16M /sbin
43M /boot/
135M /var/cache/
223M /var/log
435M /lib
464M /var/lib/apt
1.1G /usr
2.1G /swapfile
4.3G total

Discourse:

# du -hs /var/discourse/ /var/lib/docker/
1.5G /var/discourse/
7.5G /var/lib/docker/

編集:ああ、重複してカウントしていました。代わりにこちらをご覧ください。

# du -hxs /var/discourse/ /var/lib/docker/
1.5G /var/discourse/
4.1G /var/lib/docker/

上記に含まれるフォーラム自体:

201M	/var/discourse/shared/standalone/uploads
315M	/var/discourse/shared/standalone/postgres_data
930M	/var/discourse/shared/standalone/backups

私は Ubuntu 18.04 を実行していますが、あなたは 20.04 程度のバージョンを実行されているようです。おそらくそちらの方が大きいです。

私は複数の VPS を使用しています。Contabo にはいくつかの VM、Azure には他の VM を配置しています。私が管理しているものが、期待通り(サイズ、クリーンアップなど)に維持・設定されているかを確認する方法が知りたいのです。

journald のポリシー変更に関するアドバイス、ありがとうございます。実行しました(事前にクリーンアップしていたので節約効果は少しですが、少なくとも今後は確認する必要がなくなりました)。

あなたのディスク使用量は、私とほぼ同じですね。

# du -hxs /var/discourse/ /var/lib/docker/
181M    /var/discourse/
4.0G    /var/lib/docker/

Docker を削除して再構築することを検討しましたが、Docker 用にマウントされた固定ボリュームがないため、削除段階でフォーラムデータを失うのではないかと心配しています。そのため、公式の手順がさらに確立されるのを待ちたいと思います。

はい、確認を取っておく価値があります。すべてのフォーラムデータは/var/discourse 以下にあると確信しています。

利用可能な別のアプローチとして、新しいインスタンスを起動して Discourse を新規インストールし、その様子を確認する方法もあります。(いずれにせよ、バックアップのテストは行うべきです!)

「いいね!」 1