# File Drop Un hébergeur de fichiers privé, auto-hébergé et minimal. On dépose un fichier, on reçoit un lien secret et intraçable. Les images, vidéos et sons s'affichent directement dans le navigateur ; les autres fichiers se téléchargent. - **Backend** — Rust (Axum + Tokio) - **Frontend** — Svelte (Vite + Tailwind) - **Stockage** — système de fichiers local, sans base de données ## Démarrage rapide ```bash # 1. Construire le frontend (produit frontend/dist) cd frontend npm install npm run build cd .. # 2. Lancer le serveur (depuis la racine du projet) cargo run --release --manifest-path backend/Cargo.toml ``` Ouvrir ensuite http://localhost:3000. > Les chemins `STORAGE_DIR` et `STATIC_DIR` sont relatifs au dossier de > lancement. Lance donc le serveur depuis la racine du projet (ou règle ces > variables en absolu dans `.env`). ## Configuration Copier `backend/.env.example` vers `.env` puis l'adapter. | Variable | Défaut | Rôle | | ---------------------- | ----------------- | ----------------------------------------- | | `HOST` / `PORT` | `0.0.0.0` / `3000`| Adresse d'écoute. | | `STORAGE_DIR` | `./storage` | Dossier des fichiers et métadonnées. | | `STATIC_DIR` | `./frontend/dist` | Dossier du frontend construit. | | `MAX_FILE_SIZE` | `10GB` | Taille maximale d'envoi. | | `FILE_TTL_MS` | `172800000` | Durée de vie d'un fichier (48 h max). | | `KEY_LENGTH` | `8` | Longueur de la clé de partage (`a-z0-9`). | | `PUBLIC_BASE_URL` | — | URL publique pour les liens absolus. | | `RATE_LIMIT_ENABLED` | `1` | Limite de requêtes par IP. | | `RATE_LIMIT_MAX` | `300` | Requêtes max par fenêtre. | | `RATE_LIMIT_WINDOW_MS` | `60000` | Fenêtre en millisecondes. | | `TRUST_PROXY` | `0` | Activer derrière un proxy (`X-Forwarded-For`). | ## API | Méthode | Route | Rôle | | --------- | -------------------- | ------------------------------------------- | | `POST` | `/api/upload` | Envoi d'un fichier (`multipart/form-data`). | | `GET` | `/:key` | Téléchargement (inline pour les médias). | | `POST` | `/api/auth/:key` | Mot de passe d'un fichier protégé. | | `DELETE` | `/api/files/:id` | Suppression (en-tête `X-Delete-Key`). | | `GET` | `/api/health` | État du service. | Exemple : ```bash curl -F "file=@photo.png" http://localhost:3000/api/upload ``` Le lien renvoyé est de la forme `http://localhost:3000/.png`. Ajouter `?dl=1` force le téléchargement au lieu de l'affichage. ## Structure ``` backend/ serveur Rust (Axum) frontend/ interface Svelte (Vite + Tailwind) scripts/ tests storage/ données (généré au premier lancement) ``` ## Tests ```bash cargo build # dans backend/ bash scripts/e2e-test.sh ``` Le test couvre l'envoi, le téléchargement, l'authentification par mot de passe, les clés invalides, la sanitisation des noms et la suppression.