Connecteur MySQL / MariaDB 🐬

Sauvegarde une base MySQL ou MariaDB via mysqldump (avec cohérence transactionnelle) et la restaure via le client mysql. Chiffrement côté bridge.

  • Image : ilygo/bridge-mysql:8
  • Sous-commande : ilygo-bridge mysql
  • Outils embarqués : mysqldump, mysql (client MariaDB, compatible MySQL 5.7/8.x et MariaDB 10.x)

Variables d'environnement

En plus des variables communes :

Variable Obligatoire Description
MYSQL_HOST oui Hôte MySQL/MariaDB
MYSQL_PORT non Port (défaut 3306)
MYSQL_USER oui Utilisateur
MYSQL_PASSWORD non Mot de passe (passé via MYSQL_PWD, jamais en argument visible)
MYSQL_DB oui Nom de la base à sauvegarder

Prérequis côté base

Créez un utilisateur de backup avec les privilèges minimaux :

CREATE USER 'ilygo_backup'@'%' IDENTIFIED BY 'un-mot-de-passe-fort';
GRANT SELECT, SHOW VIEW, TRIGGER, LOCK TABLES, EVENT, PROCESS ON appdb.* TO 'ilygo_backup'@'%';
-- Pour la restauration (side_by_side / in_place) :
GRANT CREATE, DROP, INSERT, ALTER, REFERENCES, INDEX ON *.* TO 'ilygo_backup'@'%';
FLUSH PRIVILEGES;

PROCESS est requis pour --single-transaction sur certaines versions. EVENT/TRIGGER pour sauvegarder events et triggers.

Déploiement (docker-compose)

services:
  app-db:
    image: mariadb:11
    networks: [app-net]

  ilygo-bridge:
    image: ilygo/bridge-mysql:8
    restart: unless-stopped
    networks: [app-net, default]
    environment:
      ILYGO_ENDPOINT: https://backup.example/api/v1
      ILYGO_API_KEY: ik_xxx
      ILYGO_PASSPHRASE: ${ILYGO_PASSPHRASE}
      ILYGO_RESTORE_SECRET: 3f87d2022d95...
      ILYGO_LABEL: prod-mysql
      MYSQL_HOST: app-db
      MYSQL_PORT: "3306"
      MYSQL_USER: ilygo_backup
      MYSQL_PASSWORD: ${MYSQL_BACKUP_PW}
      MYSQL_DB: appdb

networks:
  app-net:
    internal: true

Mécanisme de backup

mysqldump --host=$MYSQL_HOST --port=$MYSQL_PORT --user=$MYSQL_USER \
  --single-transaction --routines --triggers --events \
  --default-character-set=utf8mb4 $MYSQL_DB
  • --single-transaction : snapshot cohérent sur les tables InnoDB, sans verrou bloquant.
  • --routines --triggers --events : inclut procédures stockées, triggers, et events.
  • Le mot de passe transite par MYSQL_PWD (jamais visible dans la liste des processus).
  • Sortie streamée → chunks chiffrés.

Mécanisme de restauration

Avec un RAT, le bridge déchiffre/décompresse le dump SQL, puis :

side_by_side (recommandé) :

CREATE DATABASE IF NOT EXISTS `appdb_restored` CHARACTER SET utf8mb4;
mysql --host=... --user=... appdb_restored < dump.sql

in_place (destructif, exige confirm_destructive) : le dump est rejoué directement dans MYSQL_DB. Le dump contient les DROP TABLE IF EXISTS / CREATE TABLE qui écrasent les tables existantes.

Réseau & sécurité

  • Aucun port exposé par le bridge ; base sur réseau internal: true.
  • Le mot de passe n'apparaît jamais en clair dans ps (transmis via MYSQL_PWD).
  • En prod : read_only: true + tmpfs: /tmp + cap_drop: [ALL].

Dépannage

Symptôme Cause Solution
Access denied for user privilèges insuffisants Appliquez les GRANT ci-dessus
Couldn't execute 'SHOW EVENTS' privilège EVENT manquant GRANT EVENT ON appdb.*
Unknown database au restore base cible absente (in_place) Utilisez side_by_side ou créez la base
caractères corrompus charset Le connecteur force utf8mb4 ; vérifiez la collation de la base cible

Limites & roadmap

  • v1 : dump logique mysqldump. Adapté aux bases petites/moyennes.
  • Roadmap : intégration xtrabackup (backup physique hot, incrémental) pour les très grosses bases.