# wg-easy

WireGuard VPN server with a web interface for adding and removing clients.

- Replaces: [NordVPN](https://openlogs.fyi/alternatives/nordvpn)
- Summary: Paid VPN services, such as NordVPN.
- Stack: TypeScript (language)
- Deployment: docker_compose
- License: AGPL-3.0 (osi) [source](https://github.com/wg-easy/wg-easy/blob/a9ee47497905564d56938f8fc1a072f6591bf8fb/LICENSE)
- Business model: unknown. The README at the pinned commit does not state a business model, so it stays unknown. ([source](https://github.com/wg-easy/wg-easy/blob/a9ee47497905564d56938f8fc1a072f6591bf8fb/README.md), read 2026-10-22)
- Difficulty: easy. 1 service, 2 volume mounts, no env values to set, host access: cap_add. Heuristic score 2 of 11: easy.
- Requirements: not stated
- Repository: [wg-easy/wg-easy](https://github.com/wg-easy/wg-easy)

## Install

1. Docker with the Compose plugin ([source](https://github.com/wg-easy/wg-easy/blob/a9ee47497905564d56938f8fc1a072f6591bf8fb/docs/content/examples/tutorials/basic-installation.md))

   ```text
   A host with Docker and the Docker Compose plugin. This entry runs from a compose file.
   ```

2. Save the compose file as docker-compose.yml ([source](https://github.com/wg-easy/wg-easy/blob/a9ee47497905564d56938f8fc1a072f6591bf8fb/docker-compose.yml))

   ```yaml
   volumes:
     etc_wireguard:
   
   services:
     wg-easy:
       #environment:
       #  Optional:
       #  - PORT=51821
       #  - HOST=0.0.0.0
       #  - INSECURE=false
   
       image: ghcr.io/wg-easy/wg-easy:15
       container_name: wg-easy
       networks:
         wg:
           ipv4_address: 10.42.42.42
           ipv6_address: fdcc:ad94:bacf:61a3::2a
       volumes:
         - etc_wireguard:/etc/wireguard
         - /lib/modules:/lib/modules:ro
       ports:
         - "51820:51820/udp"
         - "51821:51821/tcp"
       restart: unless-stopped
       cap_add:
         - NET_ADMIN
         - SYS_MODULE
         # - NET_RAW # ⚠️ Uncomment if using Podman
       sysctls:
         - net.ipv4.ip_forward=1
         - net.ipv4.conf.all.src_valid_mark=1
         - net.ipv6.conf.all.disable_ipv6=0
         - net.ipv6.conf.all.forwarding=1
         - net.ipv6.conf.default.forwarding=1
   
   networks:
     wg:
       driver: bridge
       enable_ipv6: true
       ipam:
         driver: default
         config:
           - subnet: 10.42.42.0/24
           - subnet: fdcc:ad94:bacf:61a3::/64
   ```

3. What the compose file check ran with ([source](https://github.com/wg-easy/wg-easy/blob/a9ee47497905564d56938f8fc1a072f6591bf8fb/docs/content/examples/tutorials/basic-installation.md))

   ```text
   The compose file check ran on this file alone. The folder held only this file. The basic installation guide tells the reader to download docker-compose.yml from the repository and run docker compose up -d in the same folder.
   ```

4. Start it ([source](https://github.com/wg-easy/wg-easy/blob/a9ee47497905564d56938f8fc1a072f6591bf8fb/docs/content/examples/tutorials/basic-installation.md))

   ```bash
   docker compose up -d
   ```

5. Open the app ([source](https://github.com/wg-easy/wg-easy/blob/a9ee47497905564d56938f8fc1a072f6591bf8fb/docker-compose.yml))

   ```text
   Open http://localhost:51821. The compose file publishes host port 51821 for the wg-easy service.
   ```

Compose file check: config_ok on 2026-10-22.

## Gotchas and maintenance

### Gotchas

- The compose file publishes host ports: Host ports: 51820/udp (wg-easy), 51821 (wg-easy). A port without a host address listens on all host network interfaces. ([source](https://github.com/wg-easy/wg-easy/blob/a9ee47497905564d56938f8fc1a072f6591bf8fb/docker-compose.yml), checked 2026-10-22)
- The compose file mounts host folders: Host paths mounted into containers: /lib/modules at /lib/modules (wg-easy). ([source](https://github.com/wg-easy/wg-easy/blob/a9ee47497905564d56938f8fc1a072f6591bf8fb/docker-compose.yml), checked 2026-10-22)
- Some services get elevated host access: wg-easy adds Linux capabilities. ([source](https://github.com/wg-easy/wg-easy/blob/a9ee47497905564d56938f8fc1a072f6591bf8fb/docker-compose.yml), checked 2026-10-22)

### Signals

Computed from a GitHub snapshot taken 2026-10-22.

- Open issues and pull requests: 51
- Stars: 27235, forks: 2593
- Last push: 2026-10-22 (0 days ago)
- Latest release: v15.4.0 on 2026-08-14 (69 days ago)

## Sources

- [Repository: https://github.com/wg-easy/wg-easy](https://github.com/wg-easy/wg-easy)
- [License: https://github.com/wg-easy/wg-easy/blob/a9ee47497905564d56938f8fc1a072f6591bf8fb/LICENSE](https://github.com/wg-easy/wg-easy/blob/a9ee47497905564d56938f8fc1a072f6591bf8fb/LICENSE)
- [Business model: https://github.com/wg-easy/wg-easy/blob/a9ee47497905564d56938f8fc1a072f6591bf8fb/README.md](https://github.com/wg-easy/wg-easy/blob/a9ee47497905564d56938f8fc1a072f6591bf8fb/README.md)
- [Compose file: https://github.com/wg-easy/wg-easy/blob/a9ee47497905564d56938f8fc1a072f6591bf8fb/docker-compose.yml](https://github.com/wg-easy/wg-easy/blob/a9ee47497905564d56938f8fc1a072f6591bf8fb/docker-compose.yml)
- [Install step: https://github.com/wg-easy/wg-easy/blob/a9ee47497905564d56938f8fc1a072f6591bf8fb/docs/content/examples/tutorials/basic-installation.md](https://github.com/wg-easy/wg-easy/blob/a9ee47497905564d56938f8fc1a072f6591bf8fb/docs/content/examples/tutorials/basic-installation.md)

---
Canonical: https://openlogs.fyi/tools/wg-easy  
Last updated: 2026-10-22
