Сбой обновления: недостаточно места на диске — избыточные файлы оверлея?

Ну, вздох… Я застрял на неудачном обновлении.

У меня VPS на 25 ГБ, используется поддерживаемая установка Docker.

Обновление docker_manager через панель администратора прошло успешно.

Обновление Discourse с v3.2.0.beta1 +125 до v3.2.0.beta3 +325 через панель администратора не удалось, поэтому я попробовал установить через командную строку:

cd /var/discourse
git pull
./launcher rebuild app

…что тоже не сработало:

You have less than 5GB of free space on the disk where /var/lib/docker is located. You will need more space to continue
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2        23G   22G  640M  98% /

Похоже, из-за двух файлов «overlay» по 18 ГБ:

root@forum:/var/discourse# df -h
Filesystem      Size  Used Avail Use% Mounted on
tmpfs            95M  1.4M   94M   2% /run
/dev/vda2        23G   18G  4.1G  82% /
tmpfs           474M     0  474M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
/dev/vda1       511M  6.1M  505M   2% /boot/efi
tmpfs            95M  4.0K   95M   1% /run/user/0
overlay          23G   18G  4.1G  82% /var/lib/docker/overlay2/8a331589d7fa9046a6ef73489cc830c2583cb76c9174125c8bfe1064d58cd503/merged
overlay          23G   18G  4.1G  82% /var/lib/docker/overlay2/d56574358c8edbc9bc1fb50022585b854462a8ce56daa636b07f3a3771949251/merged

(Три файла по 18 ГБ на сервере с 25 ГБ… Это же 54 ГБ!)

Похоже, что-то можно освободить:

root@forum:/var/discourse# docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          2         2         4.3GB     3.334GB (77%)
Containers      2         2         1.849GB   0B (0%)
Local Volumes   0         0         0B        0B
Build Cache     0         0         0B        0B

…но я не уверен, что именно и как это сделать.

Содержимое /var/discourse/shared/standalone/backups/default занимает всего 67 МБ.

Я остановил Docker командой systemctl stop docker и попробовал следующее, но безрезультатно:

docker system prune -a
docker buildx prune --all
docker builder prune --all

…все команды сообщили об освобождении 0 Б.

У меня два образа Docker: один для Discourse, а второй для… «none»?

root@forum:/var/discourse/image# docker images
REPOSITORY            TAG       IMAGE ID       CREATED        SIZE
local_discourse/app   latest    5ff1dcfe050c   2 months ago   4.09GB
<none>                <none>    bbaceb5f4a80   2 months ago   214MB

Похоже, «none» указывает на зависший или промежуточный образ: Почему в Docker появляется образ “none” и как этого избежать - Stack Overflow — но он такой маленький, что я не думаю, что это мой приоритет №1.

Когда советы на Безопасно ли чистить docker/overlay2/ - Stack Overflow доходят до поиска по overlay с помощью grep, я теряю силы. В моём docker/overlay2 60 папок с хешами… пожалуйста, не заставляйте меня запускать grep 120 раз…

Похоже, у меня есть два варианта:
A. Получить помощь, чтобы понять, можно ли удалить один из этих overlay.
B. Восстановиться из снимка, увеличить место на диске и попробовать снова. Будут ли эти огромные overlay всегда?

(И как вообще на инстансе с 25 ГБ могут быть три файла по 18 ГБ?..)

Если кто-то не спит в этот час и может что-то подсказать, буду признателен.

Просто чтобы убедиться в базовых шагах: вы пробовали ./launcher cleanup, и вот что осталось после этого?

Да — очистка не дала результата.

У вас нет двух файлов overlay размером 18 ГБ — это ложная зацепка. Docker использует overlayfs, и эти файлы просто показывают ваше существующее дисковое пространство контейнеру. /dev/vda2 — это ваш диск, и он смонтирован в / — именно туда стоит направить свои усилия.

Если ./launcher cleanup ничего не сделал, то, вероятно, docker image prune (удаляет «висящие» образы) тоже не поможет. Если вы используете этот сервер только для Discourse, возможно, стоит проверить, нет ли в вашей домашней директории больших файлов или папок.

Ох, ну это хитро со стороны Docker…
Нет, операция очистки ничего не освободила.
Я сейчас осматриваю /usr с помощью ncdu… ничего явно лишнего не видно, хотя не совсем понимаю, что делать с /usr/lib/modules:

  547.2 MiB [###########################] /6.2.0-37-generic
  547.2 MiB [########################## ] /6.2.0-34-generic
    1.2 MiB [                           ] /6.2.0-33-generic
    1.2 MiB [                           ] /6.2.0-32-generic
    1.2 MiB [                           ] /6.2.0-35-generic
    1.2 MiB [                           ] /6.2.0-36-generic

Наибольший объём занимают оверлеи в /var:

   16.0 GiB [###########################] /var
    4.3 GiB [#######                    ] /usr
    2.3 GiB [###                        ]  swapfile
    1.7 GiB [##                         ] /snap
  289.5 MiB [                           ] /boot

В /snap нет ничего, кроме того, что было установлено изначально:

root@forum:/# snap list
Name    Version       Rev    Tracking         Publisher   Notes
core22  20230801      864    latest/stable    canonical✓  base
lxd     5.19-8635f82  26200  latest/stable/…  canonical✓  -
snapd   2.60.4        20290  latest/stable    canonical✓  snapd

Ого — /var/log/journal разросся!

    1.8 GiB [###########################] /7341e5ac94ae440bbd06f743e242da89
   16.0 MiB [                           ] /7025a9ae870140c1bef8e55211d339dc

Похоже, что за пару месяцев было множество попыток входа ботов.
Хранить логи некоторое время — разумно, но этот форум всё ещё в бете.
Возможно, очистка (vacuum) этого лога позволит мне снова работать.

Что ж, это не совсем помогло, поэтому я увеличил объем сервера до 55 ГБ. Если большие файлы наложений неизбежны, то, похоже, другого выбора и не было.

Обновление Discourse только что завершено, сайт, кажется, работает нормально на версии 3.2.0.beta4-dev. :sweat_smile:

Спасибо @JammyDodger и @Stephen за ваше внимание и вклад!

У меня закончилось место на VPS Linode объёмом 50 ГБ.

Ниже перечислены некоторые «пожиратели» места, о которых ещё не упоминалось. Некоторые из них специфичны для Discourse, другие характерны для систем Linux в целом.

  1. Выполните команду ll /lib/modules. Я был удивлён, обнаружив около 15 ГБ старых ядер, которые apt autoremove не посчитал нужным удалить. Claude предположил, что они были установлены нестандартным способом, и сгенерировал безопасный скрипт для удаления. Процесс занял около часа, но сработал (запускайте на свой страх и риск, конечно), и мне удалось выполнить ./launcher rebuild без ошибки no space left on device.

  2. Скрипт не удалил соответствующие заголовки в /usr/src. Для этого ChatGPT создал другой скрипт.

  3. Около полугигабайта места было занято ненужными локалями.

  4. Ещё более 1 ГБ занимала директория /var/lib/docker/overlay2/.../merged/home/discourse/.cache.

Может, это глупый вопрос, но что именно содержат директории merge и diff? Можно ли в какой-то момент безопасно удалить одну из них?