mirror of
https://github.com/donaldzou/WGDashboard.git
synced 2025-10-04 08:16:17 +00:00
Compare commits
29 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
eb1d52ffba | ||
|
5db7351f8c | ||
|
5ae3a56337 | ||
|
e7068b472e | ||
|
3dc94a35a1 | ||
|
f82abd71a3 | ||
|
602238d794 | ||
|
4d4a15740b | ||
|
524d50ee07 | ||
|
fc591b7fe8 | ||
|
c2f06193d0 | ||
|
f2ead12315 | ||
|
ca8700ac2a | ||
|
10a8d22efd | ||
|
fc3ec61373 | ||
|
094d1c0718 | ||
|
0d814ec03c | ||
|
5ccfe07e12 | ||
|
101ac5e985 | ||
|
113a780eec | ||
|
cf77610a56 | ||
|
84675fe521 | ||
|
5db5b35311 | ||
|
ff345c9609 | ||
|
6cccfec923 | ||
|
8231dd1463 | ||
|
d8ff020d8c | ||
|
238fb91360 | ||
|
9ecc16fcc1 |
12
.github/dependabot.yml
vendored
12
.github/dependabot.yml
vendored
@@ -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"
|
||||||
|
@@ -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">
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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.
|
||||||
|
@@ -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:
|
||||||
|
@@ -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,58 @@ 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
|
||||||
|
|
||||||
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 +121,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 +174,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 +189,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 +198,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" &
|
||||||
@@ -221,4 +221,4 @@ start_and_monitor() {
|
|||||||
# Main execution flow
|
# Main execution flow
|
||||||
ensure_installation
|
ensure_installation
|
||||||
set_envvars
|
set_envvars
|
||||||
start_and_monitor
|
start_and_monitor
|
||||||
|
@@ -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."
|
||||||
)
|
)
|
||||||
|
1509
src/static/app/package-lock.json
generated
1509
src/static/app/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -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.1.0",
|
||||||
"@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,20 +27,20 @@
|
|||||||
"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.1",
|
||||||
"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",
|
||||||
"qrcode": "^1.5.3",
|
"qrcode": "^1.5.3",
|
||||||
"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": "^13.0.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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
43
src/wgd.sh
43
src/wgd.sh
@@ -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"
|
||||||
|
59
templates/wg-dashboard.ini.template
Normal file
59
templates/wg-dashboard.ini.template
Normal 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 =
|
Reference in New Issue
Block a user