diff --git a/Readme.md b/Readme.md index 423fabb..5af8f5f 100644 --- a/Readme.md +++ b/Readme.md @@ -1,182 +1,52 @@ -SeedMover +# Readme + +--- + +# SeedMover Gestionnaire de transferts dual-pane entre une seedbox et un NAS, accessible depuis navigateur et smartphone. -Fonctionnalités +## 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 - - -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` -Accès : http://:5000 +## Configuration `docker-compose.yml` -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 - - - -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/ @@ -188,124 +58,52 @@ seedmover/ │ ├── index.html │ └── login.html └── docker-compose.yml +``` +### Générer une SECRET_KEY sécurisée - - -Générer une SECRET_KEY sécurisée - +```bash python3 -c "import secrets; print(secrets.token_hex(32))" +``` +### Volumes -Volumes - +```yaml volumes: - /mnt/nas/Useed/Media_useed:/mnt/seedbox:ro # seedbox, lecture seule - /mnt/nas/BOB4-Syno:/mnt/nas # NAS, lecture/écriture +``` +## Utilisation -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 -Se connecter sur http://ip:5000 +## Notes techniques - - -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 +- 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