fix(server): rendre les chemins par défaut indépendants du cwd
CLIENT_DIST_PATH et TMP_DIR se résolvaient via process.cwd(), donc uniquement correct si le process est lancé depuis server/. Repéré en mettant en place la prévisualisation locale (.claude/launch.json, non versionné) : npm --prefix server run dev depuis la racine du dépôt ne change pas le cwd du script lancé, `npm --prefix server exec -- node -e "console.log(process.cwd())"` le confirme (reste la racine du dépôt). Résout désormais les deux chemins depuis l'emplacement du module (import.meta.url) plutôt que process.cwd() - invariant quel que soit le répertoire de lancement, y compris en Docker. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
725c5a5a7f
commit
cbfce996ed
2 changed files with 12 additions and 4 deletions
|
|
@ -1,4 +1,5 @@
|
||||||
import { resolve } from 'node:path';
|
import { resolve } from 'node:path';
|
||||||
|
import { fileURLToPath } from 'node:url';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configuration runtime du serveur, dérivée des variables d'environnement.
|
* Configuration runtime du serveur, dérivée des variables d'environnement.
|
||||||
|
|
@ -16,11 +17,18 @@ export interface ServerConfig {
|
||||||
readonly maxConcurrentDownloads: number;
|
readonly maxConcurrentDownloads: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Dossier contenant ce module compilé (server/dist/ en prod, server/src/ sous
|
||||||
|
// tsx en dev - même profondeur sous server/ dans les deux cas). Sert de base
|
||||||
|
// aux chemins par défaut ci-dessous : contrairement à process.cwd(), invariant
|
||||||
|
// quel que soit le répertoire depuis lequel le process a été lancé (ex. `npm
|
||||||
|
// --prefix server run dev` depuis la racine du dépôt ne change pas le cwd).
|
||||||
|
const here = fileURLToPath(new URL('.', import.meta.url));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construit la configuration du serveur à partir des variables d'environnement,
|
* Construit la configuration du serveur à partir des variables d'environnement,
|
||||||
* en appliquant des valeurs par défaut adaptées au développement local (le
|
* en appliquant des valeurs par défaut adaptées au développement local (le
|
||||||
* client compilé et le dossier temporaire sont alors supposés voisins de
|
* client compilé et le dossier temporaire sont alors supposés voisins de
|
||||||
* `server/`).
|
* `server/`, indépendamment du répertoire de travail courant).
|
||||||
*
|
*
|
||||||
* @returns La configuration runtime résolue.
|
* @returns La configuration runtime résolue.
|
||||||
*/
|
*/
|
||||||
|
|
@ -31,8 +39,8 @@ export function loadConfig(): ServerConfig {
|
||||||
return {
|
return {
|
||||||
port: Number.isNaN(parsedPort) ? 3000 : parsedPort,
|
port: Number.isNaN(parsedPort) ? 3000 : parsedPort,
|
||||||
host: process.env.HOST ?? '0.0.0.0',
|
host: process.env.HOST ?? '0.0.0.0',
|
||||||
clientDistPath: process.env.CLIENT_DIST_PATH ?? resolve(process.cwd(), '../client/dist'),
|
clientDistPath: process.env.CLIENT_DIST_PATH ?? resolve(here, '../../client/dist'),
|
||||||
tmpDir: process.env.TMP_DIR ?? resolve(process.cwd(), 'tmp'),
|
tmpDir: process.env.TMP_DIR ?? resolve(here, '../tmp'),
|
||||||
maxConcurrentDownloads:
|
maxConcurrentDownloads:
|
||||||
Number.isNaN(parsedConcurrency) || parsedConcurrency < 1 ? 2 : parsedConcurrency,
|
Number.isNaN(parsedConcurrency) || parsedConcurrency < 1 ? 2 : parsedConcurrency,
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ Pas de `docker-compose.yml` pour l'instant (une seule image, pas encore de dépe
|
||||||
|
|
||||||
- Fastify 5, TypeScript strict, ESM (`"type": "module"`, imports relatifs en `.js`, résolution `NodeNext`).
|
- Fastify 5, TypeScript strict, ESM (`"type": "module"`, imports relatifs en `.js`, résolution `NodeNext`).
|
||||||
- `src/index.ts` : bootstrap (plugins, écoute, arrêt propre SIGINT/SIGTERM).
|
- `src/index.ts` : bootstrap (plugins, écoute, arrêt propre SIGINT/SIGTERM).
|
||||||
- `src/config.ts` : configuration runtime depuis l'environnement (`PORT`, `HOST`, `CLIENT_DIST_PATH`).
|
- `src/config.ts` : configuration runtime depuis l'environnement (`PORT`, `HOST`, `CLIENT_DIST_PATH`, `TMP_DIR`, `MAX_CONCURRENT_DOWNLOADS`). Les valeurs par défaut de `CLIENT_DIST_PATH`/`TMP_DIR` sont résolues depuis l'emplacement du module (`import.meta.url`), pas `process.cwd()` : reste correct quel que soit le répertoire depuis lequel le process est lancé (ex. `npm --prefix server run dev` depuis la racine du dépôt, utilisé par `.claude/launch.json` pour la prévisualisation - non versionné, voir `.gitignore`).
|
||||||
- `src/routes/` : routes Fastify enregistrées comme plugins (`health.ts`, `channel.ts`, `queue.ts`). Chaque domaine métier suit le même principe : un plugin de route fin sous `src/routes/`, qui délègue à un service sous `src/services/`.
|
- `src/routes/` : routes Fastify enregistrées comme plugins (`health.ts`, `channel.ts`, `queue.ts`). Chaque domaine métier suit le même principe : un plugin de route fin sous `src/routes/`, qui délègue à un service sous `src/services/`.
|
||||||
- `src/services/` :
|
- `src/services/` :
|
||||||
- `ytDlpRunner.ts` : exécution bas niveau de yt-dlp (`node:child_process.spawn`, jamais de shell - arguments toujours passés en tableau, jamais concaténés dans une chaîne, pour exclure toute injection de commande). Supporte le suivi ligne par ligne de stdout (`onStdoutLine`, pour la progression) et l'annulation via `AbortSignal`.
|
- `ytDlpRunner.ts` : exécution bas niveau de yt-dlp (`node:child_process.spawn`, jamais de shell - arguments toujours passés en tableau, jamais concaténés dans une chaîne, pour exclure toute injection de commande). Supporte le suivi ligne par ligne de stdout (`onStdoutLine`, pour la progression) et l'annulation via `AbortSignal`.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue