diff --git a/env/.env b/env/.env
index ce5f147..77d63a1 100644
--- a/env/.env
+++ b/env/.env
@@ -171,6 +171,12 @@ DOKUWIKI_ACTIVATE=0
DOKUWIKI_LOCAL=1
DOKUWIKI_URL=${PROTOCOLE}://${WEB_URL}/dokuwiki
+# KEEWEB
+KEEWEB_SERVICE_NAME=keeweb
+KEEWEB_ACTIVATE=0
+KEEWEB_LOCAL=1
+KEEWEB_URL=${PROTOCOLE}://${WEB_URL}/keeweb
+
# KOMGA
KOMGA_SERVICE_NAME=komga
KOMGA_ACTIVATE=0
diff --git a/misc/images/keeweb/containers/Dockerfile b/misc/images/keeweb/containers/Dockerfile
new file mode 100755
index 0000000..e0f4c7a
--- /dev/null
+++ b/misc/images/keeweb/containers/Dockerfile
@@ -0,0 +1,32 @@
+FROM reg.cadoles.com/envole/nineapache:8.2
+
+USER root
+
+# Installe Node.js + npm
+RUN apk add --no-cache nodejs npm
+
+# Crée le dossier de l'app
+WORKDIR /app
+
+# Installe webdav-server localement (dans /app/node_modules)
+RUN npm install webdav-server@2
+
+# Copie ton script WebDAV dans /app
+COPY webdav.js /app/webdav.js
+
+# Installe KeeWeb
+RUN curl -L https://github.com/keeweb/keeweb/releases/download/v1.18.7/KeeWeb-1.18.7.html.zip -o /tmp/keeweb.zip \
+ && unzip /tmp/keeweb.zip -d /app/public \
+ && sed -i 's|
+ ProxyPass http://127.0.0.1:9999/
+ ProxyPassReverse http://127.0.0.1:9999/
+
+
+
+ Options FollowSymLinks
+ AllowOverride Limit Options FileInfo
+ DirectoryIndex index.php
+ Require all granted
+
diff --git a/misc/images/keeweb/containers/webdav.js b/misc/images/keeweb/containers/webdav.js
new file mode 100644
index 0000000..785c988
--- /dev/null
+++ b/misc/images/keeweb/containers/webdav.js
@@ -0,0 +1,21 @@
+const webdav = require('webdav-server').v2;
+
+const adminUser = process.env.WEBDAV_USER || 'admin';
+const adminPass = process.env.WEBDAV_PASS || 'password';
+
+const userManager = new webdav.SimpleUserManager();
+const user = userManager.addUser(adminUser, adminPass, false); // false = pas admin système
+
+const privilegeManager = new webdav.SimplePathPrivilegeManager();
+
+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')
+});
+
+server.start(() => {
+ console.log(`WebDAV server running at http://0.0.0.0:9999 as ${adminUser}`);
+});
diff --git a/misc/images/keeweb/docker-compose.yml b/misc/images/keeweb/docker-compose.yml
new file mode 100755
index 0000000..0211585
--- /dev/null
+++ b/misc/images/keeweb/docker-compose.yml
@@ -0,0 +1,14 @@
+version: '3'
+
+services:
+ keeweb:
+ build:
+ context: ./containers
+ image: reg.cadoles.com/envole/keeweb
+ container_name: keeweb
+ ports:
+ - "80:80"
+ - "443:443"
+ environment:
+ WEBDAV_USER: tonuser
+ WEBDAV_PASS: tonpassword
\ No newline at end of file
diff --git a/misc/images/keeweb/init.kdbx b/misc/images/keeweb/init.kdbx
new file mode 100644
index 0000000..e69de29
diff --git a/services/50-keeweb/apache/apache.conf b/services/50-keeweb/apache/apache.conf
new file mode 100644
index 0000000..71f8104
--- /dev/null
+++ b/services/50-keeweb/apache/apache.conf
@@ -0,0 +1,4 @@
+
+# Keeweb
+ProxyPass /keeweb http://keeweb retry=0 keepalive=On
+ProxyPassReverse /keeweb http://keeweb retry=0
diff --git a/services/50-keeweb/dockercompose/dockercompose.yml b/services/50-keeweb/dockercompose/dockercompose.yml
new file mode 100644
index 0000000..7aa9666
--- /dev/null
+++ b/services/50-keeweb/dockercompose/dockercompose.yml
@@ -0,0 +1,13 @@
+services:
+ # keeweb
+ # interface Web pour KeePass
+ # Port interne 80
+ keeweb:
+ image: reg.cadoles.com/envole/keeweb
+ container_name: nine-keeweb
+ restart: unless-stopped
+ env_file: ./services/50-keeweb/env/.env.merge
+ networks:
+ - nine-network
+ volumes:
+ - ./services/50-keeweb/volume/data:/web
diff --git a/services/50-keeweb/env/.env b/services/50-keeweb/env/.env
new file mode 100644
index 0000000..4904cb6
--- /dev/null
+++ b/services/50-keeweb/env/.env
@@ -0,0 +1,5 @@
+
+# == KEEWEB =================================================================================================================================
+
+WEBDAV_USER=${ADMIN_USER}
+WEBDAV_PASS=${ADMIN_PASSWORD}
diff --git a/services/50-keeweb/misc/nine.sh b/services/50-keeweb/misc/nine.sh
new file mode 100644
index 0000000..9631d34
--- /dev/null
+++ b/services/50-keeweb/misc/nine.sh
@@ -0,0 +1,36 @@
+#!/bin/bash
+
+
+function upkeeweb {
+ if [[ $KEEWEB_ACTIVATE == 1 && $KEEWEB_LOCAL == 1 ]]
+ then
+ Title ${KEEWEB_SERVICE_NAME^^}
+
+ EchoVert "CONTAINER"
+ upservice ${KEEWEB_SERVICE_NAME}
+ chmod -R a+wr ./services/50-keeweb/volume/data
+ Echo
+ fi
+}
+
+function destroykeeweb {
+ if [[ $KEEWEB_LOCAL == 1 ]]
+ then
+ Title "DESTROY $KEEWEB_SERVICE_NAME"
+
+ stop $KEEWEB_SERVICE_NAME 1
+ docker-compose rm -s -v -f "$KEEWEB_SERVICE_NAME"
+
+ if [[ -z $1 ]]; then
+ Question_ouinon "Souhaitez-vous supprimer le volume associé à $KEEWEB_SERVICE_NAME ?";
+ response=$?
+ fi
+ if [[ "$response" == 0 || ! -z $1 ]]
+ then
+ EchoRouge "Delete Volume = $KEEWEB_SERVICE_NAME"
+ rm -rf services/50-keeweb/volume/data
+ fi
+
+ echo ""
+ fi
+}
\ No newline at end of file