2b5f68752ff684a21435d8c25d0b262194eff714
Passenger only manages the Next.js app process; the worker now gets the same crash-recovery/auto-restart via pm2, replacing the cron-driven PID-file restart hack. Updates README deployment steps accordingly. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Ombrora YTDLP
Interface web de téléchargement de vidéos via yt-dlp, avec file d'attente persistante, suivi en base de données et liens de téléchargement sécurisés.
Fonctionnement
- L'utilisateur soumet une URL depuis l'interface web.
- La demande est enregistrée en base (statut
PENDING). - Le worker (Node.js, arrière-plan, supervisé par pm2) dépile les jobs et exécute
yt-dlpen parallèle (concurrence configurable). - Le fichier téléchargé est stocké localement ; un token signé (24h) est généré.
- L'utilisateur est redirigé vers une page de statut qui se rafraîchit jusqu'à ce que le fichier soit prêt.
- Un cron quotidien supprime les fichiers expirés et marque les entrées
FILE_DELETED— la DB conserve l'historique complet.
Stack technique
| Couche | Technologie |
|---|---|
| Framework | Next.js 16 (App Router) |
| Base de données | MariaDB 11 via Prisma 7 |
| Frontend | React 19, TypeScript |
| Worker | Node.js (tsx), supervisé par pm2 |
| Conteneur (dev) | Docker Compose |
Prérequis
- Node.js 20+
- Docker & Docker Compose (pour MariaDB en développement)
yt-dlpetffmpeg(binaires précompilés dans./bin/ou dans lePATH)
Démarrage rapide
# 1. Cloner le dépôt
git clone <url> ombrora-ytdlp && cd ombrora-ytdlp
# 2. Copier et remplir les variables d'environnement
cp .env.example .env
# 3. Démarrer MariaDB
docker-compose up -d
# 4. Installer les dépendances
npm install
# 5. Appliquer les migrations Prisma
npm run db:migrate
# 6. Lancer le serveur Next.js
npm run dev
# 7. Dans un autre terminal, lancer le worker
npm run worker
L'interface est accessible sur http://localhost:3000.
Variables d'environnement
| Variable | Requis | Exemple | Description |
|---|---|---|---|
DATABASE_URL |
oui | mysql://ombrora:ombrora@localhost:3306/ombrora |
Connexion MariaDB |
STORAGE_PATH |
oui | /var/www/ombrora/storage |
Répertoire de stockage des fichiers téléchargés |
BIN_DIR |
non | ./bin |
Répertoire contenant yt-dlp et ffmpeg (défaut : ./bin) |
Scripts npm
| Script | Description |
|---|---|
npm run dev |
Serveur de développement Next.js |
npm run build |
Build de production |
npm start |
Serveur de production |
npm test |
Tests Jest |
npm run worker |
Worker de téléchargement (boucle de polling, exécution directe/dev) |
npm run worker:pm2:start |
Démarre le worker sous pm2 (ecosystem.config.cjs), avec auto-restart |
npm run worker:pm2:stop |
Arrête le worker géré par pm2 |
npm run worker:pm2:restart |
Redémarre le worker géré par pm2 |
npm run worker:pm2:status |
Affiche l'état du process ombrora-worker |
npm run worker:pm2:logs |
Affiche les logs du worker géré par pm2 |
npm run worker:cleanup |
Expire et supprime les fichiers anciens (usage cron) |
npm run db:migrate |
Crée et applique les migrations Prisma |
npm run db:generate |
Régénère le client Prisma |
Configuration
Les paramètres applicatifs sont centralisés dans config/app.config.ts :
DOWNLOAD_LINK_TTL_HOURS: 24 // Durée de validité du token de téléchargement
WORKER_CONCURRENCY: 3 // Téléchargements parallèles maximum
WORKER_POLL_INTERVAL_MS: 10000 // Intervalle de polling du worker (ms)
RATE_LIMIT_MAX: 5 // Soumissions max par IP par fenêtre
RATE_LIMIT_WINDOW_MS: 3600000 // Fenêtre de rate-limit (1h)
API
| Méthode | Endpoint | Description |
|---|---|---|
POST |
/api/downloads |
Soumet une URL. Corps JSON : { url, format?, quality?, subtitles?, extraArgs? }. Retourne { uuid }. |
GET |
/api/downloads/:uuid |
Statut d'un téléchargement. Retourne { status, fileName, fileSize, downloadToken?, tokenExpiresAt?, errorMsg? }. |
GET |
/api/download/:token |
Téléchargement du fichier (token à usage unique, 24h). |
Architecture
src/
├── app/
│ ├── page.tsx # Page d'accueil (formulaire de soumission)
│ ├── status/[uuid]/page.tsx # Page de suivi
│ └── api/
│ ├── downloads/route.ts # POST — création
│ ├── downloads/[uuid]/route.ts # GET — statut
│ └── download/[token]/route.ts # GET — téléchargement
├── components/
│ ├── SubmitForm.tsx # Formulaire de soumission
│ └── StatusView.tsx # Vue de suivi (polling)
└── lib/
├── prisma.ts # Client Prisma (singleton)
├── rate-limit.ts # Rate limiting par IP
├── token.ts # Génération/validation de tokens
└── ytdlp.ts # Construction des arguments yt-dlp
worker/
├── index.ts # Boucle de polling principale
├── processor.ts # Exécution de yt-dlp, mise à jour DB
└── cron-cleanup.ts # Nettoyage des fichiers expirés
ecosystem.config.cjs # Config pm2 du process "ombrora-worker"
prisma/
└── schema.prisma # Modèles : Download, DownloadToken
Déploiement (o2switch / Passenger)
Contraintes spécifiques à l'hébergement mutualisé
- Pas de compilation sur le serveur :
yt-dlpetffmpegdoivent être des binaires précompilés pour la plateforme cible, placés dansBIN_DIR. node_modulesunique : Passenger ne crée qu'un seulnode_modulesà la racine. Toute dépendance runtime importée par le frontend doit figurer dans ledependenciesdupackage.jsonracine (en plus defrontend/package.json).- Worker : Passenger ne supervise que l'app Next.js. Le worker est un process à part, maintenu vivant par pm2 (auto-restart en cas de crash), à la manière de Passenger pour l'app web.
Étapes de déploiement
- Uploader les sources (hors
node_modules,.env,storage/). - Déposer
yt-dlpetffmpegdansBIN_DIR. - Créer
.envavec les valeurs de production. - Via cPanel > "Setup Node.js App" : pointer sur le dépôt, lancer
npm installpuisnpm run build.pm2est installé comme dépendance de production par ce mêmenpm install. - Appliquer les migrations :
npm run db:migrate. - Démarrer le worker sous pm2 (en SSH, dans l'environnement Node fourni par cPanel) :
npm run worker:pm2:start pm2 save # persiste la liste des process pour un `pm2 resurrect` après reboot - Configurer un cron cPanel pour
npm run worker:cleanupune fois par jour (suppression des fichiers expirés). pm2 gère lui-même le redémarrage du worker en cas de crash ; il n'y a donc plus besoin de cron de supervision dédié. - Si l'hébergeur redémarre le serveur, relancer
pm2 resurrect(ounpm run worker:pm2:startsi la sauvegardepm2 saven'a pas été faite) pour reprendre le worker.
Tests
npm test
Tests Jest (environnement Node, transpilation SWC). Les fichiers de test sont dans **/__tests__/**/*.test.ts.
Licence
Usage interne — non distribué.
Languages
TypeScript
98.8%
JavaScript
0.6%
Shell
0.5%
CSS
0.1%