139 lines
91 KiB
HTML
Raw Normal View History

<!DOCTYPE html>
<html class="no-js" lang="en"> <head><meta charset="utf-8"/><meta content="width=device-width,initial-scale=1" name="viewport"/><meta content="Manage WireGuard Peers and Interface using a beautiful and simple web UI." name="description"/><link href="https://wgportal.org/master/documentation/configuration/overview/" rel="canonical"/><link href="../../getting-started/sources/" rel="prev"/><link href="../examples/" rel="next"/><link href="../../../assets/images/favicon-large.png" rel="icon"/><meta content="mkdocs-1.6.1, mkdocs-material-9.6.3" name="generator"/><title>Overview - WireGuard Portal</title><link href="../../../assets/stylesheets/main.d7758b05.min.css" rel="stylesheet"/><link href="../../../assets/stylesheets/palette.06af60db.min.css" rel="stylesheet"/><link href="../../../stylesheets/extra.css" rel="stylesheet"/><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 content="website" property="og:type"/><meta content="Overview - WireGuard Portal" property="og:title"/><meta content="Manage WireGuard Peers and Interface using a beautiful and simple web UI." property="og:description"/><meta content="https://wgportal.org/master/assets/images/social/documentation/configuration/overview.png" property="og:image"/><meta content="image/png" property="og:image:type"/><meta content="1200" property="og:image:width"/><meta content="630" property="og:image:height"/><meta content="https://wgportal.org/master/documentation/configuration/overview/" property="og:url"/><meta content="summary_large_image" name="twitter:card"/><meta content="Overview - WireGuard Portal" name="twitter:title"/><meta content="Manage WireGuard Peers and Interface using a beautiful and simple web UI." name="twitter:description"/><meta content="https://wgportal.org/master/assets/images/social/documentation/configuration/overview.png" name="twitter:image"/></head> <body data-md-color-accent="indigo" data-md-color-primary="white" data-md-color-scheme="default" dir="ltr"> <input autocomplete="off" class="md-toggle" data-md-toggle="drawer" id="__drawer" type="checkbox"/> <input autocomplete="off" class="md-toggle" data-md-toggle="search" id="__search" type="checkbox"/> <label class="md-overlay" for="__drawer"></label> <div data-md-component="skip"> <a class="md-skip" href="#core"> 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 aria-label="Header" class="md-header__inner md-grid"> <a aria-label="WireGuard Portal" class="md-header__button md-logo" data-md-component="logo" href="../../.." title="WireGuard Portal"> <img alt="logo" src="../../../assets/images/logo.svg"/> </a> <label class="md-header__button md-icon" for="__drawer"> <svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"></path></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 viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><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"></path></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 aria-
<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">""</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">false</span>
<span class="w"> </span><span class="nt">username</span><span class="p">:</span><span class="w"> </span><span class="s">""</span>
<span class="w"> </span><span class="nt">password</span><span class="p">:</span><span class="w"> </span><span class="s">""</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">""</span>
<span class="w"> </span><span class="nt">key_File</span><span class="p">:</span><span class="w"> </span><span class="s">""</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="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 colo
</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>false</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
</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 © 2023-2025 WireGuard Portal Project </div> <div style="color: rgb(38, 38, 38);"> Made with <a href="https://squidfunk.github.io/mkdocs-material/" rel="noopener" style="color: black;" target="_blank"> Material for MkDocs </a> </div> </div> <!-- Social links --> <div class="md-social"> <a class="md-
window.update_swagger_ui_iframe_height = function (id) {
var iFrameID = document.getElementById(id);
if (iFrameID) {
full_height = (iFrameID.contentWindow.document.body.scrollHeight + 80) + "px";
iFrameID.height = full_height;
iFrameID.style.height = full_height;
}
}
let iframe_id_list = []
var iframes = document.getElementsByClassName("swagger-ui-iframe");
for (var i = 0; i < iframes.length; i++) {
iframe_id_list.push(iframes[i].getAttribute("id"))
}
let ticking = true;
document.addEventListener('scroll', function(e) {
if (!ticking) {
window.requestAnimationFrame(()=> {
let half_vh = window.innerHeight/2;
for(var i = 0; i < iframe_id_list.length; i++) {
let element = document.getElementById(iframe_id_list[i])
if(element==null){
return
}
let diff = element.getBoundingClientRect().top
if(element.contentWindow.update_top_val){
element.contentWindow.update_top_val(half_vh - diff)
}
}
ticking = false;
});
ticking = true;
}
});
const dark_scheme_name = "slate"
window.scheme = document.body.getAttribute("data-md-color-scheme")
const options = {
attributeFilter: ['data-md-color-scheme'],
};
function color_scheme_callback(mutations) {
for (let mutation of mutations) {
if (mutation.attributeName === "data-md-color-scheme") {
scheme = document.body.getAttribute("data-md-color-scheme")
var iframe_list = document.getElementsByClassName("swagger-ui-iframe")
for(var i = 0; i < iframe_list.length; i++) {
var ele = iframe_list.item(i);
if (ele) {
if (scheme === dark_scheme_name) {
ele.contentWindow.enable_dark_mode();
} else {
ele.contentWindow.disable_dark_mode();
}
}
}
}
}
}
observer = new MutationObserver(color_scheme_callback);
observer.observe(document.body, options);
})</script></body> </html>