# GoodDrive Drive privé (React 19 + Vite 8 + Tailwind v4 + composants shadcn/ui, Django REST Framework, MySQL 8 et Docker). Construit à partir de la structure du site de la boulangerie, **sans ses modules de planning / pointage**. ## Fonctions incluses - Connexion avec les comptes Django, inscription publique désactivée. - Dossiers imbriqués, import par bouton et glisser-déposer, classement en liste/grille, recherche, tri. - Aperçu des images, PDF et fichiers audio ; téléchargement direct avec des URL signées valables 5 minutes. - Renommer, déplacer, marquer favori, partager, mettre à la corbeille, restaurer et supprimer définitivement. - Espace « Partagés avec moi » : partage **en lecture à tous les comptes connectés**, uniquement pour les fichiers et dossiers à la racine (le partage d'un dossier inclut sa descendance). - Import reprenable par blocs de 8 Mio dès 8 Mio ; la progression est conservée dans le navigateur de l'utilisateur. Taille maximale réglable (50 Gio par défaut dans `.env.example`). - Fichiers sur un **dossier disque persistant**, métadonnées dans MySQL 8. - Thème clair/sombre, interface responsive avec composants shadcn/ui repris de la structure existante. ## Méthode 1 — Docker Compose (MySQL 8 intégré) Depuis le dossier `GoodDrive` : ```bash cp .env.example .env # Modifier les secrets, ALLOWED_HOSTS (IP / nom de domaine), etc. # Exemple pour un secret (ne pas copier un secret trouvé en ligne) : python3 -c "import secrets; print(secrets.token_urlsafe(64))" docker compose up -d --build docker compose exec backend python manage.py createsuperuser ``` Puis ouvrir `http://IP_DU_SERVEUR:1028/`. Les comptes supplémentaires se créent dans `http://IP_DU_SERVEUR:1028/django-admin/` > Utilisateurs. Les utilisateurs ordinaires ne peuvent pas gérer les autres comptes. Le frontend React/Vite (mode développement de l’archive) écoute sur **1028** ; Django écoute sur **1029**. Le proxy Vite transfère `/api/`, `/django-admin/` et `/static/` vers Django. En Docker Compose, `DJANGO_PROXY_TARGET=http://backend:1029` est défini pour le conteneur frontend. Hors Compose, la valeur par défaut est `http://127.0.0.1:1029` (modifiable via `DJANGO_PROXY_TARGET`). **Il est normal que les outils réseau du navigateur affichent le port 1028 : le transfert vers le port 1029 se fait côté serveur.** MySQL 8 reste privé au réseau Docker (aucun port 3306 publié). Pour une mise en production publique, remplacer le serveur de développement Vite/Django par un serveur web et Gunicorn correctement configurés. ### Persistance / sauvegarde - Fichiers : `./storage/files/`. - Importations en cours : `./storage/tmp/`. - Base MySQL 8 : **nouveau volume `mysql8_data`** de Compose. L’ancien `db_data` n’est pas supprimé ni réutilisé. Voir `MYSQL8_MIGRATION.md`. Sauvegarder **ensemble** le volume MySQL 8 et le dossier `storage`. Ne pas exécuter `docker compose down -v` : cela supprimerait la base stockée dans le volume. ## Méthode 2 — Pterodactyl (MySQL 8 externe) Si GoodDrive tourne dans un seul conteneur Pterodactyl, son backend doit accéder à une **base MySQL 8 externe**, via les variables `MYSQL_HOST`, `MYSQL_PORT`, `MYSQL_DATABASE`, `MYSQL_USER` et `MYSQL_PASSWORD` de Pterodactyl. `MYSQL_HOST=db` n'est valable que pour le Docker Compose ci-dessus. **Limite de l'archive fournie :** le `dockerfile` racine référence un `start.sh` absent et ne constitue pas, tel quel, une image monocon­teneur prête à déployer. Le présent correctif porte sur le mode Docker Compose. Une image Pterodactyl autonome nécessite son propre script de lancement et un serveur HTTP de production. ## Reverse proxy et gros fichiers - Utilise **HTTPS** sur l'accès distant : des identifiants circulent à chaque connexion. - Configure ton reverse proxy externe avec une limite suffisante : `client_max_body_size 0;` côté nginx et `proxy_request_buffering off;` pour ne pas recopie entière des très gros imports (le nginx fourni est déjà configuré). - Les envois de 8 Mio ou plus sont fractionnés en blocs de 8 Mio et peuvent reprendre après recharge/incident côté navigateur. Un navigateur différent ne récupère pas automatiquement la session locale de reprise. - Limite par fichier : `DRIVE_MAX_FILE_SIZE_MB`. L'espace disque est celui alloué au serveur Pterodactyl, **pas** un quota par utilisateur. - Une importation interrompue reste dans `storage/tmp` jusqu'à reprise. Pour nettoyer les sessions de plus de 14 jours : `python manage.py cleanup_uploads --days 14` dans le backend (ou `docker compose exec backend python manage.py cleanup_uploads --days 14`). Ne pas vider `tmp` pendant un import actif. ## Authentification / sécurité - Pas d'inscription ouverte ; les comptes sont créés via Django Admin. - Le JWT est conservé dans `sessionStorage` du navigateur, le renouvellement dans la session du même onglet (refresh 7 jours, access 30 minutes). Après fermeture de l'onglet, reconnexion nécessaire. - Les contrôles d'accès s'effectuent côté Django ; l'UI ne suffit pas pour protéger un document. - Les URL de téléchargement sont temporaires (5 min) et leur possession suffit à accéder au fichier pendant leur validité. Ne les partage pas publiquement. - Les utilisateurs peuvent modifier leurs propres fichiers et dossiers, et lire les racines partagées par d'autres comptes. Les administrateurs Django ont accès aux objets via les vues et peuvent gérer les comptes. ## Limites de cette première version Ce n'est **pas encore** un Nextcloud complet : pas de lien public permanent, pas de partage à un utilisateur précis, pas d'historique des versions, pas d'édition collaborative, pas de quota individuel, pas de WebDAV/Samba et pas de stockage chiffré de bout en bout. L'aperçu vidéo et la synchronisation automatique type client Drive ne sont pas inclus. Cette version prend en charge le téléchargement et l'import via navigateur. Pour les gros volumes de rushs (plusieurs dizaines de Go), le fractionnement évite de tout recommencer, mais les performances et la reprise sont à valider sur le réseau réel. Sauvegarde et HTTPS sont indispensables avant un usage important. ## Vérifications manuelles conseillées 1. Créer deux comptes : propriétaire A et salarié B. 2. Avec A, créer un dossier, importer un fichier, le renommer, le télécharger et l'ouvrir. 3. Avec B, vérifier que le dossier privé de A n'est pas accessible, puis que le dossier partagé de A est accessible en lecture seule. 4. Déplacer un dossier, mettre un fichier en corbeille, restaurer, puis supprimer définitivement un document test. 5. Couper volontairement la connexion au milieu d'un gros import et relancer le même fichier depuis le même navigateur pour vérifier la reprise. 6. Redémarrer le conteneur et vérifier que les fichiers et comptes sont toujours là. ## Tests automatisés Les tests Django sont dans `backend/drive/tests.py` : ```bash docker compose exec -e USE_SQLITE=1 backend python manage.py test drive ``` Note : dans Compose, utiliser la base de test dédiée automatique Django (normalement la base MySQL de tests) convient aussi : `docker compose exec backend python manage.py test drive` ; la variante SQLite évite d'avoir à créer une base MySQL de tests et n'est à réserver aux tests. ## Passage depuis MariaDB / erreur `ibdata1` Consulte **`MYSQL8_MIGRATION.md`**. Ne recycle pas un datadir MariaDB dans MySQL 8 : ce correctif crée un volume distinct sans effacer l’ancien.