sudo apt update && sudo apt upgrade -y работает ровно до первого пакета, который задаёт вопрос, требует перезапуска важного сервиса или конфликтует с локальной конфигурацией. На рабочем сервере полезнее потратить несколько минут на проверки и понимать, что именно изменится.
Эта инструкция — для обычных обновлений пакетов внутри текущего выпуска Debian или Ubuntu. Переход, например, с Debian 12 на 13 или с Ubuntu 24.04 LTS на следующий выпуск выполняется только по release notes выбранного дистрибутива.
До обновления: обеспечьте путь назад
Проверьте три вещи:
- есть свежая резервная копия данных и конфигурации;
- копия восстанавливалась хотя бы на тестовом стенде;
- доступна консоль провайдера, IPMI или другой вход, не зависящий от SSH.
Snapshot виртуальной машины удобен для быстрого отката, но не заменяет отдельную копию. Ошибка хранилища или удаление VPS может забрать snapshot вместе с сервером.
Если сервер удалённый, не закрывайте рабочую SSH-сессию до завершения проверок. Для долгой операции используйте tmux или screen, чтобы обрыв вашего интернета не оставил процесс без наблюдения.
1. Запишите исходное состояние
Посмотрите версию системы, место на дисках и сломанные сервисы:
cat /etc/os-release
uname -a
df -h
df -ih
systemctl --failed
sudo dpkg --audit
df -h показывает свободное место, а df -ih — свободные inode. Сервер может перестать создавать файлы при заполнении любого из этих ресурсов.
Сохраните список слушающих портов и активных контейнеров, если они есть:
sudo ss -lntup
docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}'
После обновления эти два вывода удобно сравнить с ожидаемым состоянием. Пароли и токены в такой журнал не копируйте.
Проверьте удержанные пакеты:
apt-mark showhold
Hold часто ставят осознанно для базы, ядра или стороннего агента. Не снимайте его автоматически: сначала выясните, кто и зачем закрепил версию.
2. Обновите индекс и изучите предложение APT
sudo apt update
apt list --upgradable
Ошибки apt update нельзя игнорировать. Просроченный ключ стороннего репозитория или недоступное зеркало означает, что часть системы останется на старых пакетах.
Смоделируйте обычное обновление без записи:
sudo apt-get --simulate upgrade
В выводе проверьте:
- нет ли неожиданного удаления пакетов;
- обновляются ли ядро, OpenSSH, Docker, база данных и firewall;
- не удерживается ли критичный пакет;
- нет ли пакетов из неизвестного стороннего репозитория.
Для автоматических сценариев используйте apt-get: его интерфейс рассчитан на стабильное использование в скриптах. Команда apt удобнее человеку в интерактивной сессии и показывает более читаемый прогресс.
3. Выполните обычное обновление
sudo apt upgrade
Не добавляйте -y в первый проход на незнакомом сервере. Прочитайте итоговый список и вопросы о конфигурационных файлах.
Если пакет предлагает заменить изменённый файл из /etc, не выбирайте вариант наугад. Обычно доступны текущий локальный файл, версия сопровождающего и просмотр различий. Сохранение старого конфига безопаснее только временно: новые параметры пакета всё равно может потребоваться перенести вручную.
apt upgrade старается не удалять установленные пакеты. Если часть обновлений удержана из-за изменения зависимостей, сначала посмотрите симуляцию полного разрешения:
sudo apt-get --simulate full-upgrade
full-upgrade может удалять пакеты. Выполняйте его только после проверки списка:
sudo apt full-upgrade
Для обычного набора security-обновлений он нужен не всегда.
4. Разберитесь с перезапусками
Обновлённая библиотека на диске не меняет уже работающий процесс. Пакетный менеджер может перезапустить часть сервисов автоматически или предложить выбор.
После завершения снова проверьте ошибки:
systemctl --failed
sudo journalctl -p err -b --no-pager
На Ubuntu и системах с соответствующим механизмом файл /var/run/reboot-required сообщает о рекомендуемой перезагрузке:
if [ -f /var/run/reboot-required ]; then
cat /var/run/reboot-required
cat /var/run/reboot-required.pkgs 2>/dev/null || true
fi
Даже если файла нет, обновление ядра, libc, systemd или низкоуровневых компонентов стоит проводить в запланированное окно. Сравните запущенное ядро с установленными пакетами:
uname -r
dpkg -l 'linux-image*' | grep '^ii'
Перед reboot убедитесь, что сервер загрузится самостоятельно: файловые системы описаны корректно, секреты для зашифрованных дисков доступны, а сетевые настройки не требуют ручной команды.
5. Проверка после перезагрузки
uptime
uname -r
systemctl --failed
sudo ss -lntup
sudo journalctl -p err -b --no-pager
Дальше проверяйте сервисы не по наличию процесса, а по пользовательскому маршруту:
- сайт открывается по HTTPS;
- вход и запись в базу работают;
- очередь выполняет задачу;
- отправляется тестовое письмо;
- резервное копирование видит нужные volumes и каталоги;
- мониторинг получает свежие данные.
Для Compose-проектов:
docker compose ps
docker compose logs --since=15m --tail=100
Команду запускайте в каталоге каждого проекта. Не делайте вывод «всё работает» только по одному глобальному docker ps: контейнер может быть Up, а приложение внутри отвечать ошибкой.
6. Очистка — только после проверки
Сначала смоделируйте удаление ненужных зависимостей:
sudo apt-get --simulate autoremove
Особенно внимательно смотрите на старые ядра, драйверы, библиотеки панелей управления и пакеты стороннего ПО. Если список понятен:
sudo apt autoremove
Не очищайте все старые ядра до первой успешной загрузки нового. Рабочее предыдущее ядро — полезный вариант в меню загрузчика, если свежая версия не увидит сеть или диск.
Короткий чек-лист
[ ] Проверена отдельная резервная копия
[ ] Есть аварийная консоль кроме SSH
[ ] Достаточно места и inode
[ ] dpkg --audit не показывает незавершённых состояний
[ ] Изучены hold и список обновлений
[ ] Просмотрена симуляция upgrade/full-upgrade
[ ] После обновления нет failed units
[ ] Выполнена контролируемая перезагрузка, если нужна
[ ] Проверены HTTPS, база, очередь, почта и мониторинг
[ ] Autoremove выполнен только после симуляции
Официальные источники