2025-04-07 16:31:58 +00:00

74 lines
86 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html><html lang=en class=no-js> <head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="Manage WireGuard Peers and Interface using a beautiful and simple web UI."><link href=https://wgportal.org/master/documentation/configuration/overview/ rel=canonical><link href=../../getting-started/sources/ rel=prev><link href=../examples/ rel=next><link rel=icon href=../../../assets/images/favicon-large.png><meta name=generator content="mkdocs-1.6.1, mkdocs-material-9.6.11"><title>Overview - WireGuard Portal</title><link rel=stylesheet href=../../../assets/stylesheets/main.4af4bdda.min.css><link rel=stylesheet href=../../../assets/stylesheets/palette.06af60db.min.css><link rel=stylesheet href=../../../stylesheets/extra.css><script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script><meta property=og:type content=website><meta property=og:title content="Overview - WireGuard Portal"><meta property=og:description content="Manage WireGuard Peers and Interface using a beautiful and simple web UI."><meta property=og:image content=https://wgportal.org/master/assets/images/social/documentation/configuration/overview.png><meta property=og:image:type content=image/png><meta property=og:image:width content=1200><meta property=og:image:height content=630><meta content=https://wgportal.org/master/documentation/configuration/overview/ property=og:url><meta name=twitter:card content=summary_large_image><meta name=twitter:title content="Overview - WireGuard Portal"><meta name=twitter:description content="Manage WireGuard Peers and Interface using a beautiful and simple web UI."><meta name=twitter:image content=https://wgportal.org/master/assets/images/social/documentation/configuration/overview.png></head> <body dir=ltr data-md-color-scheme=default data-md-color-primary=white data-md-color-accent=indigo> <input class=md-toggle data-md-toggle=drawer type=checkbox id=__drawer autocomplete=off> <input class=md-toggle data-md-toggle=search type=checkbox id=__search autocomplete=off> <label class=md-overlay for=__drawer></label> <div data-md-component=skip> <a href=#core class=md-skip> Skip to content </a> </div> <div data-md-component=announce> </div> <div data-md-color-scheme=default data-md-component=outdated hidden> </div> <header class=md-header data-md-component=header> <nav class="md-header__inner md-grid" aria-label=Header> <a href=../../.. title="WireGuard Portal" class="md-header__button md-logo" aria-label="WireGuard Portal" data-md-component=logo> <img src=../../../assets/images/logo.svg alt=logo> </a> <label class="md-header__button md-icon" for=__drawer> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> </label> <div class=md-header__title data-md-component=header-title> <div class=md-header__ellipsis> <div class=md-header__topic> <span class=md-ellipsis> WireGuard Portal </span> </div> <div class=md-header__topic data-md-component=header-topic> <span class=md-ellipsis> Overview </span> </div> </div> </div> <label class="md-header__button md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> </label> <div class=md-search data-md-component=search role=dialog> <label class=md-search__overlay for=__search></label> <div class=md-search__inner role=search> <form class=md-search__form name=search> <input type=text class=md-search__input name=query aria-label=Search placeholder=Search autocapitalize=off autocorrect=off autocomplete=off spellcheck=false data-md-component=search-query required> <label class="md-search__icon md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> </label> <nav class=md-search__options aria-label=Search> <button type=reset class="md-search__icon md-icon" title=Clear aria-label=Clear tabindex=-1> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> </button> </nav> </form> <div class=md-search__output> <div class=md-search__scrollwrap tabindex=0 data-md-scrollfix> <div class=md-search-result data-md-component=search-result> <div class=md-search-result__meta> Initializing search </div> <ol class=md-search-result__list role=presentation></ol> </div> </div> </div> </div> </div> <div class=md-header__source> <a href=https://github.com/h44z/wg-portal title="Go to repository" class=md-source data-md-component=source> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 448 512"><!-- Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg> </div> <div class=md-source__repository> h44z/wg-portal </div> </a> </div> </nav> </header> <div class=md-container data-md-component=container> <nav class=md-tabs aria-label=Tabs data-md-component=tabs> <div class=md-grid> <ul class=md-tabs__list> <li class=md-tabs__item> <a href=../../.. class=md-tabs__link> Home </a> </li> <li class="md-tabs__item md-tabs__item--active"> <a href=../../overview/ class=md-tabs__link> Documentation </a> </li> </ul> </div> </nav> <main class=md-main data-md-component=main> <div class="md-main__inner md-grid"> <div class="md-sidebar md-sidebar--primary" data-md-component=sidebar data-md-type=navigation> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--primary md-nav--lifted" aria-label=Navigation data-md-level=0> <label class=md-nav__title for=__drawer> <a href=../../.. title="WireGuard Portal" class="md-nav__button md-logo" aria-label="WireGuard Portal" data-md-component=logo> <img src=../../../assets/images/logo.svg alt=logo> </a> WireGuard Portal </label> <div class=md-nav__source> <a href=https://github.com/h44z/wg-portal title="Go to repository" class=md-source data-md-component=source> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 448 512"><!-- Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg> </div> <div class=md-source__repository> h44z/wg-portal </div> </a> </div> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../.. class=md-nav__link> <span class=md-ellipsis> Home </span> </a> </li> <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_2 checked> <label class=md-nav__link for=__nav_2 id=__nav_2_label tabindex> <span class=md-ellipsis> Documentation </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_2_label aria-expanded=true> <label class=md-nav__title for=__nav_2> <span class="md-nav__icon md-icon"></span> Documentation </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../overview/ class=md-nav__link> <span class=md-ellipsis> Overview </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type=checkbox id=__nav_2_2> <label class=md-nav__link for=__nav_2_2 id=__nav_2_2_label tabindex=0> <span class=md-ellipsis> Getting Started </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=2 aria-labelledby=__nav_2_2_label aria-expanded=false> <label class=md-nav__title for=__nav_2_2> <span class="md-nav__icon md-icon"></span> Getting Started </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../getting-started/binaries/ class=md-nav__link> <span class=md-ellipsis> Binaries </span> </a> </li> <li class=md-nav__item> <a href=../../getting-started/docker/ class=md-nav__link> <span class=md-ellipsis> Docker </span> </a> </li> <li class=md-nav__item> <a href=../../getting-started/helm/ class=md-nav__link> <span class=md-ellipsis> Helm </span> </a> </li> <li class=md-nav__item> <a href=../../getting-started/sources/ class=md-nav__link> <span class=md-ellipsis> Sources </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--active md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_2_3 checked> <label class=md-nav__link for=__nav_2_3 id=__nav_2_3_label tabindex=0> <span class=md-ellipsis> Configuration </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=2 aria-labelledby=__nav_2_3_label aria-expanded=true> <label class=md-nav__title for=__nav_2_3> <span class="md-nav__icon md-icon"></span> Configuration </label> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--active"> <input class="md-nav__toggle md-toggle" type=checkbox id=__toc> <label class="md-nav__link md-nav__link--active" for=__toc> <span class=md-ellipsis> Overview </span> <span class="md-nav__icon md-icon"></span> </label> <a href=./ class="md-nav__link md-nav__link--active"> <span class=md-ellipsis> Overview </span> </a> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class=md-nav__title for=__toc> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class=md-nav__list data-md-component=toc data-md-scrollfix> <li class=md-nav__item> <a href=#core class=md-nav__link> <span class=md-ellipsis> Core </span> </a> <nav class=md-nav aria-label=Core> <ul class=md-nav__list> <li class=md-nav__item> <a href=#admin_user class=md-nav__link> <span class=md-ellipsis> admin_user </span> </a> </li> <li class=md-nav__item> <a href=#admin_password class=md-nav__link> <span class=md-ellipsis> admin_password </span> </a> </li> <li class=md-nav__item> <a href=#admin_api_token class=md-nav__link> <span class=md-ellipsis> admin_api_token </span> </a> </li> <li class=md-nav__item> <a href=#editable_keys class=md-nav__link> <span class=md-ellipsis> editable_keys </span> </a> </li> <li class=md-nav__item> <a href=#create_default_peer class=md-nav__link> <span class=md-ellipsis> create_default_peer </span> </a> </li> <li class=md-nav__item> <a href=#create_default_peer_on_creation class=md-nav__link> <span class=md-ellipsis> create_default_peer_on_creation </span> </a> </li> <li class=md-nav__item> <a href=#re_enable_peer_after_user_enable class=md-nav__link> <span class=md-ellipsis> re_enable_peer_after_user_enable </span> </a> </li> <li class=md-nav__item> <a href=#delete_peer_after_user_deleted class=md-nav__link> <span class=md-ellipsis> delete_peer_after_user_deleted </span> </a> </li> <li class=md-nav__item> <a href=#self_provisioning_allowed class=md-nav__link> <span class=md-ellipsis> self_provisioning_allowed </span> </a> </li> <li class=md-nav__item> <a href=#import_existing class=md-nav__link> <span class=md-ellipsis> import_existing </span> </a> </li> <li class=md-nav__item> <a href=#restore_state class=md-nav__link> <span class=md-ellipsis> restore_state </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#advanced class=md-nav__link> <span class=md-ellipsis> Advanced </span> </a> <nav class=md-nav aria-label=Advanced> <ul class=md-nav__list> <li class=md-nav__item> <a href=#log_level class=md-nav__link> <span class=md-ellipsis> log_level </span> </a> </li> <li class=md-nav__item> <a href=#log_pretty class=md-nav__link> <span class=md-ellipsis> log_pretty </span> </a> </li> <li class=md-nav__item> <a href=#log_json class=md-nav__link> <span class=md-ellipsis> log_json </span> </a> </li> <li class=md-nav__item> <a href=#start_listen_port class=md-nav__link> <span class=md-ellipsis> start_listen_port </span> </a> </li> <li class=md-nav__item> <a href=#start_cidr_v4 class=md-nav__link> <span class=md-ellipsis> start_cidr_v4 </span> </a> </li> <li class=md-nav__item> <a href=#start_cidr_v6 class=md-nav__link> <span class=md-ellipsis> start_cidr_v6 </span> </a> </li> <li class=md-nav__item> <a href=#use_ip_v6 class=md-nav__link> <span class=md-ellipsis> use_ip_v6 </span> </a> </li> <li class=md-nav__item> <a href=#config_storage_path class=md-nav__link> <span class=md-ellipsis> config_storage_path </span> </a> </li> <li class=md-nav__item> <a href=#expiry_check_interval class=md-nav__link> <span class=md-ellipsis> expiry_check_interval </span> </a> </li> <li class=md-nav__item> <a href=#rule_prio_offset class=md-nav__link> <span class=md-ellipsis> rule_prio_offset </span> </a> </li> <li class=md-nav__item> <a href=#route_table_offset class=md-nav__link> <span class=md-ellipsis> route_table_offset </span> </a> </li> <li class=md-nav__item> <a href=#api_admin_only class=md-nav__link> <span class=md-ellipsis> api_admin_only </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#database class=md-nav__link> <span class=md-ellipsis> Database </span> </a> <nav class=md-nav aria-label=Database> <ul class=md-nav__list> <li class=md-nav__item> <a href=#debug class=md-nav__link> <span class=md-ellipsis> debug </span> </a> </li> <li class=md-nav__item> <a href=#slow_query_threshold class=md-nav__link> <span class=md-ellipsis> slow_query_threshold </span> </a> </li> <li class=md-nav__item> <a href=#type class=md-nav__link> <span class=md-ellipsis> type </span> </a> </li> <li class=md-nav__item> <a href=#dsn class=md-nav__link> <span class=md-ellipsis> dsn </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#statistics class=md-nav__link> <span class=md-ellipsis> Statistics </span> </a> <nav class=md-nav aria-label=Statistics> <ul class=md-nav__list> <li class=md-nav__item> <a href=#use_ping_checks class=md-nav__link> <span class=md-ellipsis> use_ping_checks </span> </a> </li> <li class=md-nav__item> <a href=#ping_check_workers class=md-nav__link> <span class=md-ellipsis> ping_check_workers </span> </a> </li> <li class=md-nav__item> <a href=#ping_unprivileged class=md-nav__link> <span class=md-ellipsis> ping_unprivileged </span> </a> </li> <li class=md-nav__item> <a href=#ping_check_interval class=md-nav__link> <span class=md-ellipsis> ping_check_interval </span> </a> </li> <li class=md-nav__item> <a href=#data_collection_interval class=md-nav__link> <span class=md-ellipsis> data_collection_interval </span> </a> </li> <li class=md-nav__item> <a href=#collect_interface_data class=md-nav__link> <span class=md-ellipsis> collect_interface_data </span> </a> </li> <li class=md-nav__item> <a href=#collect_peer_data class=md-nav__link> <span class=md-ellipsis> collect_peer_data </span> </a> </li> <li class=md-nav__item> <a href=#collect_audit_data class=md-nav__link> <span class=md-ellipsis> collect_audit_data </span> </a> </li> <li class=md-nav__item> <a href=#listening_address class=md-nav__link> <span class=md-ellipsis> listening_address </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#mail class=md-nav__link> <span class=md-ellipsis> Mail </span> </a> <nav class=md-nav aria-label=Mail> <ul class=md-nav__list> <li class=md-nav__item> <a href=#host class=md-nav__link> <span class=md-ellipsis> host </span> </a> </li> <li class=md-nav__item> <a href=#port class=md-nav__link> <span class=md-ellipsis> port </span> </a> </li> <li class=md-nav__item> <a href=#encryption class=md-nav__link> <span class=md-ellipsis> encryption </span> </a> </li> <li class=md-nav__item> <a href=#cert_validation class=md-nav__link> <span class=md-ellipsis> cert_validation </span> </a> </li> <li class=md-nav__item> <a href=#username class=md-nav__link> <span class=md-ellipsis> username </span> </a> </li> <li class=md-nav__item> <a href=#password class=md-nav__link> <span class=md-ellipsis> password </span> </a> </li> <li class=md-nav__item> <a href=#auth_type class=md-nav__link> <span class=md-ellipsis> auth_type </span> </a> </li> <li class=md-nav__item> <a href=#from class=md-nav__link> <span class=md-ellipsis> from </span> </a> </li> <li class=md-nav__item> <a href=#link_only class=md-nav__link> <span class=md-ellipsis> link_only </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#auth class=md-nav__link> <span class=md-ellipsis> Auth </span> </a> <nav class=md-nav aria-label=Auth> <ul class=md-nav__list> <li class=md-nav__item> <a href=#oidc class=md-nav__link> <span class=md-ellipsis> OIDC </span> </a> <nav class=md-nav aria-label=OIDC> <ul class=md-nav__list> <li class=md-nav__item> <a href=#provider_name class=md-nav__link> <span class=md-ellipsis> provider_name </span> </a> </li> <li class=md-nav__item> <a href=#display_name class=md-nav__link> <span class=md-ellipsis> display_name </span> </a> </li> <li class=md-nav__item> <a href=#base_url class=md-nav__link> <span class=md-ellipsis> base_url </span> </a> </li> <li class=md-nav__item> <a href=#client_id class=md-nav__link> <span class=md-ellipsis> client_id </span> </a> </li> <li class=md-nav__item> <a href=#client_secret class=md-nav__link> <span class=md-ellipsis> client_secret </span> </a> </li> <li class=md-nav__item> <a href=#extra_scopes class=md-nav__link> <span class=md-ellipsis> extra_scopes </span> </a> </li> <li class=md-nav__item> <a href=#field_map class=md-nav__link> <span class=md-ellipsis> field_map </span> </a> </li> <li class=md-nav__item> <a href=#admin_mapping class=md-nav__link> <span class=md-ellipsis> admin_mapping </span> </a> </li> <li class=md-nav__item> <a href=#registration_enabled class=md-nav__link> <span class=md-ellipsis> registration_enabled </span> </a> </li> <li class=md-nav__item> <a href=#log_user_info class=md-nav__link> <span class=md-ellipsis> log_user_info </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#oauth class=md-nav__link> <span class=md-ellipsis> OAuth </span> </a> <nav class=md-nav aria-label=OAuth> <ul class=md-nav__list> <li class=md-nav__item> <a href=#provider_name_1 class=md-nav__link> <span class=md-ellipsis> provider_name </span> </a> </li> <li class=md-nav__item> <a href=#display_name_1 class=md-nav__link> <span class=md-ellipsis> display_name </span> </a> </li> <li class=md-nav__item> <a href=#client_id_1 class=md-nav__link> <span class=md-ellipsis> client_id </span> </a> </li> <li class=md-nav__item> <a href=#client_secret_1 class=md-nav__link> <span class=md-ellipsis> client_secret </span> </a> </li> <li class=md-nav__item> <a href=#auth_url class=md-nav__link> <span class=md-ellipsis> auth_url </span> </a> </li> <li class=md-nav__item> <a href=#token_url class=md-nav__link> <span class=md-ellipsis> token_url </span> </a> </li> <li class=md-nav__item> <a href=#user_info_url class=md-nav__link> <span class=md-ellipsis> user_info_url </span> </a> </li> <li class=md-nav__item> <a href=#scopes class=md-nav__link> <span class=md-ellipsis> scopes </span> </a> </li> <li class=md-nav__item> <a href=#field_map_1 class=md-nav__link> <span class=md-ellipsis> field_map </span> </a> </li> <li class=md-nav__item> <a href=#admin_mapping_1 class=md-nav__link> <span class=md-ellipsis> admin_mapping </span> </a> </li> <li class=md-nav__item> <a href=#registration_enabled_1 class=md-nav__link> <span class=md-ellipsis> registration_enabled </span> </a> </li> <li class=md-nav__item> <a href=#log_user_info_1 class=md-nav__link> <span class=md-ellipsis> log_user_info </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#ldap class=md-nav__link> <span class=md-ellipsis> LDAP </span> </a> <nav class=md-nav aria-label=LDAP> <ul class=md-nav__list> <li class=md-nav__item> <a href=#url class=md-nav__link> <span class=md-ellipsis> url </span> </a> </li> <li class=md-nav__item> <a href=#start_tls class=md-nav__link> <span class=md-ellipsis> start_tls </span> </a> </li> <li class=md-nav__item> <a href=#cert_validation_1 class=md-nav__link> <span class=md-ellipsis> cert_validation </span> </a> </li> <li class=md-nav__item> <a href=#tls_certificate_path class=md-nav__link> <span class=md-ellipsis> tls_certificate_path </span> </a> </li> <li class=md-nav__item> <a href=#tls_key_path class=md-nav__link> <span class=md-ellipsis> tls_key_path </span> </a> </li> <li class=md-nav__item> <a href=#base_dn class=md-nav__link> <span class=md-ellipsis> base_dn </span> </a> </li> <li class=md-nav__item> <a href=#bind_user class=md-nav__link> <span class=md-ellipsis> bind_user </span> </a> </li> <li class=md-nav__item> <a href=#bind_pass class=md-nav__link> <span class=md-ellipsis> bind_pass </span> </a> </li> <li class=md-nav__item> <a href=#field_map_2 class=md-nav__link> <span class=md-ellipsis> field_map </span> </a> </li> <li class=md-nav__item> <a href=#login_filter class=md-nav__link> <span class=md-ellipsis> login_filter </span> </a> </li> <li class=md-nav__item> <a href=#admin_group class=md-nav__link> <span class=md-ellipsis> admin_group </span> </a> </li> <li class=md-nav__item> <a href=#sync_interval class=md-nav__link> <span class=md-ellipsis> sync_interval </span> </a> </li> <li class=md-nav__item> <a href=#sync_filter class=md-nav__link> <span class=md-ellipsis> sync_filter </span> </a> </li> <li class=md-nav__item> <a href=#disable_missing class=md-nav__link> <span class=md-ellipsis> disable_missing </span> </a> </li> <li class=md-nav__item> <a href=#auto_re_enable class=md-nav__link> <span class=md-ellipsis> auto_re_enable </span> </a> </li> <li class=md-nav__item> <a href=#registration_enabled_2 class=md-nav__link> <span class=md-ellipsis> registration_enabled </span> </a> </li> <li class=md-nav__item> <a href=#log_user_info_2 class=md-nav__link> <span class=md-ellipsis> log_user_info </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#web class=md-nav__link> <span class=md-ellipsis> Web </span> </a> <nav class=md-nav aria-label=Web> <ul class=md-nav__list> <li class=md-nav__item> <a href=#listening_address_1 class=md-nav__link> <span class=md-ellipsis> listening_address </span> </a> </li> <li class=md-nav__item> <a href=#external_url class=md-nav__link> <span class=md-ellipsis> external_url </span> </a> </li> <li class=md-nav__item> <a href=#site_company_name class=md-nav__link> <span class=md-ellipsis> site_company_name </span> </a> </li> <li class=md-nav__item> <a href=#site_title class=md-nav__link> <span class=md-ellipsis> site_title </span> </a> </li> <li class=md-nav__item> <a href=#session_identifier class=md-nav__link> <span class=md-ellipsis> session_identifier </span> </a> </li> <li class=md-nav__item> <a href=#session_secret class=md-nav__link> <span class=md-ellipsis> session_secret </span> </a> </li> <li class=md-nav__item> <a href=#csrf_secret class=md-nav__link> <span class=md-ellipsis> csrf_secret </span> </a> </li> <li class=md-nav__item> <a href=#request_logging class=md-nav__link> <span class=md-ellipsis> request_logging </span> </a> </li> <li class=md-nav__item> <a href=#cert_file class=md-nav__link> <span class=md-ellipsis> cert_file </span> </a> </li> <li class=md-nav__item> <a href=#key_file class=md-nav__link> <span class=md-ellipsis> key_file </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=../examples/ class=md-nav__link> <span class=md-ellipsis> Examples </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=../../upgrade/v1/ class=md-nav__link> <span class=md-ellipsis> Upgrade </span> </a> </li> <li class=md-nav__item> <a href=../../monitoring/prometheus/ class=md-nav__link> <span class=md-ellipsis> Monitoring </span> </a> </li> <li class=md-nav__item> <a href=../../rest-api/api-doc/ class=md-nav__link> <span class=md-ellipsis> REST API </span> </a> </li> </ul> </nav> </li> </ul> </nav> </div> </div> </div> <div class="md-sidebar md-sidebar--secondary" data-md-component=sidebar data-md-type=toc> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class=md-nav__title for=__toc> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class=md-nav__list data-md-component=toc data-md-scrollfix> <li class=md-nav__item> <a href=#core class=md-nav__link> <span class=md-ellipsis> Core </span> </a> <nav class=md-nav aria-label=Core> <ul class=md-nav__list> <li class=md-nav__item> <a href=#admin_user class=md-nav__link> <span class=md-ellipsis> admin_user </span> </a> </li> <li class=md-nav__item> <a href=#admin_password class=md-nav__link> <span class=md-ellipsis> admin_password </span> </a> </li> <li class=md-nav__item> <a href=#admin_api_token class=md-nav__link> <span class=md-ellipsis> admin_api_token </span> </a> </li> <li class=md-nav__item> <a href=#editable_keys class=md-nav__link> <span class=md-ellipsis> editable_keys </span> </a> </li> <li class=md-nav__item> <a href=#create_default_peer class=md-nav__link> <span class=md-ellipsis> create_default_peer </span> </a> </li> <li class=md-nav__item> <a href=#create_default_peer_on_creation class=md-nav__link> <span class=md-ellipsis> create_default_peer_on_creation </span> </a> </li> <li class=md-nav__item> <a href=#re_enable_peer_after_user_enable class=md-nav__link> <span class=md-ellipsis> re_enable_peer_after_user_enable </span> </a> </li> <li class=md-nav__item> <a href=#delete_peer_after_user_deleted class=md-nav__link> <span class=md-ellipsis> delete_peer_after_user_deleted </span> </a> </li> <li class=md-nav__item> <a href=#self_provisioning_allowed class=md-nav__link> <span class=md-ellipsis> self_provisioning_allowed </span> </a> </li> <li class=md-nav__item> <a href=#import_existing class=md-nav__link> <span class=md-ellipsis> import_existing </span> </a> </li> <li class=md-nav__item> <a href=#restore_state class=md-nav__link> <span class=md-ellipsis> restore_state </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#advanced class=md-nav__link> <span class=md-ellipsis> Advanced </span> </a> <nav class=md-nav aria-label=Advanced> <ul class=md-nav__list> <li class=md-nav__item> <a href=#log_level class=md-nav__link> <span class=md-ellipsis> log_level </span> </a> </li> <li class=md-nav__item> <a href=#log_pretty class=md-nav__link> <span class=md-ellipsis> log_pretty </span> </a> </li> <li class=md-nav__item> <a href=#log_json class=md-nav__link> <span class=md-ellipsis> log_json </span> </a> </li> <li class=md-nav__item> <a href=#start_listen_port class=md-nav__link> <span class=md-ellipsis> start_listen_port </span> </a> </li> <li class=md-nav__item> <a href=#start_cidr_v4 class=md-nav__link> <span class=md-ellipsis> start_cidr_v4 </span> </a> </li> <li class=md-nav__item> <a href=#start_cidr_v6 class=md-nav__link> <span class=md-ellipsis> start_cidr_v6 </span> </a> </li> <li class=md-nav__item> <a href=#use_ip_v6 class=md-nav__link> <span class=md-ellipsis> use_ip_v6 </span> </a> </li> <li class=md-nav__item> <a href=#config_storage_path class=md-nav__link> <span class=md-ellipsis> config_storage_path </span> </a> </li> <li class=md-nav__item> <a href=#expiry_check_interval class=md-nav__link> <span class=md-ellipsis> expiry_check_interval </span> </a> </li> <li class=md-nav__item> <a href=#rule_prio_offset class=md-nav__link> <span class=md-ellipsis> rule_prio_offset </span> </a> </li> <li class=md-nav__item> <a href=#route_table_offset class=md-nav__link> <span class=md-ellipsis> route_table_offset </span> </a> </li> <li class=md-nav__item> <a href=#api_admin_only class=md-nav__link> <span class=md-ellipsis> api_admin_only </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#database class=md-nav__link> <span class=md-ellipsis> Database </span> </a> <nav class=md-nav aria-label=Database> <ul class=md-nav__list> <li class=md-nav__item> <a href=#debug class=md-nav__link> <span class=md-ellipsis> debug </span> </a> </li> <li class=md-nav__item> <a href=#slow_query_threshold class=md-nav__link> <span class=md-ellipsis> slow_query_threshold </span> </a> </li> <li class=md-nav__item> <a href=#type class=md-nav__link> <span class=md-ellipsis> type </span> </a> </li> <li class=md-nav__item> <a href=#dsn class=md-nav__link> <span class=md-ellipsis> dsn </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#statistics class=md-nav__link> <span class=md-ellipsis> Statistics </span> </a> <nav class=md-nav aria-label=Statistics> <ul class=md-nav__list> <li class=md-nav__item> <a href=#use_ping_checks class=md-nav__link> <span class=md-ellipsis> use_ping_checks </span> </a> </li> <li class=md-nav__item> <a href=#ping_check_workers class=md-nav__link> <span class=md-ellipsis> ping_check_workers </span> </a> </li> <li class=md-nav__item> <a href=#ping_unprivileged class=md-nav__link> <span class=md-ellipsis> ping_unprivileged </span> </a> </li> <li class=md-nav__item> <a href=#ping_check_interval class=md-nav__link> <span class=md-ellipsis> ping_check_interval </span> </a> </li> <li class=md-nav__item> <a href=#data_collection_interval class=md-nav__link> <span class=md-ellipsis> data_collection_interval </span> </a> </li> <li class=md-nav__item> <a href=#collect_interface_data class=md-nav__link> <span class=md-ellipsis> collect_interface_data </span> </a> </li> <li class=md-nav__item> <a href=#collect_peer_data class=md-nav__link> <span class=md-ellipsis> collect_peer_data </span> </a> </li> <li class=md-nav__item> <a href=#collect_audit_data class=md-nav__link> <span class=md-ellipsis> collect_audit_data </span> </a> </li> <li class=md-nav__item> <a href=#listening_address class=md-nav__link> <span class=md-ellipsis> listening_address </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#mail class=md-nav__link> <span class=md-ellipsis> Mail </span> </a> <nav class=md-nav aria-label=Mail> <ul class=md-nav__list> <li class=md-nav__item> <a href=#host class=md-nav__link> <span class=md-ellipsis> host </span> </a> </li> <li class=md-nav__item> <a href=#port class=md-nav__link> <span class=md-ellipsis> port </span> </a> </li> <li class=md-nav__item> <a href=#encryption class=md-nav__link> <span class=md-ellipsis> encryption </span> </a> </li> <li class=md-nav__item> <a href=#cert_validation class=md-nav__link> <span class=md-ellipsis> cert_validation </span> </a> </li> <li class=md-nav__item> <a href=#username class=md-nav__link> <span class=md-ellipsis> username </span> </a> </li> <li class=md-nav__item> <a href=#password class=md-nav__link> <span class=md-ellipsis> password </span> </a> </li> <li class=md-nav__item> <a href=#auth_type class=md-nav__link> <span class=md-ellipsis> auth_type </span> </a> </li> <li class=md-nav__item> <a href=#from class=md-nav__link> <span class=md-ellipsis> from </span> </a> </li> <li class=md-nav__item> <a href=#link_only class=md-nav__link> <span class=md-ellipsis> link_only </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#auth class=md-nav__link> <span class=md-ellipsis> Auth </span> </a> <nav class=md-nav aria-label=Auth> <ul class=md-nav__list> <li class=md-nav__item> <a href=#oidc class=md-nav__link> <span class=md-ellipsis> OIDC </span> </a> <nav class=md-nav aria-label=OIDC> <ul class=md-nav__list> <li class=md-nav__item> <a href=#provider_name class=md-nav__link> <span class=md-ellipsis> provider_name </span> </a> </li> <li class=md-nav__item> <a href=#display_name class=md-nav__link> <span class=md-ellipsis> display_name </span> </a> </li> <li class=md-nav__item> <a href=#base_url class=md-nav__link> <span class=md-ellipsis> base_url </span> </a> </li> <li class=md-nav__item> <a href=#client_id class=md-nav__link> <span class=md-ellipsis> client_id </span> </a> </li> <li class=md-nav__item> <a href=#client_secret class=md-nav__link> <span class=md-ellipsis> client_secret </span> </a> </li> <li class=md-nav__item> <a href=#extra_scopes class=md-nav__link> <span class=md-ellipsis> extra_scopes </span> </a> </li> <li class=md-nav__item> <a href=#field_map class=md-nav__link> <span class=md-ellipsis> field_map </span> </a> </li> <li class=md-nav__item> <a href=#admin_mapping class=md-nav__link> <span class=md-ellipsis> admin_mapping </span> </a> </li> <li class=md-nav__item> <a href=#registration_enabled class=md-nav__link> <span class=md-ellipsis> registration_enabled </span> </a> </li> <li class=md-nav__item> <a href=#log_user_info class=md-nav__link> <span class=md-ellipsis> log_user_info </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#oauth class=md-nav__link> <span class=md-ellipsis> OAuth </span> </a> <nav class=md-nav aria-label=OAuth> <ul class=md-nav__list> <li class=md-nav__item> <a href=#provider_name_1 class=md-nav__link> <span class=md-ellipsis> provider_name </span> </a> </li> <li class=md-nav__item> <a href=#display_name_1 class=md-nav__link> <span class=md-ellipsis> display_name </span> </a> </li> <li class=md-nav__item> <a href=#client_id_1 class=md-nav__link> <span class=md-ellipsis> client_id </span> </a> </li> <li class=md-nav__item> <a href=#client_secret_1 class=md-nav__link> <span class=md-ellipsis> client_secret </span> </a> </li> <li class=md-nav__item> <a href=#auth_url class=md-nav__link> <span class=md-ellipsis> auth_url </span> </a> </li> <li class=md-nav__item> <a href=#token_url class=md-nav__link> <span class=md-ellipsis> token_url </span> </a> </li> <li class=md-nav__item> <a href=#user_info_url class=md-nav__link> <span class=md-ellipsis> user_info_url </span> </a> </li> <li class=md-nav__item> <a href=#scopes class=md-nav__link> <span class=md-ellipsis> scopes </span> </a> </li> <li class=md-nav__item> <a href=#field_map_1 class=md-nav__link> <span class=md-ellipsis> field_map </span> </a> </li> <li class=md-nav__item> <a href=#admin_mapping_1 class=md-nav__link> <span class=md-ellipsis> admin_mapping </span> </a> </li> <li class=md-nav__item> <a href=#registration_enabled_1 class=md-nav__link> <span class=md-ellipsis> registration_enabled </span> </a> </li> <li class=md-nav__item> <a href=#log_user_info_1 class=md-nav__link> <span class=md-ellipsis> log_user_info </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#ldap class=md-nav__link> <span class=md-ellipsis> LDAP </span> </a> <nav class=md-nav aria-label=LDAP> <ul class=md-nav__list> <li class=md-nav__item> <a href=#url class=md-nav__link> <span class=md-ellipsis> url </span> </a> </li> <li class=md-nav__item> <a href=#start_tls class=md-nav__link> <span class=md-ellipsis> start_tls </span> </a> </li> <li class=md-nav__item> <a href=#cert_validation_1 class=md-nav__link> <span class=md-ellipsis> cert_validation </span> </a> </li> <li class=md-nav__item> <a href=#tls_certificate_path class=md-nav__link> <span class=md-ellipsis> tls_certificate_path </span> </a> </li> <li class=md-nav__item> <a href=#tls_key_path class=md-nav__link> <span class=md-ellipsis> tls_key_path </span> </a> </li> <li class=md-nav__item> <a href=#base_dn class=md-nav__link> <span class=md-ellipsis> base_dn </span> </a> </li> <li class=md-nav__item> <a href=#bind_user class=md-nav__link> <span class=md-ellipsis> bind_user </span> </a> </li> <li class=md-nav__item> <a href=#bind_pass class=md-nav__link> <span class=md-ellipsis> bind_pass </span> </a> </li> <li class=md-nav__item> <a href=#field_map_2 class=md-nav__link> <span class=md-ellipsis> field_map </span> </a> </li> <li class=md-nav__item> <a href=#login_filter class=md-nav__link> <span class=md-ellipsis> login_filter </span> </a> </li> <li class=md-nav__item> <a href=#admin_group class=md-nav__link> <span class=md-ellipsis> admin_group </span> </a> </li> <li class=md-nav__item> <a href=#sync_interval class=md-nav__link> <span class=md-ellipsis> sync_interval </span> </a> </li> <li class=md-nav__item> <a href=#sync_filter class=md-nav__link> <span class=md-ellipsis> sync_filter </span> </a> </li> <li class=md-nav__item> <a href=#disable_missing class=md-nav__link> <span class=md-ellipsis> disable_missing </span> </a> </li> <li class=md-nav__item> <a href=#auto_re_enable class=md-nav__link> <span class=md-ellipsis> auto_re_enable </span> </a> </li> <li class=md-nav__item> <a href=#registration_enabled_2 class=md-nav__link> <span class=md-ellipsis> registration_enabled </span> </a> </li> <li class=md-nav__item> <a href=#log_user_info_2 class=md-nav__link> <span class=md-ellipsis> log_user_info </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#web class=md-nav__link> <span class=md-ellipsis> Web </span> </a> <nav class=md-nav aria-label=Web> <ul class=md-nav__list> <li class=md-nav__item> <a href=#listening_address_1 class=md-nav__link> <span class=md-ellipsis> listening_address </span> </a> </li> <li class=md-nav__item> <a href=#external_url class=md-nav__link> <span class=md-ellipsis> external_url </span> </a> </li> <li class=md-nav__item> <a href=#site_company_name class=md-nav__link> <span class=md-ellipsis> site_company_name </span> </a> </li> <li class=md-nav__item> <a href=#site_title class=md-nav__link> <span class=md-ellipsis> site_title </span> </a> </li> <li class=md-nav__item> <a href=#session_identifier class=md-nav__link> <span class=md-ellipsis> session_identifier </span> </a> </li> <li class=md-nav__item> <a href=#session_secret class=md-nav__link> <span class=md-ellipsis> session_secret </span> </a> </li> <li class=md-nav__item> <a href=#csrf_secret class=md-nav__link> <span class=md-ellipsis> csrf_secret </span> </a> </li> <li class=md-nav__item> <a href=#request_logging class=md-nav__link> <span class=md-ellipsis> request_logging </span> </a> </li> <li class=md-nav__item> <a href=#cert_file class=md-nav__link> <span class=md-ellipsis> cert_file </span> </a> </li> <li class=md-nav__item> <a href=#key_file class=md-nav__link> <span class=md-ellipsis> key_file </span> </a> </li> </ul> </nav> </li> </ul> </nav> </div> </div> </div> <div class=md-content data-md-component=content> <article class="md-content__inner md-typeset"> <h1>Overview</h1> <p>This page provides an overview of <strong>all available configuration options</strong> for WireGuard Portal.</p> <p>You can supply these configurations in a <strong>YAML</strong> file (e.g. <code>config.yaml</code>) when starting the Portal. The path of the configuration file defaults to <strong>config/config.yml</strong> in the working directory of the executable.<br> It is possible to override configuration filepath using the environment variable <code>WG_PORTAL_CONFIG</code>. For example: <code>WG_PORTAL_CONFIG=/etc/wg-portal/config.yaml ./wg-portal</code>.<br> Also, environment variable substitution in config file is supported. Refer to <a href="https://github.com/a8m/envsubst?tab=readme-ov-file#docs">syntax</a>.</p> <p>Configuration examples are available on the <a href=../examples/ >Examples</a> page.</p> <details> <summary>Default configuration</summary> <div class=highlight><pre><span></span><code><span class=nt>core</span><span class=p>:</span>
<span class=w> </span><span class=nt>admin_user</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">admin@wgportal.local</span>
<span class=w> </span><span class=nt>admin_password</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">wgportal</span>
<span class=w> </span><span class=nt>editable_keys</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
<span class=w> </span><span class=nt>create_default_peer</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
<span class=w> </span><span class=nt>create_default_peer_on_creation</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
<span class=w> </span><span class=nt>re_enable_peer_after_user_enable</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
<span class=w> </span><span class=nt>delete_peer_after_user_deleted</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
<span class=w> </span><span class=nt>self_provisioning_allowed</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
<span class=w> </span><span class=nt>import_existing</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
<span class=w> </span><span class=nt>restore_state</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
<span class=nt>advanced</span><span class=p>:</span>
<span class=w> </span><span class=nt>log_level</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">info</span>
<span class=w> </span><span class=nt>log_pretty</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
<span class=w> </span><span class=nt>log_json</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
<span class=w> </span><span class=nt>start_listen_port</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">51820</span>
<span class=w> </span><span class=nt>start_cidr_v4</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">10.11.12.0/24</span>
<span class=w> </span><span class=nt>start_cidr_v6</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">fdfd:d3ad:c0de:1234::0/64</span>
<span class=w> </span><span class=nt>use_ip_v6</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
<span class=w> </span><span class=nt>config_storage_path</span><span class=p>:</span><span class=w> </span><span class=s>&quot;&quot;</span>
<span class=w> </span><span class=nt>expiry_check_interval</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">15m</span>
<span class=w> </span><span class=nt>rule_prio_offset</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">20000</span>
<span class=w> </span><span class=nt>api_admin_only</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
<span class=nt>database</span><span class=p>:</span>
<span class=w> </span><span class=nt>debug</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
<span class=w> </span><span class=nt>slow_query_threshold</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">0</span>
<span class=w> </span><span class=nt>type</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">sqlite</span>
<span class=w> </span><span class=nt>dsn</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">data/sqlite.db</span>
<span class=nt>statistics</span><span class=p>:</span>
<span class=w> </span><span class=nt>use_ping_checks</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
<span class=w> </span><span class=nt>ping_check_workers</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">10</span>
<span class=w> </span><span class=nt>ping_unprivileged</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
<span class=w> </span><span class=nt>ping_check_interval</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">1m</span>
<span class=w> </span><span class=nt>data_collection_interval</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">1m</span>
<span class=w> </span><span class=nt>collect_interface_data</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
<span class=w> </span><span class=nt>collect_peer_data</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
<span class=w> </span><span class=nt>collect_audit_data</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
<span class=w> </span><span class=nt>listening_address</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">:8787</span>
<span class=nt>mail</span><span class=p>:</span>
<span class=w> </span><span class=nt>host</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">127.0.0.1</span>
<span class=w> </span><span class=nt>port</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">25</span>
<span class=w> </span><span class=nt>encryption</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">none</span>
<span class=w> </span><span class=nt>cert_validation</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
<span class=w> </span><span class=nt>username</span><span class=p>:</span><span class=w> </span><span class=s>&quot;&quot;</span>
<span class=w> </span><span class=nt>password</span><span class=p>:</span><span class=w> </span><span class=s>&quot;&quot;</span>
<span class=w> </span><span class=nt>auth_type</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">plain</span>
<span class=w> </span><span class=nt>from</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">Wireguard Portal &lt;noreply@wireguard.local&gt;</span>
<span class=w> </span><span class=nt>link_only</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
<span class=nt>auth</span><span class=p>:</span>
<span class=w> </span><span class=nt>oidc</span><span class=p>:</span><span class=w> </span><span class="p p-Indicator">[]</span>
<span class=w> </span><span class=nt>oauth</span><span class=p>:</span><span class=w> </span><span class="p p-Indicator">[]</span>
<span class=w> </span><span class=nt>ldap</span><span class=p>:</span><span class=w> </span><span class="p p-Indicator">[]</span>
<span class=nt>web</span><span class=p>:</span>
<span class=w> </span><span class=nt>listening_address</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">:8888</span>
<span class=w> </span><span class=nt>external_url</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">http://localhost:8888</span>
<span class=w> </span><span class=nt>site_company_name</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">WireGuard Portal</span>
<span class=w> </span><span class=nt>site_title</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">WireGuard Portal</span>
<span class=w> </span><span class=nt>session_identifier</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">wgPortalSession</span>
<span class=w> </span><span class=nt>session_secret</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">very_secret</span>
<span class=w> </span><span class=nt>csrf_secret</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">extremely_secret</span>
<span class=w> </span><span class=nt>request_logging</span><span class=p>:</span><span class=w> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
<span class=w> </span><span class=nt>cert_file</span><span class=p>:</span><span class=w> </span><span class=s>&quot;&quot;</span>
<span class=w> </span><span class=nt>key_File</span><span class=p>:</span><span class=w> </span><span class=s>&quot;&quot;</span>
</code></pre></div> </details> <p>Below you will find sections like <a href=#core><code>core</code></a>, <a href=#advanced><code>advanced</code></a>, <a href=#database><code>database</code></a>, <a href=#statistics><code>statistics</code></a>, <a href=#mail><code>mail</code></a>, <a href=#auth><code>auth</code></a> and <a href=#web><code>web</code></a>.<br> Each section describes the individual configuration keys, their default values, and a brief explanation of their purpose.</p> <hr> <h2 id=core>Core</h2> <p>These are the primary configuration options that control fundamental WireGuard Portal behavior. More advanced options are found in the subsequent <code>Advanced</code> section.</p> <h3 id=admin_user><code>admin_user</code></h3> <ul> <li><strong>Default:</strong> <code>admin@wgportal.local</code></li> <li><strong>Description:</strong> The administrator user. This user will be created as a default admin if it does not yet exist.</li> </ul> <h3 id=admin_password><code>admin_password</code></h3> <ul> <li><strong>Default:</strong> <code>wgportal</code></li> <li><strong>Description:</strong> The administrator password. The default password of <code>wgportal</code> should be changed immediately.</li> </ul> <h3 id=admin_api_token><code>admin_api_token</code></h3> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> An API token for the admin user. If a token is provided, the REST API can be accessed using this token. If empty, the API is initially disabled for the admin user.</li> </ul> <h3 id=editable_keys><code>editable_keys</code></h3> <ul> <li><strong>Default:</strong> <code>true</code></li> <li><strong>Description:</strong> Allow editing of WireGuard key-pairs directly in the UI.</li> </ul> <h3 id=create_default_peer><code>create_default_peer</code></h3> <ul> <li><strong>Default:</strong> <code>false</code></li> <li><strong>Description:</strong> If a user logs in for the first time with no existing peers, automatically create a new WireGuard peer for <strong>all</strong> server interfaces.</li> </ul> <h3 id=create_default_peer_on_creation><code>create_default_peer_on_creation</code></h3> <ul> <li><strong>Default:</strong> <code>false</code></li> <li><strong>Description:</strong> If an LDAP user is created (e.g., through LDAP sync) and has no peers, automatically create a new WireGuard peer for <strong>all</strong> server interfaces.</li> </ul> <h3 id=re_enable_peer_after_user_enable><code>re_enable_peer_after_user_enable</code></h3> <ul> <li><strong>Default:</strong> <code>true</code></li> <li><strong>Description:</strong> Re-enable all peers that were previously disabled if the associated user is re-enabled.</li> </ul> <h3 id=delete_peer_after_user_deleted><code>delete_peer_after_user_deleted</code></h3> <ul> <li><strong>Default:</strong> <code>false</code></li> <li><strong>Description:</strong> If a user is deleted, remove all linked peers. Otherwise, peers remain but are disabled.</li> </ul> <h3 id=self_provisioning_allowed><code>self_provisioning_allowed</code></h3> <ul> <li><strong>Default:</strong> <code>false</code></li> <li><strong>Description:</strong> Allow registered (non-admin) users to self-provision peers from their profile page.</li> </ul> <h3 id=import_existing><code>import_existing</code></h3> <ul> <li><strong>Default:</strong> <code>true</code></li> <li><strong>Description:</strong> On startup, import existing WireGuard interfaces and peers into WireGuard Portal.</li> </ul> <h3 id=restore_state><code>restore_state</code></h3> <ul> <li><strong>Default:</strong> <code>true</code></li> <li><strong>Description:</strong> Restore the WireGuard interface states (up/down) that existed before WireGuard Portal started.</li> </ul> <hr> <h2 id=advanced>Advanced</h2> <p>Additional or more specialized configuration options for logging and interface creation details.</p> <h3 id=log_level><code>log_level</code></h3> <ul> <li><strong>Default:</strong> <code>info</code></li> <li><strong>Description:</strong> The log level used by the application. Valid options are: <code>trace</code>, <code>debug</code>, <code>info</code>, <code>warn</code>, <code>error</code>.</li> </ul> <h3 id=log_pretty><code>log_pretty</code></h3> <ul> <li><strong>Default:</strong> <code>false</code></li> <li><strong>Description:</strong> If <code>true</code>, log messages are colorized and formatted for readability (pretty-print).</li> </ul> <h3 id=log_json><code>log_json</code></h3> <ul> <li><strong>Default:</strong> <code>false</code></li> <li><strong>Description:</strong> If <code>true</code>, log messages are structured in JSON format.</li> </ul> <h3 id=start_listen_port><code>start_listen_port</code></h3> <ul> <li><strong>Default:</strong> <code>51820</code></li> <li><strong>Description:</strong> The first port to use when automatically creating new WireGuard interfaces.</li> </ul> <h3 id=start_cidr_v4><code>start_cidr_v4</code></h3> <ul> <li><strong>Default:</strong> <code>10.11.12.0/24</code></li> <li><strong>Description:</strong> The initial IPv4 subnet to use when automatically creating new WireGuard interfaces.</li> </ul> <h3 id=start_cidr_v6><code>start_cidr_v6</code></h3> <ul> <li><strong>Default:</strong> <code>fdfd:d3ad:c0de:1234::0/64</code></li> <li><strong>Description:</strong> The initial IPv6 subnet to use when automatically creating new WireGuard interfaces.</li> </ul> <h3 id=use_ip_v6><code>use_ip_v6</code></h3> <ul> <li><strong>Default:</strong> <code>true</code></li> <li><strong>Description:</strong> Enable or disable IPv6 support.</li> </ul> <h3 id=config_storage_path><code>config_storage_path</code></h3> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> Path to a directory where <code>wg-quick</code> style configuration files will be stored (if you need local filesystem configs).</li> </ul> <h3 id=expiry_check_interval><code>expiry_check_interval</code></h3> <ul> <li><strong>Default:</strong> <code>15m</code></li> <li><strong>Description:</strong> Interval after which existing peers are checked if they are expired. Format uses <code>s</code>, <code>m</code>, <code>h</code>, <code>d</code> for seconds, minutes, hours, days, see <a href=https://golang.org/pkg/time/#ParseDuration>time.ParseDuration</a>.</li> </ul> <h3 id=rule_prio_offset><code>rule_prio_offset</code></h3> <ul> <li><strong>Default:</strong> <code>20000</code></li> <li><strong>Description:</strong> Offset for IP route rule priorities when configuring routing.</li> </ul> <h3 id=route_table_offset><code>route_table_offset</code></h3> <ul> <li><strong>Default:</strong> <code>20000</code></li> <li><strong>Description:</strong> Offset for IP route table IDs when configuring routing.</li> </ul> <h3 id=api_admin_only><code>api_admin_only</code></h3> <ul> <li><strong>Default:</strong> <code>true</code></li> <li><strong>Description:</strong> If <code>true</code>, the public REST API is accessible only to admin users. The API docs live at <a href=../../rest-api/api-doc/ ><code>/api/v1/doc.html</code></a>.</li> </ul> <hr> <h2 id=database>Database</h2> <p>Configuration for the underlying database used by WireGuard Portal. Supported databases include SQLite, MySQL, Microsoft SQL Server, and Postgres.</p> <h3 id=debug><code>debug</code></h3> <ul> <li><strong>Default:</strong> <code>false</code></li> <li><strong>Description:</strong> If <code>true</code>, logs all database statements (verbose).</li> </ul> <h3 id=slow_query_threshold><code>slow_query_threshold</code></h3> <ul> <li><strong>Default:</strong> 0</li> <li><strong>Description:</strong> A time threshold (e.g., <code>100ms</code>) above which queries are considered slow and logged as warnings. If empty or zero, slow query logging is disabled. Format uses <code>s</code>, <code>ms</code> for seconds, milliseconds, see <a href=https://golang.org/pkg/time/#ParseDuration>time.ParseDuration</a>.</li> </ul> <h3 id=type><code>type</code></h3> <ul> <li><strong>Default:</strong> <code>sqlite</code></li> <li><strong>Description:</strong> The database type. Valid options: <code>sqlite</code>, <code>mssql</code>, <code>mysql</code>, <code>postgres</code>.</li> </ul> <h3 id=dsn><code>dsn</code></h3> <ul> <li><strong>Default:</strong> <code>data/sqlite.db</code></li> <li><strong>Description:</strong> The Data Source Name (DSN) for connecting to the database.<br> For example: <div class=highlight><pre><span></span><code>user:pass@tcp(1.2.3.4:3306)/dbname?charset=utf8mb4&amp;parseTime=True&amp;loc=Local
</code></pre></div></li> </ul> <hr> <h2 id=statistics>Statistics</h2> <p>Controls how WireGuard Portal collects and reports usage statistics, including ping checks and Prometheus metrics.</p> <h3 id=use_ping_checks><code>use_ping_checks</code></h3> <ul> <li><strong>Default:</strong> <code>true</code></li> <li><strong>Description:</strong> Enable periodic ping checks to verify that peers remain responsive.</li> </ul> <h3 id=ping_check_workers><code>ping_check_workers</code></h3> <ul> <li><strong>Default:</strong> <code>10</code></li> <li><strong>Description:</strong> Number of parallel worker processes for ping checks.</li> </ul> <h3 id=ping_unprivileged><code>ping_unprivileged</code></h3> <ul> <li><strong>Default:</strong> <code>false</code></li> <li><strong>Description:</strong> If <code>false</code>, ping checks run without root privileges. This is currently considered BETA.</li> </ul> <h3 id=ping_check_interval><code>ping_check_interval</code></h3> <ul> <li><strong>Default:</strong> <code>1m</code></li> <li><strong>Description:</strong> Interval between consecutive ping checks for all peers. Format uses <code>s</code>, <code>m</code>, <code>h</code>, <code>d</code> for seconds, minutes, hours, days, see <a href=https://golang.org/pkg/time/#ParseDuration>time.ParseDuration</a>.</li> </ul> <h3 id=data_collection_interval><code>data_collection_interval</code></h3> <ul> <li><strong>Default:</strong> <code>1m</code></li> <li><strong>Description:</strong> Interval between data collection cycles (bytes sent/received, handshake times, etc.). Format uses <code>s</code>, <code>m</code>, <code>h</code>, <code>d</code> for seconds, minutes, hours, days, see <a href=https://golang.org/pkg/time/#ParseDuration>time.ParseDuration</a>.</li> </ul> <h3 id=collect_interface_data><code>collect_interface_data</code></h3> <ul> <li><strong>Default:</strong> <code>true</code></li> <li><strong>Description:</strong> If <code>true</code>, collects interface-level data (bytes in/out) for monitoring and statistics.</li> </ul> <h3 id=collect_peer_data><code>collect_peer_data</code></h3> <ul> <li><strong>Default:</strong> <code>true</code></li> <li><strong>Description:</strong> If <code>true</code>, collects peer-level data (bytes, last handshake, endpoint, etc.).</li> </ul> <h3 id=collect_audit_data><code>collect_audit_data</code></h3> <ul> <li><strong>Default:</strong> <code>true</code></li> <li><strong>Description:</strong> If <code>true</code>, logs certain portal events (such as user logins) to the database.</li> </ul> <h3 id=listening_address><code>listening_address</code></h3> <ul> <li><strong>Default:</strong> <code>:8787</code></li> <li><strong>Description:</strong> Address and port for the integrated Prometheus metric server (e.g., <code>:8787</code>).</li> </ul> <hr> <h2 id=mail>Mail</h2> <p>Options for configuring email notifications or sending peer configurations via email.</p> <h3 id=host><code>host</code></h3> <ul> <li><strong>Default:</strong> <code>127.0.0.1</code></li> <li><strong>Description:</strong> Hostname or IP of the SMTP server.</li> </ul> <h3 id=port><code>port</code></h3> <ul> <li><strong>Default:</strong> <code>25</code></li> <li><strong>Description:</strong> Port number for the SMTP server.</li> </ul> <h3 id=encryption><code>encryption</code></h3> <ul> <li><strong>Default:</strong> <code>none</code></li> <li><strong>Description:</strong> SMTP encryption type. Valid values: <code>none</code>, <code>tls</code>, <code>starttls</code>.</li> </ul> <h3 id=cert_validation><code>cert_validation</code></h3> <ul> <li><strong>Default:</strong> <code>true</code></li> <li><strong>Description:</strong> If <code>true</code>, validate the SMTP server certificate (relevant if <code>encryption</code> = <code>tls</code>).</li> </ul> <h3 id=username><code>username</code></h3> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> Optional SMTP username for authentication.</li> </ul> <h3 id=password><code>password</code></h3> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> Optional SMTP password for authentication.</li> </ul> <h3 id=auth_type><code>auth_type</code></h3> <ul> <li><strong>Default:</strong> <code>plain</code></li> <li><strong>Description:</strong> SMTP authentication type. Valid values: <code>plain</code>, <code>login</code>, <code>crammd5</code>.</li> </ul> <h3 id=from><code>from</code></h3> <ul> <li><strong>Default:</strong> <code>Wireguard Portal &lt;noreply@wireguard.local&gt;</code></li> <li><strong>Description:</strong> The default "From" address when sending emails.</li> </ul> <h3 id=link_only><code>link_only</code></h3> <ul> <li><strong>Default:</strong> <code>false</code></li> <li><strong>Description:</strong> If <code>true</code>, emails only contain a link to WireGuard Portal, rather than attaching the full configuration.</li> </ul> <hr> <h2 id=auth>Auth</h2> <p>WireGuard Portal supports multiple authentication strategies, including <strong>OpenID Connect</strong> (<code>oidc</code>), <strong>OAuth</strong> (<code>oauth</code>), and <strong>LDAP</strong> (<code>ldap</code>). Each can have multiple providers configured. Below are the relevant keys.</p> <hr> <h3 id=oidc>OIDC</h3> <p>The <code>oidc</code> array contains a list of OpenID Connect providers. Below are the properties for each OIDC provider entry inside <code>auth.oidc</code>:</p> <h4 id=provider_name><code>provider_name</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> A <strong>unique</strong> name for this provider. Must not conflict with other providers.</li> </ul> <h4 id=display_name><code>display_name</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> A user-friendly name shown on the login page (e.g., "Login with Google").</li> </ul> <h4 id=base_url><code>base_url</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> The OIDC providers base URL (e.g., <code>https://accounts.google.com</code>).</li> </ul> <h4 id=client_id><code>client_id</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> The OAuth client ID from the OIDC provider.</li> </ul> <h4 id=client_secret><code>client_secret</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> The OAuth client secret from the OIDC provider.</li> </ul> <h4 id=extra_scopes><code>extra_scopes</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> A list of additional OIDC scopes (e.g., <code>profile</code>, <code>email</code>).</li> </ul> <h4 id=field_map><code>field_map</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> Maps OIDC claims to WireGuard Portal user fields. </li> <li> <p>Available fields: <code>user_identifier</code>, <code>email</code>, <code>firstname</code>, <code>lastname</code>, <code>phone</code>, <code>department</code>, <code>is_admin</code>, <code>user_groups</code>.</p> <table> <thead> <tr> <th><strong>Field</strong></th> <th><strong>Typical OIDC Claim</strong></th> <th><strong>Explanation</strong></th> </tr> </thead> <tbody> <tr> <td><code>user_identifier</code></td> <td><code>sub</code> or <code>preferred_username</code></td> <td>A unique identifier for the user. Often the OIDC <code>sub</code> claim is used because its guaranteed to be unique for the user within the IdP. Some providers also support <code>preferred_username</code> if its unique.</td> </tr> <tr> <td><code>email</code></td> <td><code>email</code></td> <td>The users email address as provided by the IdP. Not always verified, depending on IdP settings.</td> </tr> <tr> <td><code>firstname</code></td> <td><code>given_name</code></td> <td>The users first name, typically provided by the IdP in the <code>given_name</code> claim.</td> </tr> <tr> <td><code>lastname</code></td> <td><code>family_name</code></td> <td>The users last (family) name, typically provided by the IdP in the <code>family_name</code> claim.</td> </tr> <tr> <td><code>phone</code></td> <td><code>phone_number</code></td> <td>The users phone number. This may require additional scopes/permissions from the IdP to access.</td> </tr> <tr> <td><code>department</code></td> <td>Custom claim (e.g., <code>department</code>)</td> <td>If the IdP can provide organizational data, it may store it in a custom claim. Adjust accordingly (e.g., <code>department</code>, <code>org</code>, or another attribute).</td> </tr> <tr> <td><code>is_admin</code></td> <td>Custom claim or derived role</td> <td>If the IdP returns a role or admin flag, you can map that to <code>is_admin</code>. Often this is managed through custom claims or group membership.</td> </tr> <tr> <td><code>user_groups</code></td> <td><code>groups</code> or another custom claim</td> <td>A list of group memberships for the user. Some IdPs provide <code>groups</code> out of the box; others require custom claims or directory lookups.</td> </tr> </tbody> </table> </li> </ul> <h4 id=admin_mapping><code>admin_mapping</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> WgPortal can grant a user admin rights by matching the value of the <code>is_admin</code> claim against a regular expression. Alternatively, a regular expression can be used to check if a user is member of a specific group listed in the <code>user_group</code> claim. The regular expressions are defined in <code>admin_value_regex</code> and <code>admin_group_regex</code>.<ul> <li><code>admin_value_regex</code>: A regular expression to match the <code>is_admin</code> claim. By default, this expression matches the string "true" (<code>^true$</code>).</li> <li><code>admin_group_regex</code>: A regular expression to match the <code>user_groups</code> claim. Each entry in the <code>user_groups</code> claim is checked against this regex.</li> </ul> </li> </ul> <h4 id=registration_enabled><code>registration_enabled</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> If <code>true</code>, a new user will be created in WireGuard Portal if not already present.</li> </ul> <h4 id=log_user_info><code>log_user_info</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> If <code>true</code>, OIDC user data is logged at the trace level upon login (for debugging).</li> </ul> <hr> <h3 id=oauth>OAuth</h3> <p>The <code>oauth</code> array contains a list of plain OAuth2 providers. Below are the properties for each OAuth provider entry inside <code>auth.oauth</code>:</p> <h4 id=provider_name_1><code>provider_name</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> A <strong>unique</strong> name for this provider. Must not conflict with other providers.</li> </ul> <h4 id=display_name_1><code>display_name</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> A user-friendly name shown on the login page.</li> </ul> <h4 id=client_id_1><code>client_id</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> The OAuth client ID for the provider.</li> </ul> <h4 id=client_secret_1><code>client_secret</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> The OAuth client secret for the provider.</li> </ul> <h4 id=auth_url><code>auth_url</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> URL of the authentication endpoint.</li> </ul> <h4 id=token_url><code>token_url</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> URL of the token endpoint.</li> </ul> <h4 id=user_info_url><code>user_info_url</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> URL of the user information endpoint.</li> </ul> <h4 id=scopes><code>scopes</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> A list of OAuth scopes.</li> </ul> <h4 id=field_map_1><code>field_map</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> Maps OAuth attributes to WireGuard Portal fields.</li> <li> <p>Available fields: <code>user_identifier</code>, <code>email</code>, <code>firstname</code>, <code>lastname</code>, <code>phone</code>, <code>department</code>, <code>is_admin</code>, <code>user_groups</code>.</p> <table> <thead> <tr> <th><strong>Field</strong></th> <th><strong>Typical Claim</strong></th> <th><strong>Explanation</strong></th> </tr> </thead> <tbody> <tr> <td><code>user_identifier</code></td> <td><code>sub</code> or <code>preferred_username</code></td> <td>A unique identifier for the user. Often the OIDC <code>sub</code> claim is used because its guaranteed to be unique for the user within the IdP. Some providers also support <code>preferred_username</code> if its unique.</td> </tr> <tr> <td><code>email</code></td> <td><code>email</code></td> <td>The users email address as provided by the IdP. Not always verified, depending on IdP settings.</td> </tr> <tr> <td><code>firstname</code></td> <td><code>given_name</code></td> <td>The users first name, typically provided by the IdP in the <code>given_name</code> claim.</td> </tr> <tr> <td><code>lastname</code></td> <td><code>family_name</code></td> <td>The users last (family) name, typically provided by the IdP in the <code>family_name</code> claim.</td> </tr> <tr> <td><code>phone</code></td> <td><code>phone_number</code></td> <td>The users phone number. This may require additional scopes/permissions from the IdP to access.</td> </tr> <tr> <td><code>department</code></td> <td>Custom claim (e.g., <code>department</code>)</td> <td>If the IdP can provide organizational data, it may store it in a custom claim. Adjust accordingly (e.g., <code>department</code>, <code>org</code>, or another attribute).</td> </tr> <tr> <td><code>is_admin</code></td> <td>Custom claim or derived role</td> <td>If the IdP returns a role or admin flag, you can map that to <code>is_admin</code>. Often this is managed through custom claims or group membership.</td> </tr> <tr> <td><code>user_groups</code></td> <td><code>groups</code> or another custom claim</td> <td>A list of group memberships for the user. Some IdPs provide <code>groups</code> out of the box; others require custom claims or directory lookups.</td> </tr> </tbody> </table> </li> </ul> <h4 id=admin_mapping_1><code>admin_mapping</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> WgPortal can grant a user admin rights by matching the value of the <code>is_admin</code> claim against a regular expression. Alternatively, a regular expression can be used to check if a user is member of a specific group listed in the <code>user_group</code> claim. The regular expressions are defined in <code>admin_value_regex</code> and <code>admin_group_regex</code>.</li> <li><code>admin_value_regex</code>: A regular expression to match the <code>is_admin</code> claim. By default, this expression matches the string "true" (<code>^true$</code>).</li> <li><code>admin_group_regex</code>: A regular expression to match the <code>user_groups</code> claim. Each entry in the <code>user_groups</code> claim is checked against this regex.</li> </ul> <h4 id=registration_enabled_1><code>registration_enabled</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> If <code>true</code>, new users are created automatically on successful login.</li> </ul> <h4 id=log_user_info_1><code>log_user_info</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> If <code>true</code>, logs user info at the trace level upon login.</li> </ul> <hr> <h3 id=ldap>LDAP</h3> <p>The <code>ldap</code> array contains a list of LDAP authentication providers. Below are the properties for each LDAP provider entry inside <code>auth.ldap</code>:</p> <h4 id=url><code>url</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> The LDAP server URL (e.g., <code>ldap://srv-ad01.company.local:389</code>).</li> </ul> <h4 id=start_tls><code>start_tls</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> If <code>true</code>, use STARTTLS to secure the LDAP connection.</li> </ul> <h4 id=cert_validation_1><code>cert_validation</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> If <code>true</code>, validate the LDAP servers TLS certificate.</li> </ul> <h4 id=tls_certificate_path><code>tls_certificate_path</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> Path to a TLS certificate if needed for LDAP connections.</li> </ul> <h4 id=tls_key_path><code>tls_key_path</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> Path to the corresponding TLS certificate key.</li> </ul> <h4 id=base_dn><code>base_dn</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> The base DN for user searches (e.g., <code>DC=COMPANY,DC=LOCAL</code>).</li> </ul> <h4 id=bind_user><code>bind_user</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> The bind user for LDAP (e.g., <code>company\\ldap_wireguard</code> or <code>ldap_wireguard@company.local</code>).</li> </ul> <h4 id=bind_pass><code>bind_pass</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> The bind password for LDAP authentication.</li> </ul> <h4 id=field_map_2><code>field_map</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li> <p><strong>Description:</strong> Maps LDAP attributes to WireGuard Portal fields.</p> <ul> <li>Available fields: <code>user_identifier</code>, <code>email</code>, <code>firstname</code>, <code>lastname</code>, <code>phone</code>, <code>department</code>, <code>memberof</code>.</li> </ul> <table> <thead> <tr> <th><strong>WireGuard Portal Field</strong></th> <th><strong>Typical LDAP Attribute</strong></th> <th><strong>Short Description</strong></th> </tr> </thead> <tbody> <tr> <td>user_identifier</td> <td>sAMAccountName / uid</td> <td>Uniquely identifies the user within the LDAP directory.</td> </tr> <tr> <td>email</td> <td>mail / userPrincipalName</td> <td>Stores the user's primary email address.</td> </tr> <tr> <td>firstname</td> <td>givenName</td> <td>Contains the user's first (given) name.</td> </tr> <tr> <td>lastname</td> <td>sn</td> <td>Contains the user's last (surname) name.</td> </tr> <tr> <td>phone</td> <td>telephoneNumber / mobile</td> <td>Holds the user's phone or mobile number.</td> </tr> <tr> <td>department</td> <td>departmentNumber / ou</td> <td>Specifies the department or organizational unit of the user.</td> </tr> <tr> <td>memberof</td> <td>memberOf</td> <td>Lists the groups and roles to which the user belongs.</td> </tr> </tbody> </table> </li> </ul> <h4 id=login_filter><code>login_filter</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> An LDAP filter to restrict which users can log in. Use <code>{{login_identifier}}</code> to insert the username. For example: <div class=highlight><pre><span></span><code>(&amp;(objectClass=organizationalPerson)(mail={{login_identifier}})(!userAccountControl:1.2.840.113556.1.4.803:=2))
</code></pre></div></li> </ul> <h4 id=admin_group><code>admin_group</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> A specific LDAP group whose members are considered administrators in WireGuard Portal. For example: <div class=highlight><pre><span></span><code>CN=WireGuardAdmins,OU=Some-OU,DC=YOURDOMAIN,DC=LOCAL
</code></pre></div></li> </ul> <h4 id=sync_interval><code>sync_interval</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> How frequently (in duration, e.g. <code>30m</code>) to synchronize users from LDAP. Empty or <code>0</code> disables sync. Format uses <code>s</code>, <code>m</code>, <code>h</code>, <code>d</code> for seconds, minutes, hours, days, see <a href=https://golang.org/pkg/time/#ParseDuration>time.ParseDuration</a>. Only users that match the <code>sync_filter</code> are synchronized, if <code>disable_missing</code> is <code>true</code>, users not found in LDAP are disabled.</li> </ul> <h4 id=sync_filter><code>sync_filter</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> An LDAP filter to select which users get synchronized into WireGuard Portal. For example: <div class=highlight><pre><span></span><code>(&amp;(objectClass=organizationalPerson)(!userAccountControl:1.2.840.113556.1.4.803:=2)(mail=*))
</code></pre></div></li> </ul> <h4 id=disable_missing><code>disable_missing</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> If <code>true</code>, any user <strong>not</strong> found in LDAP (during sync) is disabled in WireGuard Portal.</li> </ul> <h4 id=auto_re_enable><code>auto_re_enable</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> If <code>true</code>, users that where disabled because they were missing (see <code>disable_missing</code>) will be re-enabled once they are found again.</li> </ul> <h4 id=registration_enabled_2><code>registration_enabled</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> If <code>true</code>, new user accounts are created in WireGuard Portal upon first login.</li> </ul> <h4 id=log_user_info_2><code>log_user_info</code></h4> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> If <code>true</code>, logs LDAP user data at the trace level upon login.</li> </ul> <hr> <h2 id=web>Web</h2> <h3 id=listening_address_1><code>listening_address</code></h3> <ul> <li><strong>Default:</strong> <code>:8888</code></li> <li><strong>Description:</strong> The listening port of the web server.</li> </ul> <h3 id=external_url><code>external_url</code></h3> <ul> <li><strong>Default:</strong> <code>http://localhost:8888</code></li> <li><strong>Description:</strong> The URL where a client can access WireGuard Portal.</li> </ul> <h3 id=site_company_name><code>site_company_name</code></h3> <ul> <li><strong>Default:</strong> <code>WireGuard Portal</code></li> <li><strong>Description:</strong> The company name that is shown at the bottom of the web frontend.</li> </ul> <h3 id=site_title><code>site_title</code></h3> <ul> <li><strong>Default:</strong> <code>WireGuard Portal</code></li> <li><strong>Description:</strong> The title that is shown in the web frontend.</li> </ul> <h3 id=session_identifier><code>session_identifier</code></h3> <ul> <li><strong>Default:</strong> <code>wgPortalSession</code></li> <li><strong>Description:</strong> The session identifier for the web frontend.</li> </ul> <h3 id=session_secret><code>session_secret</code></h3> <ul> <li><strong>Default:</strong> <code>very_secret</code></li> <li><strong>Description:</strong> The session secret for the web frontend.</li> </ul> <h3 id=csrf_secret><code>csrf_secret</code></h3> <ul> <li><strong>Default:</strong> <code>extremely_secret</code></li> <li><strong>Description:</strong> The CSRF secret.</li> </ul> <h3 id=request_logging><code>request_logging</code></h3> <ul> <li><strong>Default:</strong> <code>false</code></li> <li><strong>Description:</strong> Log all HTTP requests.</li> </ul> <h3 id=cert_file><code>cert_file</code></h3> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> (Optional) Path to the TLS certificate file.</li> </ul> <h3 id=key_file><code>key_file</code></h3> <ul> <li><strong>Default:</strong> <em>(empty)</em></li> <li><strong>Description:</strong> (Optional) Path to the TLS certificate key file.</li> </ul> </article> </div> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> </div> </main> <!-- Application footer --> <footer class=md-footer> <!-- Further information --> <div class="md-footer-meta md-typeset" style="background-color: #fff;"> <div class="md-footer-meta__inner md-grid" style="background-color: #fff;"> <!-- Copyright and theme information --> <div class=md-footer-copyright> <div class=md-footer-copyright__highlight style="color: rgb(38, 38, 38);"> Copyright &copy; 2023-2025 WireGuard Portal Project </div> <div style="color: rgb(38, 38, 38);"> Made with <a href=https://squidfunk.github.io/mkdocs-material/ target=_blank rel=noopener style="color: black;"> Material for MkDocs </a> </div> </div> <!-- Social links --> <div class=md-social> <a href=https://github.com/h44z/wg-portal target=_blank rel=noopener title=github.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 480 512"><!-- Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M186.1 328.7c0 20.9-10.9 55.1-36.7 55.1s-36.7-34.2-36.7-55.1 10.9-55.1 36.7-55.1 36.7 34.2 36.7 55.1M480 278.2c0 31.9-3.2 65.7-17.5 95-37.9 76.6-142.1 74.8-216.7 74.8-75.8 0-186.2 2.7-225.6-74.8-14.6-29-20.2-63.1-20.2-95 0-41.9 13.9-81.5 41.5-113.6-5.2-15.8-7.7-32.4-7.7-48.8 0-21.5 4.9-32.3 14.6-51.8 45.3 0 74.3 9 108.8 36 29-6.9 58.8-10 88.7-10 27 0 54.2 2.9 80.4 9.2 34-26.7 63-35.2 107.8-35.2 9.8 19.5 14.6 30.3 14.6 51.8 0 16.4-2.6 32.7-7.7 48.2 27.5 32.4 39 72.3 39 114.2m-64.3 50.5c0-43.9-26.7-82.6-73.5-82.6-18.9 0-37 3.4-56 6-14.9 2.3-29.8 3.2-45.1 3.2-15.2 0-30.1-.9-45.1-3.2-18.7-2.6-37-6-56-6-46.8 0-73.5 38.7-73.5 82.6 0 87.8 80.4 101.3 150.4 101.3h48.2c70.3 0 150.6-13.4 150.6-101.3m-82.6-55.1c-25.8 0-36.7 34.2-36.7 55.1s10.9 55.1 36.7 55.1 36.7-34.2 36.7-55.1-10.9-55.1-36.7-55.1"/></svg> </a> <a href=https://hub.docker.com/r/wgportal/wg-portal target=_blank rel=noopener title=hub.docker.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 640 512"><!-- Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M349.9 236.3h-66.1v-59.4h66.1zm0-204.3h-66.1v60.7h66.1zm78.2 144.8H362v59.4h66.1zm-156.3-72.1h-66.1v60.1h66.1zm78.1 0h-66.1v60.1h66.1zm276.8 100c-14.4-9.7-47.6-13.2-73.1-8.4-3.3-24-16.7-44.9-41.1-63.7l-14-9.3-9.3 14c-18.4 27.8-23.4 73.6-3.7 103.8-8.7 4.7-25.8 11.1-48.4 10.7H2.4c-8.7 50.8 5.8 116.8 44 162.1 37.1 43.9 92.7 66.2 165.4 66.2 157.4 0 273.9-72.5 328.4-204.2 21.4.4 67.6.1 91.3-45.2 1.5-2.5 6.6-13.2 8.5-17.1zm-511.1-27.9h-66v59.4h66.1v-59.4zm78.1 0h-66.1v59.4h66.1zm78.1 0h-66.1v59.4h66.1zm-78.1-72.1h-66.1v60.1h66.1z"/></svg> </a> <a href=https://twitter.com/chris_h44z target=_blank rel=noopener title=twitter.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 512 512"><!-- Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253"/></svg> </a> </div> </div> </div> </footer> </div> <div class=md-dialog data-md-component=dialog> <div class="md-dialog__inner md-typeset"></div> </div> <script id=__config type=application/json>{"base": "../../..", "features": ["content.code.copy", "navigation.instant", "navigation.tabs", "navigation.expand"], "search": "../../../assets/javascripts/workers/search.f8cc74c7.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"default": "latest", "provider": "mike"}}</script> <script src=../../../assets/javascripts/bundle.c8b220af.min.js></script> </body> </html>