EQVPS
ТаблоЗапочни

Как да инсталирате MySQL на VPS: потребители, сигурен отдалечен достъп, по-малко RAM и бекъпи

Инсталирайте MySQL 8.0 на VPS с Ubuntu 24.04, създайте база и потребител за приложението, достигнете я от своя компютър, без да отваряте порт 3306, намалете паметта в покой от 383 MB на 165 MB и правете бекъп всяка нощ със скрипт, който се проваля шумно.

Инсталирането на MySQL е една команда. Повечето работа идва после: потребител за приложението, начин да стигнете до базата от своя компютър, без да изкарвате порт 3306 в интернет, настройки на паметта за малък сървър и бекъпи, които вървят без вас. Това ръководство покрива и четирите на Ubuntu 24.04. Всяка стъпка е изпълнена на нашия образ с Ubuntu 24.04, а числата по-долу са от същия сървър.

Изпълнявайте командите като потребител със sudo. Ръководството за настройка на Ubuntu създава такъв.

1. Инсталирайте

sudo apt update
sudo apt install -y mysql-server
mysql --version

На нашия сървър инсталацията отне 51 секунди и даде MySQL 8.0.46. Тя стартира веднага, стартира отново при всяко зареждане и слуша само на самия сървър: 127.0.0.1:3306 за обикновените връзки и 127.0.0.1:33060 за по-новия X протокол на MySQL. Отвън още нищо не е достъпно.

2. Създайте база и потребител

Акаунтът root в MySQL използва в Ubuntu удостоверяване през сокет, затова sudo mysql ви вкарва без парола. Създайте база и потребител за приложението:

sudo mysql
CREATE DATABASE app CHARACTER SET utf8mb4;
CREATE USER 'app'@'localhost' IDENTIFIED BY 'a-long-random-password';
GRANT ALL PRIVILEGES ON app.* TO 'app'@'localhost';
EXIT;

Проверете така, както ще се свързва приложението:

mysql -u app -p app -e "SELECT CURRENT_USER();"

Трябва да изведе app@localhost. Грешна парола получава ERROR 1045 (28000): Access denied for user 'app'@'localhost'. Потребителят може всичко в app и нищо извън нея.

3. Свързване от своя компютър: SSH тунел

За да ползвате десктоп клиент като DBeaver, MySQL Workbench или командния ред mysql на машината си, не отваряйте порт. Пренасочете един през SSH:

ssh -L 3307:127.0.0.1:3306 deploy@YOUR.SERVER.IP

При план с NAT добавете -p и личния SSH порт от панела. Докато този прозорец е отворен, насочете клиента към хост 127.0.0.1, порт 3307, потребител app. От локалната страна взехме 3307, за да не се сблъска с MySQL, който може да работи на компютъра ви. В нашия тест сървърът веднага отговори през тунела, а директна връзка към адреса му на 3306 беше отказана.

4. Директен достъп за един друг сървър

Понякога приложението работи на втори сървър и трябва да се свързва директно. Тогава базата има нужда от план със собствен IPv4, защото планът с NAT пренасочва само вашия SSH порт. Три промени, всички ограничени до адреса на сървъра на приложението (тук 203.0.113.20):

sudo sed -i 's/^bind-address.*/bind-address = 0.0.0.0/' /etc/mysql/mysql.conf.d/mysqld.cnf
sudo systemctl restart mysql
sudo ufw allow from 203.0.113.20 to any port 3306 proto tcp
CREATE USER 'app'@'203.0.113.20' IDENTIFIED BY 'a-long-random-password';
GRANT ALL PRIVILEGES ON app.* TO 'app'@'203.0.113.20';

Ако ufw още не е включен, първо разрешете SSH (sudo ufw allow OpenSSH), а после изпълнете sudo ufw enable. Подробностите са в ръководството за ufw.

Проверихме двете ключалки поотделно. С правило в защитната стена, но без съответен потребител в MySQL, сървърът отказа с error 1130: Host '…' is not allowed to connect to this MySQL server. След добавяне на потребителя връзката мина. Без правилото в защитната стена връзката просто изтече по време. Всеки друг адрес в интернет получава същото изтичане.

5. По-малко RAM

В покой, без собствени данни, MySQL 8.0 заемаше на нашия сървър 383 MB. Най-много взима Performance Schema, диагностична функция, която резервира памет предварително. На малък VPS я изключете и задайте сами размера на основния кеш:

sudo tee /etc/mysql/mysql.conf.d/zz-small-vps.cnf >/dev/null <<'EOF'
[mysqld]
performance_schema = OFF
innodb_buffer_pool_size = 256M
max_connections = 50
EOF
sudo systemctl restart mysql
ps -o rss= -C mysqld

След рестарта заемаше 165 MB. Buffer pool кешира данните и индексите ви, а 256 MB подхождат на сървър с 2 GB, на който работи и приложението. Увеличете го, ако базата е основното на сървъра и е пораснала над размера на кеша. max_connections = 50 е предостатъчно за едно приложение с пул от връзки. Губите статистиката на performance_schema. Включете я обратно, ако някога ви се наложи да разглеждате подробно бавни заявки.

6. Нощни бекъпи

mysqldump --single-transaction прави съгласувано копие на таблиците InnoDB, без да блокира приложението. Сложете го в малък скрипт:

sudo tee /usr/local/bin/mysql-backup >/dev/null <<'EOF'
#!/bin/bash
set -euo pipefail
umask 077
mkdir -p /var/backups/mysql
mysqldump --single-transaction --routines --triggers app | gzip > /var/backups/mysql/app-$(date +%F).sql.gz
find /var/backups/mysql -name 'app-*.sql.gz' -mtime +14 -delete
EOF
sudo chmod 755 /usr/local/bin/mysql-backup
echo '0 3 * * * root /usr/local/bin/mysql-backup' | sudo tee /etc/cron.d/mysql-backup
sudo /usr/local/bin/mysql-backup && sudo ls -l /var/backups/mysql

Всеки ред има причина:

  • umask 077 прави дъмпа четим само за root (-rw-------), защото в него са всичките ви данни.
  • pipefail кара целия скрипт да се провали, ако се провали mysqldump. Без него gzip щеше да запише мъничък празен архив и да докладва успех. Нарочно счупихме командата и скриптът завърши с код 2, както трябва.
  • find … -mtime +14 -delete пази копия за две седмици.
  • Скриптът работи като root, затова mysqldump влиза през сокета и никъде не стои парола във файл.

Бекъп, който никога не сте възстановявали, още не се брои. Възстановете го във временна база и погледнете данните:

sudo mysql -e "CREATE DATABASE app_restore"
gunzip -c /var/backups/mysql/app-2026-10-25.sql.gz | sudo mysql app_restore
sudo mysql -e "SHOW TABLES FROM app_restore"
sudo mysql -e "DROP DATABASE app_restore"

В нашия тест възстановената таблица имаше същите редове като оригинала. Копията на същия диск не ви пазят, ако изгубите сървъра, затова от време на време ги прехвърляйте на друга машина със scp или restic. Managed Backups добавя отгоре ежедневни точки за възстановяване на целия сървър.

Кой план

Micro (2 vCPU, 2 GB, 25 GB, $5/мес.) носи MySQL с тази настройка плюс уеб приложение. Ако самата база порасне над няколко гигабайта, Small с 4 GB и 35 GB за $8/мес. ви позволява да дадете на buffer pool 1 GB и повече. И двата са планове с NAT, а SSH тунелът от стъпка 3 работи на тях. За стъпка 4 трябва собствен IPv4: Micro-IP струва $10/мес.

Предпочитате PostgreSQL? Ръководството за PostgreSQL следва същия план. Всички планове са в раздела VPS, а плащането е в USDT, USDC или ETH в мрежите Base, Ethereum или Polygon.

Въпроси

MySQL или MariaDB?

И двете са в собствените хранилища на Ubuntu 24.04: mysql-server инсталира MySQL 8.0, а mariadb-server инсталира MariaDB 10.11. Повечето приложения, които искат „MySQL“, работят и с двете. Ползвайте каквото пише в документацията на приложението, а ако му е все едно — MySQL 8.0. Това ръководство използва MySQL.

Каква е паролата на root в MySQL?

Няма такава. В Ubuntu акаунтът root в MySQL използва удостоверяване през сокет: sudo mysql ви вкарва като root, а по мрежата никой не може да влезе като root. Оставете го така и създавайте отделни потребители за приложенията си.

Да отворя ли порт 3306 към интернет?

Не. Отворените портове на бази данни постоянно се сканират и обстрелват с опити за пароли. От своя компютър се свързвайте през SSH тунел. Ако друг сървър трябва да се свързва директно, разрешете само неговия IP, и в MySQL, и в защитната стена.

Колко RAM ѝ трябва на MySQL?

Веднага след инсталацията MySQL 8.0 заемаше на тестовия ни сървър 383 MB без собствени бази. С изключен Performance Schema и скромен buffer pool слезе до 165 MB. Планът Micro с 2 GB спокойно движи MySQL и приложение; след тази настройка 1 GB стига за малък сайт.

Трябва ли да пускам mysql_secure_installation?

В Ubuntu 24.04 повечето от работата му вече е свършена. Новата ни инсталация нямаше анонимни потребители и тестова база, а root може да влиза само през локалния сокет. Пуснете го, ако искате компонента за проверка на силата на паролите, който предлага; иначе можете да го пропуснете.

Коментари

Още няма коментари. Бъди първият.

Остави коментар

Коментарите се модерират преди да се появят.