Обновление системы на удалённом сервере похоже на ящик Пандоры, никогда не знаешь, что там внутри, и чем это закончится. Однако риски можно минимизировать и избежать ненужных проблем на удалённом сервере.
Когда я попробовал обновить дебиан на тестовой машине, то меня ждал неприятный сюрприз: отвалилась база данных. Оказалось, что в 10 версии дебиана версия mariadb-server стала 10.3 вместо 10.1. Для MariaDB это огромное различие, включая саму структуру базы. Но основная проблема, как я выяснил потом, была в том, что я изменил учётную запись пользователя root для своего удобства работы через PhpMyAdmin. Сейчас мне это вышло боком.
Перед обновлением системы проверьте, можно ли подключиться к базе без пароля. Выполните команду mysql
под root'ом в консоли. Если доступ есть, должно появиться приветствие:
# mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 571045
Server version: 10.1.38-MariaDB-0+deb9u1 Debian 9.8
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
Если доступа нет, появится ошибка:
# mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
Пока ошибка есть, обновляться нельзя. Чтобы её устранить, надо внести изменения в настройки базы данных. Для этого придётся запустить сервер без проверки привилегий пользователей:
service mysql stop
mysqld_safe --skip-grant-tables &
mysql -e "UPDATE mysql.user SET plugin='unix_socket' WHERE user='root'; FLUSH PRIVILEGES;"
kill $(cat /var/run/mysqld/mysqld.pid)
service mysql start
После этого пользователь root сможет подключаться к базе только через консоль. Это значит, что для всех веб-проектов нужно добавить отдельных пользователей. Сделать это можно так же в консоли:
mysql -e "CREATE USER 'test'@'%' IDENTIFIED BY 'test'; GRANT ALL ON *.* TO 'test'@'%';"
Чтобы сделать аналог root'а, который можно было бы использовать из PhpMyAdmin, выполните:
mysql -e "CREATE USER 'dbadmin'@'%' IDENTIFIED BY 'МОЙ_ПАРОЛЬ'; GRANT ALL ON *.* TO 'dbadmin'@'%' WITH GRANT OPTION;"
Не забудьте поменять пользователя в настройках проектов!
Процесс обновления на удалённом сервере очень уязвим к ошибкам сети: пропадёт интернет, завершится сессия ssh, закроются все запущенные процессы. Поэтому рекомендуется использовать утилиту screen:
apt install screen -y
screen -R
ВАЖНО! Устанавливать и запускать screen нужно на УДАЛЁННОМ сервере.
Screen запустит собственную сессию и будет поддерживать её независимо от интернета. Если пропадёт сеть, то восстановить сессию можно командой screen -R
Перед обновлением надо убедиться, что установлены самые последние версии пакетов. Выполните последовательно следующие команды:
apt update
apt upgrade
apt dist-upgrade
Если возникли ошибки, их нужно устранить, иначе дальнейшие шаги бессмысленны.
Дальше останавливаем веб-сервер, чтобы пользователи не видели ошибок подключения к базе, и удаляем пакет базы данных (не забудьте сделать бэкап на всякий пожарный):
service nginx stop
apt remove mariadb-server-10.1
apt autoremove
Удалится только пакет, настройки и сама база останутся на месте.
Обновляем систему:
sed -i 's/stretch/buster/g' /etc/apt/sources.list
sed -i 's/stretch/buster/g' /etc/apt/sources.list.d/*.list
apt update
apt upgrade
apt dist-upgrade
apt autoremove
В процессе будут всплывать разные запросы для подтверждений действий, поэтому лучше далеко не отходить. Само обновление у меня заняло примерно 20 минут.
После обновления устанавливаем пакет базы данных, стартуем nginx и перезагружаем сервер:
apt install mariadb-server -y
service nginx start
reboot
Теперь дебиан должен стать 10-й версии:
# lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 10 (buster)
Release: 10
Codename: buster
# uname -a
Linux anton-pribora.ru 4.19.0-5-amd64 #1 SMP Debian 4.19.37-5+deb10u2 (2019-08-08) x86_64 GNU/Linux
Я очень люблю использовать виртуальные машины VirtualBox, чтобы запускать проекты в окружении "как на хостинге". Поэтому после обновления системы мне пришлось установить обновлённые драйвера:
apt install virtualbox-guest-additions-iso
mkdir /media/iso
mount /usr/share/virtualbox/VBoxGuestAdditions.iso /media/iso
/media/iso/VBoxLinuxAdditions.run
reboot
Прежде, чем выполнять обновление на основном сервере, я тестировал все команды на виртуальной машине. И тут очень пригодились снэпшоты, которые есть в linux-версии VirtualBox. Пришлось несколько раз откатываться на начальное состояние, пока не нашёл правильное решение.