# 🚀 Guide de Migration vers MariaDB - Version ComplĂšte ## 📋 Vue d'ensemble Ce guide vous accompagne pour migrer votre blog Django de SQLite vers MariaDB sur votre Raspberry Pi. ### PrĂ©requis - ✅ Serveur MariaDB dans Docker sur le RPI (conteneur nommĂ© `mariadb`) - ✅ AccĂšs rĂ©seau du Mac vers le RPI - ✅ Python 3.x installĂ© - ✅ Fichier `.env` configurĂ© --- ## 🎯 Étape 1 : VĂ©rifications prĂ©liminaires ### 1.1 VĂ©rifier l'environnement ```bash # Rendre le script exĂ©cutable chmod +x scripts/pre_migration_check.sh # Lancer les vĂ©rifications ./scripts/pre_migration_check.sh ``` Ce script vĂ©rifie : - ✅ Python et dĂ©pendances installĂ©es - ✅ Configuration du fichier `.env` - ✅ Connexion rĂ©seau vers MariaDB - ✅ PrĂ©sence de la base SQLite source ### 1.2 Installer les dĂ©pendances manquantes Si des dĂ©pendances manquent : ```bash pip3 install -r requirements.txt ``` **Important**: `mysqlclient` nĂ©cessite des outils de compilation : **Sur macOS :** ```bash brew install mysql-client pkg-config export PKG_CONFIG_PATH="/opt/homebrew/opt/mysql-client/lib/pkgconfig" pip3 install mysqlclient ``` --- ## 🔧 Étape 2 : Configuration du serveur MariaDB ### 2.1 VĂ©rifier que le conteneur Docker est dĂ©marrĂ© Sur votre **Raspberry Pi** : ```bash # VĂ©rifier si le conteneur tourne docker ps | grep mariadb # Si non dĂ©marrĂ©, le dĂ©marrer docker start mariadb # Voir les logs docker logs mariadb ``` ### 2.2 VĂ©rifier l'exposition du port ```bash # Sur le RPI docker port mariadb # Devrait afficher : 3306/tcp -> 0.0.0.0:3306 ``` Si le port n'est pas exposĂ©, recrĂ©ez le conteneur : ```bash docker run -d \ --name mariadb \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=votre_mot_de_passe_root \ -v mariadb_data:/var/lib/mysql \ --restart unless-stopped \ mariadb:latest ``` ### 2.3 CrĂ©er la base de donnĂ©es et l'utilisateur Sur le **Raspberry Pi** : ```bash # Se connecter Ă  MariaDB docker exec -it mariadb mysql -u root -p ``` Puis dans le shell MySQL : ```sql -- CrĂ©er la base de donnĂ©es CREATE DATABASE IF NOT EXISTS duhaz_blog CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CrĂ©er l'utilisateur CREATE USER IF NOT EXISTS 'duhaz_user'@'%' IDENTIFIED BY 'votre_mot_de_passe_securise'; -- Donner tous les droits sur la base GRANT ALL PRIVILEGES ON duhaz_blog.* TO 'duhaz_user'@'%'; -- Appliquer les changements FLUSH PRIVILEGES; -- VĂ©rifier SHOW DATABASES; SELECT User, Host FROM mysql.user WHERE User = 'duhaz_user'; -- Quitter EXIT; ``` **Note**: `'duhaz_user'@'%'` permet les connexions depuis n'importe quelle IP. Pour plus de sĂ©curitĂ©, remplacez `%` par l'IP de votre Mac. --- ## 🌐 Étape 3 : Configuration rĂ©seau ### 3.1 Trouver l'IP de votre Raspberry Pi Sur le **RPI** : ```bash hostname -I # Exemple de rĂ©sultat : 192.168.1.100 ``` ### 3.2 Tester la connexion rĂ©seau Depuis votre **Mac** : ```bash # Test de ping ping 192.168.1.100 # Test du port MariaDB nc -zv 192.168.1.100 3306 # ou telnet 192.168.1.100 3306 ``` Si le port n'est pas accessible, vĂ©rifiez : - Le pare-feu du RPI : `sudo ufw status` - Le conteneur Docker expose bien le port - Votre rĂ©seau local autorise les connexions --- ## ⚙ Étape 4 : Configuration du fichier .env ### 4.1 Éditer le fichier .env Deux options pour `DB_HOST` : **Option A : Utiliser le nom du conteneur** (si votre Mac fait partie du rĂ©seau Docker) ```env DB_ENGINE=mysql DB_NAME=duhaz_blog DB_USER=duhaz_user DB_PASSWORD=votre_mot_de_passe_securise DB_HOST=mariadb DB_PORT=3306 ``` **Option B : Utiliser l'IP du RPI** (recommandĂ© pour dĂ©veloppement depuis un autre machine) ```env DB_ENGINE=mysql DB_NAME=duhaz_blog DB_USER=duhaz_user DB_PASSWORD=votre_mot_de_passe_securise DB_HOST=192.168.1.100 DB_PORT=3306 ``` ### 4.2 SĂ©curitĂ© du mot de passe ⚠ **Important** : N'utilisez JAMAIS de mots de passe simples en production ! GĂ©nĂ©rer un mot de passe fort : ```bash openssl rand -base64 32 ``` --- ## đŸ§Ș Étape 5 : Test de connexion ### 5.1 Test direct avec Python ```bash python3 scripts/test_mariadb_connection.py ``` Ce script teste : 1. Import du module MySQLdb 2. Connexion directe Ă  MariaDB 3. Connexion via Django ### 5.2 InterprĂ©ter les rĂ©sultats **✅ SuccĂšs** : ``` ✅ Tous les tests sont passĂ©s! ``` **❌ Échec** - Erreurs courantes : | Erreur | Solution | |--------|----------| | `ModuleNotFoundError: No module named 'MySQLdb'` | `pip3 install mysqlclient` | | `Can't connect to MySQL server` | VĂ©rifier que MariaDB est dĂ©marrĂ© et accessible | | `Access denied for user` | VĂ©rifier DB_USER et DB_PASSWORD dans .env | | `Unknown database` | CrĂ©er la base avec les commandes SQL ci-dessus | --- ## 📩 Étape 6 : Sauvegarde des donnĂ©es SQLite ### 6.1 Sauvegarde automatique Le script de migration crĂ©e automatiquement un backup, mais vous pouvez aussi le faire manuellement : ```bash # CrĂ©er le dossier de backup mkdir -p backup # Copier la base SQLite cp db.sqlite3 backup/db.sqlite3.backup # Export JSON des donnĂ©es python3 manage.py dumpdata \ --natural-foreign \ --natural-primary \ --exclude=contenttypes \ --exclude=auth.permission \ --indent=2 \ --output=backup/sqlite_data.json ``` ### 6.2 VĂ©rifier le backup ```bash # Taille du fichier ls -lh backup/ # Nombre d'objets dans le JSON grep -c '"model":' backup/sqlite_data.json ``` --- ## 🚀 Étape 7 : Migration des donnĂ©es ### 7.1 Lancer la migration automatique ```bash python3 scripts/migrate_to_mariadb.py ``` Le script effectue : 1. **Export** des donnĂ©es depuis SQLite 2. **Pause** pour que vous modifiiez le .env vers MariaDB 3. **Import** des donnĂ©es dans MariaDB 4. **VĂ©rification** du nombre d'enregistrements ### 7.2 Processus Ă©tape par Ă©tape Le script vous demandera : ``` ⚠ IMPORTANT: Maintenant, modifiez votre fichier .env Changez DB_ENGINE de 'sqlite3' Ă  'mysql' Appuyez sur EntrĂ©e quand c'est fait... ``` À ce moment : 1. Éditez le fichier `.env` 2. Changez `DB_ENGINE=sqlite3` vers `DB_ENGINE=mysql` 3. Appuyez sur EntrĂ©e dans le terminal ### 7.3 Migration manuelle (si nĂ©cessaire) Si vous prĂ©fĂ©rez contrĂŽler chaque Ă©tape : ```bash # 1. Exporter depuis SQLite (avec DB_ENGINE=sqlite3) python3 manage.py dumpdata \ --natural-foreign \ --natural-primary \ --exclude=contenttypes \ --exclude=auth.permission \ --indent=2 \ --output=backup/manual_export.json # 2. Modifier le .env pour passer Ă  MariaDB # DB_ENGINE=mysql # 3. CrĂ©er les tables dans MariaDB python3 manage.py migrate --run-syncdb # 4. Importer les donnĂ©es python3 manage.py loaddata backup/manual_export.json ``` --- ## ✅ Étape 8 : VĂ©rification post-migration ### 8.1 VĂ©rifier les donnĂ©es ```bash # Lancer le shell Django python3 manage.py shell ``` Dans le shell Python : ```python from django.contrib.auth.models import User from blog.models import Article # Compter les utilisateurs print(f"Utilisateurs: {User.objects.count()}") # Compter les articles print(f"Articles: {Article.objects.count()}") # Afficher le premier article article = Article.objects.first() if article: print(f"Premier article: {article.title}") ``` ### 8.2 Tester l'interface admin ```bash # DĂ©marrer le serveur python3 manage.py runserver ``` AccĂ©dez Ă  : http://127.0.0.1:8000/admin/ VĂ©rifiez : - ✅ Connexion avec votre compte admin - ✅ Liste des articles visible - ✅ Modification d'un article fonctionne - ✅ CrĂ©ation d'un nouvel article fonctionne ### 8.3 Tester le site public AccĂ©dez Ă  : http://127.0.0.1:8000/ VĂ©rifiez : - ✅ Les articles s'affichent - ✅ Les images sont visibles - ✅ Les liens fonctionnent - ✅ La recherche fonctionne --- ## 🔧 DĂ©pannage ### ProblĂšme : Can't connect to MySQL server **Cause** : Le serveur n'est pas accessible **Solutions** : ```bash # 1. VĂ©rifier que le conteneur tourne docker ps | grep mariadb # 2. Voir les logs docker logs mariadb # 3. Tester la connexion rĂ©seau telnet 192.168.1.100 3306 # 4. VĂ©rifier le pare-feu sudo ufw status ``` ### ProblĂšme : Access denied for user **Cause** : Identifiants incorrects **Solutions** : ```bash # VĂ©rifier les variables dans .env cat .env | grep DB_ # Tester la connexion directement docker exec -it mariadb mysql -u duhaz_user -p ``` ### ProblĂšme : Unknown database 'duhaz_blog' **Cause** : La base n'existe pas **Solution** : ```bash # Se connecter en root docker exec -it mariadb mysql -u root -p # CrĂ©er la base CREATE DATABASE duhaz_blog CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` ### ProblĂšme : Table already exists **Cause** : Les migrations ont dĂ©jĂ  Ă©tĂ© appliquĂ©es **Solution** : ```bash # Supprimer toutes les tables et recommencer docker exec -it mariadb mysql -u root -p DROP DATABASE duhaz_blog; CREATE DATABASE duhaz_blog CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # Relancer la migration python3 scripts/migrate_to_mariadb.py ``` ### ProblĂšme : ImportError: No module named 'MySQLdb' **Cause** : mysqlclient n'est pas installĂ© **Solution macOS** : ```bash # Installer les dĂ©pendances systĂšme brew install mysql-client pkg-config # Configurer PKG_CONFIG_PATH export PKG_CONFIG_PATH="/opt/homebrew/opt/mysql-client/lib/pkgconfig" # Installer mysqlclient pip3 install mysqlclient ``` --- ## 📊 Comparaison SQLite vs MariaDB | CaractĂ©ristique | SQLite | MariaDB | |----------------|--------|---------| | **Performance lecture** | Excellente | TrĂšs bonne | | **Performance Ă©criture** | Bonne | Excellente | | **Concurrence** | LimitĂ©e | Excellente | | **Backup** | Copie de fichier | mysqldump | | **Taille max** | ~140 To | Pratiquement illimitĂ©e | | **AdaptĂ© pour** | Dev, petits sites | Production, sites moyens/grands | --- ## 🔒 SĂ©curitĂ© en production Avant de dĂ©ployer en production, modifiez `.env` : ```env # DĂ©sactiver le mode debug DEBUG=False # Limiter les hĂŽtes autorisĂ©s ALLOWED_HOSTS=duhaz.fr,www.duhaz.fr # Utiliser un mot de passe fort DB_PASSWORD= ``` Et dans `settings.py`, dĂ©commentez : ```python SECURE_SSL_REDIRECT = True SESSION_COOKIE_SECURE = True CSRF_COOKIE_SECURE = True SECURE_BROWSER_XSS_FILTER = True SECURE_CONTENT_TYPE_NOSNIFF = True X_FRAME_OPTIONS = 'DENY' ``` --- ## 📚 Ressources ### Documentation officielle - [Django Database Configuration](https://docs.djangoproject.com/en/5.1/ref/databases/) - [MariaDB Knowledge Base](https://mariadb.com/kb/en/) - [mysqlclient Documentation](https://mysqlclient.readthedocs.io/) ### Fichiers du projet - `scripts/pre_migration_check.sh` - VĂ©rifications prĂ©liminaires - `scripts/test_mariadb_connection.py` - Test de connexion - `scripts/migrate_to_mariadb.py` - Migration automatique - `scripts/setup_mariadb.sh` - Configuration du serveur - `scripts/setup_mariadb.sql` - Commandes SQL --- ## ✹ Checklist finale Avant de considĂ©rer la migration terminĂ©e : - [ ] Tous les tests de connexion passent - [ ] L'admin Django fonctionne - [ ] Les articles s'affichent sur le site - [ ] Les images sont visibles - [ ] Les modifications sont sauvegardĂ©es - [ ] Un backup de SQLite est conservĂ© - [ ] Le fichier `.env` est sĂ©curisĂ© - [ ] Les mots de passe sont forts - [ ] La documentation est Ă  jour --- ## 🆘 Besoin d'aide ? Si vous rencontrez des problĂšmes : 1. Consultez la section **DĂ©pannage** ci-dessus 2. VĂ©rifiez les logs : `docker logs mariadb` 3. Testez chaque Ă©tape individuellement 4. Gardez votre backup SQLite jusqu'Ă  ce que tout fonctionne **Rappel important** : Ne supprimez JAMAIS `db.sqlite3` avant d'avoir vĂ©rifiĂ© que tout fonctionne parfaitement avec MariaDB ! --- Bonne migration ! 🚀