# 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 ```bash # 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 ```bash python3 -c "import secrets; print(secrets.token_hex(32))" ``` ### Volumes ```yaml volumes: - /mnt/nas/Useed/Media_useed:/mnt/seedbox:ro # seedbox, lecture seule - /mnt/nas/BOB4-Syno:/mnt/nas # NAS, lecture/écriture ``` ## Utilisation 1. Se connecter sur `http://ip:5000` 2. Naviguer dans la seedbox (panneau gauche) avec double-clic 3. Naviguer vers le dossier destination sur le NAS (panneau droit) 4. Sélectionner un ou plusieurs fichiers/dossiers côté seedbox (clic simple) 5. Cliquer sur **⟶ Copier vers NAS** 6. 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