Files
davide fc5d6209c1 docs: add resource limits guide for low-RAM devices
- README: new section explaining WG_MEM_LIMIT / WG_MEMSWAP_LIMIT with
  per-RAM-tier values and host swap configuration for SBC boards
- CLAUDE.md: simplify resource limits table, drop device-specific
  measurements, reference README for per-board guidance
- .env.example: update comments with per-tier values and OOM warning

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-07 08:22:43 +02:00

119 lines
3.4 KiB
Markdown

# WireGuard VPN con wg-easy (Docker)
Una configurazione Docker pronta all'uso per eseguire un server VPN WireGuard con interfaccia web [wg-easy](https://github.com/wg-easy/wg-easy), ideale per Raspberry Pi o qualsiasi server Linux.
---
## Prerequisiti
- Docker e Docker Compose installati sul server
- Una porta UDP aperta sul router/firewall (default: **51820**)
- Un indirizzo IP pubblico statico oppure un hostname DDNS (es. DuckDNS, No-IP)
---
## Configurazione rapida
### 1. Clona il repository
```bash
git clone https://santantonio.sytes.net/davide/vpn.git
cd vpn
```
### 2. Crea il file `.env`
```bash
cp .env.example .env
```
L'unica variabile obbligatoria è `TZ` (già precompilata con `Europe/Rome`). Le porte possono essere lasciate ai valori di default.
| Variabile | Descrizione | Default |
|---|---|---|
| `TZ` | Fuso orario (formato IANA) | `Europe/Rome` |
| `WG_PORT` | Porta UDP WireGuard | `51820` |
| `WG_UI_PORT` | Porta TCP interfaccia web | `51821` |
> **Nota v15:** host VPN, password e DNS si configurano dalla web UI al primo avvio.
### 3. Apri la porta sul router
Inoltra la porta **UDP 51820** (o quella scelta in `WG_PORT`) verso l'IP locale del server.
### 4. Avvia il container
```bash
docker compose up -d
```
Al primo avvio, un init container crea automaticamente `wg-data/` con permessi `700` prima che wg-easy scriva le chiavi private.
### 5. Completa il setup dalla web UI
```
http://IP_DEL_TUO_SERVER:51821
```
Al primo avvio appare un wizard che guida nella configurazione di password, hostname DDNS e DNS per i client. Dopo il setup puoi aggiungere client, scaricare configurazioni e generare QR code per dispositivi mobili.
---
## Struttura del progetto
```
vpn/
├── docker-compose.yml # Definizione del servizio
├── .env.example # Template variabili (committato)
├── .env # Variabili locali (NON committato)
├── .gitignore
├── README.md
└── wg-data/ # Generato dal container al primo avvio (ignorato da git)
├── wg0.conf # Configurazione WireGuard con chiavi private
└── wg-easy.db # Database interno wg-easy
```
---
## Dispositivi a risorse limitate (SBC)
Su board con poca RAM (≤ 1 GB) il processo Node.js di wg-easy può crescere nel tempo e far sì che il kernel OOM-killi altri processi di sistema — SSH compreso. Per evitarlo, decommenta e adatta questi valori nel tuo `.env`:
```ini
# Board con 512 MB RAM
WG_MEM_LIMIT=96m
WG_MEMSWAP_LIMIT=96m
# Board con 1 GB RAM
WG_MEM_LIMIT=128m
WG_MEMSWAP_LIMIT=128m
```
Tieni `WG_MEMSWAP_LIMIT` uguale a `WG_MEM_LIMIT` per disabilitare lo swap del container: quando il container raggiunge il limite viene riavviato da Docker invece di consumare swap di sistema.
Assicurati anche che lo swap dell'host sia almeno 512 MB. Su Raspberry Pi OS il default è 100 MB — per aumentarlo:
```bash
sudo dphys-swapfile swapoff
sudo sed -i 's/CONF_SWAPSIZE=100/CONF_SWAPSIZE=512/' /etc/dphys-swapfile
sudo dphys-swapfile setup && sudo dphys-swapfile swapon
```
---
## Aggiornare wg-easy
Esegui mensilmente per ricevere patch di sicurezza:
```bash
docker compose pull
docker compose up -d
```
---
## Sicurezza
- `wg-data/` contiene chiavi crittografiche private ed è completamente ignorata da git. I permessi `700` vengono impostati automaticamente dall'init container al primo avvio.
- `.env` contiene variabili locali specifiche del server. Non committarlo.