Ce guide vous accompagne pour migrer votre blog Django de SQLite vers MariaDB sur votre Raspberry Pi.
mariadb).env configuré# 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 :
.envSi des dépendances manquent :
pip3 install -r requirements.txt
Important: mysqlclient nécessite des outils de compilation :
Sur macOS :
brew install mysql-client pkg-config
export PKG_CONFIG_PATH="/opt/homebrew/opt/mysql-client/lib/pkgconfig"
pip3 install mysqlclient
Sur votre Raspberry Pi :
# 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
# 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 :
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
Sur le Raspberry Pi :
# Se connecter à MariaDB
docker exec -it mariadb mysql -u root -p
Puis dans le shell MySQL :
-- 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.
Sur le RPI :
hostname -I
# Exemple de résultat : 192.168.1.100
Depuis votre Mac :
# 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 :
sudo ufw statusDeux options pour DB_HOST :
Option A : Utiliser le nom du conteneur (si votre Mac fait partie du réseau Docker)
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)
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
⚠️ Important : N'utilisez JAMAIS de mots de passe simples en production !
Générer un mot de passe fort :
openssl rand -base64 32
python3 scripts/test_mariadb_connection.py
Ce script teste :
✅ 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 |
Le script de migration crée automatiquement un backup, mais vous pouvez aussi le faire manuellement :
# 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
# Taille du fichier
ls -lh backup/
# Nombre d'objets dans le JSON
grep -c '"model":' backup/sqlite_data.json
python3 scripts/migrate_to_mariadb.py
Le script effectue :
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 :
.envDB_ENGINE=sqlite3 vers DB_ENGINE=mysqlSi vous préférez contrôler chaque étape :
# 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
# Lancer le shell Django
python3 manage.py shell
Dans le shell 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}")
# Démarrer le serveur
python3 manage.py runserver
Accédez à : http://127.0.0.1:8000/admin/
Vérifiez :
Accédez à : http://127.0.0.1:8000/
Vérifiez :
Cause : Le serveur n'est pas accessible
Solutions :
# 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
Cause : Identifiants incorrects
Solutions :
# Vérifier les variables dans .env
cat .env | grep DB_
# Tester la connexion directement
docker exec -it mariadb mysql -u duhaz_user -p
Cause : La base n'existe pas
Solution :
# 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;
Cause : Les migrations ont déjà été appliquées
Solution :
# 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
Cause : mysqlclient n'est pas installé
Solution macOS :
# 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
| 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 |
Avant de déployer en production, modifiez .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=<mot_de_passe_généré_par_openssl>
Et dans settings.py, décommentez :
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'
scripts/pre_migration_check.sh - Vérifications préliminairesscripts/test_mariadb_connection.py - Test de connexionscripts/migrate_to_mariadb.py - Migration automatiquescripts/setup_mariadb.sh - Configuration du serveurscripts/setup_mariadb.sql - Commandes SQLAvant de considérer la migration terminée :
.env est sécuriséSi vous rencontrez des problèmes :
docker logs mariadbRappel important : Ne supprimez JAMAIS db.sqlite3 avant d'avoir vérifié que tout fonctionne parfaitement avec MariaDB !
Bonne migration ! 🚀