Modification Readme
This commit is contained in:
330
Readme.md
330
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.
|
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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
|
||||||
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
|
# Générer une SECRET_KEY
|
||||||
python3 -c "import secrets; print(secrets.token_hex(32))"
|
python3 -c "import secrets; print(secrets.token_hex(32))"
|
||||||
|
|
||||||
# Lancer
|
# Lancer
|
||||||
docker compose up -d
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
Accès : `http://<ip>:5000`
|
||||||
|
|
||||||
Accès : http://<ip>: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/
|
seedmover/
|
||||||
├── app.py
|
├── app.py
|
||||||
├── plugins/
|
├── plugins/
|
||||||
@@ -188,124 +58,52 @@ seedmover/
|
|||||||
│ ├── index.html
|
│ ├── index.html
|
||||||
│ └── login.html
|
│ └── login.html
|
||||||
└── docker-compose.yml
|
└── docker-compose.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
### Générer une SECRET_KEY sécurisée
|
||||||
|
|
||||||
|
```bash
|
||||||
|
|
||||||
Générer une SECRET_KEY sécurisée
|
|
||||||
|
|
||||||
python3 -c "import secrets; print(secrets.token_hex(32))"
|
python3 -c "import secrets; print(secrets.token_hex(32))"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Volumes
|
||||||
|
|
||||||
Volumes
|
```yaml
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
- /mnt/nas/Useed/Media_useed:/mnt/seedbox:ro # seedbox, lecture seule
|
- /mnt/nas/Useed/Media_useed:/mnt/seedbox:ro # seedbox, lecture seule
|
||||||
- /mnt/nas/BOB4-Syno:/mnt/nas # NAS, lecture/écriture
|
- /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
|
||||||
|
|
||||||
|
- 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
|
||||||
Naviguer dans la seedbox (panneau gauche) avec double-clic
|
- Verrou par connexion pour thread-safety Paramiko (évite les "Garbage packet")
|
||||||
|
- Prefetch SFTP désactivé pour éviter le chargement du fichier entier en RAM
|
||||||
|
|
||||||
|
|
||||||
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
|
|
||||||
Reference in New Issue
Block a user