# Wg Gen Web

<h1><img src="./web-ui.png" ></h1>

Générateur de configuration simple basé sur le Web pour [WireGuard](https://wireguard.com).

## Why another one ?

Toutes les implémentations de WireGuard UI essaient de gérer le service en appliquant des configurations et en créant des règles de réseau.

Cette implémentation ne fait que générer de la configuration et c'est à vous de créer des règles réseau et d'appliquer la configuration à WireGuard.

Par exemple en surveillant le répertoire généré avec [inotifywait](https://github.com/inotify-tools/inotify-tools/wiki) ou avec systemd.path. 

Le but est d'exécuter Wg-Gen-Web dans un espace et WireGuard sur le système hôte.

### Caractéristiques

 * Libre-service et basé sur le web
 * QR-Code pour une configuration pratique du client mobile
 * Support optionnel multi-utilisateurs derrière un proxy d'authentification
 * Prise en charge de l'authentification simple
 * Zéro dépendance externe - juste un binaire unique utilisant le module noyau wireguard
 * Déploiement de binaires et de conteneurs

Vous devez avoir WireGuard installé sur la machine qui exécute `wg-ui`.

## Wg ui

### Installation de Go (Debian)

Installer la dernière version de Go à partir de (<https://golang.org/dl/>)  

```
cd ~
wget https://go.dev/dl/go1.21.5.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.21.5.linux-amd64.tar.gz
echo "export PATH=$PATH:/usr/local/go/bin"  >> ~/.bashrc
source ~/.bashrc
```

Installer la version LTS de nodejs pour le frontend

```
# debian
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo bash -
sudo apt update
sudo apt install nodejs
```

### Cloner wg-webui-fr

```
git clone https://gitea.rnmkcy.eu/yann/wg-webui-fr
```

### Construire wg-webui-fr 

Exécuter les commandes suivantes

```
cd ~/wg-webui-fr/
go mod tidy
go build -o wg-ui main.go
cd ui
export NODE_OPTIONS=--openssl-legacy-provider
export VUE_APP_API_BASE_URL=http://localhost:8080/api/v1.0
npm install
npm run build
sudo mkdir -p /opt/appwg/ui
sudo cp ../wg-ui /opt/appwg
sudo cp -r dist /opt/appwg/ui/
```

### Environnement

Créer un fichier environnement `/opt/appwg/.env`

```
SERVER=127.0.0.1
PORT=8090
GIN_MODE=debug

WG_CONF_DIR=/opt/appwg/wireguard
WG_INTERFACE_NAME=wg0.conf

SMTP_HOST="mx.exemple.com"
SMTP_PORT=587
SMTP_USERNAME="Utilisateur@exemple.com"
SMTP_PASSWORD="Mot de passe"
SMTP_FROM="Utilisateur@exemple.com"
```

ATTENTION!!! il faut au minimun un fichier `wg0.conf` dans `/opt/appwg/wireguard`   
Avec une installation de l'application wireguard, `WG_CONF_DIR=/etc/wireguard` 

### Utilisation systemd

Créer le service `/etc/systemd/system/wgweb.service`

```
[Unit]
Description=Wireguard web
After=network.target

[Service]

Type=simple

Restart=on-failure
RestartSec=10

WorkingDirectory=/opt/appwg
ExecStart=/opt/appwg/wg-ui

[Install]
WantedBy=multi-user.target
```

Recharger 

```
sudo systemctl daemon-reload
```

### Activer et lancer le service

```
sudo systemctl enable wgweb.service --now
```

Wireguard ui est accessible sur localhost:8090  

Pour un accès via ssh  

```
ssh -L 9500:localhost:8090 utilisateur@adresse_serveur
```

### Accès navigateur

Ensuite ouvrir un navigateur localement sur localhost:9500

![](web-ui-a.png)

Activer le service

    sudo systemctl enable wgweb.service

### Mise è jour wg-webui-fr 

Exécuter les commandes suivantes

```bash
echo "Arrêt wgweb.service"
sudo systemctl stop wgweb.service
echo "Sauvegarde"
sudo cp /opt/appwg/.env _.env
echo "Supprimer appwg"
sudo rm -r /opt/appwg
echo "Construire wg-ui main.go"
cd $HOME/wg-webui-fr/
go mod tidy
go build -o wg-ui main.go
cd ui
export NODE_OPTIONS=--openssl-legacy-provider
export VUE_APP_API_BASE_URL=http://localhost:8080/api/v1.0
npm install
npm run build
sudo mkdir -p /opt/appwg/ui
sudo cp ../wg-ui /opt/appwg
sudo cp -r dist /opt/appwg/ui/
echo "Restaurer environnement"
sudo cp $HOME/_.env /opt/appwg/.env
echo "Démarrer le service"
sudo systemctl start wgweb.service
echo "FIN reconstruction"
```

Wireguard ui est accessible sur localhost:8090  


### Appliquer automatiquement les changements à WireGuard

#### Utilisation de systemd (DEFAUT) 

Utilisation de `systemd.path` pour surveiller les changements de répertoire voir [systemd doc](https://www.freedesktop.org/software/systemd/man/systemd.path.html)

```
# /etc/systemd/system/wg-gen-web.path
[Unit]
Description=Watch /etc/wireguard for changes

[Path]
PathModified=/etc/wireguard

[Install]
WantedBy=multi-user.target
```

Ce `.path` activera le fichier unit avec le même nom

```
# /etc/systemd/system/wg-gen-web.service
[Unit]
Description=Restart WireGuard
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl restart wg-quick@wg0.service

[Install]
WantedBy=multi-user.target
```

Ce qui va redémarrer le service WireGuard

Activer et lancer 

```
sudo systemctl enable wg-gen-web.path --now
```

### Utiliser inotifywait 

Pour tout autre système d'initialisation, créez un daemon exécutant ce script

```
#!/bin/sh
while inotifywait -e modify -e create /etc/wireguard; do
  wg-quick down wg0
  wg-quick up wg0
done
```

### Comment utiliser avec une configuration WireGuard existante

Après le premier lancement, Wg Gen Web créera le fichier `server.json` dans le répertoire défini le paramètre `WG_INTERFACE_NAME` du fichier environnement.

Modifier le fichier existant **server.json** pour être identique au paramétrage de wireguard **wg0.conf**