Изображение Discourse и размер установки. Очистить /var/lib/docker/overlay2?

Здравствуйте! Я установил Discourse на новую выделенную машину, следуя руководству по адресу discourse/docs/INSTALL-cloud.md at main · discourse/discourse · GitHub.

На сервере всего 15 ГБ дискового пространства, и хотя установка ещё не работает в продакшене (меньше 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 и всей установки, и что можно сделать, чтобы освободить место?

Спасибо.

Меня интересует, что означает образ Docker <none>. (Редактирование: кажется, если образ <none> появляется в выводе docker images -a, это не так важно, но если он появляется в docker images, то это пустая трата места. Я надеялся, что очистка запуска поможет, но вам это не помогло…)

Обратите внимание, что использование файловой системы overlay, отображаемое командой df, совпадает с использованием корневой файловой системы: много данных дублируется, поэтому нужно быть осторожным, чтобы не посчитать их дважды. В вашем случае доступное пространство составляет 3,2 ГБ, и именно этот показатель вызывает беспокойство. Возможно, потребуется провести некоторую уборку.

Ниже я приведу свои аналогичные статистические данные. У меня два форума, каждый на отдельном хосте. На одном хосте 20 ГБ, на другом — 25 ГБ свободного места. Я думаю, что 15 ГБ может оказаться очень мало, особенно учитывая, что процесс обновления требует 5 ГБ свободного места перед запуском.

# 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 не удалось из-за нехватки места на диске и/или в памяти:

Обновление: после создания резервной копии и запуска обновления я также выполнил очистку.

Я уверен, что инструменты для управления образами 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

Я бы сказал, что нужно минимум 25 ГБ, но @Ed_S заявил, что ему удалось запустить это с 20 ГБ. И даже 25 ГБ, по моему опыту, немного впритык.

Всем привет,
спасибо за ответ.

Я проверил журнал с помощью команды

# journalctl --disk-usage
Архивированные и активные журналы занимают 1,5 ГБ в файловой системе.

и выполнил эту команду для освобождения места:
# journalctl --vacuum-time=10d

Теперь у меня есть дополнительно 1 ГБ.
Мой чистый вопрос касался реального размера, необходимого для Discourse.
На самом деле мои резервные копии, так как они не в рабочей среде, занимают около 10 МБ каждая, итого 3 копии (30 МБ).

Я понимаю необходимость места во время обновления, но во время работы я ожидаю сохранять текущую версию и иметь возможность удалять старые версии.
Нужны ли нам все различия в оверлее, или мы можем как-то объединить весь контент, чтобы освободить место? Я также не вижу никаких смонтированных томов, поэтому предполагаю, что 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        /

В связанной теме мы видим ситуацию, когда ./launcher cleanup не помог, но docker system prune --all --volumes --force сработал. Я не знаю, почему так произошло.

Я не понимаю, как именно складываются образы Docker, почему директории diff такие большие или почему использование диска Docker оказывается значительно больше, чем сообщает сам Docker.

Тем не менее, стоит отметить, что минимизация использования диска требует усилий: ни Docker, ни Discourse не ставят минимизацию использования диска в приоритет. Оба проекта предпочитают сосредоточиться на улучшении продукта и сохранении простоты.

Я успешно работаю на экземпляре с 20 ГБ. Учитывая необходимость оставлять 5 ГБ свободными для обновлений, фактический лимит используемого дискового пространства составляет 15 ГБ. В вашем случае, с экземпляром на 15 ГБ, вам придется укладываться в 10 ГБ используемого пространства. Можно ожидать, что это будет сложнее, а возможно, даже невозможно. Существует определённый минимальный предел.

Я почти уверен, что видел тему, где советовали полностью удалить Docker и Discourse, оставив только конфигурацию сайта и базу данных, а затем переустановить их. Я бы не стал делать это легкомысленно и уж точно не стал бы без резервной копии! К сожалению, я не могу найти эту тему в данный момент.

Мой вывод команды “docker volume ls” пуст; это зависит от того, смонтировал ли кто-то том.

Было бы неплохо иметь более официальную спецификацию или ожидаемый размер установки. Возможно, эта информация где-то есть, но я её не нашёл.

Я понимаю, что в современном мире 20 ГБ — это не так уж много, но когда речь заходит о резервном копировании, удалённой передаче, дублировании и так далее, это пустая трата места, которую, возможно, можно избежать, если знать, как экономить это место изначально.

Установка без Docker возможна, но, насколько мне известно, она не поддерживается в случае возникновения каких-либо проблем.

А 25 ГБ — это именно тот объём, который обычно получают новички и пользователи с ограниченным бюджетом, использующие DigitalOcean. Это и есть наша целевая аудитория.

Круг людей, обладающих достаточной экспертизой для управления дисковым пространством меньше 25 ГБ и при этом не имеющих бюджета на 25 ГБ, крайне мал. Думаю, вы — первый человек, который за последние пять лет высказал подобную просьбу.

Вы можете немного сэкономить, управляя собственными резервными копиями и сохраняя их удалённо. Для одной резервной копии требуется три версии: старая копия, новая несжатая копия и новая сжатая копия. Это самый эффективный способ экономии места, о котором я могу подумать, хотя я не претендую на глубокие специальные знания в области Docker.

Также можно было бы создать новый образ на временном удалённом сервере и затем отправить его в репозиторий. В этом случае вам не потребуется дополнительное место для Docker локально. Это, вероятно, лучший вариант, но чётко документированного способа сделать это нет, и такая процедура в основном не поддерживается (хотя всё же больше, чем установка без Docker). Если бы вы наняли меня для выполнения этой задачи, это стоило бы лет работы столько же, сколько стоит 10 ГБ дискового пространства. Я рассматривал возможность создания сервиса, где я бы создавал такие образы (по сути, более надёжная версия Bitnami), но до этого ещё не дошло, так как я не вижу рынка, который оправдал бы затраты времени на разработку.

Мне было бы интересно узнать, сколько стоит ваш сервер на 15 ГБ и от какого поставщика. Моя машина на 25 ГБ обходится мне в 6 долларов в месяц от Digital Ocean, а машина на 20 ГБ — в 3 доллара от Hetzner.

Если вы не планируете отлаживать поведение системы по журналам, можно довольно радикально очищать журналы.

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

Однако я изменил политику:

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

Использование диска на машине на 20 ГБ, на которой работает очень небольшой форум с низкой активностью, выглядит так:

# 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, а другие — на Azure. Для меня важно знать, что то, что я поддерживаю, находится в надлежащем состоянии и настроено так, как ожидается (размеры, очистка и т. д.).

Спасибо за совет по изменению политики journald — я это сделал (ранее я уже очистил, поэтому экономия небольшая, но теперь мне не нужно проверять это вручную).

Использование диска у вас примерно такое же, как и у меня:

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

Я бы предпочёл удалить Docker и собрать заново, но так как для Docker не смонтирован фиксированный том, я беспокоюсь, что при удалении потеряю данные форума. Буду ждать более официальной процедуры по этому вопросу.

Да, стоит подождать подтверждения. Я почти уверен, что все данные форума находятся в /var/discourse.

Другой подход, который может быть вам доступен, — запустить новый экземпляр и установить Discourse заново, чтобы посмотреть, как всё будет работать. (В любом случае следует тестировать свои резервные копии!)