mirror of https://github.com/h44z/wg-portal.git
				
				
				
			
		
			
				
	
	
		
			98 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
## Reverse Proxy for HTTPS
 | 
						||
 | 
						||
For production deployments, always serve the WireGuard Portal over HTTPS. You have two options to secure your connection:
 | 
						||
 | 
						||
 | 
						||
### Reverse Proxy
 | 
						||
 | 
						||
Let a front‐end proxy handle HTTPS for you. This also frees you from managing certificates manually and is therefore the preferred option.
 | 
						||
You can use Nginx, Traefik, Caddy or any other proxy. 
 | 
						||
 | 
						||
Below is an example using a Docker Compose stack with [Traefik](https://traefik.io/traefik/). 
 | 
						||
It exposes the WireGuard Portal on `https://wg.domain.com` and redirects initial HTTP traffic to HTTPS.
 | 
						||
 | 
						||
```yaml
 | 
						||
services:
 | 
						||
  reverse-proxy:
 | 
						||
    image: traefik:v3.3
 | 
						||
    restart: unless-stopped
 | 
						||
    command:
 | 
						||
      #- '--log.level=DEBUG'
 | 
						||
      - '--providers.docker.endpoint=unix:///var/run/docker.sock'
 | 
						||
      - '--providers.docker.exposedbydefault=false'
 | 
						||
      - '--entrypoints.web.address=:80'
 | 
						||
      - '--entrypoints.websecure.address=:443'
 | 
						||
      - '--entrypoints.websecure.http3'
 | 
						||
      - '--certificatesresolvers.letsencryptresolver.acme.httpchallenge=true'
 | 
						||
      - '--certificatesresolvers.letsencryptresolver.acme.httpchallenge.entrypoint=web'
 | 
						||
      - '--certificatesresolvers.letsencryptresolver.acme.email=your.email@domain.com'
 | 
						||
      - '--certificatesresolvers.letsencryptresolver.acme.storage=/letsencrypt/acme.json'
 | 
						||
      #- '--certificatesresolvers.letsencryptresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory'  # just for testing
 | 
						||
    ports:
 | 
						||
      - 80:80 # for HTTP
 | 
						||
      - 443:443/tcp  # for HTTPS
 | 
						||
      - 443:443/udp  # for HTTP/3
 | 
						||
    volumes:
 | 
						||
      - acme-certs:/letsencrypt
 | 
						||
      - /var/run/docker.sock:/var/run/docker.sock:ro
 | 
						||
    labels:
 | 
						||
      - 'traefik.enable=true'
 | 
						||
      # HTTP Catchall for redirecting HTTP -> HTTPS
 | 
						||
      - 'traefik.http.routers.dashboard-catchall.rule=Host(`wg.domain.com`) && PathPrefix(`/`)'
 | 
						||
      - 'traefik.http.routers.dashboard-catchall.entrypoints=web'
 | 
						||
      - 'traefik.http.routers.dashboard-catchall.middlewares=redirect-to-https'
 | 
						||
      - 'traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https'
 | 
						||
 | 
						||
  wg-portal:
 | 
						||
    image: wgportal/wg-portal:v2
 | 
						||
    container_name: wg-portal
 | 
						||
    restart: unless-stopped
 | 
						||
    logging:
 | 
						||
      options:
 | 
						||
        max-size: "10m"
 | 
						||
        max-file: "3"
 | 
						||
    cap_add:
 | 
						||
      - NET_ADMIN
 | 
						||
    ports:
 | 
						||
      # host port : container port
 | 
						||
      # WireGuard port, needs to match the port in wg-portal interface config (add one port mapping for each interface)
 | 
						||
      - "51820:51820/udp"
 | 
						||
      # Web UI port (only available on localhost, Traefik will handle the HTTPS)
 | 
						||
      - "127.0.0.1:8888:8888/tcp"
 | 
						||
    sysctls:
 | 
						||
      - net.ipv4.conf.all.src_valid_mark=1
 | 
						||
    volumes:
 | 
						||
      # host path : container path
 | 
						||
      - ./wg/data:/app/data
 | 
						||
      - ./wg/config:/app/config
 | 
						||
    labels:
 | 
						||
      - 'traefik.enable=true'
 | 
						||
      - 'traefik.http.routers.wgportal.rule=Host(`wg.domain.com`)'
 | 
						||
      - 'traefik.http.routers.wgportal.entrypoints=websecure'
 | 
						||
      - 'traefik.http.routers.wgportal.tls.certresolver=letsencryptresolver'
 | 
						||
      - 'traefik.http.routers.wgportal.service=wgportal'
 | 
						||
      - 'traefik.http.services.wgportal.loadbalancer.server.port=8888'
 | 
						||
 | 
						||
volumes:
 | 
						||
  acme-certs:
 | 
						||
```
 | 
						||
 | 
						||
The WireGuard Portal configuration must be updated accordingly so that the correct external URL is set for the web interface:
 | 
						||
 | 
						||
```yaml
 | 
						||
web:
 | 
						||
  external_url: https://wg.domain.com
 | 
						||
```
 | 
						||
 | 
						||
### Built-in TLS
 | 
						||
 | 
						||
If you prefer to let WireGuard Portal handle TLS itself, you can use the built-in TLS support.
 | 
						||
In your `config.yaml`, under the `web` section, point to your certificate and key files:
 | 
						||
 | 
						||
```yaml
 | 
						||
web:
 | 
						||
  cert_file: /path/to/your/fullchain.pem
 | 
						||
  key_file:  /path/to/your/privkey.pem
 | 
						||
```
 | 
						||
 | 
						||
The web server will then use these files to serve HTTPS traffic directly instead of HTTP. |