diff --git a/CHANGELOG.md b/CHANGELOG.md index 31f8945..d6a02aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,35 +1,43 @@ -## v0.05 ( Nov 17th 2023 ) -* Environment Variables and Labels are now unchecked by default. -* Support for Docker volumes. -* Fixed app uninstall. -* Fixed Proxy Manager. -* Updated functions to ignore the three DweebUI containers: DweebUI, DweebCache(redis), and DweebProxy(caddy). -* Visual updates: Tabs for networks, images, and volumes. Added 'update' option in container drop-down. -* Updated main.js to prevent javascript errors. -* Fix for templates using 'set' instead of 'default' in environment variables. -* Fixes for templates with no volumes or no labels. -* New README.md. -* New screenshots. -* Automatically persists data in docker volumes if there is no bind mount. - -## v0.04 (Nov 11th 2023) -* Docker Image and Compose file available. -* The containers DweebUI and DweebCache are hidden from the dashboard. -* Default icon for containers. -* Fixed missing information in container details/edit modals (Ports, Env, Volumes, Labels). - -## v0.03 (Nov 5th 2023) -* Container graphs now load instantly on refresh -* Working net data for server dashboard -* Redis is now installed as a docker container. - - -## v0.02 (Nov 1st 2023) -* Significant code clean-up and improvements -* CPU and RAM graphs for each container -* Updated Templates.json -* Fixed text color of VPN and VNC buttons - - -## v0.01 (Oct 15th 2023) -* First release. Not much working. +## v0.06 ( Nov 24th 2023 ) +* Multi-platform image (amd64/arm64). +* Removed Caddy from compose file. +* Proxy Manager UI can be enabled from environment variable. +* Removed hardcoded redis passwords. +* Repo change: Implemented image build-and-publish and dependabot (Thank you, gaby). +* Updated dependencies. + +## v0.05 ( Nov 17th 2023 ) +* Environment Variables and Labels are now unchecked by default. +* Support for Docker volumes. +* Fixed app uninstall. +* Fixed Proxy Manager. +* Updated functions to ignore the three DweebUI containers: DweebUI, DweebCache(redis), and DweebProxy(caddy). +* Visual updates: Tabs for networks, images, and volumes. Added 'update' option in container drop-down. +* Updated main.js to prevent javascript errors. +* Fix for templates using 'set' instead of 'default' in environment variables. +* Fixes for templates with no volumes or no labels. +* New README.md. +* New screenshots. +* Automatically persists data in docker volumes if there is no bind mount. + +## v0.04 (Nov 11th 2023) +* Docker Image and Compose file available. +* The containers DweebUI and DweebCache are hidden from the dashboard. +* Default icon for containers. +* Fixed missing information in container details/edit modals (Ports, Env, Volumes, Labels). + +## v0.03 (Nov 5th 2023) +* Container graphs now load instantly on refresh +* Working net data for server dashboard +* Redis is now installed as a docker container. + + +## v0.02 (Nov 1st 2023) +* Significant code clean-up and improvements +* CPU and RAM graphs for each container +* Updated Templates.json +* Fixed text color of VPN and VNC buttons + + +## v0.01 (Oct 15th 2023) +* First release. Not much working. diff --git a/Dockerfile b/Dockerfile index 2f9b834..ff00254 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,28 +2,20 @@ FROM node:21-alpine -# Use production node environment by default. ENV NODE_ENV production WORKDIR /app -# Download dependencies as a separate step to take advantage of Docker's caching. -# Leverage a cache mount to /root/.npm to speed up subsequent builds. -# Leverage a bind mounts to package.json and package-lock.json to avoid having to copy them into -# into this layer. + RUN --mount=type=bind,source=package.json,target=package.json \ --mount=type=bind,source=package-lock.json,target=package-lock.json \ --mount=type=cache,target=/root/.npm \ npm ci --omit=dev -# Run the application as a non-root user. USER root -# Copy the rest of the source files into the image. COPY . . -# Expose the port that the application listens on. EXPOSE 8000 -# Run the application. -CMD node app.js +CMD node app.js \ No newline at end of file diff --git a/README.md b/README.md index baf3c6f..fa40689 100644 --- a/README.md +++ b/README.md @@ -1,93 +1,87 @@ -# DweebUI -DweebUI is a simple Docker web interface created with javascript and node.js - -Pre-Pre-Pre-Pre-Pre Alpha v0.05 ( :fire: Experimental. Don't install on any servers you care about :fire: ) - -[![GitHub Stars](https://img.shields.io/github/stars/lllllllillllllillll/DweebUI)](https://github.com/lllllllillllllillll) -[![GitHub License](https://img.shields.io/github/license/lllllllillllllillll/DweebUI)](https://github.com/lllllllillllllillll/DweebUI/blob/main/LICENSE) -[![GitHub Activity](https://img.shields.io/github/commit-activity/y/lllllllillllllillll/DweebUI)](https://github.com/lllllllillllllillll) - -* I haven't used Github very much and I'm still new to javascript. -* This is the first project I've ever released and I'm sure it's full of plenty of bugs and mistakes. -* I probably should have waited a lot longer to share this :| - - - - - - -## Features -* [x] Dashboard provides server metrics (cpu, ram, network, disk) and container controls on a single page. -* [x] Light/Dark Mode. -* [x] Easy to install app templates. -* [x] Automatically persists data in docker volumes if bind mount isn't used. -* [x] Proxy manager for Caddy. -* [x] Partial Portainer Template Support (Network Mode, Ports, Volumes, Enviroment Variables, Labels, Commands, Restart Policy, Nvidia Hardware Acceleration). -* [x] Multi-User built-in. -* [ ] User pages: Shortcuts, Requests, Support. (planned) -* [x] Support for Windows, Linux, and MacOS. -* [ ] Import compose files. (planned) -* [x] Pure javascript. No frameworks or typescript. -* [x] Templates.json maintains compatability with Portainer, allowing you to use the template without needing to use DweebUI. -* [ ] Manage your Docker networks, images, and volumes. (planned) -* [ ] Preset variables. (planned) -* [ ] VPN, VPS, and Firewall Toggles. (planned) -* [ ] Offline Mode. (planned) - -## Setup - -* Docker compose.yaml: -``` -services: - dweebui: - container_name: DweebUI - image: lllllllillllllillll/dweebui:v0.05 - restart: unless-stopped - ports: - - 8000:8000 - depends_on: - - cache - links: - - cache - volumes: - - dweebui:/app - - caddy:/app/caddyfiles - - /var/run/docker.sock:/var/run/docker.sock - cache: - container_name: DweebCache - image: redis:6.2-alpine - restart: always - command: redis-server --save 20 1 --loglevel warning --requirepass eYVX7EwVmmxKPCDmwMtyKVge8oLd2t81 - volumes: - - cache:/data - proxy: - container_name: DweebProxy - image: caddy:2.4.5-alpine - depends_on: - - dweebui - restart: unless-stopped - network_mode: host - volumes: - - caddy:/data - - caddy:/config - - caddy:/etc/caddy -volumes: - dweebui: - cache: - caddy: -``` - -* Using setup.sh: -``` -Extract DweebUI.zip and navigate to /DweebUI -cd DweebUI -chmod +x setup.sh -sudo ./setup.sh -``` - - -## Credit - -* UI was built using HTML and CSS elements from https://tabler.io/ -* Apps template based on Portainer template provided by Lissy93 here: https://github.com/Lissy93/portainer-templates -* Most of the app icons were sourced from Walkxcode's dashboard icons here: https://github.com/walkxcode/dashboard-icons +# DweebUI +DweebUI is a simple Docker web interface created with javascript and node.js + +Pre-Pre-Pre-Pre-Pre Alpha v0.06 ( :fire: Experimental. Don't install on any servers you care about :fire: ) + +[![GitHub Stars](https://img.shields.io/github/stars/lllllllillllllillll/DweebUI)](https://github.com/lllllllillllllillll) +[![GitHub License](https://img.shields.io/github/license/lllllllillllllillll/DweebUI)](https://github.com/lllllllillllllillll/DweebUI/blob/main/LICENSE) +[![GitHub Activity](https://img.shields.io/github/commit-activity/y/lllllllillllllillll/DweebUI)](https://github.com/lllllllillllllillll) + +* I haven't used Github very much and I'm still new to javascript. +* This is the first project I've ever released and I'm sure it's full of plenty of bugs and mistakes. +* I probably should have waited a lot longer to share this :| + + + + + + +## Features +* [x] Dashboard provides server metrics (cpu, ram, network, disk) and container controls on a single page. +* [x] Light/Dark Mode. +* [x] Easy to install app templates. +* [x] Automatically persists data in docker volumes if bind mount isn't used. +* [x] Proxy manager for Caddy. (Optional) +* [x] Partial Portainer Template Support (Network Mode, Ports, Volumes, Enviroment Variables, Labels, Commands, Restart Policy, Nvidia Hardware Acceleration). +* [x] Multi-User built-in. +* [ ] User pages: Shortcuts, Requests, Support. (planned) +* [x] Support for Windows, Linux, and MacOS. +* [ ] Import compose files. (planned) +* [x] Pure javascript. No frameworks or typescript. +* [x] Templates.json maintains compatability with Portainer, allowing you to use the template without needing to use DweebUI. +* [ ] Manage your Docker networks, images, and volumes. (planned) +* [ ] Preset variables. (planned) +* [ ] VPN, VPS, and Firewall Toggles. (planned) +* [ ] Offline Mode. (planned) + +## Setup + +* Docker compose.yaml: +``` +services: + dweebui: + container_name: DweebUI + image: lllllllillllllillll/dweebui:v0.06 + environment: + NODE_ENV: production + REDIS_PASS: replace_with_password_for_redis + # Proxy_Manager: enabled + restart: unless-stopped + ports: + - 8000:8000 + depends_on: + - cache + links: + - cache + volumes: + - dweebui:/app + - caddyfiles:/app/caddyfiles + - /var/run/docker.sock:/var/run/docker.sock + cache: + container_name: DweebCache + image: redis:6.2-alpine + restart: always + command: redis-server --save 20 1 --loglevel warning --requirepass replace_with_password_for_redis + volumes: + - cache:/data + +volumes: + dweebui: + cache: + caddyfiles: +``` + +* Using setup.sh: +``` +Extract DweebUI.zip and navigate to /DweebUI +cd DweebUI +chmod +x setup.sh +sudo ./setup.sh +``` + + +## Credit + +* UI was built using HTML and CSS elements from https://tabler.io/ +* Apps template based on Portainer template provided by Lissy93 here: https://github.com/Lissy93/portainer-templates +* Most of the app icons were sourced from Walkxcode's dashboard icons here: https://github.com/walkxcode/dashboard-icons diff --git a/app.js b/app.js index 68523e6..66518b6 100644 --- a/app.js +++ b/app.js @@ -12,7 +12,7 @@ app.locals.site_list = ''; const redisClient = require('redis').createClient({ url: 'redis://DweebCache:6379', - password:'eYVX7EwVmmxKPCDmwMtyKVge8oLd2t81', + password: process.env.REDIS_PASS, legacyMode:true }); redisClient.connect().catch(console.log); diff --git a/compose.yaml b/compose.yaml index ac4c9cb..122a373 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1,7 +1,11 @@ services: dweebui: container_name: DweebUI - image: lllllllillllllillll/dweebui:v0.05 + image: lllllllillllllillll/dweebui:v0.06 + environment: + NODE_ENV: production + REDIS_PASS: replace_with_password_for_redis + # Proxy_Manager: enabled restart: unless-stopped ports: - 8000:8000 @@ -11,27 +15,17 @@ services: - cache volumes: - dweebui:/app - - caddy:/app/caddyfiles + - caddyfiles:/app/caddyfiles - /var/run/docker.sock:/var/run/docker.sock cache: container_name: DweebCache image: redis:6.2-alpine restart: always - command: redis-server --save 20 1 --loglevel warning --requirepass eYVX7EwVmmxKPCDmwMtyKVge8oLd2t81 + command: redis-server --save 20 1 --loglevel warning --requirepass replace_with_password_for_redis volumes: - cache:/data - proxy: - container_name: DweebProxy - image: caddy:2.4.5-alpine - depends_on: - - dweebui - restart: unless-stopped - network_mode: host - volumes: - - caddy:/data - - caddy:/config - - caddy:/etc/caddy + volumes: dweebui: cache: - caddy: + caddyfiles: diff --git a/controllers/dashboard.js b/controllers/dashboard.js index b77a0ee..09aee37 100644 --- a/controllers/dashboard.js +++ b/controllers/dashboard.js @@ -1,6 +1,5 @@ const User = require('../database/UserModel'); - exports.Dashboard = async function (req, res) { if (req.session.role == "admin") { @@ -8,6 +7,12 @@ exports.Dashboard = async function (req, res) { // get user data with matching UUID from sqlite database let user = await User.findOne({ where: { UUID: req.session.UUID } }); + let caddy = 'd-none'; + + if (process.env.Proxy_Manager == 'enabled') { + caddy = ''; + } + // Render the home page res.render("pages/dashboard", { name: user.first_name + ' ' + user.last_name, @@ -15,6 +20,7 @@ exports.Dashboard = async function (req, res) { avatar: user.avatar, isLoggedIn: true, site_list: req.app.locals.site_list, + caddy: caddy }); } else { // Redirect to the login page diff --git a/package-lock.json b/package-lock.json index 4545801..58e6071 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "bcrypt": "^5.1.0", "child_process": "^1.0.2", - "connect-redis": "^7.1.0", + "connect-redis": "^6.1.3", "dockerode": "^4.0.0", "dockerode-compose": "^1.4.0", "ejs": "^3.1.9", @@ -152,38 +152,38 @@ "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" }, "node_modules/@types/cors": { - "version": "2.8.15", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.15.tgz", - "integrity": "sha512-n91JxbNLD8eQIuXDIChAN1tCKNWCEgpceU9b7ZMbFA+P+Q4yIeh80jizFLEvolRPc1ES0VdwFlGv+kJTSirogw==", + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/debug": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.10.tgz", - "integrity": "sha512-tOSCru6s732pofZ+sMv9o4o3Zc+Sa8l3bxd/tweTQudFn06vAzb13ZX46Zi6m6EJ+RUbRTHvgQJ1gBtSgkaUYA==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dependencies": { "@types/ms": "*" } }, "node_modules/@types/ms": { - "version": "0.7.33", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.33.tgz", - "integrity": "sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ==" + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "node_modules/@types/node": { - "version": "20.8.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", - "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "version": "20.9.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.4.tgz", + "integrity": "sha512-wmyg8HUhcn6ACjsn8oKYjkN/zUzQeNtMy44weTJSM6p4MMzEOuKbA3OjJ267uPCOW7Xex9dyrNTful8XTQYoDA==", "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/validator": { - "version": "13.11.5", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.5.tgz", - "integrity": "sha512-xW4qsT4UIYILu+7ZrBnfQdBYniZrMLYYK3wN9M/NdeIHgBN5pZI2/8Q7UfdWIcr5RLJv/OGENsx91JIpUUoC7Q==" + "version": "13.11.7", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.7.tgz", + "integrity": "sha512-q0JomTsJ2I5Mv7dhHhQLGjMvX0JJm5dyZ1DXQySIUzU1UlwzB8bt+R6+LODUbz0UDIOvEzGc28tk27gBJw2N8Q==" }, "node_modules/abbrev": { "version": "1.1.1", @@ -565,14 +565,11 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/connect-redis": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/connect-redis/-/connect-redis-7.1.0.tgz", - "integrity": "sha512-UaqO1EirWjON2ENsyau7N5lbkrdYBpS6mYlXSeff/OYXsd6EGZ+SXSmNPoljL2PSua8fgjAEaldSA73PMZQ9Eg==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/connect-redis/-/connect-redis-6.1.3.tgz", + "integrity": "sha512-aaNluLlAn/3JPxRwdzw7lhvEoU6Enb+d83xnokUNhC9dktqBoawKWL+WuxinxvBLTz6q9vReTnUDnUslaz74aw==", "engines": { - "node": ">=16" - }, - "peerDependencies": { - "express-session": ">=1" + "node": ">=12" } }, "node_modules/console-control-strings": { @@ -817,9 +814,9 @@ } }, "node_modules/engine.io": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.3.tgz", - "integrity": "sha512-IML/R4eG/pUS5w7OfcDE0jKrljWS9nwnEfsxWCIJF5eO6AHo6+Hlv+lQbdlAYsiJPHzUthLm1RUjnBzWOs45cw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", + "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", "dependencies": { "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", diff --git a/package.json b/package.json index 768113d..41d539f 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "dependencies": { "bcrypt": "^5.1.0", "child_process": "^1.0.2", - "connect-redis": "^7.1.0", + "connect-redis": "^6.1.3", "dockerode": "^4.0.0", "dockerode-compose": "^1.4.0", "ejs": "^3.1.9", diff --git a/templates.json b/templates.json index 95cc4ad..9b10ed9 100644 --- a/templates.json +++ b/templates.json @@ -3701,16 +3701,16 @@ "type": 1, "volumes": [ { - "bind": "/home/docker/caddy/", + "bind": "caddy", "container": "/data" }, { - "bind": "caddy/Caddyfile", - "container": "/etc/caddy/Caddyfile" + "bind": "caddy", + "container": "/config" }, { - "bind": "caddy/sites", - "container": "/etc/caddy/sites" + "bind": "caddyfiles", + "container": "/etc/caddy" } ] }, diff --git a/views/pages/dashboard.ejs b/views/pages/dashboard.ejs index 6805ffb..5d5cba4 100644 --- a/views/pages/dashboard.ejs +++ b/views/pages/dashboard.ejs @@ -126,7 +126,7 @@ -
./caddyfiles/Caddyfile
+caddy:/etc/caddy