Installation Docker
Installation du mode client via Docker Compose.
Deux fichiers compose sont fournis, à choisir selon la base de données :
| Fichier | Base | Services | Pour qui |
|---|---|---|---|
docker-compose.sqlite.yml | SQLite (un fichier dans le volume myelectricaldata_data) | backend, frontend | Recommandé pour une nouvelle installation : rien à administrer |
docker-compose.yml | PostgreSQL 16 embarqué (volume postgres_data) | postgres, backend, frontend | Installations existantes, ou besoin d'un serveur PostgreSQL |
Les deux donnent le même client (mêmes pages, mêmes exports). Passer de l'un à l'autre ne déplace pas les données : la nouvelle base repart vide et se resynchronise depuis la passerelle (3 ans de journalier, 2 ans de courbe de charge).
Prérequis
- Docker 24+ et Docker Compose v2
- Accès réseau vers
www.v2.myelectricaldata.fr - Une machine amd64 (x86_64) : les images ne sont pas encore publiées pour ARM (voir Raspberry Pi)
Les images ghcr.io/myelectricaldata/myelectricaldata_new/backend et .../frontend sont publiques : aucun compte GitHub ni docker login n'est nécessaire.
# Vérifier les versions
docker --version
docker compose version
Installation
Étape 1 : Cloner le dépôt
git clone https://github.com/MyElectricalData/myelectricaldata_new.git
cd myelectricaldata_new
Étape 2 : Configurer
# Copier le template
cp .env.local-client.example .env
# Éditer avec vos credentials
nano .env
Docker Compose lit automatiquement le fichier .env du dossier courant.
Contenu minimum de .env :
# === OBLIGATOIRE ===
# Credentials API MyElectricalData (depuis votre compte)
MED_CLIENT_ID=cli_xxxxxxxxxxxxxxxxxxxxxxxxx
MED_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# === RECOMMANDÉ (avant le premier démarrage) ===
# Clé de signature des sessions, à générer :
# python3 -c "import secrets; print(secrets.token_urlsafe(32))"
# Vide : clé aléatoire à chaque démarrage (sessions perdues au redémarrage)
SECRET_KEY=
# === OPTIONNEL ===
TZ=Europe/Paris
CLIENT_FRONTEND_PORT=8100
CLIENT_BACKEND_PORT=8181
# === POSTGRESQL SEULEMENT (docker-compose.yml) ===
# Mot de passe de la base PostgreSQL embarquée : lettres, chiffres, - _ . ~ seulement
# (il est repris tel quel dans l'URL de connexion, un @ / : # ? la casserait)
POSTGRES_PASSWORD=un-mot-de-passe-solide
Le frontend transmet les appels /api au backend : seule l'adresse http://localhost:8100 est à ouvrir.
Pour utiliser votre propre serveur PostgreSQL, partez de docker-compose.yml et renseignez DATABASE_URL dans .env (format postgresql+asyncpg://utilisateur:motdepasse@hote:5432/base).
Chaque fichier compose peut être déployé tel quel comme stack Portainer : renseignez MED_CLIENT_ID et MED_CLIENT_SECRET (plus POSTGRES_PASSWORD avec docker-compose.yml) dans les variables d'environnement de la stack. Aucun autre fichier n'est nécessaire.
Étape 3 : Démarrer
# SQLite (recommandé)
docker compose -f docker-compose.sqlite.yml up -d
# ou PostgreSQL
docker compose -f docker-compose.yml up -d
Au premier démarrage, le backend crée la base (fichier /app/data/myelectricaldata.db en SQLite) et son schéma.
Les exemples suivants visent docker-compose.sqlite.yml. Avec PostgreSQL, remplacez-le par docker-compose.yml.
Étape 4 : Vérifier
# Logs
docker compose -f docker-compose.sqlite.yml logs -f
# Accéder à l'interface
open http://localhost:8100
Première synchronisation
Au premier démarrage, les données ne sont pas encore synchronisées.
Synchronisation automatique
Le scheduler lance une synchronisation quotidienne à 6h00.
Synchronisation manuelle
- Accéder à http://localhost:8100
- Aller dans Dashboard
- Cliquer sur Synchroniser
Installation sur Raspberry Pi
Les images publiées ne sont construites que pour linux/amd64. Sur un Raspberry Pi (ARM64 ou ARMv7), docker compose up échoue avec no matching manifest for linux/arm64. En attendant des images multi-architecture, utiliser une machine amd64.
# Vérifier l'architecture (x86_64 attendu)
uname -m
Commandes utiles
# Démarrer
docker compose -f docker-compose.sqlite.yml up -d
# Arrêter
docker compose -f docker-compose.sqlite.yml down
# Logs
docker compose -f docker-compose.sqlite.yml logs -f
docker compose -f docker-compose.sqlite.yml logs -f backend
# Redémarrer
docker compose -f docker-compose.sqlite.yml restart backend
# Appliquer une modification du .env (restart ne relit pas le fichier)
docker compose -f docker-compose.sqlite.yml up -d
Mise à jour
# Mettre à jour le compose et la doc
git pull
# Télécharger les nouvelles images et recréer les conteneurs
docker compose -f docker-compose.sqlite.yml pull
docker compose -f docker-compose.sqlite.yml up -d
Le backend applique les migrations de la base au démarrage.
Sauvegarde
SQLite
La copie passe par SQLite lui-même (cohérente même pendant une synchronisation), puis sort du conteneur :
docker compose -f docker-compose.sqlite.yml exec backend python -c "import sqlite3; sqlite3.connect('/app/data/myelectricaldata.db', timeout=30).backup(sqlite3.connect('/app/data/backup.db'))"
docker compose -f docker-compose.sqlite.yml cp backend:/app/data/backup.db ./backup.db
docker compose -f docker-compose.sqlite.yml exec backend rm /app/data/backup.db
Restauration, backend démarré (SQLite réécrit la base en place, puis le redémarrage repart d'un état propre) :
docker compose -f docker-compose.sqlite.yml cp ./backup.db backend:/app/data/restore.db
docker compose -f docker-compose.sqlite.yml exec backend python -c "import sqlite3; sqlite3.connect('/app/data/restore.db').backup(sqlite3.connect('/app/data/myelectricaldata.db', timeout=30))"
docker compose -f docker-compose.sqlite.yml exec backend rm /app/data/restore.db
docker compose -f docker-compose.sqlite.yml restart backend
La base tourne en mode WAL : des écritures récentes vivent dans myelectricaldata.db-wal. Remplacer myelectricaldata.db par une copie, même backend arrêté, laisse ce fichier en place et SQLite le rejoue sur la base restaurée (données perdues ou base corrompue). Passez toujours par la commande ci-dessus.
PostgreSQL
docker compose -f docker-compose.yml exec postgres \
pg_dump -U myelectricaldata myelectricaldata_client > backup.sql
Restauration :
docker compose -f docker-compose.yml exec -T postgres \
psql -U myelectricaldata myelectricaldata_client < backup.sql
Dépannage
Le frontend ne démarre pas
# Vérifier les logs
docker compose -f docker-compose.sqlite.yml logs frontend
# Port déjà utilisé ? Modifier CLIENT_FRONTEND_PORT
Erreur de connexion API
Vérifier que MED_CLIENT_ID et MED_CLIENT_SECRET sont corrects dans .env, puis docker compose -f docker-compose.sqlite.yml up -d.
Erreur 405 ou page d'accueil à la place de l'API
Les appels /api doivent atteindre le backend. Vérifier que le service frontend a bien API_PROXY_URL=http://backend:8000 et que l'image frontend est à jour (docker compose pull).
denied au téléchargement des images
Les images doivent être ghcr.io/myelectricaldata/myelectricaldata_new/backend et .../frontend. Un ancien compose dont les images n'ont pas le suffixe _new vise un registre privé : mettre à jour le dépôt (git pull) ou corriger les deux lignes image:.
Réinitialiser la base
# ATTENTION : perte de données
docker compose -f docker-compose.sqlite.yml down -v
docker compose -f docker-compose.sqlite.yml up -d
Désinstallation
# Arrêter et supprimer
docker compose -f docker-compose.sqlite.yml down
# Supprimer les données
docker compose -f docker-compose.sqlite.yml down -v