diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..423fabb --- /dev/null +++ b/Readme.md @@ -0,0 +1,311 @@ +SeedMover + +Gestionnaire de transferts dual-pane entre une seedbox et un NAS, accessible depuis navigateur et smartphone. + +Fonctionnalités + + + + + +Dual-pane — navigation indépendante dans chaque panneau + + + +Multi-protocoles — Local et SFTP inclus, extensible via plugins + + + +File d'attente — transferts séquentiels avec progression temps réel, pause et stop + + + +Historique — suivi de tous les transferts (taille, durée, date, statut) + + + +Connexions — ajout, édition, test depuis l'interface, persistées entre redémarrages + + + +Panneaux par défaut — sauvegarde la vue de démarrage en un clic + +Démarrage rapide + +# Générer une SECRET_KEY +python3 -c "import secrets; print(secrets.token_hex(32))" + +# Lancer +docker compose up -d + + +Accès : http://:5000 + +Configuration docker-compose.yml + + + + + + + +Variable + + + +Défaut + + + +Description + + + + + +SEEDBOX_PATH + + + +/mnt/seedbox + + + +Chemin local seedbox + + + + + +NAS_PATH + + + +/mnt/nas + + + +Chemin local NAS + + + + + +APP_USERNAME + + + +admin + + + +Identifiant + + + + + +APP_PASSWORD + + + +changeme + + + +Mot de passe + + + + + +SECRET_KEY + + + +(à changer) + + + +Clé de session Flask + + + + + +CACHE_TTL + + + +60 + + + +TTL du cache de listing (secondes) + + + + + +HISTORY_MAX + + + +50 + + + +Nombre max d'entrées dans l'historique + + + + + +SESSION_LIFETIME + + + +86400 + + + +Durée de session (secondes) + +Ajouter un protocole + +Créer plugins/monprotocole.py, hériter de AbstractFS, implémenter les méthodes, définir PLUGIN_NAME et PLUGIN_LABEL. Le plugin est détecté automatiquement au démarrage. + +Structure + +seedmover/ +├── app.py +├── plugins/ +│ ├── base.py ← interface abstraite +│ ├── local.py ← système de fichiers local +│ └── sftp.py ← SFTP via Paramiko +├── data/ ← volume Docker (connexions, historique) +├── templates/ +│ ├── index.html +│ └── login.html +└── docker-compose.yml + + + + +Générer une SECRET_KEY sécurisée + +python3 -c "import secrets; print(secrets.token_hex(32))" + + +Volumes + +volumes: + - /mnt/nas/Useed/Media_useed:/mnt/seedbox:ro # seedbox, lecture seule + - /mnt/nas/BOB4-Syno:/mnt/nas # NAS, lecture/écriture + + +Utilisation + + + + + +Se connecter sur http://ip:5000 + + + +Naviguer dans la seedbox (panneau gauche) avec double-clic + + + +Naviguer vers le dossier destination sur le NAS (panneau droit) + + + +Sélectionner un ou plusieurs fichiers/dossiers côté seedbox (clic simple) + + + +Cliquer sur ⟶ Copier vers NAS + + + +Suivre la progression dans la file de transfert en bas + +Raccourcis + + + + + +Double-clic — ouvrir un dossier + + + +Clic simple — sélectionner/désélectionner + + + +↻ Actualiser — forcer un rechargement (bypass cache) + + + +📁 — créer un nouveau dossier + + + +✏ Renommer — renommer un élément côté NAS + + + +⏸ Pause / ▶ Reprendre — suspendre le transfert en cours + + + +⏹ Stop — annuler le transfert et supprimer le fichier partiel + + + +Échap — fermer les modales + + + +Entrée — valider les modales + +Stack technique + + + + + +Backend : Python 3.12, Flask, Flask-SocketIO, Eventlet + + + +Frontend : HTML/CSS/JS vanilla, Socket.IO + + + +Transport : copie par chunks de 4MB avec progression WebSocket + + + +Notes techniques + + + + + +Streaming chunk par chunk (1MB) sans buffer intermédiaire — RAM stable pendant les transferts + + + +malloc_trim() appelé après chaque transfert pour rendre la mémoire au système + + + +Verrou par connexion pour thread-safety Paramiko (évite les "Garbage packet") + + + +Prefetch SFTP désactivé pour éviter le chargement du fichier entier en RAM \ No newline at end of file