Compare commits

...

24 Commits

Author SHA1 Message Date
Donald Zou
798580be5a Update entrypoint.sh 2025-09-29 17:58:58 +08:00
Donald Zou
602238d794 Merge pull request #933 from WGDashboard/dependabot/npm_and_yarn/src/static/app/vue-3.5.22
Some checks failed
Mark stale issues and pull requests / stale (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docker Build and Push / docker_build (push) Has been cancelled
Docker Build and Push / docker_scan (push) Has been cancelled
Bump vue from 3.5.21 to 3.5.22 in /src/static/app
2025-09-26 06:02:36 +08:00
dependabot[bot]
4d4a15740b Bump vue from 3.5.21 to 3.5.22 in /src/static/app
Bumps [vue](https://github.com/vuejs/core) from 3.5.21 to 3.5.22.
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/core/compare/v3.5.21...v3.5.22)

---
updated-dependencies:
- dependency-name: vue
  dependency-version: 3.5.22
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-25 18:23:15 +00:00
DaanSelen
524d50ee07 Update dependabot.yml
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docker Build and Push / docker_build (push) Has been cancelled
Docker Build and Push / docker_scan (push) Has been cancelled
chore: set dependabot to run weekly
2025-09-25 20:21:56 +02:00
dependabot[bot]
fc591b7fe8 Bump vite from 7.1.6 to 7.1.7 in /src/static/app (#927)
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docker Build and Push / docker_build (push) Has been cancelled
Docker Build and Push / docker_scan (push) Has been cancelled
Mark stale issues and pull requests / stale (push) Has been cancelled
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.1.6 to 7.1.7.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.7/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.1.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-24 10:29:38 +02:00
dependabot[bot]
c2f06193d0 Bump @vue/language-server from 3.0.7 to 3.0.8 in /src/static/app (#929)
Bumps [@vue/language-server](https://github.com/vuejs/language-tools/tree/HEAD/packages/language-server) from 3.0.7 to 3.0.8.
- [Release notes](https://github.com/vuejs/language-tools/releases)
- [Changelog](https://github.com/vuejs/language-tools/blob/master/CHANGELOG.md)
- [Commits](https://github.com/vuejs/language-tools/commits/v3.0.8/packages/language-server)

---
updated-dependencies:
- dependency-name: "@vue/language-server"
  dependency-version: 3.0.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-24 10:29:19 +02:00
Donald Zou
f2ead12315 Merge pull request #924 from WGDashboard/fix-#920
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docker Build and Push / docker_build (push) Has been cancelled
Docker Build and Push / docker_scan (push) Has been cancelled
Mark stale issues and pull requests / stale (push) Has been cancelled
Update PeerJobs.py
2025-09-22 22:51:52 +08:00
Donald Zou
ca8700ac2a Update PeerJobs.py 2025-09-22 22:50:59 +08:00
Donald Zou
10a8d22efd Merge pull request #922 from WGDashboard/docker-duplicate-hotfix
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docker Build and Push / docker_build (push) Has been cancelled
Docker Build and Push / docker_scan (push) Has been cancelled
2025-09-22 17:53:34 +08:00
Donald Zou
fc3ec61373 Merge pull request #923 from WGDashboard/remove-docker-funcs
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docker Build and Push / docker_build (push) Has been cancelled
Docker Build and Push / docker_scan (push) Has been cancelled
Mark stale issues and pull requests / stale (push) Has been cancelled
2025-09-22 05:46:38 +08:00
Daan Selen
094d1c0718 refac: remove docker functions 2025-09-21 22:04:59 +02:00
Daan Selen
0d814ec03c refac: new logic to detecting a Wireguard interface 2025-09-21 21:57:28 +02:00
dependabot[bot]
5ccfe07e12 Bump npm from 10.9.3 to 11.6.0 in /src/static/app (#901)
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docker Build and Push / docker_build (push) Has been cancelled
Docker Build and Push / docker_scan (push) Has been cancelled
Bumps [npm](https://github.com/npm/cli) from 10.9.3 to 11.6.0.
- [Release notes](https://github.com/npm/cli/releases)
- [Changelog](https://github.com/npm/cli/blob/latest/CHANGELOG.md)
- [Commits](https://github.com/npm/cli/compare/v10.9.3...v11.6.0)

---
updated-dependencies:
- dependency-name: npm
  dependency-version: 11.6.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-21 17:30:31 +02:00
dependabot[bot]
101ac5e985 Bump vite from 7.1.5 to 7.1.6 in /src/static/app (#912)
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docker Build and Push / docker_build (push) Has been cancelled
Docker Build and Push / docker_scan (push) Has been cancelled
Mark stale issues and pull requests / stale (push) Has been cancelled
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.1.5 to 7.1.6.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.1.6/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.1.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-19 21:00:15 +02:00
dependabot[bot]
113a780eec Bump @vue/language-server from 3.0.5 to 3.0.7 in /src/static/app (#902)
Bumps [@vue/language-server](https://github.com/vuejs/language-tools/tree/HEAD/packages/language-server) from 3.0.5 to 3.0.7.
- [Release notes](https://github.com/vuejs/language-tools/releases)
- [Changelog](https://github.com/vuejs/language-tools/blob/master/CHANGELOG.md)
- [Commits](https://github.com/vuejs/language-tools/commits/v3.0.7/packages/language-server)

---
updated-dependencies:
- dependency-name: "@vue/language-server"
  dependency-version: 3.0.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-19 20:59:48 +02:00
Donald Zou
cf77610a56 Merge pull request #914 from WGDashboard/add-template
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docker Build and Push / docker_build (push) Has been cancelled
Docker Build and Push / docker_scan (push) Has been cancelled
2025-09-19 18:24:45 +08:00
Daan Selen
84675fe521 feat: add default wg-dashboard.ini config 2025-09-19 10:32:25 +02:00
Donald Zou
5db5b35311 Update README.md
Some checks failed
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docker Build and Push / docker_build (push) Has been cancelled
Docker Build and Push / docker_scan (push) Has been cancelled
Mark stale issues and pull requests / stale (push) Has been cancelled
2025-09-17 23:31:20 +08:00
DaanSelen
ff345c9609 style: readme update 2025-09-17 16:03:35 +02:00
Daan Selen
6cccfec923 fix: fix the docker building issue
I accidentally removed a character
  we are all human.
2025-09-17 15:58:16 +02:00
Donald Zou
8231dd1463 Merge pull request #906 from WGDashboard/docker-doc-refac
refac(docs): rewrite and check the docker documents
2025-09-17 21:49:25 +08:00
Daan Selen
d8ff020d8c refac(docs): rewrite and check the docker documents 2025-09-17 15:34:39 +02:00
Daan Selen
238fb91360 chore: further expand and change the compose file
For people that want to get started quickly
2025-09-17 15:20:01 +02:00
DaanSelen
9ecc16fcc1 chore: update dependabot config 2025-09-17 11:05:31 +02:00
11 changed files with 595 additions and 658 deletions

View File

@@ -8,24 +8,24 @@ updates:
- package-ecosystem: "pip" - package-ecosystem: "pip"
directory: "/src" directory: "/src"
schedule: schedule:
interval: "daily" interval: "weekly"
- package-ecosystem: "npm" - package-ecosystem: "npm"
directory: "/" directory: "/src/static/app"
schedule: schedule:
interval: "daily" interval: "weekly"
- package-ecosystem: "github-actions" - package-ecosystem: "github-actions"
directory: "/.github" directory: "/.github"
schedule: schedule:
interval: "daily" interval: "weekly"
- package-ecosystem: "docker" - package-ecosystem: "docker"
directory: "/docker" directory: "/docker"
schedule: schedule:
interval: "daily" interval: "weekly"
- package-ecosystem: "docker-compose" - package-ecosystem: "docker-compose"
directory: "/docker" directory: "/docker"
schedule: schedule:
interval: "daily" interval: "weekly"

View File

@@ -26,6 +26,8 @@
<a href="https://wakatime.com/badge/github/donaldzou/WGDashboard"><img src="https://wakatime.com/badge/github/donaldzou/WGDashboard.svg?style=for-the-badge" alt="wakatime"></a> <a href="https://wakatime.com/badge/github/donaldzou/WGDashboard"><img src="https://wakatime.com/badge/github/donaldzou/WGDashboard.svg?style=for-the-badge" alt="wakatime"></a>
<a href="https://hitscounter.dev"><img src="https://hitscounter.dev/api/hit?url=https%3A%2F%2Fgithub.com%2Fdonaldzou%2FWGDashboard&label=Visitor&icon=github&color=%230a58ca&style=for-the-badge"></a> <a href="https://hitscounter.dev"><img src="https://hitscounter.dev/api/hit?url=https%3A%2F%2Fgithub.com%2Fdonaldzou%2FWGDashboard&label=Visitor&icon=github&color=%230a58ca&style=for-the-badge"></a>
<img src="https://img.shields.io/docker/pulls/donaldzou/wgdashboard?logo=docker&label=Docker%20Image%20Pulls&labelColor=ffffff&style=for-the-badge"> <img src="https://img.shields.io/docker/pulls/donaldzou/wgdashboard?logo=docker&label=Docker%20Image%20Pulls&labelColor=ffffff&style=for-the-badge">
<img src="https://github.com/WGDashboard/WGDashboard/actions/workflows/docker.yml/badge.svg?style=for-the-badge">
<img src="https://github.com/WGDashboard/WGDashboard/actions/workflows/codeql-analyze.yaml/badge.svg">
</p> </p>
<p align="center"><b>This project is supported by</b></p> <p align="center"><b>This project is supported by</b></p>
<p align="center"> <p align="center">

View File

@@ -3,8 +3,10 @@
# Base: Alpine # Base: Alpine
# #
# Pull the current golang-alpine image.
FROM golang:1.25-alpine AS awg-go FROM golang:1.25-alpine AS awg-go
# Install build-dependencies.
RUN apk add --no-cache \ RUN apk add --no-cache \
git \ git \
gcc \ gcc \
@@ -14,9 +16,12 @@ RUN apk add --no-cache \
RUN mkdir -p /workspace && \ RUN mkdir -p /workspace && \
git clone https://github.com/WGDashboard/amneziawg-go /workspace/awg git clone https://github.com/WGDashboard/amneziawg-go /workspace/awg
# Enable CGO compilation for AmneziaWG
ENV CGO_ENABLED=1 ENV CGO_ENABLED=1
# Change directory
WORKDIR /workspace/awg WORKDIR /workspace/awg
# Compile the binaries
RUN go mod download && \ RUN go mod download && \
go mod verify && \ go mod verify && \
go build -ldflags '-linkmode external -extldflags "-fno-PIC -static"' -v -o /usr/bin go build -ldflags '-linkmode external -extldflags "-fno-PIC -static"' -v -o /usr/bin
@@ -26,6 +31,7 @@ RUN go mod download && \
# #
FROM alpine:latest AS awg-tools FROM alpine:latest AS awg-tools
# Install needed dependencies.
RUN apk add --no-cache \ RUN apk add --no-cache \
make \ make \
git \ git \
@@ -33,19 +39,24 @@ RUN apk add --no-cache \
linux-headers \ linux-headers \
ca-certificates ca-certificates
# Get the workspace ready
RUN mkdir -p /workspace && \ RUN mkdir -p /workspace && \
git clone https://github.com/WGDashboard/amneziawg-tools /workspace/awg-tools git clone https://github.com/WGDashboard/amneziawg-tools /workspace/awg-tools
# Change directory
WORKDIR /workspace/awg-tools/src WORKDIR /workspace/awg-tools/src
# Compile and change permissions
RUN make && chmod +x wg* RUN make && chmod +x wg*
# #
# PIP DEPENDENCY BUILDING # PIP DEPENDENCY BUILDING
# Base: Alpine # Base: Alpine
# #
# Use the python-alpine image for building pip dependencies
FROM python:3.13-alpine AS pip-builder FROM python:3.13-alpine AS pip-builder
# Add the build dependencies and create a Python virtual environment.
RUN apk add --no-cache \ RUN apk add --no-cache \
build-base \ build-base \
pkgconfig \ pkgconfig \
@@ -57,7 +68,9 @@ RUN apk add --no-cache \
&& mkdir -p /opt/wgdashboard/src \ && mkdir -p /opt/wgdashboard/src \
&& python3 -m venv /opt/wgdashboard/src/venv && python3 -m venv /opt/wgdashboard/src/venv
# Copy the requirements file into the build layer.
COPY ./src/requirements.txt /opt/wgdashboard/src COPY ./src/requirements.txt /opt/wgdashboard/src
# Install the pip packages
RUN . /opt/wgdashboard/src/venv/bin/activate && \ RUN . /opt/wgdashboard/src/venv/bin/activate && \
pip3 install --upgrade pip && \ pip3 install --upgrade pip && \
pip3 install -r /opt/wgdashboard/src/requirements.txt pip3 install -r /opt/wgdashboard/src/requirements.txt
@@ -66,6 +79,8 @@ RUN . /opt/wgdashboard/src/venv/bin/activate && \
# WGDashboard RUNNING STAGE # WGDashboard RUNNING STAGE
# Base: Alpine # Base: Alpine
# #
# Running with the python-alpine image.
FROM python:3.13-alpine AS final FROM python:3.13-alpine AS final
LABEL maintainer="dselen@nerthus.nl" LABEL maintainer="dselen@nerthus.nl"
@@ -78,7 +93,7 @@ RUN apk add --no-cache \
tzdata wireguard-tools \ tzdata wireguard-tools \
openresolv openrc openresolv openrc
# Copy only the final binaries from the builders # Copy only the final binaries from the AWG builder stages
COPY --from=awg-go /usr/bin/amneziawg-go /usr/bin/amneziawg-go COPY --from=awg-go /usr/bin/amneziawg-go /usr/bin/amneziawg-go
COPY --from=awg-tools /workspace/awg-tools/src/wg /usr/bin/awg COPY --from=awg-tools /workspace/awg-tools/src/wg /usr/bin/awg
COPY --from=awg-tools /workspace/awg-tools/src/wg-quick/linux.bash /usr/bin/awg-quick COPY --from=awg-tools /workspace/awg-tools/src/wg-quick/linux.bash /usr/bin/awg-quick
@@ -92,14 +107,14 @@ ENV TZ="Europe/Amsterdam" \
public_ip="" \ public_ip="" \
WGDASH=/opt/wgdashboard WGDASH=/opt/wgdashboard
# Create directories # Create directories needed for operation
RUN mkdir /data /configs -p ${WGDASH}/src /etc/amnezia/amneziawg RUN mkdir /data /configs -p ${WGDASH}/src /etc/amnezia/amneziawg
# Copy app source and prebuilt venv only (no pip cache) # Copy the python virtual environment from the pip-builder stage
COPY ./src ${WGDASH}/src COPY ./src ${WGDASH}/src
COPY --from=pip-builder /opt/wgdashboard/src/venv /opt/wgdashboard/src/venv COPY --from=pip-builder /opt/wgdashboard/src/venv /opt/wgdashboard/src/venv
# WireGuard interface template # First WireGuard interface template
SHELL ["/bin/bash", "-o", "pipefail", "-c"] SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN out_adapt=$(ip -o -4 route show to default | awk '{print $NF}') \ RUN out_adapt=$(ip -o -4 route show to default | awk '{print $NF}') \
&& echo -e "[Interface]\n\ && echo -e "[Interface]\n\
@@ -114,11 +129,14 @@ SaveConfig = true\n\
DNS = ${global_dns}" > /configs/wg0.conf.template \ DNS = ${global_dns}" > /configs/wg0.conf.template \
&& chmod 600 /configs/wg0.conf.template && chmod 600 /configs/wg0.conf.template
# Set a healthcheck to determine the container its health
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD sh -c 'pgrep gunicorn > /dev/null && pgrep tail > /dev/null' || exit 1 CMD sh -c 'pgrep gunicorn > /dev/null && pgrep tail > /dev/null' || exit 1
# Copy in the runtime script, essential.
COPY ./docker/entrypoint.sh /entrypoint.sh COPY ./docker/entrypoint.sh /entrypoint.sh
#
EXPOSE 10086 EXPOSE 10086
WORKDIR $WGDASH/src WORKDIR $WGDASH/src

View File

@@ -3,8 +3,8 @@ Author: @DaanSelen<br>
This document delves into how the WGDashboard Docker container has been built.<br> This document delves into how the WGDashboard Docker container has been built.<br>
Of course there are two stages (simply said), one before run-time and one at/after run-time.<br> Of course there are two stages (simply said), one before run-time and one at/after run-time.<br>
The `Dockerfile` describes how the container image is made, and the `entrypoint.sh` is executed after running the container. <br> The `Dockerfile` describes how the container image is made, and the `entrypoint.sh` is executed after the container is started. <br>
In this example, WireGuard is integrated into the container itself, so it should be a run-and-go(/out-of-the-box).<br> In this example, [WireGuard](https://www.wireguard.com/) is integrated into the container itself, so it should be a run-and-go(/out-of-the-box) experience.<br>
For more details on the source-code specific to this Docker image, refer to the source files, they have lots of comments. For more details on the source-code specific to this Docker image, refer to the source files, they have lots of comments.
<br> <br>
@@ -18,20 +18,24 @@ For more details on the source-code specific to this Docker image, refer to the
/> />
<br> <br>
To get the container running you either pull the image from the repository, (docker.io)`donaldzou/wgdashboard:latest`.<br> To get the container running you either pull the pre-made image from a remote repository, there are 2 official options.<br>
From there either use the environment variables describe below as parameters or use the Docker Compose file: `compose.yaml`.<br>
Be careful, the default generated WireGuard configuration file uses port 51820/udp. So use this port if you want to use it out of the box.<br> - ghcr.io/wgdashboard/wgdashboard:<tag>
Otherwise edit the configuration file in `/etc/wireguard/wg0.conf`. - docker.io/donaldzou/wgdashboard:<tag>
> tags should be either: latest, main, <version> or <commit-sha>.
From there either use the environment variables described below as parameters or use the Docker Compose file: `compose.yaml`.<br>
Be careful, the default generated WireGuard configuration file uses port 51820/udp. So make sure to use this port if you want to use it out of the box.<br>
Otherwise edit the configuration file in WGDashboard under `Configuration Settings` -> `Edit Raw Configuration File`.
> Otherwise you need to enter the container and edit: `/etc/wireguard/wg0.conf`.
# WGDashboard: 🐳 Docker Deployment Guide # WGDashboard: 🐳 Docker Deployment Guide
To run the container, you can either pull the image from Docker Hub or build it yourself. The image is available at: To run the container, you can either pull the image from the Github Container Registry (ghcr.io), Docker Hub (docker.io) or build it yourself. The image is available at:
``` > `docker.io` is in most cases automatically resolved by the Docker application. Therefor you can ofter specify: `donaldzou/wgdashboard:latest`
docker.io/donaldzou/wgdashboard:latest
```
> `docker.io` is in most cases automatically resolved by the Docker application.
### 🔧 Quick Docker Run Command ### 🔧 Quick Docker Run Command
@@ -44,7 +48,7 @@ docker run -d \
-p 10086:10086/tcp \ -p 10086:10086/tcp \
-p 51820:51820/udp \ -p 51820:51820/udp \
--cap-add NET_ADMIN \ --cap-add NET_ADMIN \
donaldzou/wgdashboard:latest ghcr.io/wgdashboard/wgdashboard:latest
``` ```
> ⚠️ The default WireGuard port is `51820/udp`. If you change this, update the `/etc/wireguard/wg0.conf` accordingly. > ⚠️ The default WireGuard port is `51820/udp`. If you change this, update the `/etc/wireguard/wg0.conf` accordingly.
@@ -58,23 +62,24 @@ You can also use Docker Compose for easier configuration:
```yaml ```yaml
services: services:
wgdashboard: wgdashboard:
image: donaldzou/wgdashboard:latest image: ghcr.io/wgdashboard/wgdashboard:latest
restart: unless-stopped restart: unless-stopped
container_name: wgdashboard container_name: wgdashboard
environment:
# - tz=Europe/Amsterdam
# - global_dns=1.1.1.1
# - public_ip=YOUR_PUBLIC_IP
ports: ports:
- 10086:10086/tcp - 10086:10086/tcp
- 51820:51820/udp - 51820:51820/udp
volumes: volumes:
- aconf:/etc/amnezia/amneziawg
- conf:/etc/wireguard - conf:/etc/wireguard
- data:/data - data:/data
cap_add: cap_add:
- NET_ADMIN - NET_ADMIN
volumes: volumes:
aconf:
conf: conf:
data: data:
``` ```
@@ -85,7 +90,7 @@ volumes:
## 🔄 Updating the Container ## 🔄 Updating the Container
Updating WGDashboard is currently in **alpha** stage. While the update process may work, it's still under testing. Updating the WGDashboard container should be through 'The Docker Way' - by pulling the newest/newer image and replacing this old one.
--- ---
@@ -205,4 +210,4 @@ ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]
## Closing remarks: ## Closing remarks:
For feedback please submit an issue to the repository. Or message dselen@nerthus.nl. For feedback please submit an issue to the repository. Or message dselen@nerthus.nl.

View File

@@ -1,22 +1,41 @@
services: services:
wireguard-dashboard: wgdashboard:
image: donaldzou/wgdashboard:latest # Since the github organisation we recommend the ghcr.io.
# Alternatively we also still push to docker.io under donaldzou/wgdashboard.
# Both share the exact same tags. So they should be interchangable.
image: ghcr.io/wgdashboard/wgdashboard:latest
# Make sure to set the restart policy. Because for a VPN its important to come back IF it crashes.
restart: unless-stopped restart: unless-stopped
container_name: wgdashboard container_name: wgdashboard
# Environment variables can be used to configure certain values at startup. Without having to configure it from the dashboard.
# By default its all disabled, but uncomment the following lines to apply these. (uncommenting is removing the # character)
# Refer to the documentation on https://wgdashboard.dev/ for more info on what everything means.
#environment: #environment:
#- tz= # <--- Set container timezone, default: Europe/Amsterdam. #- tz= # <--- Set container timezone, default: Europe/Amsterdam.
#- public_ip= # <--- Set public IP to ensure the correct one is chosen, defaulting to the IP give by ifconfig.me. #- public_ip= # <--- Set public IP to ensure the correct one is chosen, defaulting to the IP give by ifconfig.me.
#- wgd_port= # <--- Set the port WGDashboard will use for its web-server. #- wgd_port= # <--- Set the port WGDashboard will use for its web-server.
# The following section, ports is very important for exposing more than one Wireguard/AmneziaWireguard interfaces.
# Once you create a new configuration and assign a port in the dashboard, don't forget to add it to the ports as well.
# Quick-tip: most Wireguard VPN tunnels use UDP. WGDashboard uses HTTP, so tcp.
ports: ports:
- 10086:10086/tcp - 10086:10086/tcp
- 51820:51820/udp - 51820:51820/udp
# Volumes can be configured however you'd like. The default is using docker volumes.
# If you want to use local paths, replace the path before the : with your path.
volumes: volumes:
- aconf:/etc/amnezia/amneziawg - aconf:/etc/amnezia/amneziawg
- conf:/etc/wireguard - conf:/etc/wireguard
- data:/data - data:/data
# Needed for network administration.
cap_add: cap_add:
- NET_ADMIN - NET_ADMIN
# The following configuration is linked to the above default volumes.
volumes: volumes:
aconf: aconf:
conf: conf:

View File

@@ -13,15 +13,15 @@ hash_password() {
set_ini() { set_ini() {
local section="$1" key="$2" value="$3" local section="$1" key="$2" value="$3"
local current_value local current_value
# Add section if it doesn't exist # Add section if it doesn't exist
grep -q "^\[${section}\]" "$config_file" \ grep -q "^\[${section}\]" "$config_file" \
|| printf "\n[%s]\n" "${section}" >> "$config_file" || printf "\n[%s]\n" "${section}" >> "$config_file"
# Check current value if key exists # Check current value if key exists
if grep -q "^[[:space:]]*${key}[[:space:]]*=" "$config_file"; then if grep -q "^[[:space:]]*${key}[[:space:]]*=" "$config_file"; then
current_value=$(grep "^[[:space:]]*${key}[[:space:]]*=" "$config_file" | cut -d= -f2- | xargs) current_value=$(grep "^[[:space:]]*${key}[[:space:]]*=" "$config_file" | cut -d= -f2- | xargs)
# Don't display actual value if it's a password field # Don't display actual value if it's a password field
if [[ "$key" == *"password"* ]]; then if [[ "$key" == *"password"* ]]; then
if [ "$current_value" = "$value" ]; then if [ "$current_value" = "$value" ]; then
@@ -40,7 +40,7 @@ set_ini() {
fi fi
else else
sed -i "/^\[${section}\]/a ${key} = ${value}" "$config_file" sed -i "/^\[${section}\]/a ${key} = ${value}" "$config_file"
# Don't display actual value if it's a password field # Don't display actual value if it's a password field
if [[ "$key" == *"password"* ]]; then if [[ "$key" == *"password"* ]]; then
echo "- Added new setting $key (value hidden)" echo "- Added new setting $key (value hidden)"
@@ -61,58 +61,59 @@ echo "Starting the WGDashboard Docker container."
ensure_installation() { ensure_installation() {
echo "Quick-installing..." echo "Quick-installing..."
# Make the wgd.sh script executable. # Make the wgd.sh script executable.
chmod +x "${WGDASH}"/src/wgd.sh chmod +x "${WGDASH}"/src/wgd.sh
cd "${WGDASH}"/src || exit cd "${WGDASH}"/src || exit
# Github issue: https://github.com/donaldzou/WGDashboard/issues/723 # Github issue: https://github.com/donaldzou/WGDashboard/issues/723
echo "Checking for stale pids..." echo "Checking for stale pids..."
if [[ -f ${WGDASH}/src/gunicorn.pid ]]; then if [[ -f ${WGDASH}/src/gunicorn.pid ]]; then
echo "Found stale pid, removing..." echo "Found stale pid, removing..."
rm ${WGDASH}/src/gunicorn.pid rm ${WGDASH}/src/gunicorn.pid
fi fi
# Removing clear shell command from the wgd.sh script to enhance docker logging. # Removing clear shell command from the wgd.sh script to enhance docker logging.
echo "Removing clear command from wgd.sh for better Docker logging." echo "Removing clear command from wgd.sh for better Docker logging."
sed -i '/clear/d' ./wgd.sh sed -i '/clear/d' ./wgd.sh
# Create required directories and links # Create required directories and links
if [ ! -d "/data/db" ]; then if [ ! -d "/data/db" ]; then
echo "Creating database dir" echo "Creating database dir"
mkdir -p /data/db mkdir -p /data/db
fi fi
mkdir "${WGDASH}/src/log"
if [ ! -d "${WGDASH}/src/db" ]; then if [ ! -d "${WGDASH}/src/db" ]; then
ln -s /data/db "${WGDASH}/src/db" ln -s /data/db "${WGDASH}/src/db"
fi fi
if [ ! -f "${config_file}" ]; then if [ ! -f "${config_file}" ]; then
echo "Creating wg-dashboard.ini file" echo "Creating wg-dashboard.ini file"
touch "${config_file}" touch "${config_file}"
fi fi
if [ ! -f "${WGDASH}/src/wg-dashboard.ini" ]; then if [ ! -f "${WGDASH}/src/wg-dashboard.ini" ]; then
ln -s "${config_file}" "${WGDASH}/src/wg-dashboard.ini" ln -s "${config_file}" "${WGDASH}/src/wg-dashboard.ini"
fi fi
# Create the Python virtual environment. # Create the Python virtual environment.
. "${WGDASH}/src/venv/bin/activate" . "${WGDASH}/src/venv/bin/activate"
# Use the bash interpreter to install WGDashboard according to the wgd.sh script. # Use the bash interpreter to install WGDashboard according to the wgd.sh script.
/bin/bash ./wgd.sh install # /bin/bash ./wgd.sh install
echo "Looks like the installation succeeded. Moving on." echo "Looks like the installation succeeded. Moving on."
# Setup WireGuard if needed # Setup WireGuard if needed
if [ ! -f "/etc/wireguard/wg0.conf" ]; then if [ -z "$(ls -A /etc/wireguard)" ]; then
cp -a "/configs/wg0.conf.template" "/etc/wireguard/wg0.conf" cp -a "/configs/wg0.conf.template" "/etc/wireguard/wg0.conf"
echo "Setting a secure private key." echo "Setting a secure private key."
local privateKey local privateKey
privateKey=$(wg genkey) privateKey=$(wg genkey)
sed -i "s|^PrivateKey *=.*$|PrivateKey = ${privateKey}|g" /etc/wireguard/wg0.conf sed -i "s|^PrivateKey *=.*$|PrivateKey = ${privateKey}|g" /etc/wireguard/wg0.conf
echo "Done setting template." echo "Done setting template."
else else
echo "Existing wg0 configuration file found, using that." echo "Existing wg0 configuration file found, using that."
@@ -121,51 +122,51 @@ ensure_installation() {
set_envvars() { set_envvars() {
printf "\n------------- SETTING ENVIRONMENT VARIABLES ----------------\n" printf "\n------------- SETTING ENVIRONMENT VARIABLES ----------------\n"
# Check if config file is empty # Check if config file is empty
if [ ! -s "${config_file}" ]; then if [ ! -s "${config_file}" ]; then
echo "Config file is empty. Creating initial structure." echo "Config file is empty. Creating initial structure."
fi fi
echo "Checking basic configuration:" echo "Checking basic configuration:"
set_ini Peers peer_global_dns "${global_dns}" set_ini Peers peer_global_dns "${global_dns}"
if [ -z "${public_ip}" ]; then if [ -z "${public_ip}" ]; then
public_ip=$(curl -s ifconfig.me) public_ip=$(curl -s ifconfig.me)
echo "Automatically detected public IP: ${public_ip}" echo "Automatically detected public IP: ${public_ip}"
fi fi
set_ini Peers remote_endpoint "${public_ip}" set_ini Peers remote_endpoint "${public_ip}"
set_ini Server app_port "${wgd_port}" set_ini Server app_port "${wgd_port}"
# Account settings - process all parameters # Account settings - process all parameters
[[ -n "$username" ]] && echo "Configuring user account:" [[ -n "$username" ]] && echo "Configuring user account:"
# Basic account variables # Basic account variables
[[ -n "$username" ]] && set_ini Account username "${username}" [[ -n "$username" ]] && set_ini Account username "${username}"
if [[ -n "$password" ]]; then if [[ -n "$password" ]]; then
echo "- Setting password" echo "- Setting password"
set_ini Account password "$(hash_password "${password}")" set_ini Account password "$(hash_password "${password}")"
fi fi
# Additional account variables # Additional account variables
[[ -n "$enable_totp" ]] && set_ini Account enable_totp "${enable_totp}" [[ -n "$enable_totp" ]] && set_ini Account enable_totp "${enable_totp}"
[[ -n "$totp_verified" ]] && set_ini Account totp_verified "${totp_verified}" [[ -n "$totp_verified" ]] && set_ini Account totp_verified "${totp_verified}"
[[ -n "$totp_key" ]] && set_ini Account totp_key "${totp_key}" [[ -n "$totp_key" ]] && set_ini Account totp_key "${totp_key}"
# Welcome session # Welcome session
[[ -n "$welcome_session" ]] && set_ini Other welcome_session "${welcome_session}" [[ -n "$welcome_session" ]] && set_ini Other welcome_session "${welcome_session}"
# If username and password are set but welcome_session isn't, disable it # If username and password are set but welcome_session isn't, disable it
if [[ -n "$username" && -n "$password" && -z "$welcome_session" ]]; then if [[ -n "$username" && -n "$password" && -z "$welcome_session" ]]; then
set_ini Other welcome_session "false" set_ini Other welcome_session "false"
fi fi
# Autostart WireGuard # Autostart WireGuard
if [[ -n "$wg_autostart" ]]; then if [[ -n "$wg_autostart" ]]; then
echo "Configuring WireGuard autostart:" echo "Configuring WireGuard autostart:"
set_ini WireGuardConfiguration autostart "${wg_autostart}" set_ini WireGuardConfiguration autostart "${wg_autostart}"
fi fi
# Email (check if any settings need to be configured) # Email (check if any settings need to be configured)
email_vars=("email_server" "email_port" "email_encryption" "email_username" "email_password" "email_from" "email_template") email_vars=("email_server" "email_port" "email_encryption" "email_username" "email_password" "email_from" "email_template")
for var in "${email_vars[@]}"; do for var in "${email_vars[@]}"; do
@@ -174,12 +175,12 @@ set_envvars() {
break break
fi fi
done done
# Email (iterate through all possible fields) # Email (iterate through all possible fields)
email_fields=("server:email_server" "port:email_port" "encryption:email_encryption" email_fields=("server:email_server" "port:email_port" "encryption:email_encryption"
"username:email_username" "email_password:email_password" "username:email_username" "email_password:email_password"
"send_from:email_from" "email_template:email_template") "send_from:email_from" "email_template:email_template")
for field_pair in "${email_fields[@]}"; do for field_pair in "${email_fields[@]}"; do
IFS=: read -r field var <<< "$field_pair" IFS=: read -r field var <<< "$field_pair"
[[ -n "${!var}" ]] && set_ini Email "$field" "${!var}" [[ -n "${!var}" ]] && set_ini Email "$field" "${!var}"
@@ -189,7 +190,7 @@ set_envvars() {
# Start service and monitor logs # Start service and monitor logs
start_and_monitor() { start_and_monitor() {
printf "\n---------------------- STARTING CORE -----------------------\n" printf "\n---------------------- STARTING CORE -----------------------\n"
# Due to some instances complaining about this, making sure its there every time. # Due to some instances complaining about this, making sure its there every time.
mkdir -p /dev/net mkdir -p /dev/net
mknod /dev/net/tun c 10 200 mknod /dev/net/tun c 10 200
@@ -198,15 +199,15 @@ start_and_monitor() {
# Actually starting WGDashboard # Actually starting WGDashboard
echo "Activating Python venv and executing the WireGuard Dashboard service." echo "Activating Python venv and executing the WireGuard Dashboard service."
bash ./wgd.sh start bash ./wgd.sh start
# Wait a second before continuing, to give the python program some time to get ready. # Wait a second before continuing, to give the python program some time to get ready.
sleep 1 sleep 1
echo -e "\nEnsuring container continuation." echo -e "\nEnsuring container continuation."
# Find and monitor log file # Find and monitor log file
local logdir="${WGDASH}/src/log" local logdir="${WGDASH}/src/log"
latestErrLog=$(find "$logdir" -name "error_*.log" -type f -print | sort -r | head -n 1) latestErrLog=$(find "$logdir" -name "error_*.log" -type f -print | sort -r | head -n 1)
# Only tail the logs if they are found # Only tail the logs if they are found
if [ -n "$latestErrLog" ]; then if [ -n "$latestErrLog" ]; then
tail -f "$latestErrLog" & tail -f "$latestErrLog" &

View File

@@ -184,7 +184,7 @@ class PeerJobs:
f"Somehow can't find this peer {job.Peer} from {c.Name} failed {job.Action}ed." f"Somehow can't find this peer {job.Peer} from {c.Name} failed {job.Action}ed."
) )
else: else:
current_app.logger.warning(f"Somehow can't find this peer {job.Peer} from {c.Name} failed {job.Action}ed.") current_app.logger.warning(f"Somehow can't find this peer {job.Peer} from {job.Configuration} failed {job.Action}ed.")
self.JobLogger.log(job.JobID, False, self.JobLogger.log(job.JobID, False,
f"Somehow can't find this peer {job.Peer} from {job.Configuration} failed {job.Action}ed." f"Somehow can't find this peer {job.Peer} from {job.Configuration} failed {job.Action}ed."
) )

File diff suppressed because it is too large Load Diff

View File

@@ -13,7 +13,7 @@
}, },
"dependencies": { "dependencies": {
"@volar/language-server": "2.4.23", "@volar/language-server": "2.4.23",
"@vue/language-server": "3.0.5", "@vue/language-server": "3.0.8",
"@vuepic/vue-datepicker": "^11.0.2", "@vuepic/vue-datepicker": "^11.0.2",
"@vueuse/core": "^13.5.0", "@vueuse/core": "^13.5.0",
"@vueuse/shared": "^13.5.0", "@vueuse/shared": "^13.5.0",
@@ -27,7 +27,7 @@
"fuse.js": "^7.0.0", "fuse.js": "^7.0.0",
"i": "^0.3.7", "i": "^0.3.7",
"is-cidr": "^5.0.3", "is-cidr": "^5.0.3",
"npm": "^10.5.0", "npm": "^11.6.0",
"ol": "^10.2.1", "ol": "^10.2.1",
"pinia": "^3.0.3", "pinia": "^3.0.3",
"pinia-plugin-persistedstate": "^4.5.0", "pinia-plugin-persistedstate": "^4.5.0",
@@ -35,12 +35,12 @@
"qrcodejs": "^1.0.0", "qrcodejs": "^1.0.0",
"simple-code-editor": "^2.0.9", "simple-code-editor": "^2.0.9",
"uuid": "^11.1.0", "uuid": "^11.1.0",
"vue": "^3.5.17", "vue": "^3.5.22",
"vue-chartjs": "^5.3.0", "vue-chartjs": "^5.3.0",
"vue-router": "^4.2.5" "vue-router": "^4.2.5"
}, },
"devDependencies": { "devDependencies": {
"@vitejs/plugin-vue": "^6.0.0", "@vitejs/plugin-vue": "^6.0.0",
"vite": "^7.0.5" "vite": "^7.1.7"
} }
} }

View File

@@ -464,47 +464,6 @@ stop_wgd() {
fi fi
} }
# ============= Docker Functions =============
startwgd_docker() {
_checkWireguard
printf "[WGDashboard][Docker] WireGuard configuration started\n"
{ date; start_core ; printf "\n\n"; } >> ./log/install.txt
gunicorn_start
}
start_core() {
# Re-assign config_files to ensure it includes any newly created configurations
local config_files=$(find /etc/wireguard -type f -name "*.conf")
# Set file permissions
find /etc/wireguard -type f -name "*.conf" -exec chmod 600 {} \;
find "$iptable_dir" -type f -name "*.sh" -exec chmod +x {} \;
# Start WireGuard for each config file
for file in $config_files; do
config_name=$(basename "$file" ".conf")
wg-quick up "$config_name"
done
}
newconf_wgd() {
local wg_port_listen=$wg_port
local wg_addr_range=$wg_net
private_key=$(wg genkey)
public_key=$(echo "$private_key" | wg pubkey)
cat <<EOF >"/etc/wireguard/wg0.conf"
[Interface]
PrivateKey = $private_key
Address = $wg_addr_range
ListenPort = $wg_port_listen
SaveConfig = true
PostUp = /opt/wireguarddashboard/src/iptable-rules/postup.sh
PreDown = /opt/wireguarddashboard/src/iptable-rules/postdown.sh
EOF
}
# ============= Docker Functions =============
start_wgd_debug() { start_wgd_debug() {
_checkWireguard _checkWireguard
printf "[WGDashboard] Starting WGDashboard in the foreground.\n" printf "[WGDashboard] Starting WGDashboard in the foreground.\n"
@@ -600,4 +559,4 @@ else
help help
fi fi
fi fi
printf "%s\n" "$dashes" printf "%s\n" "$dashes"

View File

@@ -0,0 +1,59 @@
[Peers]
remote_endpoint = <your-public-ip>
peer_global_dns = <your-chosen-dns>
peer_endpoint_allowed_ip = 0.0.0.0/0
peer_display_mode = grid
peer_mtu = 1420
peer_keep_alive = 21
[Server]
app_port = 10086
wg_conf_path = /etc/wireguard
awg_conf_path = /etc/amnezia/amneziawg
app_prefix =
app_ip = 0.0.0.0
auth_req = true
version = v4.3.0.1
dashboard_refresh_interval = 60000
dashboard_peer_list_display = grid
dashboard_sort = status
dashboard_theme = dark
dashboard_api_key = false
dashboard_language = en-US
[Account]
username = admin
password = $2b$12$nWgPW.4adylN2oMhTyS5AeoiAvDj9SZxnXS.lCMkJYCV6jytmHKzu
enable_totp = false
totp_verified = false
totp_key = UOXAUPDDUNFTTHXZNQI4J4BWCEJZ63HF
[Other]
welcome_session = true
[Database]
type = sqlite
host =
port =
username =
password =
[Email]
server =
port =
encryption =
username =
email_password =
authentication_required = true
send_from =
email_template =
[OIDC]
admin_enable = false
client_enable = false
[Clients]
enable = true
[WireGuardConfiguration]
autostart =