Обновляем Debian 9 до 10 версии (nginx + php + mariadb)

Обновление системы на удалённом сервере похоже на ящик Пандоры, никогда не знаешь, что там внутри, и чем это закончится. Однако риски можно минимизировать и избежать ненужных проблем на удалённом сервере.

Когда я попробовал обновить дебиан на тестовой машине, то меня ждал неприятный сюрприз: отвалилась база данных. Оказалось, что в 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

Я очень люблю использовать виртуальные машины VirtualBox, чтобы запускать проекты в окружении "как на хостинге". Поэтому после обновления системы мне пришлось установить обновлённые драйвера:

apt install virtualbox-guest-additions-iso
mkdir /media/iso
mount /usr/share/virtualbox/VBoxGuestAdditions.iso /media/iso
/media/iso/VBoxLinuxAdditions.run
reboot

P.S.

Прежде, чем выполнять обновление на основном сервере, я тестировал все команды на виртуальной машине. И тут очень пригодились снэпшоты, которые есть в linux-версии VirtualBox. Пришлось несколько раз откатываться на начальное состояние, пока не нашёл правильное решение.

Хорошая статья, мне понравилась. Оставлю отзыв!