EQVPS
Tableau de bordCommencer

Installer MySQL sur un VPS : utilisateurs, accès distant sûr, moins de RAM et sauvegardes

Installer MySQL 8.0 sur un VPS Ubuntu 24.04, créer une base et un utilisateur pour l'application, y accéder depuis votre ordinateur sans ouvrir le port 3306, faire passer sa mémoire au repos de 383 Mo à 165 Mo et le sauvegarder chaque nuit avec un script qui échoue bruyamment.

Installer MySQL tient en une commande. L'essentiel du travail vient après : un utilisateur pour l'application, un moyen d'atteindre la base depuis votre ordinateur sans exposer le port 3306 à Internet, des réglages mémoire pour un petit serveur et des sauvegardes qui tournent sans vous. Ce guide couvre les quatre sous Ubuntu 24.04. Chaque étape a été exécutée sur notre image Ubuntu 24.04, et les chiffres ci-dessous viennent de ce serveur.

Lancez les commandes avec un utilisateur qui a sudo. Le guide de configuration d'Ubuntu en crée un.

1. Installer

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

L'installation a pris 51 secondes sur notre serveur et nous a donné MySQL 8.0.46. Il démarre tout de suite, redémarre à chaque boot et n'écoute que sur le serveur lui-même : 127.0.0.1:3306 pour les connexions normales et 127.0.0.1:33060 pour le protocole X, plus récent. Rien n'est encore joignable de l'extérieur.

2. Créer une base et un utilisateur

Le compte root de MySQL utilise sous Ubuntu l'authentification par socket, donc sudo mysql vous connecte sans mot de passe. Créez une base et un utilisateur pour votre application :

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;

Testez-le comme votre application se connectera :

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

Cela doit afficher app@localhost. Un mauvais mot de passe donne ERROR 1045 (28000): Access denied for user 'app'@'localhost'. L'utilisateur peut tout faire dans app et rien en dehors.

3. Se connecter depuis votre ordinateur : tunnel SSH

Pour utiliser un client de bureau comme DBeaver, MySQL Workbench ou la ligne de commande mysql sur votre machine, n'ouvrez pas de port. Redirigez-en un par SSH :

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

Sur une offre NAT, ajoutez -p et le port SSH personnel de votre tableau de bord. Tant que cette fenêtre est ouverte, pointez votre client vers l'hôte 127.0.0.1, port 3307, utilisateur app. Côté local, nous avons pris 3307 pour éviter un conflit avec un MySQL qui tournerait sur votre ordinateur. Dans notre test, le serveur a répondu tout de suite par le tunnel, alors qu'une connexion directe à son adresse sur le 3306 était refusée.

4. Accès direct pour un autre serveur

Parfois, l'application tourne sur un second serveur et doit se connecter directement. Il faut alors à la base une offre avec sa propre IPv4, car une offre NAT ne redirige que votre port SSH. Trois changements, tous limités à l'adresse du serveur d'application (ici 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';

Si ufw n'est pas encore activé, autorisez d'abord SSH (sudo ufw allow OpenSSH) puis lancez sudo ufw enable. Le guide ufw donne les détails.

Nous avons vérifié les deux verrous séparément. Avec la règle de pare-feu mais sans utilisateur MySQL correspondant, le serveur a refusé avec error 1130: Host '…' is not allowed to connect to this MySQL server. Avec l'utilisateur ajouté, la connexion est passée. Sans la règle de pare-feu, la connexion a simplement expiré. Toute autre adresse sur Internet obtient ce même délai d'expiration.

5. Utiliser moins de RAM

Au repos, sans données à lui, MySQL 8.0 utilisait 383 Mo sur notre serveur. L'essentiel vient du Performance Schema, une fonction de diagnostic qui réserve de la mémoire d'avance. Sur un petit VPS, désactivez-le et fixez vous-même la taille du cache principal :

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

Après le redémarrage, il utilisait 165 Mo. Le buffer pool met en cache vos données et index, et 256 Mo conviennent à un serveur de 2 Go qui fait aussi tourner l'application. Augmentez-le si la base est l'élément principal du serveur et a dépassé la taille du cache. max_connections = 50 suffit largement pour une application avec un pool de connexions. Vous perdez les statistiques de performance_schema. Réactivez-le si vous devez un jour analyser des requêtes lentes en détail.

6. Sauvegardes chaque nuit

mysqldump --single-transaction prend une copie cohérente des tables InnoDB sans bloquer l'application. Mettez-le dans un petit script :

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

Chaque ligne a sa raison d'être :

  • umask 077 rend le dump lisible par root seulement (-rw-------), puisqu'il contient toutes vos données.
  • pipefail fait échouer tout le script si mysqldump échoue. Sans cela, gzip écrirait une minuscule archive vide et annoncerait un succès. Nous avons volontairement cassé la commande, et le script s'est terminé avec le code 2, comme prévu.
  • find … -mtime +14 -delete conserve deux semaines de copies.
  • Le script tourne en root, donc mysqldump se connecte par le socket et aucun mot de passe ne traîne dans un fichier.

Une sauvegarde jamais restaurée ne compte pas encore. Restaurez-la dans une base temporaire et regardez les données :

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"

Dans notre test, la table restaurée avait les mêmes lignes que l'originale. Des copies sur le même disque ne vous protègent pas si vous perdez le serveur, alors rapatriez-les de temps en temps sur une autre machine avec scp ou restic. Managed Backups ajoute par-dessus des points de restauration quotidiens de tout le serveur.

Quelle offre

Micro (2 vCPU, 2 Go, 25 Go, $5/mois) accueille MySQL réglé comme ci-dessus plus une application web. Si la base elle-même dépasse quelques gigaoctets, Small avec 4 Go et 35 Go pour $8/mois permet de donner 1 Go ou plus au buffer pool. Ce sont deux offres NAT, et le tunnel SSH de l'étape 3 y fonctionne. L'étape 4 demande votre propre IPv4 : Micro-IP coûte $10/mois.

Vous préférez PostgreSQL ? Le guide PostgreSQL suit le même plan. Toutes les offres sont dans la section VPS, et le paiement se fait en USDT, USDC ou ETH sur Base, Ethereum ou Polygon.

FAQ

MySQL ou MariaDB ?

Les deux sont dans les dépôts d'Ubuntu 24.04 : mysql-server installe MySQL 8.0 et mariadb-server installe MariaDB 10.11. La plupart des applications qui demandent « MySQL » fonctionnent avec l'un ou l'autre. Prenez ce que cite la documentation de votre application, et MySQL 8.0 si cela lui est égal. Ce guide utilise MySQL.

Quel est le mot de passe root de MySQL ?

Il n'y en a pas. Sous Ubuntu, le compte root de MySQL utilise l'authentification par socket : sudo mysql vous connecte en root, et personne ne peut se connecter en root par le réseau. Laissez-le ainsi et créez des utilisateurs distincts pour vos applications.

Faut-il ouvrir le port 3306 sur Internet ?

Non. Les ports de bases de données ouverts sont scannés et visés par des essais de mots de passe en permanence. Connectez-vous depuis votre ordinateur par un tunnel SSH. Si un autre serveur doit se connecter directement, n'autorisez que son IP, dans MySQL et dans le pare-feu.

De combien de RAM MySQL a-t-il besoin ?

Juste après l'installation, MySQL 8.0 utilisait 383 Mo sur notre serveur de test, sans base à lui. En désactivant le Performance Schema et avec un buffer pool modeste, il est descendu à 165 Mo. L'offre Micro de 2 Go fait tourner MySQL et une application sans peine ; après ce réglage, 1 Go suffit pour un petit site.

Faut-il lancer mysql_secure_installation ?

Sous Ubuntu 24.04, l'essentiel de son travail est déjà fait. Notre installation neuve n'avait ni utilisateurs anonymes ni base de test, et root ne peut se connecter que par le socket local. Lancez-le si vous voulez le composant de vérification de la force des mots de passe qu'il propose ; sinon, vous pouvez vous en passer.

Commentaires

Pas encore de commentaires. Soyez le premier.

Laisser un commentaire

Les commentaires sont modérés avant leur publication.