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