diff --git a/.gitignore b/.gitignore index c3d195d..2af6c35 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,8 @@ /services/40-keycloak/volume/realm/realm-export.json +/services/50-keeweb/volume + /services/50-komga/volume /services/50-nextcloud/volume/data diff --git a/misc/images/keeweb/containers/webdav.js b/misc/images/keeweb/containers/webdav.js index 785c988..93b9f42 100644 --- a/misc/images/keeweb/containers/webdav.js +++ b/misc/images/keeweb/containers/webdav.js @@ -1,21 +1,78 @@ const webdav = require('webdav-server').v2; +const fs = require('fs'); +const path = require('path'); const adminUser = process.env.WEBDAV_USER || 'admin'; const adminPass = process.env.WEBDAV_PASS || 'password'; +const WEB_URL = process.env.WEB_URL || 'localhost'; +const PROTOCOLE = process.env.PROTOCOLE || 'http'; +const ALLOWED_ORIGIN = `${PROTOCOLE}://${WEB_URL}`; +const ROOT_DIR = '/data'; +// Auth const userManager = new webdav.SimpleUserManager(); -const user = userManager.addUser(adminUser, adminPass, false); // false = pas admin système - +const user = userManager.addUser(adminUser, adminPass, false); const privilegeManager = new webdav.SimplePathPrivilegeManager(); +privilegeManager.setRights(user, '/', ['all']); +// ✅ LoggingFileSystem étend PhysicalFileSystem +class LoggingFileSystem extends webdav.PhysicalFileSystem { + move(ctx, source, destination, callback) { + console.log(`🟡 MOVE requested from ${source.toString()} to ${destination.toString()}`); + + const srcPath = path.join(ROOT_DIR, source.toString()); + const destPath = path.join(ROOT_DIR, destination.toString()); + + fs.promises.mkdir(path.dirname(destPath), { recursive: true }) + .then(() => fs.promises.rename(srcPath, destPath)) + .then(() => { + console.log(`✅ MOVE succeeded: ${srcPath} -> ${destPath}`); + if (typeof callback === 'function') callback(null); + }) + .catch(err => { + console.error(`❌ MOVE failed: ${err.message}`); + if (typeof callback === 'function') callback(err); + }); + } + +} + +// Serveur WebDAV const server = new webdav.WebDAVServer({ port: 9999, hostname: '0.0.0.0', httpAuthentication: new webdav.HTTPBasicAuthentication(userManager, 'default realm'), privilegeManager, - rootFileSystem: new webdav.PhysicalFileSystem('/data') + rootFileSystem: new LoggingFileSystem(ROOT_DIR), + responseHeaders: { + 'Access-Control-Allow-Origin': ALLOWED_ORIGIN, + 'Access-Control-Allow-Credentials': 'true', + 'Access-Control-Allow-Headers': 'Authorization, Depth, Content-Type', + 'Access-Control-Allow-Methods': 'GET, PUT, OPTIONS, MKCOL, PROPFIND, DELETE, COPY, MOVE, LOCK, UNLOCK' + } }); -server.start(() => { - console.log(`WebDAV server running at http://0.0.0.0:9999 as ${adminUser}`); +// Ajout header Last-Modified +server.beforeRequest((arg, next) => { + const { request, response, requested } = arg; + + if (request.method === 'GET' || request.method === 'HEAD') { + const filePath = path.join(ROOT_DIR, decodeURIComponent(requested.path.toString())); + fs.stat(filePath, (err, stats) => { + if (!err && stats.isFile()) { + response.setHeader('Last-Modified', stats.mtime.toUTCString()); + console.log(`[INFO] Added Last-Modified: ${stats.mtime.toUTCString()} for ${filePath}`); + } + next(); + }); + } else { + next(); + } +}); + +// Start +server.start(() => { + console.log(`✅ WebDAV server ready at http://0.0.0.0:9999`); + console.log(`🔐 Auth: user="${adminUser}", pass="***"`); + console.log(`🌐 CORS: Allow-Origin = ${ALLOWED_ORIGIN}`); }); diff --git a/misc/images/keeweb/init.kdbx b/misc/images/keeweb/init.kdbx deleted file mode 100644 index e69de29..0000000 diff --git a/services/50-keeweb/apache/apache.conf b/services/50-keeweb/apache/apache.conf index 71f8104..7dbe867 100644 --- a/services/50-keeweb/apache/apache.conf +++ b/services/50-keeweb/apache/apache.conf @@ -1,4 +1,4 @@ # Keeweb -ProxyPass /keeweb http://keeweb retry=0 keepalive=On -ProxyPassReverse /keeweb http://keeweb retry=0 +ProxyPass /keeweb http://keeweb/keeweb retry=0 keepalive=On +ProxyPassReverse /keeweb http://keeweb/keeweb retry=0 diff --git a/services/50-keeweb/dockercompose/dockercompose.yml b/services/50-keeweb/dockercompose/dockercompose.yml index 7aa9666..51f91b3 100644 --- a/services/50-keeweb/dockercompose/dockercompose.yml +++ b/services/50-keeweb/dockercompose/dockercompose.yml @@ -10,4 +10,4 @@ services: networks: - nine-network volumes: - - ./services/50-keeweb/volume/data:/web + - ./services/50-keeweb/volume/data:/data