Outil de synchronisation unidirectionnelle de dossiers pour Windows. Surveille un dossier source et réplique automatiquement les changements vers une destination (ex: clé USB).
| Événement | Action |
|---|---|
| Nouveau fichier créé | Copié vers la destination |
| Fichier modifié | Recopié vers la destination |
| Fichier supprimé | Déplacé vers _Archive/ (avec horodatage) |
| Dossier renommé/déplacé | Reproduit côté destination |
| Démarrage | Synchronisation initiale complète |
| Clé USB débranchée | Pause auto + retry + reprise au rebranchement |
- Démarrage avec Windows (registre HKCU, sans droits admin)
- Démarrage automatique de la surveillance à l'ouverture de l'app
- Zone de notification (system tray) : la fenêtre se minimise au lieu de se fermer
- Configuration persistante : chemins et options sauvegardés dans
%APPDATA%\SimpleClone\config.json - Rotation automatique du fichier de log (5 Mo × 3 backups)
- Python 3.8 ou supérieur
- pip (gestionnaire de paquets Python)
# 1. Créer l'environnement virtuel
python -m venv venv
# 2. Activer l'environnement virtuel
# Windows (cmd)
venv\Scripts\activate
# Windows (PowerShell)
.\venv\Scripts\Activate.ps1
# Linux/Mac
source venv/bin/activate
# 3. Installer les dépendances
pip install -r requirements.txt# Avec le venv activé
python SimpleClone.py- Cliquer sur Parcourir... pour sélectionner le dossier Source (celui à surveiller)
- Cliquer sur Parcourir... pour sélectionner le dossier Destination (ex: clé USB)
- Cliquer sur DÉMARRER LA SURVEILLANCE
- L'application effectue d'abord une copie initiale, puis surveille les changements en continu
Cliquer sur le bouton rouge ARRÊTER LA SURVEILLANCE.
Deux cases à cocher dans l'interface :
- Démarrer avec Windows : ajoute une entrée dans
HKCU\Software\Microsoft\Windows\CurrentVersion\Run(pas besoin de droits admin) - Lancer la surveillance automatiquement : démarre la sync dès l'ouverture de l'app
Combinées, ces deux options font tourner SimpleClone en permanence sans intervention. L'app se loge dans la zone de notification (zone à côté de l'horloge) ; double-clic pour rouvrir la fenêtre.
Si la clé est débranchée pendant la surveillance, l'app ne crashe pas et ne spamme pas le log. Elle bascule en pause (indicateur orange, statut "En pause — destination inaccessible") et vérifie toutes les 5 secondes si la clé revient.
Au rebranchement, une resynchronisation complète est lancée automatiquement. Les fichiers qui ont été supprimés de la source pendant la pause sont déplacés dans _Archive/ (jamais supprimés définitivement) pour rester cohérents avec le comportement habituel de l'app.
Vous pouvez donc débrancher la clé sans précaution particulière (mais toujours via "Éjecter le périphérique" pour éviter une corruption FS).
Un workflow .github/workflows/build-windows.yml est inclus. Il déclenche un build Windows à chaque tag v*.*.* :
git tag v1.2.0
git push --tagsL'exécutable apparaît ensuite dans l'onglet Releases du dépôt GitHub. Pas besoin d'avoir Windows en local.
# 1. Activer le venv
venv\Scripts\activate
# 2. Installer PyInstaller
pip install pyinstaller
# 3. Créer l'exécutable
pyinstaller --onefile --windowed --name "SimpleClone" SimpleClone.pyL'exécutable sera créé dans le dossier dist/SimpleClone.exe.
pyinstaller --onefile --windowed --name "SimpleClone" --icon=monicon.ico SimpleClone.pylog/
├── activity/
│ ├── activity.log ← fichier courant (jour J)
│ ├── activity.log.2026-05-03 ← rotation à minuit
│ ├── activity.log.2026-05-02
│ └── ... ← conservés 6 ans (≈2190 fichiers)
└── errors/
├── SimpleClone_Errors.log ← rotation par taille (5 Mo × 3)
├── SimpleClone_Errors.log.1
└── ...
Le dossier log/ est créé à côté de l'exécutable par défaut. Si l'exe est installé dans un emplacement non inscriptible (typiquement Program Files), il bascule automatiquement sur %APPDATA%\SimpleClone\log\. Le chemin effectif est affiché dans le journal de l'application au démarrage.
À côté de la destination on trouve aussi :
| Fichier | Description |
|---|---|
_Archive/ |
Fichiers et dossiers supprimés de la source (avec horodatage) |
Le fichier log/activity/activity.log enregistre chaque opération réussie au format JSON-lines (une ligne par événement) :
{"ts": "2026-05-04T11:42:04", "op": "copy_initial", "src": "C:/data/autoclave_001.csv", "dest": "E:/backup/autoclave_001.csv", "size": 18432}
{"ts": "2026-05-04T11:42:09", "op": "copy", "src": "C:/data/cycle_42.txt", "dest": "E:/backup/cycle_42.txt", "size": 24500}
{"ts": "2026-05-04T11:43:11", "op": "archive", "src": "C:/data/old.csv", "dest": "E:/backup/_Archive/old_20260504_114311.csv", "size": 12000}Opérations tracées :
op |
Quand |
|---|---|
app_start |
Démarrage de l'application |
heartbeat |
Toutes les 15 minutes — preuve que l'app tourne (avec state, uptime_s) |
app_stop |
Fermeture propre de l'application (avec uptime_s) |
copy |
Fichier nouveau ou modifié détecté en surveillance |
copy_initial |
Fichier copié pendant la synchronisation initiale |
archive |
Fichier supprimé de la source → déplacé dans _Archive/ |
archive_dir |
Dossier supprimé de la source |
archive_orphan |
Fichier orphelin déplacé après une reprise de pause USB |
rename |
Fichier ou dossier renommé/déplacé |
Rétention : rotation quotidienne à minuit, conservation 6 ans (politique adaptée à un cycle d'archivage légal de 5 ans + marge). Les fichiers plus anciens sont supprimés automatiquement.
Exploitation : le format JSON-lines permet d'extraire facilement les preuves :
# Toutes les copies d'un fichier précis
grep autoclave_001 log/activity/activity.log*
# Avec jq, toutes les copies d'une journée
cat log/activity/activity.log.2026-05-03 | jq 'select(.op | startswith("copy"))'
# Dernier heartbeat (pour vérifier que l'app tourne)
grep heartbeat log/activity/activity.log | tail -1Cette section s'adresse à l'administrateur qui déploie SimpleClone sur un poste client en exploitation continue. Les recommandations ci-dessous sont issues du retour d'expérience terrain et conditionnent la valeur probante du log d'audit.
Le log d'activité a une rétention de 6 ans. Si le disque qui le contient lâche, l'audit disparaît avec lui. Pour un usage légal :
- Mettre
log/sur un volume régulièrement sauvegardé (NAS, cloud, sauvegarde système Windows). - Idéalement, copier
log/activity/*.log*sur un autre support une fois par mois (les anciens fichiers ne changent plus, c'est trivial à automatiser). - Si l'exe est dans
Program Files(cas où SimpleClone bascule sur%APPDATA%\SimpleClone\log\), s'assurer que%APPDATA%du compte qui exécute l'app est bien dans le périmètre de sauvegarde.
Le chemin effectif est affiché dans le journal d'activité de l'application au démarrage — si vous avez un doute, ouvrez la fenêtre.
Toutes les 15 minutes, SimpleClone écrit une ligne heartbeat dans log/activity/activity.log. C'est la preuve positive qu'à cet instant le process était vivant.
Vérification ponctuelle :
# La dernière heartbeat doit dater de moins de 30 minutes
grep heartbeat log/activity/activity.log | tail -1Surveillance automatisée (recommandée) : un script planifié (Tâches planifiées Windows, cron sur un poste tiers, supervision Centreon/Zabbix...) qui alerte si la dernière heartbeat date de plus d'une heure. Exemple en PowerShell :
$last = Get-Content "C:\path\to\log\activity\activity.log" | Select-String heartbeat | Select-Object -Last 1
if (-not $last) { exit 1 }
$ts = ($last -match '"ts": "([^"]+)"') ; $datetime = [datetime]$matches[1]
if ((Get-Date) - $datetime -gt [TimeSpan]"01:00:00") { Write-Error "SimpleClone silencieux depuis > 1h" ; exit 1 }L'utilisateur peut générer un fichier de diagnostic depuis l'application : clic sur le bouton ? en haut à droite de la fenêtre, puis "Créer un fichier de diagnostic". SimpleClone écrit alors un fichier simpleclone-diagnostic-DATE-HEURE.txt dans log/diagnostic/, et ouvre l'Explorateur de fichiers Windows directement sur ce fichier.
Le fichier contient :
- l'état courant (surveillance en cours / en pause / arrêtée)
- les chemins source et destination
- la version de SimpleClone, Python, plateforme
- la configuration JSON
- les 200 dernières lignes du journal d'activité
- les 100 dernières lignes du journal d'erreurs
L'opérateur copie le fichier sur une clé USB et l'envoie au support technique. Tout le contexte nécessaire est dedans, pas besoin que l'utilisateur sache lire un log.
"Le fichier X est manquant en destination."
# Le fichier a-t-il été copié ?
grep "X" log/activity/activity.log*
# Si oui : le log donne l'horodatage exact, le chemin source et destination, la taille
# Si non : il n'a jamais été détecté côté source — vérifier la source"L'app était-elle bien active à la date Y ?"
# Recherche la dernière heartbeat avant la date suspecte
grep heartbeat log/activity/activity.log.2026-04-* | tailUne séquence app_start ... heartbeat ... heartbeat ... app_stop est le signe d'un cycle propre. Une absence de app_stop après la dernière heartbeat indique une terminaison anormale (crash, kill, coupure secteur) — informatif pour l'enquête.
- Modifications directes sur la destination : si l'utilisateur modifie un fichier directement sur la clé USB, il sera écrasé au prochain événement source. La destination est un miroir de la source, pas un dossier de travail.
- Suppressions sur la source : un fichier supprimé de la source est archivé dans
_Archive/(jamais effacé définitivement par SimpleClone). Pour libérer de l'espace, c'est à l'utilisateur de purger manuellement_Archive/. - Démarrage automatique Windows : la commande enregistrée dans le registre contient le chemin absolu de l'exécutable. Si vous déplacez l'exe, il faut décocher puis recocher "Démarrer avec Windows" pour mettre à jour le registre.
- Intégrité des copies : SimpleClone fait confiance à
shutil.copy2(qui appelle l'API Windows native). Aucun checksum n'est calculé. Pour la majorité des cas c'est suffisant ; si votre cadre légal exige une preuve cryptographique d'intégrité, un complément (ex: hash sha256 stocké séparément) est nécessaire. - Pas de sync bidirectionnelle : si la destination doit être préservée contre l'écrasement, n'utilisez pas SimpleClone.
Le script ne crash jamais. Si un fichier ne peut pas être copié (verrouillé, permissions, chemin trop long), il est :
- Enregistré dans
log/errors/SimpleClone_Errors.log - Ignoré, le script continue avec le fichier suivant
Le log d'erreurs utilise une rotation par taille (5 Mo × 3 fichiers maximum), distincte du log d'activité — les erreurs sont du debug technique, pas un audit légal.
simpleClone/
├── SimpleClone.py # Script principal
├── requirements.txt # Dépendances runtime
├── requirements-dev.txt # Dépendances de dev (pytest)
├── tests/ # Suite pytest
├── README.md # Documentation
└── venv/ # Environnement virtuel (après installation)
Le projet dispose d'une suite pytest qui couvre la configuration, le système de logs, et la logique de synchronisation (copie, archivage, détection de débranchement, non-récursion sur _Archive/).
# Une seule fois : installer les dépendances de dev
pip install -r requirements-dev.txt
# Lancer la suite
pytest -vLes tests stub tkinter et watchdog au niveau import : aucun environnement graphique n'est requis. Les loggers sont isolés par test (chaque test reçoit son propre dossier log/ temporaire).
La CI GitHub (.github/workflows/test.yml) exécute automatiquement les tests à chaque push sur main et chaque pull request.
Runtime :
- watchdog : surveillance du système de fichiers
- pystray + Pillow : zone de notification (system tray)
Développement :
- pytest : suite de tests