1
0
mirror of https://github.com/donaldzou/WGDashboard.git synced 2024-11-22 07:10:09 +01:00

Changed some file-names

This commit is contained in:
Daan 2024-11-07 11:25:05 +01:00
parent d425cfe1aa
commit 160ce3338d
7 changed files with 483 additions and 154 deletions

View File

@ -1,31 +1,57 @@
# Pull from small Debian stable image. FROM alpine:latest
FROM alpine:latest AS builder
LABEL maintainer="dselen@nerthus.nl" LABEL maintainer="dselen@nerthus.nl"
WORKDIR /opt/wireguarddashboard/src # Declaring environment variables, change Peernet to an address you like, standard is a 24 bit subnet.
ARG wg_net="10.0.0.1"
ARG wg_port="51820"
RUN apk update && \ # Following ENV variables are changable on container runtime because /entrypoint.sh handles that. See compose.yaml for more info.
apk add --no-cache sudo gcc musl-dev rust cargo linux-headers ENV TZ="Europe/Amsterdam"
ENV global_dns="1.1.1.1"
ENV isolate="none"
ENV public_ip="0.0.0.0"
COPY ./docker/alpine/builder.sh /opt/wireguarddashboard/src/ # Doing package management operations, such as upgrading
COPY ./docker/alpine/requirements.txt /opt/wireguarddashboard/src/ RUN apk update \
RUN chmod u+x /opt/wireguarddashboard/src/builder.sh && apk add --no-cache bash git tzdata \
RUN /opt/wireguarddashboard/src/builder.sh iptables ip6tables openrc curl wireguard-tools \
sudo py3-psutil py3-bcrypt \
&& apk upgrade
# Using WGDASH -- like wg_net functionally as a ARG command. But it is needed in entrypoint.sh so it needs to be exported as environment variable.
ENV WGDASH=/opt/wireguarddashboard
FROM alpine:latest # Removing the Linux Image package to preserve space on the image, for this reason also deleting apt lists, to be able to install packages: run apt update.
WORKDIR /opt/wireguarddashboard/src
COPY ./src /opt/wireguarddashboard/src/ # Doing WireGuard Dashboard installation measures. Modify the git clone command to get the preferred version, with a specific branch for example.
COPY --from=builder /opt/wireguarddashboard/src/venv /opt/wireguarddashboard/src/venv RUN mkdir /data \
COPY --from=builder /opt/wireguarddashboard/src/log /opt/wireguarddashboard/src/log/ && mkdir /configs \
&& mkdir -p ${WGDASH}/src
COPY ./src ${WGDASH}/src
RUN apk update && \ # Generate basic WireGuard interface. Echoing the WireGuard interface config for readability, adjust if you want it for efficiency.
apk add --no-cache wireguard-tools sudo && \ # Also setting the pipefail option, verbose: https://github.com/hadolint/hadolint/wiki/DL4006.
apk add --no-cache iptables ip6tables && \ SHELL ["/bin/bash", "-o", "pipefail", "-c"]
chmod u+x /opt/wireguarddashboard/src/entrypoint.sh RUN out_adapt=$(ip -o -4 route show to default | awk '{print $NF}') \
&& echo -e "[Interface]\n\
Address = ${wg_net}/24\n\
PrivateKey =\n\
PostUp = iptables -t nat -I POSTROUTING 1 -s ${wg_net}/24 -o ${out_adapt} -j MASQUERADE\n\
PostUp = iptables -I FORWARD -i wg0 -o wg0 -j DROP\n\
PreDown = iptables -t nat -D POSTROUTING -s ${wg_net}/24 -o ${out_adapt} -j MASQUERADE\n\
PreDown = iptables -D FORWARD -i wg0 -o wg0 -j DROP\n\
ListenPort = ${wg_port}\n\
SaveConfig = true\n\
DNS = ${global_dns}" > /configs/wg0.conf.template \
&& chmod 600 /configs/wg0.conf.template
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 CMD curl -f http://localhost:10086/signin || exit 1 # Defining a way for Docker to check the health of the container. In this case: checking the gunicorn process.
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD sh -c 'pgrep gunicorn > /dev/null && pgrep tail > /dev/null' || exit 1
ENTRYPOINT ["/opt/wireguarddashboard/src/entrypoint.sh"] # Copy the basic entrypoint.sh script.
COPY entrypoint.sh /entrypoint.sh
# Exposing the default WireGuard Dashboard port for web access.
EXPOSE 10086
ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]

View File

@ -1,26 +0,0 @@
services:
wireguard-dashboard:
build: ./
container_name: wiregate
cap_add:
- NET_ADMIN
- SYS_MODULE
restart: unless-stopped
environment:
- wg_net=10.0.0.1/24
- wg_port=51820
volumes:
- wgd_configs:/etc/wireguard
- wgd_app:/opt/wireguarddashboard/src
ports:
- 10086:10086/tcp
- 51820:51820/udp
sysctls:
- net.ipv4.ip_forward=1
- net.ipv4.conf.all.src_valid_mark=1
volumes:
wgd_configs:
wgd_app:

View File

@ -1,82 +0,0 @@
# WG-Dashboard Docker Explanation:
Author: DaanSelen<br>
This document delves into how the WG-Dashboard Docker container has been built.<br>
Of course there are two stages, 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>
In this example, WireGuard is integrated into the container itself, so it should be a run-and-go.<br>
For more details on the source-code specific to this Docker image, refer to the source files, they have lots of comments.
I have tried to embed some new features such as `isolated_peers` and interface startup on container-start (through `enable_wg0`).
<img src="https://raw.githubusercontent.com/donaldzou/WGDashboard/main/img/logo.png" alt="WG-Dashboard Logo" title="WG-Dashboard Logo" width="150" height="150" />
## Getting the container running:
To get the container running you either pull the image from the repository, at the moment: `repo.nerthus.nl/app/wireguard-dashboard:latest`.<br>
From there either use the environment variables describe below as parameters or use the Docker Compose file: `compose.yaml`.
An example of a simple command to get the container running is show below:<br>
```shell
docker run -d \
--name wireguard-dashboard \
--restart unless-stopped \
-e enable_wg0=true \
-e isolated_peers=true \
-p 10086:10086/tcp \
-p 51820:51820/udp \
--cap-add NET_ADMIN \
repo.nerthus.nl/app/wireguard-dashboard:latest
```
<br>
If you want to use Compose instead of a raw Docker command, refer to the example in the `compose.yaml` or the one pasted below:
<br><br>
```yaml
services:
wireguard-dashboard:
image: repo.nerthus.nl/app/wireguard-dashboard:latest
restart: unless-stopped
container_name: wire-dash
environment:
#- tz=
#- global_dns=
- enable_wg0=true
- isolated_peers=false
#- public_ip=
ports:
- 10086:10086/tcp
- 51820:51820/udp
volumes:
- conf:/etc/wireguard
- app:/opt/wireguarddashboard/app
cap_add:
- NET_ADMIN
volumes:
conf:
app:
```
If you want to customize the yaml, make sure the core stays the same, but for example volume PATHs can be freely changed.<br>
This setup is just generic and will use the Docker volumes.
## Working with the container and environment variables:
Once the container is running, the installation process is essentially the same as running it on bare-metal.<br>
So go to the assign TCP port in this case HTTP, like the default 10086 one in the example and log into the WEB-GUI.<br>
| Environment variable | Accepted arguments | Default value | Verbose |
| -------------- | ------- | ------- | ------- |
| tz | Europe/Amsterdam or any confirming timezone notation. | Europe/Amsterdam | Sets the timezone of the Docker container. This is to timesync the container to any other processes which would need it. |
| global_dns | Any IPv4 address, such as my personal recommendation: 9.9.9.9 (QUAD9) | 1.1.1.1 | Set the default DNS given to clients once they connect to the WireGuard tunnel (VPN).
| enable_wg0 | `true` or `false` | `false` | Enables or disables the starting of the WireGuard interface on container 'boot-up'.
| isolated_peers | `true` or `false` | `true` | For security the default is true, and it disables peers to ping or reach eachother, the WireGuard interface IS able to reach the peers (Done through `iptables`).
| public_ip | Any IPv4 (public recommended) address, such as the one returned by default | Default uses the return of `curl ifconfig.me` | To reach your VPN from outside your own network, you need WG-Dashboard to know what your public IP-address is, otherwise it will generate faulty config files for clients.
## Closing remarks:
For feedback please submit an issue to the repository. Or message dselen@nerthus.nl.

23
docker/compose.yaml Normal file
View File

@ -0,0 +1,23 @@
services:
wireguard-dashboard:
image: test:latest
restart: unless-stopped
container_name: wgdashboard
environment:
- tz=Europe/Amsterdam # <--- Set container timezone, default: Europe/Amsterdam.
- global_dns=9.9.9.9 # <--- Set global DNS address, default: 1.1.1.1.
#- enable= # <--- Set the interfaces that will be enabled on startup, default: 'none'.
#- isolate= # <--- Set the interfaces that will disallow peer communication, default: 'none'.
#- public_ip= # <--- Set public IP to ensure the correct one is chosen, defaulting to the IP give by ifconfig.me.
ports:
- 10086:10086/tcp
- 51820:51820/udp
volumes:
- conf:/etc/wireguard
- data:/data
cap_add:
- NET_ADMIN
volumes:
conf:
data:

211
entrypoint.sh Normal file
View File

@ -0,0 +1,211 @@
#!/bin/bash
echo "------------------------- START ----------------------------"
echo "Starting the WireGuard Dashboard Docker container."
ensure_installation() {
# When using a custom directory to store the files, this part moves over and makes sure the installation continues.
echo "Quick-installing..."
[ ! -d "/data/db" ] && echo "Creating database dir" && mkdir /data/db
ln -s /data/db "${WGDASH}/src/db"
[ ! -f "/data/wg-dashboard.ini" ] && echo "Creating wg-dashboard.ini file" && touch /data/wg-dashboard.ini
ln -s /data/wg-dashboard.ini "${WGDASH}/src/wg-dashboard.ini"
python3 -m venv "${WGDASH}"/src/venv
. "${WGDASH}/src/venv/bin/activate"
[ ! -d "${WGDASH}/src/venv/lib/python3.12/site-packages/psutil" ] && echo "Moving PIP dependency: psutil" && mv /usr/lib/python3.12/site-packages/psutil* "${WGDASH}"/src/venv/lib/python3.12/site-packages
[ ! -d "${WGDASH}/src/venv/lib/python3.12/site-packages/bcrypt" ] && echo "Moving PIP dependency: bcrypt" && mv /usr/lib/python3.12/site-packages/bcrypt* "${WGDASH}"/src/venv/lib/python3.12/site-packages
chmod +x "${WGDASH}"/src/wgd.sh
cd "${WGDASH}"/src || exit
./wgd.sh install
echo "Looks like the installation succeeded."
# This first step is to ensure the wg0.conf file exists, and if not, then its copied over from the ephemeral container storage.
# This is done so WGDashboard it works out of the box
if [ ! -f "/etc/wireguard/wg0.conf" ]; then
echo "Standard wg0 Configuration file not found, grabbing template."
cp -a "/configs/wg0.conf.template" "/etc/wireguard/wg0.conf"
echo "Setting a secure private key." # SORRY 4 BE4 - Daan
local privateKey
privateKey=$(wg genkey)
sed -i "s|^PrivateKey *=.*$|PrivateKey = ${privateKey}|g" /etc/wireguard/wg0.conf
echo "Done setting template."
else
echo "Existing wg0 configuration file found, using that."
fi
}
set_envvars() {
printf "\n------------- SETTING ENVIRONMENT VARIABLES ----------------\n"
# Path to the configuration file (exists because of previous function).
local config_file="/opt/wireguarddashboard/src/wg-dashboard.ini"
# Check if the file is empty
if [ ! -s "$config_file" ]; then
echo "Config file is empty. Creating [Peers] section."
# Create [Peers] section with initial values
{
echo "[Peers]"
echo "remote_endpoint = ${public_ip}"
echo "peer_global_dns = ${global_dns}"
} > "$config_file"
else
echo "Config file is not empty, enforcing environment variables."
# Check and update the DNS if it has changed
current_dns=$(grep "peer_global_dns = " "$config_file" | awk '{print $NF}')
if [ "${global_dns}" != "$current_dns" ]; then
echo "Changing default DNS."
sed -i "s/^peer_global_dns = .*/peer_global_dns = ${global_dns}/" "$config_file"
else
echo "DNS is set correctly."
fi
# Determine the public IP and update if necessary
echo "{$public_ip}"
if [ "${public_ip}" = "0.0.0.0" ]; then
default_ip=$(curl -s ifconfig.me)
echo "Trying to fetch the Public-IP using ifconfig.me: ${default_ip}"
sed -i "s/^remote_endpoint = .*/remote_endpoint = ${default_ip}/" "$config_file"
else
current_ip=$(grep "remote_endpoint = " "$config_file" | awk '{print $NF}')
if [ "${public_ip}" != "$current_ip" ]; then
echo "Setting the Public-IP using given variable: ${public_ip}"
sed -i "s/^remote_endpoint = .*/remote_endpoint = ${public_ip}/" "$config_file"
fi
fi
fi
}
# === CORE SERVICES ===
start_core() {
printf "\n---------------------- STARTING CORE -----------------------\n"
echo "Activating Python venv and executing the WireGuard Dashboard service."
. "${WGDASH}"/src/venv/bin/activate
cd "${WGDASH}"/src || return
bash wgd.sh start
# Isolated peers feature, first converting the existing configuration files and the given names to arrays.
#
# WILL BE REMOVED IN FUTURE WHEN WGDASHBOARD ITSELF SUPPORTS THIS!!
#
local configurations=(/etc/wireguard/*)
IFS=',' read -r -a do_isolate <<< "${isolate}"
non_isolate=()
# Checking if there are matches between the two arrays.
for config in "${configurations[@]}"; do
config=$(echo "$config" | sed -e 's|.*/etc/wireguard/||' -e 's|\.conf$||')
local found
found=false
for interface in "${do_isolate[@]}"; do
if [[ "$config" == "$interface" ]]; then
found=true
break
fi
done
if [ "$found" = false ]; then
non_isolate+=("$config")
fi
done
# Isolating the matches.
for interface in "${do_isolate[@]}"; do
if [ "$interface" = "none" ] || [ "$interface" = "" ]; then
echo "Found: $interface, stopping isolation checking."
break
else
if [ ! -f "/etc/wireguard/${interface}.conf" ]; then
echo "Ignoring ${interface}"
elif [ -f "/etc/wireguard/${interface}.conf" ]; then
echo "Isolating interface:" "$interface"
upblocking=$(grep -c "PostUp = iptables -I FORWARD -i ${interface} -o ${interface} -j DROP" /etc/wireguard/"${interface}".conf)
downblocking=$(grep -c "PreDown = iptables -D FORWARD -i ${interface} -o ${interface} -j DROP" /etc/wireguard/"${interface}".conf)
if [ "$upblocking" -lt 1 ] && [ "$downblocking" -lt 1 ]; then
sed -i "/PostUp =/a PostUp = iptables -I FORWARD -i ${interface} -o ${interface} -j DROP" /etc/wireguard/"${interface}".conf
sed -i "/PreDown =/a PreDown = iptables -D FORWARD -i ${interface} -o ${interface} -j DROP" /etc/wireguard/"${interface}".conf
fi
else
echo "Configuration for $interface in enforce isolation does not seem to exist, continuing."
fi
fi
done
# Removing isolation for the configurations that did not match.
for interface in "${non_isolate[@]}"; do\
if [ ! -f "/etc/wireguard/${interface}.conf" ]; then
echo "Ignoring ${interface}"
elif [ -f "/etc/wireguard/${interface}.conf" ]; then
echo "Removing isolation, if isolation is present for:" "$interface"
sed -i "/PostUp = iptables -I FORWARD -i ${interface} -o ${interface} -j DROP/d" /etc/wireguard/"${interface}".conf
sed -i "/PreDown = iptables -D FORWARD -i ${interface} -o ${interface} -j DROP/d" /etc/wireguard/"${interface}".conf
else
echo "Configuration for $interface in removing isolation does not seem to exist, continuing."
fi
done
}
ensure_blocking() {
sleep 1s
echo -e "\nEnsuring container continuation."
# Find and tail the latest error and access logs if they exist
local logdir="/opt/wireguarddashboard/src/log"
latestErrLog=$(find "$logdir" -name "error_*.log" -type f -print | sort -r | head -n 1)
latestAccLog=$(find "$logdir" -name "access_*.log" -type f -print | sort -r | head -n 1)
# Only tail the logs if they are found
if [ -n "$latestErrLog" ] || [ -n "$latestAccLog" ]; then
tail -f "$latestErrLog" "$latestAccLog"
else
echo "No log files found to tail."
fi
# Blocking command to keep the container running as a last resort.
sleep infinity
}
# Execute functions for the WireGuard Dashboard services, then set the environment variables
ensure_installation
set_envvars
start_core
ensure_blocking

View File

@ -1,9 +1,39 @@
[ [
{
"lang_id": "cs",
"lang_name": "Czech",
"lang_name_localized": "Česky"
},
{
"lang_id": "de",
"lang_name": "German",
"lang_name_localized": "Deutsch"
},
{ {
"lang_id": "en", "lang_id": "en",
"lang_name": "English", "lang_name": "English",
"lang_name_localized": "English" "lang_name_localized": "English"
}, },
{
"lang_id": "it-IT",
"lang_name": "Italian",
"lang_name_localized": "Italiano"
},
{
"lang_id": "nl-NL",
"lang_name": "Dutch",
"lang_name_localized": "Nederlands"
},
{
"lang_id": "ru",
"lang_name": "Russian",
"lang_name_localized": "Русский"
},
{
"lang_id": "uk",
"lang_name": "Ukrainian",
"lang_name_localized": "Українська"
},
{ {
"lang_id": "zh-CN", "lang_id": "zh-CN",
"lang_name": "Chinese (Simplified)", "lang_name": "Chinese (Simplified)",
@ -13,30 +43,5 @@
"lang_id": "zh-HK", "lang_id": "zh-HK",
"lang_name": "Chinese (Traditional)", "lang_name": "Chinese (Traditional)",
"lang_name_localized": "中文(繁體)" "lang_name_localized": "中文(繁體)"
},
{
"lang_id": "uk",
"lang_name": "Ukrainian",
"lang_name_localized": "Українська"
},
{
"lang_id": "de",
"lang_name": "German",
"lang_name_localized": "Deutsch"
},
{
"lang_id": "it-IT",
"lang_name": "Italian",
"lang_name_localized": "Italiano"
},
{
"lang_id": "ru",
"lang_name": "Russian",
"lang_name_localized": "Русский"
},
{
"lang_id": "cs",
"lang_name": "Czech",
"lang_name_localized": "Česky"
} }
] ]

View File

@ -0,0 +1,172 @@
{
"Welcome to": "Welkom bij",
"Username": "Gebruikersnaam",
"Password": "Wachtwoord",
"OTP from your authenticator": "OTP van je authenticator",
"Sign In": "Inloggen",
"Signing In...": "Inloggen...",
"Access Remote Server": "Toegang tot externe server",
"Server": "Server",
"Click": "Klik",
"Pinging...": "Pingen...",
"to add your server": "om je server toe te voegen",
"Server List": "Serverlijst",
"Sorry, your username or password is incorrect.": "Sorry, je gebruikersnaam of wachtwoord is onjuist.",
"Home": "Startpagina",
"Settings": "Instellingen",
"Tools": "Hulpmiddelen",
"Sign Out": "Uitloggen",
"Checking for update...": "Controleren op updates...",
"You're on the latest version": "Je hebt de nieuwste versie",
"WireGuard Configurations": "WireGuard-configuraties",
"You don't have any WireGuard configurations yet. Please check the configuration folder or change it in Settings. By default the folder is /etc/wireguard.": "Je hebt nog geen WireGuard-configuraties. Controleer de configuratiemap of wijzig deze in de instellingen. Standaard is de map /etc/wireguard.",
"Configuration": "Configuratie",
"Configurations": "Configuraties",
"Peers Default Settings": "Standaardinstellingen voor peers",
"Dashboard Theme": "Dashboard-thema",
"Light": "Licht",
"Dark": "Donker",
"This will be changed globally, and will be apply to all peer's QR code and configuration file.": "Dit wordt wereldwijd gewijzigd en toegepast op de QR-code en configuratiebestand van alle peers.",
"WireGuard Configurations Settings": "Instellingen voor WireGuard-configuraties",
"Configurations Directory": "Configuratiemap",
"Remember to remove / at the end of your path. e.g /etc/wireguard": "Vergeet niet om de \"/\" aan het einde van je pad te verwijderen, bijv. /etc/wireguard",
"WGDashboard Account Settings": "WGDashboard-accountinstellingen",
"Current Password": "Huidig wachtwoord",
"New Password": "Nieuw wachtwoord",
"Repeat New Password": "Herhaal nieuw wachtwoord",
"Update Password": "Wachtwoord bijwerken",
"Multi-Factor Authentication (MFA)": "Multi-Factor Authenticatie (MFA)",
"Reset": "Resetten",
"Setup": "Instellen",
"API Keys": "API-sleutels",
"API Key": "API-sleutel",
"Key": "Sleutel",
"Enabled": "Ingeschakeld",
"Disabled": "Uitgeschakeld",
"No WGDashboard API Key": "Geen WGDashboard API-sleutel",
"Expire At": "Verloopt op",
"Are you sure to delete this API key?": "Weet je zeker dat je deze API-sleutel wilt verwijderen?",
"Create API Key": "API-sleutel maken",
"When should this API Key expire?": "Wanneer moet deze API-sleutel verlopen?",
"Never Expire": "Geen vervaldatum",
"Don't think that's a good idea": "Dat is waarschijnlijk geen goed idee",
"Creating...": "Bezig met aanmaken...",
"Create": "Aanmaken",
"Status": "Status",
"On": "Aan",
"Off": "Uit",
"Turning On...": "Inschakelen...",
"Turning Off...": "Uitschakelen...",
"Address": "Adres",
"Listen Port": "Luisterpoort",
"Public Key": "Publieke sleutel",
"Connected Peers": "Verbonden peers",
"Total Usage": "Totale verbruik",
"Total Received": "Totaal ontvangen",
"Total Sent": "Totaal verzonden",
"Peers Data Usage": "Datagebruik van peers",
"Real Time Received Data Usage": "Ontvangen data in real-time",
"Real Time Sent Data Usage": "Verzonden data in real-time",
"Peer": "Peer",
"Peers": "Peers",
"Peer Settings": "Peer-instellingen",
"Download All": "Alles downloaden",
"Search Peers...": "Zoek peers...",
"Display": "Weergave",
"Sort By": "Sorteren op",
"Refresh Interval": "Verversingsinterval",
"Name": "Naam",
"Allowed IPs": "Toegestane IP's",
"Restricted": "Beperkt",
"(.*) Seconds": "$1 seconden",
"(.*) Minutes": "$1 minuten",
"Configuration Settings": "Configuratie-instellingen",
"Peer Jobs": "Peer-taken",
"Active Jobs": "Actieve taken",
"All Active Jobs": "Alle actieve taken",
"Logs": "Logboeken",
"Private Key": "Privésleutel",
"(Required for QR Code and Download)": "(Vereist voor QR-code en downloaden)",
"(Required)": "(Vereist)",
"Endpoint Allowed IPs": "Toegestane IP's voor eindpunt",
"DNS": "DNS",
"Optional Settings": "Optionele instellingen",
"Pre-Shared Key": "Vooraf gedeelde sleutel",
"MTU": "MTU",
"Persistent Keepalive": "Persistente Keepalive",
"Reset Data Usage": "Datagebruik resetten",
"Total": "Totaal",
"Sent": "Verzonden",
"Received": "Ontvangen",
"Revert": "Herstellen",
"Save Peer": "Peer opslaan",
"QR Code": "QR-code",
"Schedule Jobs": "Taken plannen",
"Job": "Taak",
"Job ID": "Taak-ID",
"Unsaved Job": "Niet-opgeslagen taak",
"This peer does not have any job yet.": "Deze peer heeft nog geen taak.",
"if": "als",
"is": "is",
"then": "dan",
"larger than": "groter dan",
"Date": "Datum",
"Restrict Peer": "Peer beperken",
"Delete Peer": "Peer verwijderen",
"Edit": "Bewerken",
"Delete": "Verwijderen",
"Deleting...": "Bezig met verwijderen...",
"Cancel": "Annuleren",
"Save": "Opslaan",
"No active job at the moment.": "Momenteel geen actieve taak.",
"Jobs Logs": "Taken logboeken",
"Updated at": "Bijgewerkt op",
"Refresh": "Verversen",
"Filter": "Filter",
"Success": "Succesvol",
"Failed": "Mislukt",
"Log ID": "Log-ID",
"Message": "Bericht",
"Share Peer": "Peer delen",
"Currently the peer is not sharing": "De peer wordt momenteel niet gedeeld",
"Sharing...": "Delen...",
"Start Sharing": "Delen starten",
"Stop Sharing...": "Delen stoppen...",
"Stop Sharing": "Delen stoppen",
"Access Restricted": "Toegang beperkt",
"Restrict Access": "Toegang beperken",
"Restricting...": "Beperken...",
"Allow Access": "Toegang toestaan",
"Allowing Access...": "Toegang toestaan...",
"Download & QR Code is not available due to no private key set for this peer": "Downloaden & QR-code zijn niet beschikbaar omdat er geen privésleutel is ingesteld voor deze peer",
"Add Peers": "Peers toevoegen",
"Bulk Add": "Bulk toevoegen",
"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP.": "Bij het toevoegen van peers in bulk wordt de naam van elke peer automatisch gegenereerd, en wordt de toegestane IP toegekend aan het eerstvolgende beschikbare IP.",
"How many peers you want to add?": "Hoeveel peers wil je toevoegen?",
"You can add up to (.*) peers": "Je kunt maximaal $1 peers toevoegen",
"Use your own Private and Public Key": "Gebruik je eigen privésleutel en publieke sleutel",
"Enter IP Address/CIDR": "Voer IP-adres/CIDR in",
"IP Address/CIDR": "IP-adres/CIDR",
"or": "of",
"Pick Available IP": "Beschikbare IP kiezen",
"No available IP containing": "Geen beschikbare IP bevat",
"Add": "Toevoegen",
"Adding...": "Toevoegen...",
"Failed to check available update": "Controle op beschikbare update mislukt",
"Nice to meet you!": "Aangenaam!",
"Please fill in the following fields to finish setup": "Vul de volgende velden in om de setup te voltooien",
"Create an account": "Maak een account aan",
"Enter an username you like": "Voer een gebruikersnaam naar keuze in",
"Enter a password": "Voer een wachtwoord in",
"\\(At least 6 characters)": "(Minimaal 6 tekens)",
"Repeat password": "Herhaal wachtwoord",
"Set up": "Instellen",
"Setting up...": "Instellen...",
"Nice!": "Top!",
"Go to Login Page": "Ga naar de inlogpagina",
"Starting server...": "Server starten...",
"Status code": "Statuscode",
"Restart WGDashboard Server": "WGDashboard-server opnieuw starten",
"Restart": "Opnieuw starten",
"WGDashboard Web API Documentation": "WGDashboard Web API Documentatie"
}