MySQL / MariaDB: установка и настройка
В этой статье вы поставите MariaDB — современный стандартный «MySQL» для Linux — на VPS mHost, пройдёте базовую защиту через mysql_secure_installation, создадите базу данных с отдельным пользователем и правами, настроите bind-address для локального или удалённого доступа и подключитесь к серверу клиентом mysql.
Что понадобится
- VPS mHost на Ubuntu 22.04/24.04, Debian 11/12 или AlmaLinux/Rocky Linux 8/9.
- Доступ по SSH под root или пользователем с sudo.
Шаг 1. Установите MariaDB
Ubuntu / Debian
apt update
apt install mariadb-serverAlmaLinux / Rocky Linux
dnf install mariadb-serverПакет mariadb-server есть в штатном репозитории обоих семейств дистрибутивов (AppStream — на AlmaLinux/Rocky), подключать сторонние репозитории не нужно. Вместе с сервером ставится и клиент — команда mysql.
Проверьте, что всё установилось:
mysql --versionШаг 2. Включите автозапуск и запустите MariaDB
systemctl enable --now mariadb
systemctl status mariadbФлаг enable --now одновременно добавляет MariaDB в автозагрузку и запускает её сразу. В статусе должно быть active (running).
Шаг 3. Защитите установку: mysql_secure_installation
Свежая установка MariaDB не защищена — есть анонимные пользователи, тестовая база и root без ограничений на удалённый вход. Скрипт mysql_secure_installation устраняет всё это за один проход:
mysql_secure_installationСкрипт задаст несколько вопросов подряд:
- Enter current password for root — у свежей установки пароля ещё нет, просто нажмите Enter.
- Switch to unix_socket authentication (формулировка отличается между версиями, а на Ubuntu/Debian вопрос может не появиться вовсе — там этот способ входа уже включён по умолчанию) — соглашайтесь (
Y): это вход под root без пароля, но только с самого сервера от системного пользователя root, и он безопаснее пароля. - Change the root password — если оставляете unix_socket, отдельный пароль root не обязателен, можно ответить
n; если нужен пароль в дополнение к сокету —Yи задайте надёжный. - Remove anonymous users —
Y. - Disallow root login remotely —
Y: root не должен логиниться по сети вообще. - Remove test database and access to it —
Y. - Reload privilege tables now —
Y.
Шаг 4. Создайте базу данных, пользователя и права
Подключитесь к консоли MariaDB под root:
mysqlВнутри консоли (приглашение MariaDB [(none)]>) выполните три команды подряд — замените app_db, app_user и особенно STRONG_PASSWORD_HERE на свои значения:
CREATE DATABASE app_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'STRONG_PASSWORD_HERE';
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'localhost';CREATE DATABASE— кодировкаutf8mb4корректно хранит любые символы, включая эмодзи и большинство языков;utf8(безmb4) в MySQL/MariaDB — устаревший 3-байтовый вариант, для новых проектов не используется.CREATE USER— часть@'localhost'ограничивает пользователя подключениями с этого же сервера (через unix-сокет или127.0.0.1). Для удалённого доступа понадобится отдельная запись — см. шаг 5.GRANT— права выданы только на базуapp_db, а не на все базы сервера (*.*). Для рядового приложения этого достаточно;rootдля подключения из приложения использовать не стоит.
Проверьте, что права выданы верно:
SHOW GRANTS FOR 'app_user'@'localhost';Выйдите из консоли:
EXIT;Шаг 5. bind-address: локальный или удалённый доступ
bind-address определяет, на каком сетевом интерфейсе MariaDB принимает TCP-подключения. Проверить текущее значение можно прямо из клиента:
mysql -e "SHOW VARIABLES LIKE 'bind_address';"или на уровне ОС:
ss -tlnp | grep 3306Только локальный доступ (по умолчанию, рекомендуется)
Если база нужна только приложению на этом же VPS (PHP, Django, FastAPI, Node.js — неважно, все они соединяются через localhost), открывать порт 3306 наружу не нужно вообще — это самый безопасный вариант.
На Ubuntu/Debian это значение уже стоит по умолчанию в конфиге пакета:
# /etc/mysql/mariadb.conf.d/50-server.cnf — [mysqld]
bind-address = 127.0.0.1# /etc/my.cnf.d/mariadb-server.cnf — [mysqld]
bind-address = 127.0.0.1После изменения файла перезапустите MariaDB — именно перезапустите, а не reload: bind-address применяется только при старте сервиса:
systemctl restart mariadbУдалённый доступ
Если к базе нужно подключаться снаружи — с другого сервера или со своего компьютера, — смените bind-address на публичный IP-адрес VPS или на 0.0.0.0 (слушать все интерфейсы):
bind-address = 0.0.0.0и перезапустите MariaDB так же, как выше.
Затем добавьте отдельного пользователя для подключения именно с этого внешнего адреса — запись с @'localhost' из шага 4 для удалённых подключений не подойдёт:
CREATE USER 'app_user'@'203.0.113.10' IDENTIFIED BY 'STRONG_PASSWORD_HERE';
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'203.0.113.10';Замените 203.0.113.10 на реальный IP-адрес, с которого будете подключаться. Вместо '%' (разрешить с любого IP) старайтесь указывать конкретный адрес или подсеть — так пароль остаётся не единственной линией защиты.
Ubuntu / Debian (ufw)
ufw allow from 203.0.113.10 to any port 3306 proto tcpAlmaLinux / Rocky (firewalld)
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10" port protocol="tcp" port="3306" accept'
firewall-cmd --reloadШаг 6. Подключитесь клиентом
Локально, на самом VPS
Под root вход идёт без пароля, через unix-сокет (см. шаг 3):
mysqlПод пользователем приложения — с паролем:
mysql -u app_user -p app_dbКлиент запросит пароль (STRONG_PASSWORD_HERE из шага 4) и откроет приглашение MariaDB [app_db]>.
Удалённо, с другого компьютера
Установите клиент на машине, откуда будете подключаться:
- Ubuntu/Debian:
apt install mariadb-client - AlmaLinux/Rocky/Fedora:
dnf install mariadb - macOS (Homebrew):
brew install mariadb
Подключитесь, указав IP сервера:
mysql -h SERVER_IP -u app_user -p app_dbТот же протокол понимают и GUI-клиенты — DBeaver, TablePlus, HeidiSQL, MySQL Workbench: в них указывается тот же хост, порт 3306, имя пользователя и пароль.
SHOW DATABASES;app_db должна быть в списке.
Что дальше
Данные в базе рано или поздно нужно будет восстанавливать — не откладывайте настройку регулярного резервного копирования, см. «Резервное копирование баз данных». Если ещё не ограничили доступ к серверу файрволом, вернитесь к статье «Настройка файрвола UFW» — без него открытый порт 3306 (да и вообще любой сервис) остаётся уязвимым для сканирований и перебора.