«No space left on device» никогда не приходит вовремя. База перестаёт принимать записи, apt не может доделать обновление, а Docker отказывается скачать образ, который нужен прямо сейчас. Хорошая новость: на маленьком VPS виновник почти всегда один из пяти, и найти его можно за пару минут.
1. Насколько всё плохо?
df -h /
df -i /
Первая команда показывает занятое место, вторая — иноды. Если иноды на 100%, а места вроде хватает, значит, у вас миллионы мелких файлов: сессии, почтовая очередь, каталог кэша. Проблема другая, симптом тот же.
2. Ищем, что занимает место
Проходим от корня и сортируем по размеру:
du -xh / --max-depth=1 2>/dev/null | sort -h | tail -15
Флаг -x не даёт уйти на другие файловые системы вроде /proc. Дальше спускайтесь в самый большой каталог. Для интерактивного просмотра удобнее ncdu:
apt install -y ncdu
ncdu -x /
Навигация стрелками, d — удалить. С последним аккуратнее.
3. Быстрые победы
Это безопасно на любом сервере с Ubuntu или Debian:
apt clean
apt autoremove --purge -y
journalctl --disk-usage
journalctl --vacuum-size=200M
apt autoremove заодно убирает старые ядра. Журнал systemd удивляет чаще всего: без ограничений он дорастает до нескольких гигабайт. Чтобы ограничить его навсегда, пропишите SystemMaxUse=200M в /etc/systemd/journald.conf и выполните systemctl restart systemd-journald.
4. Остатки Docker
Если у вас Docker, смотрите сюда в первую очередь. Старые образы и кэш сборки копятся с каждым деплоем:
docker system df
docker image prune -a
docker builder prune
docker image prune -a удаляет образы, которые не использует ни один запущенный контейнер. Обычно это и нужно, просто при следующем деплое их придётся скачать заново.
Опасная команда — docker system prune -a --volumes. В томах лежат ваши данные, а том остановленного контейнера считается неиспользуемым. Так теряют базы данных. Не копируйте её из ответа на форуме.
Второй скрытый пожиратель места — логи контейнеров. Ограничьте их в /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}
После этого перезапустите Docker. Лимит действует только на контейнеры, созданные после изменения, поэтому пересоздайте самые болтливые через docker compose up -d --force-recreate.
5. Логи и забытые файлы
Ищем большие файлы по всему диску:
find / -xdev -type f -size +500M -exec ls -lh {} + 2>/dev/null
find /var/log -type f -size +100M -exec ls -lh {} + 2>/dev/null
Типичные находки: backup.tar.gz полугодовой давности в /root, дамп базы, который кто-то собирался скачать, лог приложения без ротации.
Лог, в который сервис всё ещё пишет, не удаляйте через rm — обнулите его:
truncate -s 0 /var/log/myapp/app.log
Если файл уже удалён, а место не вернулось, его держит открытым какой-то процесс:
lsof +L1
Перезапустите сервис из списка, и место освободится.
Если чистки мало
Иногда данные просто настоящие: растущая база, загрузки пользователей, файл модели. Тогда честное решение — больше диска. Смена тарифа увеличивает диск на месте и сохраняет всё: у Nano 15 ГБ, у Micro 25 ГБ, у Small 35 ГБ, у Medium 45 ГБ. Сервер перезагрузится один раз. Подробности — в документации по тарифам.
Ещё одна вещь тихо занимает место — swap-файл. Если вы делали всё по нашей инструкции по swap, эти 1–2 ГБ заняты осознанно. А если главный потребитель — Docker, то установка Docker и развёртывание Compose-стека показывают, как держать образы под контролем.
Привычка, которая избавляет от всего этого: ограничьте журнал и логи Docker в первый же день. Две строки конфигурации — и «диск переполнен» почти перестаёт случаться.
Комментарии
Пока нет комментариев. Будьте первым.