Все команды ниже выполняйте на машине, диск которой очищаете. Если терминал открыт на Mac, его Docker-кэш не имеет отношения к свободному месту VPS. Для сервера сначала подключитесь по SSH. Очистку выполняйте после завершения операций; текущий и предыдущий релизы сохраняйте. Автоматической очистки старых релизов пока нет.
1. Посмотрите расход диска
df -h /
docker system df
docker buildx du
Первая команда показывает свободное место на файловой системе, вторая — образы, контейнеры и Docker-кэш, третья — записи кэша текущего builder. Общие слои используются несколькими образами или кэшем. Удаление одного тега может освободить только несколько килобайт, даже если рядом указан размер в сотни мегабайт.
2. Очистите старый кэш сборки
Кэш ускоряет build и не содержит рабочих данных приложения. Сначала удалите записи, которые не использовались последние сутки:
docker buildx prune --filter 'until=24h'
Docker покажет запрос подтверждения. Подтвердите y. Контейнеры, готовые образы, БД и медиа сохраняются; будущая сборка может занять больше времени. Команда действует на выбранный builder. Чтобы удалить одну запись, возьмите ее ID из docker buildx du:
docker buildx prune --filter 'id=ID_ЗАПИСИ'
Если нужно удалить весь доступный кэш этого builder:
docker buildx prune
Не ожидайте освобождения суммы всех показанных размеров: общие слои нужных образов остаются. В Docker Desktop освобождение места внутри виртуального диска может отобразиться на Mac не сразу.
3. Сохраните нужные релизы перед удалением образов
Ниже пример путей. Замените example_project и production значениями своего профиля; runtime root указан в Deployment → Runtime directory.
jq '{id, backend, admin, ops, services, imageArchive}' \
/srv/admingen/example_project/production/state/current.json \
/srv/admingen/example_project/production/state/previous.json
docker image ls
docker ps -a
Если previous.json еще нет, это первый релиз: просмотрите только current.json. Сохраните точные backend/admin/ops текущего и предыдущего релиза, используемые сервисные образы, а также образы других окружений и незавершенных операций. Для старого ненужного образа укажите конкретный тег из docker image ls:
docker image rm ПОЛНОЕ_ИМЯ_СТАРОГО_ОБРАЗА:ТЕГ
Не добавляйте --force. Не используйте docker image prune -a или docker system prune -a как обычную очистку: они могут удалить сохраненную версию для отката, потому что сейчас она не используется контейнером.
4. Посмотрите архивы образов
Source/Archive оставляют файл рядом с release JSON в checkout и копию в runtime/image-archives. Docker prune эти обычные файлы не удаляет. На примере checkout /home/deploy/projects/example-project:
find /home/deploy/projects/example-project \
-maxdepth 1 -type f -name '*.images.tar' -exec du -h {} \;
du -ah /srv/admingen/example_project/production/image-archives/ | sort -h
В current.json/previous.json поле imageArchive.file дает имя архива в checkout; imageArchive.sha256 — имя runtime-копии, к которому добавляется .tar. Например, source-...images.tar и <sha256>.tar могут содержать один релиз. Оба архива нужны не всегда, но для простой политики сохраните обе копии текущего и предыдущего релиза.
Удаляйте только конкретные старые файлы, не весь каталог:
rm -i /home/deploy/projects/example-project/ИМЯ_СТАРОГО_РЕЛИЗА.images.tar
rm -i /srv/admingen/example_project/production/image-archives/SHA256_СТАРОГО_РЕЛИЗА.tar
-i спрашивает подтверждение каждого удаления. После удаления архива вы теряете эту локальную копию старой версии. Архивы не являются дампом БД и не содержат загруженные пользователями изображения.
5. Что еще занимает диск
На VPS:
sudo du -xhd1 / 2>/dev/null | sort -h
sudo du -xhd1 /var /root /home /srv /usr 2>/dev/null | sort -h
sudo du -xhd1 /var/lib 2>/dev/null | sort -h
sudo find / -xdev -type f -size +200M -exec du -h {} + 2>/dev/null | sort -h
journalctl --disk-usage
du показывает размеры каталогов; -x не обходит другие файловые системы. find перечисляет крупные файлы. Если большая папка найдена, раскройте ее следующей командой du -xhd1.
При большом системном журнале можно удалить записи старше недели:
sudo journalctl --vacuum-time=7d
Старые системные журналы будут удалены. Это не очищает логи Docker-контейнеров. Если место занято удаленными файлами, которые еще открыты процессами, и lsof установлен:
sudo lsof +L1
Не завершайте процессы наугад. Данные PostgreSQL, медиа, backup и swap — не Docker-кэш. /var/lib/docker и /var/lib/containerd вручную не чистите: управляйте ими через Docker. Рабочие каталоги data, secrets, pki, state не удаляйте ради свободного места.
6. Проверьте результат
df -h /
docker system df
Для сохранения данных используйте backup; для состава Docker-образов — объяснение backend/admin/ops.