Si votre application Django tourne dans un autre conteneur Docker sur le même Raspberry Pi :
# .env
DB_HOST=mariadb # Nom du conteneur (résolution DNS Docker)
DB_PORT=3306
✅ C'est le cas pour la production sur le RPI
Si vous développez sur votre Mac et que MariaDB est sur le Raspberry Pi :
# .env
DB_HOST=192.168.x.x # IP du Raspberry Pi sur le réseau local
DB_PORT=3306
⚠️ Le port 3306 doit être exposé sur le réseau (pas seulement au réseau Docker interne)
# Sur le Raspberry Pi
docker port mariadb
Si vous voyez 3306/tcp -> 0.0.0.0:3306, le port est bien exposé. ✅
Si vous ne voyez rien, le port n'est pas exposé. ❌
Si le conteneur a été créé sans exposer le port, vous avez deux options :
# Sauvegarder d'abord les données !
docker exec mariadb mysqldump -u root -p --all-databases > backup_all.sql
# Arrêter et supprimer le conteneur
docker stop mariadb
docker rm mariadb
# Recréer avec le port exposé
docker run -d \
--name mariadb \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=votre_mot_de_passe \
-v mariadb_data:/var/lib/mysql \
mariadb:latest
# Restaurer les données
docker exec -i mariadb mysql -u root -p < backup_all.sql
Si vous ne voulez pas modifier le conteneur :
# Sur votre Mac
ssh -L 3306:localhost:3306 user@raspberry-pi-ip
Puis dans votre .env :
DB_HOST=127.0.0.1 # Se connecte via le tunnel SSH
DB_PORT=3306
hostname -I
# Exemple de sortie : 192.168.1.100 fe80::xxxx
# Utilisez la première IP (IPv4)
Ou :
ip addr show | grep "inet " | grep -v 127.0.0.1
# Si vous connaissez le hostname du RPI
ping raspberrypi.local
# Scanner le réseau (nécessite nmap)
nmap -sn 192.168.1.0/24 | grep -B 2 "Raspberry"
# Test 1 : Port ouvert ?
telnet 192.168.1.100 3306
# Si ça se connecte : ✅
# Si "Connection refused" : ❌ Port non exposé ou firewall
# Test 2 : Connexion MySQL
mysql -h 192.168.1.100 -u duhaz_user -p duhaz_blog
# Si ça fonctionne : ✅
# test_connection.py
import MySQLdb
try:
conn = MySQLdb.connect(
host='192.168.1.100', # IP du RPI
user='duhaz_user',
passwd='votre_mot_de_passe',
db='duhaz_blog',
port=3306
)
print("✅ Connexion réussie!")
conn.close()
except Exception as e:
print(f"❌ Erreur: {e}")
Ne laissez PAS le port 3306 ouvert sur Internet ! Utilisez plutôt :
C'est OK d'exposer le port sur le réseau local (192.168.x.x) si :
# docker-compose.yml
version: '3.8'
services:
mariadb:
image: mariadb:latest
environment:
MYSQL_ROOT_PASSWORD: password_fort
MYSQL_DATABASE: duhaz_blog
MYSQL_USER: duhaz_user
MYSQL_PASSWORD: password_fort
volumes:
- mariadb_data:/var/lib/mysql
networks:
- blog_network
# PAS de ports: exposés !
django:
build: .
environment:
DB_HOST: mariadb # Nom du service
DB_PORT: 3306
networks:
- blog_network
ports:
- "8000:8000"
volumes:
mariadb_data:
networks:
blog_network:
# Sur le RPI : exposer le port
docker run -d --name mariadb -p 3306:3306 ...
# Sur le Mac : .env
DB_HOST=192.168.1.100
DB_PORT=3306
docker ps | grep mariadbdocker port mariadbtelnet IP 3306sudo ufw status.env✅ Vérifiez que l'utilisateur peut se connecter depuis n'importe où :
SELECT User, Host FROM mysql.user WHERE User = 'duhaz_user';
-- Host doit être '%' ou votre IP
L'utilisateur n'a pas le droit de se connecter depuis votre IP :
-- Sur le RPI
docker exec -it mariadb mysql -u root -p
GRANT ALL PRIVILEGES ON duhaz_blog.* TO 'duhaz_user'@'192.168.1.%';
FLUSH PRIVILEGES;
| Situation | DB_HOST | Port exposé ? |
|---|---|---|
| Production (Docker) | mariadb |
Non |
| Dev local (Mac → RPI) | 192.168.x.x |
Oui |
| Dev avec tunnel SSH | 127.0.0.1 |
Non (via SSH) |
| RPI local (même machine) | localhost |
Oui |