MySQL / MariaDB: установка и настройка
В этой статье вы поставите MariaDB — современный стандартный «MySQL» для Linux — на VPS ForestsNet Cloud, пройдёте базовую защиту через mysql_secure_installation, создадите базу данных с отдельным пользователем и правами, настроите bind-address для локального или удалённого доступа и подключитесь к серверу клиентом mysql.
Что понадобится
- VPS ForestsNet Cloud на Ubuntu 22.04/24.04, Debian 11/12 или AlmaLinux/Rocky Linux 8/9.
- Доступ по SSH под root или пользователем с sudo.
ℹ️ Совет: все команды ниже даны от имени root. Если вы работаете под обычным пользователем, добавляйте sudo перед каждой командой.
ℹ️ Совет: если вам нужен не только MySQL, а сразу веб-сервер и PHP в комплекте, проще взять готовый рецепт LEMP/LAMP в VMmanager 6 (см. «Готовые рецепты VMmanager 6») — он разворачивает весь стек, включая MariaDB, одним запуском. Ниже — установка и настройка именно MariaDB вручную.
Шаг 1. Установите MariaDB
Ubuntu / Debian
apt update
apt install mariadb-serverAlmaLinux / Rocky Linux
dnf install mariadb-serverПакет mariadb-server есть в штатном репозитории обоих семейств дистрибутивов (AppStream — на AlmaLinux/Rocky), подключать сторонние репозитории не нужно. Вместе с сервером ставится и клиент — команда mysql.
Проверьте, что всё установилось:
mysql --versionℹ️ Совет: apt/dnf ставят версию MariaDB из репозитория вашего дистрибутива (обычно от 10.5 до 10.11+ в зависимости от релиза) — для обычного проекта её достаточно. Нужна конкретная свежая версия — у MariaDB есть собственный репозиторий с генератором команд установки под любой дистрибутив, см. mariadb.org/download.
ℹ️ MySQL или MariaDB? Пакет mysql-server в штатных репозиториях Ubuntu, Debian, AlmaLinux и Rocky Linux уже давно заменён на MariaDB — форк MySQL, совместимый с ним по протоколу, SQL, утилитам и порту 3306 (используется тот же клиент mysql). Ниже везде ставится именно MariaDB — это и есть стандартный современный «MySQL» для Linux-серверов. Если вам принципиально нужен «оригинальный» MySQL от Oracle, подключите его официальный репозиторий (см. dev.mysql.com/downloads/repo) — остальные шаги статьи (база, пользователь, bind-address) для него совпадают почти дословно.
Шаг 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ℹ️ Совет: начиная с MariaDB 10.5 у команды появилось «родное» имя mariadb-secure-installation; mysql_secure_installation остаётся рабочим как симлинк для обратной совместимости — можно использовать любое из двух названий, в том числе на MySQL.
Скрипт задаст несколько вопросов подряд:
- 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.
ℹ️ Проверьте: точные формулировки и порядок вопросов немного отличаются между версиями MariaDB/MySQL и дистрибутивами (у Oracle MySQL перед этим списком может добавиться отдельный вопрос про плагин validate_password и уровень сложности пароля) — отвечайте по смыслу, а не ищите точное совпадение текста.
✅ Готово: теперь вход в консоль MariaDB под root с самого сервера — без пароля, через unix_socket: команда mysql (или sudo mysql, если вы работаете под обычным пользователем). Эту консоль используем в следующем шаге.
Шаг 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для подключения из приложения использовать не стоит.
ℹ️ Совет: в современных версиях MySQL/MariaDB FLUSH PRIVILEGES; после GRANT/CREATE USER не требуется — сервер применяет изменения сразу. Команда нужна только после прямого редактирования системных таблиц mysql.* через INSERT/UPDATE. Во многих старых туториалах её всё ещё пишут по инерции — это не ошибка, просто лишний шаг.
Проверьте, что права выданы верно:
SHOW GRANTS FOR 'app_user'@'localhost';Выйдите из консоли:
EXIT;⚠️ Важно: не выдавайте приложениям GRANT ALL PRIVILEGES ON *.* и не используйте root как пользователя приложения. Права должны ограничиваться конкретной базой (как в примере выше) — так утечка пароля от одного приложения не затронет остальные базы на сервере.
Шаг 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ℹ️ Проверьте: сама MariaDB «из коробки» слушает все интерфейсы — ограничение до 127.0.0.1 добавляет именно пакет Ubuntu/Debian через этот файл. Пакет AlmaLinux/Rocky такого ограничения по умолчанию может не задавать — обязательно сверьтесь командой из начала шага, и если нужен строго локальный доступ, пропишите строку явно:
# /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) старайтесь указывать конкретный адрес или подсеть — так пароль остаётся не единственной линией защиты.
⚠️ Важно: порт 3306, открытый в интернет, — частая цель перебора паролей. Если ufw на сервере ещё не настроен, сначала пройдите статью «Настройка файрвола UFW» — она ставит ufw, разрешает SSH и включает файрвол. Затем откройте 3306 не «отовсюду», а только с конкретного адреса:
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ℹ️ Совет: если источник подключений заранее неизвестен или их много, рассмотрите туннель через SSH (ssh -L 3306:localhost:3306 user@SERVER_IP) или VPN вместо открытия 3306 в публичный интернет — тогда bind-address вообще можно оставить на 127.0.0.1.
Шаг 6. Подключитесь клиентом
Локально, на самом VPS
Под root вход идёт без пароля, через unix-сокет (см. шаг 3):
mysqlПод пользователем приложения — с паролем:
mysql -u app_user -p app_dbКлиент запросит пароль (STRONG_PASSWORD_HERE из шага 4) и откроет приглашение MariaDB [app_db]>.
ℹ️ Совет: если явно указать -h 127.0.0.1 вместо того, чтобы оставить хост пустым, клиент подключится по TCP, а не через unix-сокет — и сервер будет матчить это подключение как хост 127.0.0.1, а не localhost. Для пользователя из шага 4 (@'localhost') это не сработает. На практике проще оставить хост пустым: клиент mysql по умолчанию использует сокет для localhost.
Удалённо, с другого компьютера
Установите клиент на машине, откуда будете подключаться:
- 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, имя пользователя и пароль.
✅ Готово: после ввода пароля вы должны увидеть приглашение MariaDB [app_db]>. Проверьте, что база на месте:
SHOW DATABASES;app_db должна быть в списке.
Что дальше
Данные в базе рано или поздно нужно будет восстанавливать — не откладывайте настройку регулярного резервного копирования, см. «Резервное копирование баз данных». Если ещё не ограничили доступ к серверу файрволом, вернитесь к статье «Настройка файрвола UFW» — без него открытый порт 3306 (да и вообще любой сервис) остаётся уязвимым для сканирований и перебора.