From f3b4b309b6887154b95443e872f3422a57207bc6 Mon Sep 17 00:00:00 2001 From: thomas Date: Tue, 1 Sep 2026 08:25:25 +0200 Subject: [PATCH] fix(docker): Geocode-Cache-Volume war funktionslos (EISDIR) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Beim Hochfahren des echten Stacks aufgefallen: d9fecb6 mountet ein Named Volume auf einen DATEIpfad (geocode-cache:/app/geocode-cache.json). Ein Named Volume ist immer ein Verzeichnis — im laufenden Container liegt an der Stelle also ein Ordner. Jeder Lese- und Schreibversuch lief in EISDIR und wurde von den try/catch-Bloecken in utils/geocode.js still verschluckt: der Cache wurde nie geladen und nie gespeichert. Im laufenden drohnenfuehrer-backend nachgestellt: Schreiben schlaegt fehl: EISDIR - illegal operation on a directory Lesen schlaegt fehl: EISDIR - Der Cache-Pfad ist jetzt ueber GEOCODE_CACHE_FILE konfigurierbar und faellt ohne die Variable auf den bisherigen Ort zurueck. - Das Volume wird als Verzeichnis unter /app/cache gemountet, die Compose- Dateien setzen GEOCODE_CACHE_FILE=/app/cache/geocode-cache.json. - .dockerignore schliesst geocode-cache.json aus: eine bei lokalen Tests entstandene Datei war ueber COPY . . ins Image gewandert und liess den Container gar nicht mehr starten ("not a directory"). Geprueft: im neu gebauten nachsuche-backend ist /app/cache/geocode-cache.json schreibbar. Co-Authored-By: Claude Opus 5 --- drohnenfuehrer/backend/.dockerignore | 3 +++ drohnenfuehrer/backend/utils/geocode.js | 7 ++++++- drohnenfuehrer/docker-compose.yml | 3 ++- nachsuche/backend/.dockerignore | 3 +++ nachsuche/backend/utils/geocode.js | 7 ++++++- nachsuche/docker-compose.yml | 3 ++- portal/docker-compose.yml | 3 ++- stoeberhunde/backend/.dockerignore | 3 +++ stoeberhunde/backend/utils/geocode.js | 7 ++++++- stoeberhunde/docker-compose.yml | 3 ++- 10 files changed, 35 insertions(+), 7 deletions(-) diff --git a/drohnenfuehrer/backend/.dockerignore b/drohnenfuehrer/backend/.dockerignore index 6f4eb6f..aebd3e1 100644 --- a/drohnenfuehrer/backend/.dockerignore +++ b/drohnenfuehrer/backend/.dockerignore @@ -39,3 +39,6 @@ docs/ *.swp *.swo .DS_Store + +# Laufzeit-Cache, gehoert nicht ins Image +geocode-cache.json diff --git a/drohnenfuehrer/backend/utils/geocode.js b/drohnenfuehrer/backend/utils/geocode.js index 973cfdf..d2d9afd 100644 --- a/drohnenfuehrer/backend/utils/geocode.js +++ b/drohnenfuehrer/backend/utils/geocode.js @@ -4,7 +4,12 @@ const path = require('path'); const config = require('../config/env'); const logger = require('./logger'); -const CACHE_FILE = path.join(__dirname, '..', 'geocode-cache.json'); +// Pfad konfigurierbar: im Container zeigt GEOCODE_CACHE_FILE in ein +// Verzeichnis-Volume. Ein Named Volume ist immer ein Verzeichnis und kann +// nicht auf einen Dateipfad gemountet werden — vorher lief jeder Lese- und +// Schreibversuch in EISDIR, still verschluckt vom try/catch. +const CACHE_FILE = process.env.GEOCODE_CACHE_FILE + || path.join(__dirname, '..', 'geocode-cache.json'); const CACHE_SAVE_INTERVAL = 60000; // Save every 60 seconds const CACHE_MAX_ENTRIES = 1000; diff --git a/drohnenfuehrer/docker-compose.yml b/drohnenfuehrer/docker-compose.yml index c80569c..b7f25cc 100644 --- a/drohnenfuehrer/docker-compose.yml +++ b/drohnenfuehrer/docker-compose.yml @@ -28,9 +28,10 @@ services: - default - jagd-network volumes: - - geocode-cache:/app/geocode-cache.json + - geocode-cache:/app/cache environment: - NODE_ENV=production + - GEOCODE_CACHE_FILE=/app/cache/geocode-cache.json - MONGO_URI=mongodb://drohnenfuehrer:${MONGO_PASSWORD}@mongo:27017/drohnenfuehrer?authSource=admin # :? statt stiller Leerersetzung — sonst startet das Backend mit # leerem Secret und beendet sich sofort wieder (Crash-Loop). diff --git a/nachsuche/backend/.dockerignore b/nachsuche/backend/.dockerignore index 6f4eb6f..aebd3e1 100644 --- a/nachsuche/backend/.dockerignore +++ b/nachsuche/backend/.dockerignore @@ -39,3 +39,6 @@ docs/ *.swp *.swo .DS_Store + +# Laufzeit-Cache, gehoert nicht ins Image +geocode-cache.json diff --git a/nachsuche/backend/utils/geocode.js b/nachsuche/backend/utils/geocode.js index 46d5348..4c105c0 100644 --- a/nachsuche/backend/utils/geocode.js +++ b/nachsuche/backend/utils/geocode.js @@ -4,7 +4,12 @@ const path = require('path'); const config = require('../config/env'); const logger = require('./logger'); -const CACHE_FILE = path.join(__dirname, '..', 'geocode-cache.json'); +// Pfad konfigurierbar: im Container zeigt GEOCODE_CACHE_FILE in ein +// Verzeichnis-Volume. Ein Named Volume ist immer ein Verzeichnis und kann +// nicht auf einen Dateipfad gemountet werden — vorher lief jeder Lese- und +// Schreibversuch in EISDIR, still verschluckt vom try/catch. +const CACHE_FILE = process.env.GEOCODE_CACHE_FILE + || path.join(__dirname, '..', 'geocode-cache.json'); const CACHE_SAVE_INTERVAL = 60000; // Save every 60 seconds const CACHE_MAX_ENTRIES = 1000; diff --git a/nachsuche/docker-compose.yml b/nachsuche/docker-compose.yml index 5314b72..f584254 100644 --- a/nachsuche/docker-compose.yml +++ b/nachsuche/docker-compose.yml @@ -30,9 +30,10 @@ services: - default - jagd-network volumes: - - geocode-cache:/app/geocode-cache.json + - geocode-cache:/app/cache environment: - NODE_ENV=production + - GEOCODE_CACHE_FILE=/app/cache/geocode-cache.json - MONGO_URI=mongodb://nachsuche:${MONGO_PASSWORD}@mongo:27017/nachsuche?authSource=admin # :? statt stiller Leerersetzung — sonst startet das Backend mit # leerem Secret und beendet sich sofort wieder (Crash-Loop). diff --git a/portal/docker-compose.yml b/portal/docker-compose.yml index aafbe41..b9bc9bb 100644 --- a/portal/docker-compose.yml +++ b/portal/docker-compose.yml @@ -4,7 +4,8 @@ services: container_name: jagd-portal restart: unless-stopped ports: - - "8090:80" + # Port konfigurierbar, damit der Aufbau nicht an einer Belegung scheitert + - "${PORTAL_PORT:-8090}:80" networks: - default - jagd-network diff --git a/stoeberhunde/backend/.dockerignore b/stoeberhunde/backend/.dockerignore index 6f4eb6f..aebd3e1 100644 --- a/stoeberhunde/backend/.dockerignore +++ b/stoeberhunde/backend/.dockerignore @@ -39,3 +39,6 @@ docs/ *.swp *.swo .DS_Store + +# Laufzeit-Cache, gehoert nicht ins Image +geocode-cache.json diff --git a/stoeberhunde/backend/utils/geocode.js b/stoeberhunde/backend/utils/geocode.js index 973cfdf..d2d9afd 100644 --- a/stoeberhunde/backend/utils/geocode.js +++ b/stoeberhunde/backend/utils/geocode.js @@ -4,7 +4,12 @@ const path = require('path'); const config = require('../config/env'); const logger = require('./logger'); -const CACHE_FILE = path.join(__dirname, '..', 'geocode-cache.json'); +// Pfad konfigurierbar: im Container zeigt GEOCODE_CACHE_FILE in ein +// Verzeichnis-Volume. Ein Named Volume ist immer ein Verzeichnis und kann +// nicht auf einen Dateipfad gemountet werden — vorher lief jeder Lese- und +// Schreibversuch in EISDIR, still verschluckt vom try/catch. +const CACHE_FILE = process.env.GEOCODE_CACHE_FILE + || path.join(__dirname, '..', 'geocode-cache.json'); const CACHE_SAVE_INTERVAL = 60000; // Save every 60 seconds const CACHE_MAX_ENTRIES = 1000; diff --git a/stoeberhunde/docker-compose.yml b/stoeberhunde/docker-compose.yml index f24a592..ef72832 100644 --- a/stoeberhunde/docker-compose.yml +++ b/stoeberhunde/docker-compose.yml @@ -28,9 +28,10 @@ services: - default - jagd-network volumes: - - geocode-cache:/app/geocode-cache.json + - geocode-cache:/app/cache environment: - NODE_ENV=production + - GEOCODE_CACHE_FILE=/app/cache/geocode-cache.json - MONGO_URI=mongodb://stoeberhunde:${MONGO_PASSWORD}@mongo:27017/stoeberhunde?authSource=admin # :? statt stiller Leerersetzung — sonst startet das Backend mit # leerem Secret und beendet sich sofort wieder (Crash-Loop).