This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# gluetun-pia-wireguard-rotator
|
||||
|
||||
Sidecar die op een cron-schema (en bij container-start) de **snelste** PIA WireGuard-region kiest (TCP-latency) via [pia-wg-config](https://github.com/ccarpinteri/pia-wg-config), `wg0.conf` op het gedeelde gluetun-volume schrijft, en een configureerbare lijst containers herstart.
|
||||
Sidecar die op een cron-schema (en bij container-start) de **snelste** PIA WireGuard-server kiest (TCP-latency), lokaal een keypair maakt, via PIA `addKey` registreert, `wg0.conf` op het gedeelde gluetun-volume schrijft, en afhankelijke containers herstart.
|
||||
|
||||
## Vereisten
|
||||
|
||||
@@ -19,12 +19,14 @@ Sidecar die op een cron-schema (en bij container-start) de **snelste** PIA WireG
|
||||
| `PIA_PASS` | PIA-wachtwoord |
|
||||
| `PIA_REGIONS` | CSV (`nl_amsterdam,france,belgium`) of JSON-array (`["nl_amsterdam","france"]`) |
|
||||
|
||||
Region-codes moeten overeenkomen met `pia-wg-config` (niet de OpenVPN-namen uit Gluetun's ingebouwde PIA-provider).
|
||||
Region-IDs komen uit de PIA serverlist (niet de OpenVPN-namen uit Gluetun's ingebouwde PIA-provider).
|
||||
|
||||
Lijst opvragen:
|
||||
|
||||
```bash
|
||||
docker run --rm --entrypoint pia-wg-config bramkel/gluetun-pia-wireguard-rotator:latest --list-regions
|
||||
docker run --rm --entrypoint /opt/venv/bin/python \
|
||||
bramkel/gluetun-pia-wireguard-rotator:latest \
|
||||
/usr/local/bin/rotate.py --list-regions
|
||||
```
|
||||
|
||||
### Optional
|
||||
@@ -35,33 +37,34 @@ docker run --rm --entrypoint pia-wg-config bramkel/gluetun-pia-wireguard-rotator
|
||||
| `GLUETUN_CONTAINER` | `m3u-filter-vpn` | Gluetun-container; wordt **altijd als eerste** herstart |
|
||||
| `WG_CONFIG_PATH` | `/config/wireguard/wg0.conf` | Pad waar `wg0.conf` wordt geschreven |
|
||||
| `ROTATOR_STATE_PATH` | `/config/rotator-state.json` | Laatste rotatie-metadata |
|
||||
| `ROTATE_CRON` | `0 3 * * *` | 5-veld cron-expressie (minuut uur dag-van-maand maand dag-van-week), in `TZ`. Macros: `@hourly`, `@daily`, `@weekly`, `@monthly`, `@yearly` |
|
||||
| `REGION_SELECT` | `fastest` | `fastest` = laagste TCP-latency naar WG-servers in `PIA_REGIONS`; `random` = willekeurig (slaat vorige region over indien mogelijk) |
|
||||
| `ROTATE_CRON` | `0 3 * * *` | 5-veld cron-expressie, in `TZ`. Macros: `@hourly`, `@daily`, `@weekly`, `@monthly`, `@yearly` |
|
||||
| `REGION_SELECT` | `fastest` | `fastest` = laagste TCP-latency; `random` = willekeurige regio/server |
|
||||
| `LATENCY_PORT` | `1337` | TCP-poort voor latency-probes |
|
||||
| `LATENCY_TIMEOUT_SECONDS` | `2` | Timeout per probe |
|
||||
| `LATENCY_SAMPLES` | `2` | Aantal samples per server-IP (gemiddelde) |
|
||||
| `LATENCY_SWITCH_MARGIN_MS` | `15` | Alleen switchen van regio als de winst ≥ deze marge is (minder churn / token-calls) |
|
||||
| `SERVERLIST_CACHE_PATH` | `/config/cache/pia-serverlist.json` | Disk-cache voor PIA serverlist (gedeeld met `pia-wg-config`) |
|
||||
| `SERVERLIST_CACHE_TTL` | `24h` | Gebruik cache zonder refresh (`Ns`/`Nm`/`Nh`/`Nd` of seconden) |
|
||||
| `SERVERLIST_CACHE_MAX_AGE` | `168h` | Maximale leeftijd; daarna verplicht vernieuwen (stale fallback bij fetch-fout) |
|
||||
| `WG_CONFIG_MAX_AGE` | `7d` | Geen nieuwe token/config zolang regio gelijk blijft en `wg0.conf` jonger is |
|
||||
| `FORCE_ROTATE` | `false` | `true` = altijd nieuwe config + container-restarts, cache-skip negeren |
|
||||
| `RATE_LIMIT_WAIT_SECONDS` | `3600` | Wachttijd bij PIA rate-limit (`429` / `too_many_attempts`) vóór retry |
|
||||
| `LATENCY_SWITCH_MARGIN_MS` | `15` | Alleen switchen als de winst ≥ deze marge is |
|
||||
| `SERVERLIST_CACHE_PATH` | `/config/cache/pia-serverlist.json` | Disk-cache voor PIA serverlist |
|
||||
| `SERVERLIST_CACHE_TTL` | `24h` | Cache zonder refresh (`Ns`/`Nm`/`Nh`/`Nd` of seconden) |
|
||||
| `SERVERLIST_CACHE_MAX_AGE` | `168h` | Max leeftijd; stale fallback bij fetch-fout |
|
||||
| `TOKEN_CACHE_PATH` | `/config/cache/pia-token.json` | Disk-cache voor PIA auth-token |
|
||||
| `TOKEN_CACHE_TTL` | `20h` | Hergebruik token i.p.v. opnieuw inloggen |
|
||||
| `PIA_CA_PATH` | `/config/cache/ca.rsa.4096.crt` | Gecachete PIA CA voor `addKey` TLS |
|
||||
| `WG_CONFIG_MAX_AGE` | `7d` | Geen nieuwe token/`addKey` zolang endpoint gelijk blijft en config jonger is |
|
||||
| `FORCE_ROTATE` | `false` | `true` = altijd nieuwe config + restarts |
|
||||
| `FORCE_TOKEN_REFRESH` | `false` | `true` = token-cache negeren |
|
||||
| `RATE_LIMIT_WAIT_SECONDS` | `3600` | Wachttijd bij PIA rate-limit vóór retry |
|
||||
| `TZ` | `Europe/Brussels` | Tijdzone voor scheduling |
|
||||
|
||||
`ROTATE_CRON` voorbeelden: `0 */6 * * *` (elke 6 uur), `0 3 * * 1-5` (weekdagen 03:00), `@hourly`. Quote de waarde in Compose (`'ROTATE_CRON=0 3 * * *'`) zodat YAML `*` niet speciaal interpreteert. Oude `ROTATE_AT=HH:MM` werkt nog als `ROTATE_CRON` leeg is.
|
||||
`ROTATE_CRON` voorbeelden: `0 */6 * * *`, `0 3 * * 1-5`, `@hourly`. Quote in Compose: `'ROTATE_CRON=0 3 * * *'`.
|
||||
|
||||
## Output
|
||||
|
||||
- `wireguard/wg0.conf` op het gedeelde volume — Gluetun leest dit als `/gluetun/wireguard/wg0.conf` en dit **overschrijft** `WIREGUARD_*` environment variables
|
||||
- `rotator-state.json` — laatste gekozen region, latency-resultaten, timestamp en herstartte containers
|
||||
- `wireguard/wg0.conf` — Gluetun leest dit als `/gluetun/wireguard/wg0.conf` (overschrijft `WIREGUARD_*` env-vars)
|
||||
- `rotator-state.json` — gekozen region/server, latency, timestamps
|
||||
- `cache/` — serverlist, token, PIA CA
|
||||
|
||||
## Compose-integratie
|
||||
|
||||
Zie [`docker-compose.example.yml`](docker-compose.example.yml) voor een volledig voorbeeld met `m3u-filter-vpn`, m3u-editor en xtream-proxy.
|
||||
|
||||
### Nieuwe service toevoegen
|
||||
|
||||
```yaml
|
||||
gluetun-pia-wireguard-rotator:
|
||||
image: bramkel/gluetun-pia-wireguard-rotator:latest
|
||||
@@ -83,11 +86,9 @@ Zie [`docker-compose.example.yml`](docker-compose.example.yml) voor een volledig
|
||||
- m3u-filter-vpn
|
||||
```
|
||||
|
||||
Zet `PIA_USER` en `PIA_PASSWORD` in een host-`.env` (niet inline in compose).
|
||||
|
||||
### Gluetun opschonen (aanbevolen na eerste succesvolle rotatie)
|
||||
|
||||
Zodra `wg0.conf` bestaat, heeft het bestand voorrang op env-vars. Verwijder uit `m3u-filter-vpn` om verwarring te voorkomen:
|
||||
Verwijder uit gluetun zodra `wg0.conf` bestaat:
|
||||
|
||||
- `WIREGUARD_ENDPOINT_IP`
|
||||
- `WIREGUARD_PUBLIC_KEY`
|
||||
@@ -102,27 +103,18 @@ Behoud minimaal:
|
||||
- VPN_TYPE=wireguard
|
||||
```
|
||||
|
||||
Optioneel host-`.env`-keys (`WIREGUARD_*`) opruimen als die niet meer gebruikt worden.
|
||||
|
||||
## Deploy
|
||||
|
||||
1. Push/build image (`Dockers/gluetun-pia-wireguard-rotator/**` triggert Gitea CI → `bramkel/gluetun-pia-wireguard-rotator:latest`)
|
||||
1. Push/build image (`Dockers/gluetun-pia-wireguard-rotator/**` → `bramkel/gluetun-pia-wireguard-rotator:latest`)
|
||||
2. `docker compose up -d gluetun-pia-wireguard-rotator`
|
||||
3. Controleer logs: `docker logs gluetun-pia-wireguard-rotator` en `docker logs m3u-filter-vpn`
|
||||
3. Logs: `docker logs gluetun-pia-wireguard-rotator`
|
||||
|
||||
## Gedrag
|
||||
|
||||
1. Bij start / cron: latency meten (of random kiezen)
|
||||
2. Serverlist komt uit disk-cache (`SERVERLIST_CACHE_*`); token/API alleen bij echte config-refresh
|
||||
3. Geen `pia-wg-config` + geen restarts als regio gelijk blijft én `wg0.conf` jonger is dan `WG_CONFIG_MAX_AGE`
|
||||
4. Anders: nieuwe config schrijven, `GLUETUN_CONTAINER` eerst herstarten, daarna `RESTART_CONTAINERS`
|
||||
1. Latency meten over WG-servers in `PIA_REGIONS` (of random)
|
||||
2. **Pin** de snelste server-IP (niet alleen regio)
|
||||
3. Keypair lokaal genereren; token + `addKey` alleen bij echte refresh
|
||||
4. Caches: serverlist, token (~20u), CA-cert
|
||||
5. Skip token/`addKey`/restarts als endpoint gelijk blijft én config jonger dan `WG_CONFIG_MAX_AGE`
|
||||
|
||||
**Let op:** zet gluetun **niet** in `RESTART_CONTAINERS`; gebruik `GLUETUN_CONTAINER` daarvoor. Sidecars met `network_mode: service:...` horen in `RESTART_CONTAINERS`.
|
||||
|
||||
**Let op:** elke rotatie veroorzaakt kort downtime voor alle VPN-afhankelijke services.
|
||||
|
||||
## Security
|
||||
|
||||
- De Docker socket geeft de rotator rechten om containers te herstarten; mount read-only waar mogelijk
|
||||
- `wg0.conf` bevat private keys (`chmod 600`)
|
||||
- Bewaar PIA-credentials in `.env`, niet in version control
|
||||
**Let op:** zet gluetun **niet** in `RESTART_CONTAINERS`; gebruik `GLUETUN_CONTAINER`. Elke echte rotatie geeft korte downtime.
|
||||
|
||||
Reference in New Issue
Block a user