{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"documentation/overview/","title":"Overview","text":"

WireGuard Portal is a simple, web based configuration portal for WireGuard. The portal uses the WireGuard wgctrl library to manage existing VPN interfaces. This allows for seamless activation or deactivation of new users, without disturbing existing VPN connections.

The configuration portal supports using a database (SQLite, MySQL, MsSQL or Postgres), OAuth or LDAP (Active Directory or OpenLDAP) as a user source for authentication and profile data.

"},{"location":"documentation/overview/#features","title":"Features","text":""},{"location":"documentation/overview/#quick-start","title":"Quick-Start","text":"

The easiest way to get started is to use the provided Docker image.

"},{"location":"documentation/configuration/examples/","title":"Examples","text":"

Below are some sample YAML configurations demonstrating how to override some default values.

"},{"location":"documentation/configuration/examples/#basic-configuration","title":"Basic Configuration","text":"
core:\n  admin_user: test@example.com\n  admin_password: password\n  import_existing: false\n  create_default_peer: true\n  self_provisioning_allowed: true\n\nweb:\n  site_title: My WireGuard Server\n  site_company_name: My Company\n  listening_address: :8080\n  external_url: https://my.externa-domain.com\n  csrf_secret: super-s3cr3t-csrf\n  session_secret: super-s3cr3t-session\n  request_logging: true\n\nadvanced:\n  log_level: trace\n  log_pretty: true\n  log_json: false\n  config_storage_path: /etc/wireguard\n  expiry_check_interval: 5m\n\ndatabase:\n  debug: true\n  type: sqlite\n  dsn: data/sqlite.db\n
"},{"location":"documentation/configuration/examples/#ldap-authentication-and-synchronization-configuration","title":"LDAP Authentication and Synchronization Configuration","text":"
# ... (basic configuration)\n\nauth:\n  ldap:\n\n    # a sample LDAP provider with user sync enabled\n    - id: ldap\n      provider_name: Active Directory\n      display_name: Login with</br>AD\n      url: ldap://srv-ad1.company.local:389\n      bind_user: ldap_wireguard@company.local\n      bind_pass: super-s3cr3t-ldap\n      base_dn: DC=COMPANY,DC=LOCAL\n      login_filter: (&(objectClass=organizationalPerson)(mail={{login_identifier}})(!userAccountControl:1.2.840.113556.1.4.803:=2))\n      sync_interval: 15m\n      sync_filter: (&(objectClass=organizationalPerson)(!userAccountControl:1.2.840.113556.1.4.803:=2)(mail=*))\n      disable_missing: true\n      field_map:\n        user_identifier: sAMAccountName\n        email: mail\n        firstname: givenName\n        lastname: sn\n        phone: telephoneNumber\n        department: department\n        memberof: memberOf\n      admin_group: CN=WireGuardAdmins,OU=Some-OU,DC=COMPANY,DC=LOCAL\n      registration_enabled: true\n      log_user_info: true\n
"},{"location":"documentation/configuration/examples/#openid-connect-oidc-authentication-configuration","title":"OpenID Connect (OIDC) Authentication Configuration","text":"
# ... (basic configuration)\n\nauth:\n  oidc:\n\n    # a sample provider where users with the attribute `wg_admin` set to `true` are considered as admins   \n    - id: oidc-with-admin-attribute\n      provider_name: google\n      display_name: Login with</br>Google\n      base_url: https://accounts.google.com\n      client_id: the-client-id-1234.apps.googleusercontent.com\n      client_secret: A_CLIENT_SECRET\n      extra_scopes:\n        - https://www.googleapis.com/auth/userinfo.email\n        - https://www.googleapis.com/auth/userinfo.profile\n      field_map:\n        user_identifier: sub\n        email: email\n        firstname: given_name\n        lastname: family_name\n        phone: phone_number\n        department: department\n        is_admin: wg_admin\n      admin_mapping:\n        - admin_value_regex: ^true$\n      registration_enabled: true\n      log_user_info: true\n\n    # a sample provider where users in the group `the-admin-group` are considered as admins    \n    - id: oidc-with-admin-group\n      provider_name: google2\n      display_name: Login with</br>Google2\n      base_url: https://accounts.google.com\n      client_id: another-client-id-1234.apps.googleusercontent.com\n      client_secret: A_CLIENT_SECRET\n      extra_scopes:\n        - https://www.googleapis.com/auth/userinfo.email\n        - https://www.googleapis.com/auth/userinfo.profile\n      field_map:\n        user_identifier: sub\n        email: email\n        firstname: given_name\n        lastname: family_name\n        phone: phone_number\n        department: department\n        user_groups: groups\n      admin_mapping:\n        - admin_group_regex: ^the-admin-group$\n      registration_enabled: true\n      log_user_info: true\n
"},{"location":"documentation/configuration/examples/#plain-oauth2-authentication-configuration","title":"Plain OAuth2 Authentication Configuration","text":"
# ... (basic configuration)\n\nauth:\n  oauth:\n\n    # a sample provider where users with the attribute `this-attribute-must-be-true` set to `true` or `True`\n    # are considered as admins    \n    - id: google_plain_oauth-with-admin-attribute\n      provider_name: google3\n      display_name: Login with</br>Google3\n      client_id: another-client-id-1234.apps.googleusercontent.com\n      client_secret: A_CLIENT_SECRET\n      auth_url: https://accounts.google.com/o/oauth2/v2/auth\n      token_url: https://oauth2.googleapis.com/token\n      user_info_url: https://openidconnect.googleapis.com/v1/userinfo\n      scopes:\n        - openid\n        - email\n        - profile\n      field_map:\n        user_identifier: sub\n        email: email\n        firstname: name\n        is_admin: this-attribute-must-be-true\n      admin_mapping:\n        - admin_value_regex: ^(True|true)$\n      registration_enabled: true\n\n    # a sample provider where either users with the attribute `this-attribute-must-be-true` set to `true` or \n    # users in the group `admin-group-name` are considered as admins    \n    - id: google_plain_oauth_with_groups\n      provider_name: google4\n      display_name: Login with</br>Google4\n      client_id: another-client-id-1234.apps.googleusercontent.com\n      client_secret: A_CLIENT_SECRET\n      auth_url: https://accounts.google.com/o/oauth2/v2/auth\n      token_url: https://oauth2.googleapis.com/token\n      user_info_url: https://openidconnect.googleapis.com/v1/userinfo\n      scopes:\n        - openid\n        - email\n        - profile\n        - i-want-some-groups\n      field_map:\n        email: email\n        firstname: name\n        user_identifier: sub\n        is_admin: this-attribute-must-be-true\n        user_groups: groups\n      admin_mapping:\n        admin_value_regex: ^true$\n        admin_group_regex: ^admin-group-name$\n      registration_enabled: true\n      log_user_info: true\n
"},{"location":"documentation/configuration/overview/","title":"WireGuard Portal Configuration","text":"

This page provides an overview of all available configuration options for WireGuard Portal. You can supply these configurations in a YAML file (e.g. config.yaml) when starting the Portal. Complete configuration examples are available in the Configuration Examples page.

Below you will find sections like core, advanced, statistics, mail, auth, database, and web. Each section describes the individual configuration keys, their default values, and a brief explanation of their purpose.

"},{"location":"documentation/configuration/overview/#core","title":"Core","text":"

These are the primary configuration options that control fundamental WireGuard Portal behavior. More advanced options are found in the subsequent Advanced section.

"},{"location":"documentation/configuration/overview/#admin_user","title":"admin_user","text":""},{"location":"documentation/configuration/overview/#admin_password","title":"admin_password","text":""},{"location":"documentation/configuration/overview/#editable_keys","title":"editable_keys","text":""},{"location":"documentation/configuration/overview/#create_default_peer","title":"create_default_peer","text":""},{"location":"documentation/configuration/overview/#create_default_peer_on_creation","title":"create_default_peer_on_creation","text":""},{"location":"documentation/configuration/overview/#re_enable_peer_after_user_enable","title":"re_enable_peer_after_user_enable","text":""},{"location":"documentation/configuration/overview/#delete_peer_after_user_deleted","title":"delete_peer_after_user_deleted","text":""},{"location":"documentation/configuration/overview/#self_provisioning_allowed","title":"self_provisioning_allowed","text":""},{"location":"documentation/configuration/overview/#import_existing","title":"import_existing","text":""},{"location":"documentation/configuration/overview/#restore_state","title":"restore_state","text":""},{"location":"documentation/configuration/overview/#advanced","title":"Advanced","text":"

Additional or more specialized configuration options for logging and interface creation details.

"},{"location":"documentation/configuration/overview/#log_level","title":"log_level","text":""},{"location":"documentation/configuration/overview/#log_pretty","title":"log_pretty","text":""},{"location":"documentation/configuration/overview/#log_json","title":"log_json","text":""},{"location":"documentation/configuration/overview/#start_listen_port","title":"start_listen_port","text":""},{"location":"documentation/configuration/overview/#start_cidr_v4","title":"start_cidr_v4","text":""},{"location":"documentation/configuration/overview/#start_cidr_v6","title":"start_cidr_v6","text":""},{"location":"documentation/configuration/overview/#use_ip_v6","title":"use_ip_v6","text":""},{"location":"documentation/configuration/overview/#config_storage_path","title":"config_storage_path","text":""},{"location":"documentation/configuration/overview/#expiry_check_interval","title":"expiry_check_interval","text":""},{"location":"documentation/configuration/overview/#rule_prio_offset","title":"rule_prio_offset","text":""},{"location":"documentation/configuration/overview/#route_table_offset","title":"route_table_offset","text":""},{"location":"documentation/configuration/overview/#api_admin_only","title":"api_admin_only","text":""},{"location":"documentation/configuration/overview/#database","title":"Database","text":"

Configuration for the underlying database used by WireGuard Portal. Supported databases include SQLite, MySQL, Microsoft SQL Server, and Postgres.

"},{"location":"documentation/configuration/overview/#debug","title":"debug","text":""},{"location":"documentation/configuration/overview/#slow_query_threshold","title":"slow_query_threshold","text":""},{"location":"documentation/configuration/overview/#type","title":"type","text":""},{"location":"documentation/configuration/overview/#dsn","title":"dsn","text":""},{"location":"documentation/configuration/overview/#statistics","title":"Statistics","text":"

Controls how WireGuard Portal collects and reports usage statistics, including ping checks and Prometheus metrics.

"},{"location":"documentation/configuration/overview/#use_ping_checks","title":"use_ping_checks","text":""},{"location":"documentation/configuration/overview/#ping_check_workers","title":"ping_check_workers","text":""},{"location":"documentation/configuration/overview/#ping_unprivileged","title":"ping_unprivileged","text":""},{"location":"documentation/configuration/overview/#ping_check_interval","title":"ping_check_interval","text":""},{"location":"documentation/configuration/overview/#data_collection_interval","title":"data_collection_interval","text":""},{"location":"documentation/configuration/overview/#collect_interface_data","title":"collect_interface_data","text":""},{"location":"documentation/configuration/overview/#collect_peer_data","title":"collect_peer_data","text":""},{"location":"documentation/configuration/overview/#collect_audit_data","title":"collect_audit_data","text":""},{"location":"documentation/configuration/overview/#listening_address","title":"listening_address","text":""},{"location":"documentation/configuration/overview/#mail","title":"Mail","text":"

Options for configuring email notifications or sending peer configurations via email.

"},{"location":"documentation/configuration/overview/#host","title":"host","text":""},{"location":"documentation/configuration/overview/#port","title":"port","text":""},{"location":"documentation/configuration/overview/#encryption","title":"encryption","text":""},{"location":"documentation/configuration/overview/#cert_validation","title":"cert_validation","text":""},{"location":"documentation/configuration/overview/#username","title":"username","text":""},{"location":"documentation/configuration/overview/#password","title":"password","text":""},{"location":"documentation/configuration/overview/#auth_type","title":"auth_type","text":""},{"location":"documentation/configuration/overview/#from","title":"from","text":""},{"location":"documentation/configuration/overview/#link_only","title":"link_only","text":""},{"location":"documentation/configuration/overview/#auth","title":"Auth","text":"

WireGuard Portal supports multiple authentication strategies, including OpenID Connect (oidc), OAuth (oauth), and LDAP (ldap). Each can have multiple providers configured. Below are the relevant keys.

"},{"location":"documentation/configuration/overview/#oidc-provider-properties","title":"OIDC Provider Properties","text":"

The oidc array contains a list of OpenID Connect providers. Below are the properties for each OIDC provider entry inside auth.oidc:

"},{"location":"documentation/configuration/overview/#provider_name","title":"provider_name","text":""},{"location":"documentation/configuration/overview/#display_name","title":"display_name","text":""},{"location":"documentation/configuration/overview/#base_url","title":"base_url","text":""},{"location":"documentation/configuration/overview/#client_id","title":"client_id","text":""},{"location":"documentation/configuration/overview/#client_secret","title":"client_secret","text":""},{"location":"documentation/configuration/overview/#extra_scopes","title":"extra_scopes","text":""},{"location":"documentation/configuration/overview/#field_map","title":"field_map","text":""},{"location":"documentation/configuration/overview/#admin_mapping","title":"admin_mapping","text":""},{"location":"documentation/configuration/overview/#registration_enabled","title":"registration_enabled","text":""},{"location":"documentation/configuration/overview/#log_user_info","title":"log_user_info","text":""},{"location":"documentation/configuration/overview/#oauth-provider-properties","title":"OAuth Provider Properties","text":"

The oauth array contains a list of plain OAuth2 providers. Below are the properties for each OAuth provider entry inside auth.oauth:

"},{"location":"documentation/configuration/overview/#provider_name_1","title":"provider_name","text":""},{"location":"documentation/configuration/overview/#display_name_1","title":"display_name","text":""},{"location":"documentation/configuration/overview/#client_id_1","title":"client_id","text":""},{"location":"documentation/configuration/overview/#client_secret_1","title":"client_secret","text":""},{"location":"documentation/configuration/overview/#auth_url","title":"auth_url","text":""},{"location":"documentation/configuration/overview/#token_url","title":"token_url","text":""},{"location":"documentation/configuration/overview/#user_info_url","title":"user_info_url","text":""},{"location":"documentation/configuration/overview/#scopes","title":"scopes","text":""},{"location":"documentation/configuration/overview/#field_map_1","title":"field_map","text":""},{"location":"documentation/configuration/overview/#admin_mapping_1","title":"admin_mapping","text":""},{"location":"documentation/configuration/overview/#registration_enabled_1","title":"registration_enabled","text":""},{"location":"documentation/configuration/overview/#log_user_info_1","title":"log_user_info","text":""},{"location":"documentation/configuration/overview/#ldap-provider-properties","title":"LDAP Provider Properties","text":"

The ldap array contains a list of LDAP authentication providers. Below are the properties for each LDAP provider entry inside auth.ldap:

"},{"location":"documentation/configuration/overview/#url","title":"url","text":""},{"location":"documentation/configuration/overview/#start_tls","title":"start_tls","text":""},{"location":"documentation/configuration/overview/#cert_validation_1","title":"cert_validation","text":""},{"location":"documentation/configuration/overview/#tls_certificate_path","title":"tls_certificate_path","text":""},{"location":"documentation/configuration/overview/#tls_key_path","title":"tls_key_path","text":""},{"location":"documentation/configuration/overview/#base_dn","title":"base_dn","text":""},{"location":"documentation/configuration/overview/#bind_user","title":"bind_user","text":""},{"location":"documentation/configuration/overview/#bind_pass","title":"bind_pass","text":""},{"location":"documentation/configuration/overview/#field_map_2","title":"field_map","text":""},{"location":"documentation/configuration/overview/#login_filter","title":"login_filter","text":""},{"location":"documentation/configuration/overview/#admin_group","title":"admin_group","text":""},{"location":"documentation/configuration/overview/#sync_interval","title":"sync_interval","text":""},{"location":"documentation/configuration/overview/#sync_filter","title":"sync_filter","text":""},{"location":"documentation/configuration/overview/#disable_missing","title":"disable_missing","text":""},{"location":"documentation/configuration/overview/#registration_enabled_2","title":"registration_enabled","text":""},{"location":"documentation/configuration/overview/#log_user_info_2","title":"log_user_info","text":""},{"location":"documentation/getting-started/building/","title":"Building","text":"

To build a standalone application, use the Makefile provided in the repository. Go version 1.23 or higher has to be installed to build WireGuard Portal. If you want to re-compile the frontend, NodeJS 18 and NPM >= 9 is required.

# build the frontend (optional)\nmake frontend\n\n# build the binary\nmake build\n
"},{"location":"documentation/getting-started/docker/","title":"Docker Container","text":""},{"location":"documentation/getting-started/docker/#image-usage","title":"Image Usage","text":"

The preferred way to start WireGuard Portal as Docker container is to use Docker Compose.

A sample docker-compose.yml:

version: '3.6'\nservices:\n  wg-portal:\n    image: wgportal/wg-portal:latest\n    restart: unless-stopped\n    cap_add:\n      - NET_ADMIN\n    network_mode: \"host\"\n    ports:\n      - \"8888:8888\"\n    volumes:\n      - /etc/wireguard:/etc/wireguard\n      - ./data:/app/data\n      - ./config:/app/config\n

By default, the webserver is listening on port 8888.

Volumes for /app/data and /app/config should be used ensure data persistence across container restarts.

"},{"location":"documentation/getting-started/docker/#image-versioning","title":"Image Versioning","text":"

All images are hosted on Docker Hub at https://hub.docker.com/r/wgportal/wg-portal. There are three types of tags in the repository:

"},{"location":"documentation/getting-started/docker/#semantic-versioned-tags","title":"Semantic versioned tags","text":"

For example, 1.0.19.

These are official releases of WireGuard Portal. They correspond to the GitHub tags that we make, and you can see the release notes for them here: https://github.com/h44z/wg-portal/releases.

Once these tags show up in this repository, they will never change.

For production deployments of WireGuard Portal, we strongly recommend using one of these tags, e.g. wgportal/wg-portal:1.0.19, instead of the latest or canary tags.

If you only want to stay at the same major or major+minor version, use either v[MAJOR] or [MAJOR].[MINOR] tags. For example v1 or 1.0.

Version 1 is currently stable, version 2 is in development.

"},{"location":"documentation/getting-started/docker/#latest","title":"latest","text":"

This is the most recent build to master! It changes a lot and is very unstable.

We recommend that you don't use it except for development purposes.

"},{"location":"documentation/getting-started/docker/#branch-tags","title":"Branch tags","text":"

For each commit in the master and the stable branch, a corresponding Docker image is build. These images use the master or stable tags.

"},{"location":"documentation/getting-started/docker/#configuration","title":"Configuration","text":"

You can configure WireGuard Portal using a yaml configuration file. The filepath of the yaml configuration file defaults to /app/config/config.yml. It is possible to override the configuration filepath using the environment variable WG_PORTAL_CONFIG.

By default, WireGuard Portal uses a SQLite database. The database is stored in /app/data/sqlite.db.

You should mount those directories as a volume: - /app/data - /app/config

A detailed description of the configuration options can be found here.

"},{"location":"documentation/getting-started/upgrade/","title":"Upgrade from V1","text":"

For production deployments of WireGuard Portal, we strongly recommend using version 1. If you want to use version 2, please be aware that it is still in beta and not feature complete.

"},{"location":"documentation/getting-started/upgrade/#upgrade-from-v1-to-v2","title":"Upgrade from v1 to v2","text":"

Before upgrading from V1, make sure that you have a backup of your currently working configuration files and database!

To start the upgrade process, start the wg-portal binary with the -migrateFrom parameter. The configuration (config.yml) for WireGuard Portal must be updated and valid before starting the upgrade.

To upgrade from a previous SQLite database, start wg-portal like:

./wg-portal-amd64 -migrateFrom=old_wg_portal.db\n

You can also specify the database type using the parameter -migrateFromType, supported types: mysql, mssql, postgres or sqlite. For example:

./wg-portal-amd64 -migrateFromType=mysql -migrateFrom=user:pass@tcp(1.2.3.4:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local\n

The upgrade will transform the old, existing database and store the values in the new database specified in the config.yml configuration file. Ensure that the new database does not contain any data!

If you are using Docker, you can adapt the docker-compose.yml file to start the upgrade process:

services:\n  wg-portal:\n    image: wgportal/wg-portal:latest\n    # ... other settings\n    restart: no\n    command: [\"-migrateFrom=/app/data/wg_portal.db\"]\n
"},{"location":"documentation/rest-api/api-doc/","title":"REST API","text":""}]}