From f9f17bd169d9518e393022e709078bd9552276df Mon Sep 17 00:00:00 2001 From: Nicolas Date: Wed, 9 Sep 2026 23:25:11 +0200 Subject: [PATCH] Ajout d'un compose.yaml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Service unique : build local (ou image publiée en commentaire), non-root, restart: unless-stopped. - config.json monté en lecture seule ; un montage ./data:/data pour les dossiers de dépôt (les `dir` des targets pointent sous /data). - Commentaires sur l'uid 1000, le remap de port, l'override `user:`. - .gitignore / .dockerignore : ajout de data/ ; README : section Docker réécrite autour de Compose. Co-Authored-By: Claude Sonnet 5 --- .dockerignore | 2 ++ .gitignore | 1 + README.md | 45 +++++++++++++++++++++++---------------------- compose.yaml | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 22 deletions(-) create mode 100644 compose.yaml diff --git a/.dockerignore b/.dockerignore index 7a0dbed..304044a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -7,6 +7,7 @@ coverage .env config.json uploads +data # VCS / outillage / docs sans intérêt au build .git @@ -25,5 +26,6 @@ eslint.config.mjs .prettierignore Dockerfile .dockerignore +compose.yaml README.md Claude.md diff --git a/.gitignore b/.gitignore index e184f94..b02fb22 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ coverage/ .env config.json uploads/ +data/ *.log diff --git a/README.md b/README.md index 8d1f489..dde2182 100644 --- a/README.md +++ b/README.md @@ -62,37 +62,37 @@ npm start ## Docker Image multi-stage (Debian slim ; Alpine exclu à cause du module natif -`sodium-native`). Le `config.json` et les dossiers de dépôt sont montés, jamais -inclus dans l'image. +`sodium-native`), exécutée en non-root. Le `config.json` et les dossiers de +dépôt sont **montés**, jamais inclus dans l'image. + +### Compose (recommandé) + +Voir [`compose.yaml`](compose.yaml). + +```bash +cp config.example.json config.json # puis éditer publicUrl, session.key, oidc.* +mkdir -p ./data && sudo chown -R 1000:1000 ./data +docker compose up -d --build +``` + +Dans `config.json`, faire pointer les `dir` des `targets` sous `/data` +(ex. `"dir": "/data/photos"`). Le conteneur tourne en uid `1000` (utilisateur +`node`) : `./data` doit lui être inscriptible. + +### Sans Compose ```bash docker build -t mediadrop . - docker run --rm -p 3000:3000 \ -v "$PWD/config.json:/app/config.json:ro" \ - -v "$PWD/data/photos:/data/photos" \ + -v "$PWD/data:/data" \ mediadrop ``` -Les `dir` des `targets` doivent pointer vers des chemins montés, inscriptibles -par l'uid `1000` (utilisateur `node`). Exemple `compose.yaml` : - -```yaml -services: - mediadrop: - build: . - ports: - - '3000:3000' - volumes: - - ./config.json:/app/config.json:ro - - ./data/photos:/data/photos - - ./data/videos:/data/videos - restart: unless-stopped -``` - La découverte OIDC a lieu au démarrage : si l'issuer est injoignable, le -conteneur s'arrête (utiliser `restart: unless-stopped`). Le `HEALTHCHECK` -interroge `GET /health` sur le port `3000` — l'adapter si `port` diffère. +conteneur s'arrête (d'où `restart: unless-stopped`). Le `HEALTHCHECK` interroge +`GET /health` sur le port `3000` — garder `port: 3000` dans `config.json` et +remapper côté hôte si besoin. ## Endpoints @@ -187,6 +187,7 @@ Seule variable d'environnement : `MEDIADROP_CONFIG` (chemin du fichier, défaut config.example.json modèle de configuration (à copier en config.json) config.schema.json schéma JSON (validation / autocomplétion éditeur) Dockerfile image multi-stage (deps / build / runtime non-root) +compose.yaml déploiement Docker Compose (config + /data montés) src/ index.ts entrée : config -> app -> écoute + arrêt propre app.ts construction de l'instance Fastify (exportée pour les tests) diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..d27b1fa --- /dev/null +++ b/compose.yaml @@ -0,0 +1,33 @@ +# Démarrage : +# cp config.example.json config.json # puis éditer (publicUrl, session.key, oidc.*) +# mkdir -p ./data && sudo chown -R 1000:1000 ./data +# docker compose up -d --build +# +# Dans config.json, faire pointer les `dir` des `targets` sous /data, +# par ex. { "name": "photos", "dir": "/data/photos" }. + +services: + mediadrop: + build: + context: . + dockerfile: Dockerfile + # Alternative : utiliser une image publiée plutôt que builder localement. + # image: git.dev.kyuno.fr/kyuno/mediadrop:latest + container_name: mediadrop + restart: unless-stopped + + ports: + # :. Garder 3000 côté conteneur (= `port` de config.json + # et port du HEALTHCHECK) ; remapper côté hôte si besoin, ex. "8080:3000". + - '3000:3000' + + volumes: + # Configuration, en lecture seule — montée, jamais incluse dans l'image. + - ./config.json:/app/config.json:ro + # Données : les `dir` des `targets` doivent vivre sous /data. + - ./data:/data + + # Le conteneur tourne en uid 1000 (utilisateur `node`) : ./data doit lui être + # inscriptible (voir le chown ci-dessus). Sous Linux, pour tourner sous ton + # propre uid avec des dossiers t'appartenant : + # user: '${MEDIADROP_UID:-1000}:${MEDIADROP_GID:-1000}'