# Guide de migration MariaDB vers container centralisé Ce guide détaille la procédure complète pour migrer la base de données `geo_app` depuis le container applicatif vers le container MariaDB centralisé. ## 📋 Prérequis - Container source (geo) avec MariaDB et la base geo_app - Container cible (maria) avec MariaDB installé - Réseau incusbr0 configuré entre les containers - Accès root/sudo sur les deux containers ## 🔄 Procédure de migration ### 1. Sur le container SOURCE (geo) #### Créer le dump de la base de données ```bash # Se connecter au container source incus exec geo -- bash # Créer le dump avec structure et données mysqldump -u root -p geo_app > /tmp/geo_app_dump.sql # Vérifier le dump ls -lh /tmp/geo_app_dump.sql ``` #### Copier le dump vers le container CIBLE ```bash # Depuis l'hôte, copier le dump incus file pull geo/tmp/geo_app_dump.sql ./ incus file push ./geo_app_dump.sql maria/tmp/ ``` ### 2. Sur le container CIBLE (maria) #### Se connecter au container et à MariaDB ```bash # Se connecter au container maria incus exec maria -- bash # Se connecter à MariaDB mysql -u root -p ``` #### Créer la base de données ```sql -- Créer la base avec l'encodage UTF8MB4 pour le français CREATE DATABASE IF NOT EXISTS geo_app CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- Vérifier la création SHOW DATABASES; ``` #### Créer l'utilisateur et attribuer les droits **Pour DEV:** ```sql -- Créer l'utilisateur pour l'accès distant CREATE USER IF NOT EXISTS 'geo_app_user_dev'@'%' IDENTIFIED BY '34GOz-X5gJu-oH@Fa3$#Z'; -- Donner tous les privilèges sur la base geo_app GRANT ALL PRIVILEGES ON geo_app.* TO 'geo_app_user_dev'@'%'; -- Appliquer les changements FLUSH PRIVILEGES; -- Vérifier les permissions SHOW GRANTS FOR 'geo_app_user_dev'@'%'; ``` **Pour RECETTE:** ```sql -- Créer l'utilisateur pour l'accès distant CREATE USER IF NOT EXISTS 'geo_app_user_rec'@'%' IDENTIFIED BY 'QO:96df*?k-dS3KiO-{4W6m'; -- Donner tous les privilèges sur la base geo_app GRANT ALL PRIVILEGES ON geo_app.* TO 'geo_app_user_rec'@'%'; -- Appliquer les changements FLUSH PRIVILEGES; -- Vérifier les permissions SHOW GRANTS FOR 'geo_app_user_rec'@'%'; ``` **Pour PROD:** ```sql -- Créer l'utilisateur pour l'accès distant CREATE USER IF NOT EXISTS 'geo_app_user_prod'@'%' IDENTIFIED BY 'QO:96-SrHJ6k7-df*?k{4W6m'; -- Donner tous les privilèges sur la base geo_app GRANT ALL PRIVILEGES ON geo_app.* TO 'geo_app_user_prod'@'%'; -- Appliquer les changements FLUSH PRIVILEGES; -- Vérifier les permissions SHOW GRANTS FOR 'geo_app_user_prod'@'%'; ``` #### Importer le dump ```bash # Sortir de mysql si vous y êtes encore exit # Importer le dump dans la nouvelle base mysql -u root -p geo_app < /tmp/geo_app_dump.sql # Vérifier l'import mysql -u root -p -e "USE geo_app; SHOW TABLES;" ``` ### 3. Configuration réseau et firewall #### Sur le container MARIA ##### Configurer MariaDB pour l'accès distant ```bash # Éditer la configuration MariaDB nano /etc/mysql/mariadb.conf.d/50-server.cnf # Modifier ou ajouter: bind-address = 0.0.0.0 # Redémarrer MariaDB systemctl restart mariadb ``` ##### Configurer le firewall UFW ```bash # Vérifier l'IP du container source (geo) # Exemple: 13.23.33.43 # Autoriser l'accès depuis le container geo ufw allow from 13.23.33.43 to any port 3306 # Ou autoriser tout le réseau incusbr0 (plus flexible) ufw allow from 13.23.33.0/24 to any port 3306 # Vérifier les règles ufw status numbered ``` ### 4. Test de connexion #### Depuis le container SOURCE (geo) ```bash # Tester la connexion vers le container maria # Pour DEV mysql -h 13.23.33.46 -u geo_app_user_dev -p'34GOz-X5gJu-oH@Fa3$#Z' geo_app -e "SELECT 1;" # Pour RECETTE mysql -h 13.23.33.36 -u geo_app_user_rec -p'QO:96df*?k-dS3KiO-{4W6m' geo_app -e "SELECT 1;" # Pour PROD mysql -h 13.23.33.26 -u geo_app_user_prod -p'QO:96-SrHJ6k7-df*?k{4W6m' geo_app -e "SELECT 1;" ``` ### 5. Mise à jour de la configuration API Modifier le fichier `api/src/Config/AppConfig.php` pour pointer vers le nouveau serveur MariaDB: ```php // Configuration DÉVELOPPEMENT 'database' => [ 'host' => '13.23.33.46', // IP du container maria 'name' => 'geo_app', 'username' => 'geo_app_user_dev', 'password' => '34GOz-X5gJu-oH@Fa3$#Z', ], // Configuration RECETTE 'database' => [ 'host' => '13.23.33.36', // IP du container maria recette 'name' => 'geo_app', 'username' => 'geo_app_user_rec', 'password' => 'QO:96df*?k-dS3KiO-{4W6m', ], // Configuration PRODUCTION 'database' => [ 'host' => '13.23.33.26', // IP du container maria prod 'name' => 'geo_app', 'username' => 'geo_app_user_prod', 'password' => 'QO:96-SrHJ6k7-df*?k{4W6m', ], ``` ### 6. Arrêt du service MariaDB local #### Sur Alpine Linux (container geo) ```bash # Arrêter le service MariaDB rc-service mariadb stop # Vérifier l'arrêt rc-service mariadb status # Désactiver le démarrage automatique rc-update del mariadb # Pour redémarrer si besoin rc-service mariadb start ``` #### Sur Ubuntu/Debian ```bash # Arrêter le service systemctl stop mariadb # ou systemctl stop mysql # Vérifier l'arrêt systemctl status mariadb # Désactiver le démarrage automatique systemctl disable mariadb ``` ### 7. Vérification finale ```bash # Tester l'application web curl http://localhost/api/health # Vérifier les logs pour toute erreur tail -f /var/log/apache2/error.log # ou tail -f /var/log/php*.log ``` ## 🔐 Sécurité - Les mots de passe utilisés ici sont ceux du fichier AppConfig.php - En production, utilisez des mots de passe forts et uniques - Limitez les accès réseau au strict minimum - Activez SSL/TLS pour les connexions distantes si possible ## 📝 Notes importantes 1. **Sauvegarde**: Toujours faire une sauvegarde avant la migration 2. **Test**: Tester d'abord en environnement de développement 3. **Firewall**: Configurer précisément les règles firewall 4. **Monitoring**: Surveiller les performances après migration 5. **Rollback**: Garder l'ancienne base accessible pour un rollback rapide si nécessaire ## 🚨 Dépannage ### Erreur de connexion ```bash # Vérifier que MariaDB écoute sur toutes les interfaces netstat -tlnp | grep 3306 # Vérifier les logs MariaDB tail -f /var/log/mysql/error.log ``` ### Erreur de permissions ```sql -- Recréer les permissions GRANT ALL PRIVILEGES ON geo_app.* TO 'geo_app_user_dev'@'%'; FLUSH PRIVILEGES; ``` ### Test de connectivité réseau ```bash # Ping entre containers ping 13.23.33.46 # Test du port MySQL telnet 13.23.33.46 3306 ```