mirror of https://github.com/Aidaho12/haproxy-wi
1176 lines
63 KiB
HTML
1176 lines
63 KiB
HTML
{% extends "base.html" %}
|
||
{% block content %}
|
||
{% from 'include/input_macros.html' import input, checkbox, select %}
|
||
{% set balance_params = dict() %}
|
||
{% set balance_params = {'roundrobin':'roundrobin','source':'source','leastconn':'leastconn','first':'first',
|
||
'rdp-cookie':'rdp-cookie', 'uri':'uri', 'uri whole':'uri whole', 'static-rr': 'static-rr',
|
||
'url_param userid':'url_param userid'} %}
|
||
{% set checks = dict() %}
|
||
{% set checks = {'':'Choose a custom health check','option tcp-check':'Check a TCP Port',
|
||
'option ssl-hello-chk':'Check a SSL Port','option httpchk':'Check a HTTP service',
|
||
'option ldap-check':'Check a LDAP service', 'option mysql-check':'Check a MySql Service',
|
||
'option pgsql-check':'Check a PgSQL Service', 'option redis-check': 'Check a Redis Service',
|
||
'option smtpchk':'Check a SMTP service'} %}
|
||
{% set observe = {'layer7':'layer7', 'layer4': 'layer4'} %}
|
||
{% set on_error = {'mark-down':'mark-down', 'fastinter': 'fastinter', 'fail-check':'fail-check',
|
||
'sudden-death':'sudden-death'} %}
|
||
|
||
{% set if_values = dict() %}
|
||
{% set if_values = {'1':'Host name starts with','2':'Host name ends with','3':'Path starts with','4':'Path ends with', '6': 'Src ip'} %}
|
||
|
||
<script src="/inc/add.js"></script>
|
||
<div id="tabs">
|
||
<ul>
|
||
<li><a href="#create" title="Add proxy: Create proxy - Roxy-WI">Create proxy</a></li>
|
||
<li><a href="#listen" title="Add proxy: Create Listen - Roxy-WI">Listen</a></li>
|
||
<li><a href="#frontend" title="Add proxy: Create Frontend - Roxy-WI">Frontend</a></li>
|
||
<li><a href="#backend" title="Add proxy: Create Backend - Roxy-WI">Backend</a></li>
|
||
<li><a href="#ssl" title="Add proxy: Upload SSL certificates - Roxy-WI">SSL certificates</a></li>
|
||
<li><a href="#option" title="Add proxy: Options templates - Roxy-WI">Options</a></li>
|
||
<li><a href="#add-servers" title="Add proxy: Servers templates - Roxy-WI">Servers</a></li>
|
||
<li><a href="#userlist" title="Add proxy: Create Userlists - Roxy-WI">Userlists</a></li>
|
||
<li><a href="#peers" title="Add proxy: Create peers - Roxy-WI">Peers</a></li>
|
||
<li><a href="#lists" title="Add proxy: Create and upload whitelists or blacklists - Roxy-WI">Lists</a></li>
|
||
{% include 'include/login.html' %}
|
||
</ul>
|
||
<ul id='browse_histroy'></ul>
|
||
{% include 'include/add_proxy.html' %}
|
||
<div id="listen">
|
||
<form name="add-listener" id="add-listener" action="/app/add.py" method="post">
|
||
<table class="add-table">
|
||
<caption><h3>Add listen</h3></caption>
|
||
<tr>
|
||
<td class="addName">Select a server: </td>
|
||
<td class="addOption">
|
||
<select required name="serv" id="serv">
|
||
<option disabled selected>------</option>
|
||
{% for select in selects %}
|
||
<option value="{{ select.2 }}">{{ select.1 }}</option>
|
||
{% endfor %}
|
||
</select>
|
||
<div class="tooltip tooltipTop"><b>Note:</b> If you re-configure the master server, the slave server will be re-configured automatically</div>
|
||
</td>
|
||
<td rowspan="5" class="add-note addName alert-info">
|
||
A "listen" section defines a complete proxy with its frontend and backend parts combined in one section. It is generally useful for TCP-only traffic.
|
||
<br /><br />
|
||
All proxy names must be formed from upper and lower case letters, digits, '-' (dash), '_' (underscore) , '.' (dot) and ':' (colon). ACL names are
|
||
case-sensitive, which means that "www" and "WWW" are two different proxies.
|
||
<br /><br />
|
||
Historically, all proxy names could overlap, it just caused troubles in the logs. Since the introduction of content switching, it is mandatory that two
|
||
proxies with overlapping capabilities (frontend/backend) have different names. However, it is still permitted that a frontend and a backend share the same
|
||
name, as this configuration seems to be commonly encountered.
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="addName">Name:</td>
|
||
<td class="addOption">
|
||
{{ input('name', name='listener', title="Name Listener", placeholder="web_80", required='required') }}
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="addName">IP and Port:</td>
|
||
<td class="addOption">
|
||
{{ input('ip', placeholder="Any", size='15') }}<b>:</b>
|
||
{{ input('listen-port', name='port', title="Port for bind listen", placeholder="8080", size='5', required='required') }}
|
||
<div id="listener_bind" style="display: none"></div>
|
||
<a class="link add-server" id="add_bind_listener" title="Bind one more IP-port pair"></a>
|
||
<div class="tooltip tooltipTop">
|
||
If the IP-address for the listener is empty, it will listen on all IP addresses.
|
||
Start typing IP or press down button. Click on + to add multiple IP-port pairs. If you are using VRRP,
|
||
leave the IP field blank. If you assign a VRRP IP, the slave server will not start.
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr class="advance">
|
||
<td class="addName">Mode: </td>
|
||
<td class="addOption">
|
||
{% set values = dict() %}
|
||
{% set values = {'http':'http','tcp':'tcp'} %}
|
||
{{ select('listen-mode-select', name='mode', values=values, selected='http', required='required', class='force_close') }}
|
||
<span id="https-listen-span">
|
||
<label for="https-listen" style="margin-top: 5px;" title="Enable SSL Offloading" data-help="The term SSL termination means that you are performing all encryption and decryption at the edge of your network, such as at the load balancer.">SSL Offloading</label>
|
||
<input type="checkbox" id="https-listen" name="ssl" value="https" >
|
||
</span>
|
||
<div id="https-hide-listen" style="display: none;">
|
||
<br /><span class="tooltip tooltipTop">Enter name of pem file, or press the "down" button:</span><br />
|
||
{{ input('path-cert-listen', name="cert", placeholder="some_cert.pem", size='39') }}<br />
|
||
<label for="ssl-dis-check-listen" style="margin-top: 5px;">Disable SSL check</label><input type="checkbox" id="ssl-dis-check-listen" name="ssl-dis-check" value="ssl-dis-check">
|
||
<label for="ssl-check-listen" style="margin-top: 5px;">Disable SSL verify on servers</label><input type="checkbox" id="ssl-check-listen" name="ssl-check" value="ssl-check" checked>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr class="advance">
|
||
<td class="addName">Maxconn: </td>
|
||
<td class="addOption">
|
||
{{ input('maxconn', value='2000', type="number", title="Fix the maximum number of concurrent connections on a frontend", size='5', required='required') }}
|
||
<div class="tooltip tooltipTop">This value should not exceed the global maxconn. Default global maxconn value: 2000</div>
|
||
</td>
|
||
</tr>
|
||
<tr class="advance">
|
||
<td class="addName">Balance: </td>
|
||
<td class="addOption">
|
||
{{ select('balance', values=balance_params, selected='roundrobin', required='required', class='force_close') }}
|
||
</td>
|
||
</tr>
|
||
<tr class="advance">
|
||
<td class="addName">Health check: </td>
|
||
<td class="addOption">
|
||
{{ select('listener_checks', name='health_check', values=checks, selected='', class='force_close') }}
|
||
<span id="listener_checks_note" class="tooltip tooltipTop"></span>
|
||
<br />
|
||
<span id="listener_checks_http" style="display: none;">
|
||
URI path for checking: {{ input('listener_checks_http_path', name='checks_http_path', value='/', title="URI for checking e.g. /check") }}
|
||
Domain name: {{ input('listener_checks_http_domain', name='checks_http_domain', placeholder='domain.com', title="Domain name for checking e.g. domain.com") }}
|
||
</span>
|
||
</td>
|
||
</tr>
|
||
<tr class="advance">
|
||
<td class="addName" title="Access control list">ACL: </td>
|
||
<td class="addOption">
|
||
<span title="Add ACL" id="add_listener_acl" class="link add-server"></span>
|
||
<div id="listener_acl" style="display: none;">
|
||
<p style="border-bottom: 1px solid #ddd; padding-bottom: 10px;" id="listener_acl_rule">
|
||
<b class="padding10">if</b>
|
||
{{ select('listener_acl_if', name='acl_if', values=if_values, first='Choose if', class='force_close', disabled=false) }}
|
||
<b class="padding10">value</b>
|
||
{{ input('listener_acl_value', name="acl_value") }}
|
||
<b class="padding10">then</b>
|
||
{% set values = dict() %}
|
||
{% set values = {'2':'Redirect to','3':'Allow','4':'Deny', '6': 'Return', '7': 'Set-header'} %}
|
||
{{ select('listener_acl_then', name='acl_then', values=values, first='Choose action', class='force_close', disabled=false) }}
|
||
<b class="padding10">value</b>
|
||
{{ input('listener_acl_then_value', name='acl_then_value', title="Required if \'then\' is \'Use backend\' or \'Redirect\', \'Return\', or \'Set-header\'") }}
|
||
<span class="minus minus-style" onclick="deleteId('listener_acl_rule')" title="Delete this rule"></span>
|
||
</p>
|
||
</div>
|
||
<span>
|
||
<a class="link add-server" id="listener_add_acl" title="Add ACL" style="cursor: pointer; display: none;"></a>
|
||
</span>
|
||
</td>
|
||
</tr>
|
||
<tr class="advance">
|
||
<td class="addName"><span title="Cache support start 1.8 and latter" class="help_cursor">Web acceleration:</span></td>
|
||
<td class="addOption">
|
||
<span class="controlgroup">
|
||
{{ checkbox('compression', title='HTTP compression allows you to shrink the body of a response before it is relayed to a client, which results in using less network bandwidth per request. From a client\'s perspective, this reduces latency.',
|
||
value='1', desc='Compression') }}
|
||
{{ checkbox('cache', title='Enable cache', value='2', desc='Cache') }}
|
||
{{ checkbox('ssl_offloading', title='Enable redirection from HTTP scheme to HTTPS scheme', desc='HTTP->HTTPS') }}
|
||
</span>
|
||
</td>
|
||
</tr>
|
||
<tr class="advance">
|
||
<td class="addName"><span title="Web application firewall" class="help_cursor">WAF:</span></td>
|
||
<td class="addOption">
|
||
<span class="controlgroup">
|
||
{{ checkbox('slow_atack', title='In a Slow POST attack, an attacker begins by sending a legitimate HTTP POST header to a Web server, exactly as they would under normal circumstances. The header specifies the exact size of the message body that will then follow. However, that message body is then sent at an alarmingly low rate – sometimes as slow as 1 byte per approximately two minutes.',
|
||
desc='Slow attack') }}
|
||
{{ checkbox('ddos', title='DDOS attack protect', desc='DDOS') }}
|
||
{{ checkbox('whitelist_checkbox', title='Add whitelist', desc='Whitelist') }}
|
||
{{ checkbox('blacklist_checkbox', title='Add blacklist', desc='Blacklist') }}
|
||
{{ checkbox('waf', title='Web application firewall', desc='WAF', value='1') }}
|
||
{{ checkbox('antibot', title='Unfortunately, a large portion of bots are used for malicious reasons. Their intentions include web scraping, spamming, request flooding, brute forcing, and vulnerability scanning. For example, bots may scrape your price lists so that competitors can consistently undercut you or build a competitive solution using your data. Or they may try to locate forums and comment sections where they can post spam. At other times, they’re scanning your site looking for security weaknesses.',
|
||
desc='Antibot', value='1') }}
|
||
</span>
|
||
<div id="blacklist-hide" style="display: none;">
|
||
<br /><span class="tooltip tooltipTop">Enter a blacklist name, or press the "down" button:</span><br />
|
||
{{ input('blacklist-hide-input', size='39', name="blacklist", placeholder="blacklist.lst") }}
|
||
</div>
|
||
<div id="whitelist-hide" style="display: none;">
|
||
<br /><span class="tooltip tooltipTop">Enter a whitelist name, or press the "down" button::</span><br />
|
||
{{ input('whitelist-hide-input', size='39', name="whitelist", placeholder="whitelist.lst") }}
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr class="advance">
|
||
<td class="addName">Options:</td>
|
||
<td class="addOption">
|
||
<span class="controlgroup">
|
||
{{ checkbox('forward_for', title='When HAProxy Enterprise proxies a TCP connection, it overwrites the client\'s source IP address with its own when communicating with the backend server. However, when relaying HTTP messages, it can store the client\'s address in the HTTP header X-Forwarded-For. The backend server can then be configured to read the value from that header to retrieve the client\'s IP address.',
|
||
desc='Forward for') }}
|
||
{{ checkbox('redispatch', title='In HTTP mode, if a server designated by a cookie is down, clients may
|
||
definitely stick to it because they cannot flush the cookie, so they will not
|
||
be able to access the service anymore.
|
||
Specifying "option redispatch" will allow the proxy to break their
|
||
persistence and redistribute them to a working server.
|
||
It also allows to retry connections to another server in case of multiple
|
||
connection failures. Of course, it requires having "retries" set to a nonzero
|
||
value.', desc='Redispatch') }}
|
||
{% set values = dict() %}
|
||
{% set values = {'Off':'Off','Server only':'Server only','Force close':'Force close','Pretend keep alive':'Pretend keep alive'} %}
|
||
{{ select('force_close', values=values, first='Force HTTP close', title='Since HAProxy works in reverse-proxy mode, the servers see its IP address as
|
||
their client address. This is sometimes annoying when the client\'s IP address
|
||
is expected in server logs. To solve this problem, the well-known HTTP header
|
||
"X-Forwarded-For" may be added by HAProxy to all requests sent to the server.
|
||
This header contains a value representing the client\'s IP address. Since this
|
||
header is always appended at the end of the existing header list, the server
|
||
must be configured to always use the last occurrence of this header only. See
|
||
the server\'s manual to find how to enable use of this standard header. Note
|
||
that only the last occurrence of the header must be used, since it is really
|
||
possible that the client has already brought one.', class='force_close') }}
|
||
{{ checkbox('cookie', title='To send a client to the same server where they were sent previously in order to reuse a session on that server, you can enable cookie-based session persistence. Add a cookie directive to the backend section and set the cookie parameter to a unique value on each server line.',
|
||
desc='Set cookie', value='1') }}
|
||
{{ checkbox('options-listen-show', title='Set options manually', desc='Set options') }}
|
||
</span>
|
||
<br>
|
||
<span id="cookie_div" style="display: none;">
|
||
<input type="text" placeholder="name" name="cookie_name" id="cookie_name" class="form-control"><br><br>
|
||
<input type="text" placeholder="domain" name="cookie_domain" class="form-control"><br><br>
|
||
<span class="controlgroup">
|
||
{% set values = dict() %}
|
||
{% set values = {'None':'None','rewrite':'rewrite','indirect':'indirect','insert':'insert'} %}
|
||
{{ select('rewrite', values=values, first='rewrite/indirect/insert', class='force_close') }}
|
||
{{ checkbox('prefix', title='This keyword indicates that instead of relying on a dedicated cookie for the persistence, an existing one will be completed', desc='prefix', value='prefix') }}
|
||
{{ checkbox('nocache', title='This option is recommended in conjunction with the insert mode when there is a cache between the client and HAProxy', desc='nocache', value='nocache') }}
|
||
{{ checkbox('postonly', title='This option ensures that cookie insertion will only be performed on responses to POST requests', desc='postonly', value='postonly') }}
|
||
{{ checkbox('dynamic', title='Activate dynamic cookies. When used, a session cookie is dynamically created for each server', desc='dynamic', value='dynamic') }}
|
||
<span id="dynamic_div" style="display: none;">
|
||
dynamic-cookie-key: {{ input('dynamic-cookie-key', placeholder="your-custom-key") }}
|
||
</span>
|
||
</span>
|
||
</span>
|
||
<div id="options-listen-show-div" style="display: none;">
|
||
<div class="tooltip">
|
||
<span style="padding-right: 10px;">Start typing options: </span>
|
||
{{ input('options') }}
|
||
<span style="padding-left: 10px;">
|
||
or press the "down" button. <a href="http://cbonte.github.io/haproxy-dconv/1.7/configuration.html" target="_blanck" style="color: #23527c" title="HAproxy docs">Read more about options</a>
|
||
</span>
|
||
<br />
|
||
<span style="padding-right: 10px;">Start typing saved options: </span>
|
||
{{ input('saved-options') }}
|
||
These are the options that you saved in the "Options" tab
|
||
</div>
|
||
<textarea name="option" title="Options thru" id="optionsInput" cols=80 rows=5 placeholder="acl test hdr_beg(host) -i some_host"></textarea>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="addName">Servers:</td>
|
||
<td class="addOption">
|
||
{% include 'include/add_servers.html' %}
|
||
<br>
|
||
<br>
|
||
{{ checkbox('template-listen', name='template', title='Сreate the list of servers from the template', value='template', desc='Server-template') }}
|
||
</td>
|
||
</tr>
|
||
<tr class="advance">
|
||
<td class="addName">Check:</td>
|
||
<td class="addOption">
|
||
<div>
|
||
<label for="controlgroup-listen-show" style="margin-top: 5px;" title="Set custom check parameters">Custom check params</label>
|
||
<input type="checkbox" id="controlgroup-listen-show" name="default-check" value="1">
|
||
<span class="tooltip tooltipTop"> Default params: inter 2000 rise 2 fall 5</span>
|
||
</div>
|
||
<div class="controlgroup" id="controlgroup-listen" style="display: none;">
|
||
<label for="check-servers-listen" title="Ebable servers check">Check</label>
|
||
<input type="checkbox" id="check-servers-listen" name="check-servers" checked value="1">
|
||
{% set values = dict() %}
|
||
{% set values = {'1000':'1000','2000':'2000','3000':'3000'} %}
|
||
{{ select('inter-listen', values=values, first='inter', class='force_close') }}
|
||
{% set values = dict() %}
|
||
{% set values = {'1':'1','2':'2','3':'3'} %}
|
||
{{ select('rise-listen', name='rise', values=values, first='rise', class='force_close') }}
|
||
{% set values = dict() %}
|
||
{% set values = {'4':'4','5':'5','6':'6'} %}
|
||
{{ select('fall-listen', name='fall', values=values, first='fall', class='force_close') }}
|
||
</div>
|
||
<div style="display: block">
|
||
{{ checkbox('circuit_breaking_listen', name="circuit_breaking", desc='Circuit Breaking', title='Circuit breaker is a design pattern which is used to detect failures and encapsulates the logic of preventing a failure from constantly recurring. The circuit breaker design pattern works much like an electrical circuit breaker which is intended to “trip” or open the circuit when failure is detected.',
|
||
value='1') }}
|
||
</div>
|
||
<div id="circuit_breaking_listen_div" style="display: none">
|
||
Observe:
|
||
{{ select('circuit_breaking_observe', values=observe, class='force_close') }}
|
||
error-limit: {{ input('circuit_breaking_error_limit', type='number', value='50', style='width: 50px;') }}
|
||
on-error:
|
||
{{ select('circuit_breaking_on_error', values=on_error, class='force_close') }}
|
||
<div class="tooltip tooltipTop">Read more about Circuit Breaking <a href="https://roxy-wi.org/description/circuit-breaking" title="Circuit Breaking" target="_blank">here</a></div>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr class="advance-show">
|
||
<td class="addOption" colspan="2">
|
||
<button title="Show full list of settings" class="row-down advance-show-button">Show Advanced settings</button>
|
||
<button title="Hide full list of settings" class="row-up advance-hide-button" style="display: none">Hide Advanced settings</button>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="addButton">
|
||
<a class="ui-button ui-widget ui-corner-all" title="Add Listen" onclick="addProxy('add-listener')">Add Listen</a>
|
||
</td>
|
||
<td class="addButton">
|
||
<a class="ui-button ui-widget ui-corner-all" title="Generate and display config" onclick="generateConfig('add-listener')">Generate config</a>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
</form>
|
||
</div>
|
||
|
||
<!-- Second tabs -->
|
||
|
||
<div id="frontend">
|
||
<form name="add-frontend" id="add-frontend" action="/app/add.py" method="post">
|
||
<table>
|
||
<caption><h3>Add frontend</h3></caption>
|
||
<tr>
|
||
<td class="addName">Select a server: </td>
|
||
<td class="addOption">
|
||
<select required name="serv" id="serv2">
|
||
<option disabled selected>------</option>
|
||
{% for select in selects %}
|
||
<option value="{{ select.2 }}">{{ select.1 }}</option>
|
||
{% endfor %}
|
||
</select>
|
||
<div class="tooltip tooltipTop"><b>Note:</b> If you re-configure the master server, the slave server will be re-configured automatically</div>
|
||
</td>
|
||
<td rowspan="5" class="add-note addName alert-info">
|
||
A "frontend" section describes a set of listening sockets accepting client connections.
|
||
<br /><br />
|
||
All proxy names must be formed from upper and lower case letters, digits, '-' (dash), '_' (underscore) , '.' (dot) and ':' (colon). ACL names are
|
||
case-sensitive, which means that "www" and "WWW" are two different proxies.
|
||
<br /><br />
|
||
Historically, all proxy names could overlap, it just caused troubles in the logs. Since the introduction of content switching, it is mandatory that two
|
||
proxies with overlapping capabilities (frontend/backend) have different names. However, it is still permitted that a frontend and a backend share the same
|
||
name, as this configuration seems to be commonly encountered.
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="addName">Name:</td>
|
||
<td class="addOption">
|
||
<input type="text" name="frontend" id="new_frontend" required title="Name frontend" placeholder="web_80" class="form-control">
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="addName">IP and Port:</td>
|
||
<td class="addOption">
|
||
<input type="text" name="ip" id="ip1" size="15" placeholder="Any" class="form-control"><b>:</b>
|
||
<input type="text" name="port" size="5" required title="Port for bind frontend" placeholder="8080" class="form-control">
|
||
<div id="frontend_bind" style="display: none"></div>
|
||
<a class="link add-server" id="add_bind_frontend" title="Bind one more IP-port pair"></a>
|
||
<div class="tooltip tooltipTop">
|
||
If the IP-address for the listener is empty, it will listen on all IP addresses.
|
||
Start typing IP or press down button. Click on + to add multiple IP-port pairs. If you are using VRRP,
|
||
leave the IP field blank. If you assign a VRRP IP, the slave server will not start.
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr class="advance">
|
||
<td class="addName">Mode: </td>
|
||
<td class="addOption">
|
||
{% set values = dict() %}
|
||
{% set values = {'http':'http','tcp':'tcp'} %}
|
||
{{ select('frontend-mode-select', name='mode', values=values, selected='http', required='required', class='force_close') }}
|
||
<span id="https-frontend-span">
|
||
{{ checkbox('https-frontend', title='The term SSL termination means that you are performing all encryption and decryption at the edge of your network, such as at the load balancer.', desc='SSL Offloading') }}
|
||
|
||
</span>
|
||
<div id="https-hide-frontend" style="display: none;">
|
||
<br /><span class="tooltip tooltipTop">Enter a name of pem file, or press the "down" button:</span><br />
|
||
{{ input('path-cert-frontend', name="cert", placeholder="some_cert.pem", size='39') }}
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr class="advance">
|
||
<td class="addName">Maxconn: </td>
|
||
<td class="addOption">
|
||
{{ input('maxconn', value='2000', type="number", title="Fix the maximum number of concurrent connections on a frontend", size='5', required='required') }}
|
||
<div class="tooltip tooltipTop">This value should not exceed the global maxconn. Default global maxconn value: 2000</div>
|
||
</td>
|
||
</tr>
|
||
<tr class="advance">
|
||
<td class="addName" title="Access control list">ACL: </td>
|
||
<td class="addOption">
|
||
<span title="Add ACL" id="add_frontend_acl" class="link add-server"></span>
|
||
<div id="frontend_acl" style="display: none;">
|
||
<p id="frontend_acl_rule" style="border-bottom: 1px solid #ddd; padding-bottom: 10px;">
|
||
<b class="padding10">if</b>
|
||
{{ select('frontend_acl_if', name='acl_if', values=if_values, first='Choose if', class='force_close', disabled=false) }}
|
||
<b class="padding10">value</b>
|
||
{{ input('frontend_acl_value', name='acl_value') }}
|
||
<b class="padding10">then</b>
|
||
{% set values = dict() %}
|
||
{% set values = {'5':'Use backend','2':'Redirect to','3':'Allow','4':'Deny', '6': 'Return', '7': 'Set-header'} %}
|
||
{{ select('frontend_acl_then', name='acl_then', values=values, first='Choose action', class='force_close', disabled=false) }}
|
||
<b class="padding10">value</b>
|
||
{{ input('frontend_acl_then_value', name='acl_then_value', title="Required if \'then\' is \'Use backend\' or \'Redirect\', \'Return\', or \'Set-header\'") }}
|
||
<span class="minus minus-style" onclick="deleteId('frontend_acl_rule')" title="Delete this rule"></span>
|
||
</p>
|
||
</div>
|
||
<span>
|
||
<a class="link add-server" id="frontend_add_acl" title="Add ACL" style="cursor: pointer; display: none;"></a>
|
||
</span>
|
||
</td>
|
||
</tr>
|
||
<tr class="advance">
|
||
<td class="addName"><span title="Cache support start 1.8 and latter" class="help_cursor">Web acceleration:</span></td>
|
||
<td class="addOption">
|
||
<span class="controlgroup">
|
||
{{ checkbox('compression2', name="compression", title='HTTP compression allows you to shrink the body of a response before it is relayed to a client, which results in using less network bandwidth per request. From a client\'s perspective, this reduces latency.',
|
||
value='1', desc='Compression') }}
|
||
{{ checkbox('cache2', name="cache", title='Enable cache', value='2', desc='Cache') }}
|
||
{{ checkbox('ssl_offloading1', title='Enable redirection from HTTP scheme to HTTPS scheme', desc='HTTP->HTTPS') }}
|
||
</span>
|
||
</td>
|
||
</tr>
|
||
<tr class="advance">
|
||
<td class="addName"><span title="Web application firewall" class="help_cursor">WAF:</span></td>
|
||
<td class="addOption">
|
||
<span class="controlgroup">
|
||
{{ checkbox('slow_atack1', title='In a Slow POST attack, an attacker begins by sending a legitimate HTTP POST header to a Web server, exactly as they would under normal circumstances. The header specifies the exact size of the message body that will then follow. However, that message body is then sent at an alarmingly low rate – sometimes as slow as 1 byte per approximately two minutes.',
|
||
desc='Slow attack') }}
|
||
{{ checkbox('ddos1', title='DDOS attack protect', desc='DDOS') }}
|
||
{{ checkbox('whitelist_checkbox1', title='Add whitelist', desc='Whitelist') }}
|
||
{{ checkbox('blacklist_checkbox1', title='Add blacklist', desc='Blacklist') }}
|
||
{{ checkbox('waf2', name='waf', title='Web application firewall', desc='WAF', value='1') }}
|
||
{{ checkbox('antibot1', title='Unfortunately, a large portion of bots are used for malicious reasons. Their intentions include web scraping, spamming, request flooding, brute forcing, and vulnerability scanning. For example, bots may scrape your price lists so that competitors can consistently undercut you or build a competitive solution using your data. Or they may try to locate forums and comment sections where they can post spam. At other times, they’re scanning your site looking for security weaknesses.',
|
||
desc='Antibot', value='1') }}
|
||
</span>
|
||
<div id="blacklist-hide1" style="display: none;">
|
||
<br /><span class="tooltip tooltipTop">Enter a blacklist name, or press the "down" button::</span><br />
|
||
{{ input('blacklist-hide-input1', size='39', name="blacklist", placeholder="blacklist.lst") }}
|
||
</div>
|
||
<div id="whitelist-hide1" style="display: none;">
|
||
<br /><span class="tooltip tooltipTop">Enter a whitelist name, or press the "down" button::</span><br />
|
||
{{ input('whitelist-hide-input1', size='39', name="whitelist", placeholder="whitelist.lst") }}
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr class="advance">
|
||
<td class="addName">Options:</td>
|
||
<td class="addOption">
|
||
<span class="controlgroup">
|
||
{{ checkbox('forward_for1', title='When HAProxy Enterprise proxies a TCP connection, it overwrites the client\'s source IP address with its own when communicating with the backend server. However, when relaying HTTP messages, it can store the client\'s address in the HTTP header X-Forwarded-For. The backend server can then be configured to read the value from that header to retrieve the client\'s IP address.',
|
||
desc='Forward for') }}
|
||
{% set values = dict() %}
|
||
{% set values = {'Off':'Off','Server only':'Server only','Force close':'Force close','Pretend keep alive':'Pretend keep alive'} %}
|
||
{{ select('force_close', values=values, first='Force HTTP close', title='Since HAProxy works in reverse-proxy mode, the servers see its IP address as
|
||
their client address. This is sometimes annoying when the client\'s IP address
|
||
is expected in server logs. To solve this problem, the well-known HTTP header
|
||
"X-Forwarded-For" may be added by HAProxy to all requests sent to the server.
|
||
This header contains a value representing the client\'s IP address. Since this
|
||
header is always appended at the end of the existing header list, the server
|
||
must be configured to always use the last occurrence of this header only. See
|
||
the server\'s manual to find how to enable use of this standard header. Note
|
||
that only the last occurrence of the header must be used, since it is really
|
||
possible that the client has already brought one.', class='force_close') }}
|
||
{{ checkbox('options-frontend-show', title='Set options manually', desc='Set options') }}
|
||
</span>
|
||
<div id="options-frontend-show-div" style="display: none;">
|
||
<div style="font-size: 12px; padding-bottom: 10px;">
|
||
<span style="padding-right: 10px;">Start typing options: </span>
|
||
{{ input('options1') }}
|
||
<span style="padding-left: 10px;">
|
||
or press the "down" button:. <a href="http://cbonte.github.io/haproxy-dconv/1.7/configuration.html" target="_blanck" style="color: #23527c" title="HAproxy docs">Read more about options</a>
|
||
</span>
|
||
<br />
|
||
<span style="padding-right: 10px;">Start typing saved options: </span>
|
||
{{ input('saved-options1') }}
|
||
These are the options that you saved in the "Options" tab
|
||
</div>
|
||
<textarea name="option" title="Options thru" cols=80 rows=5 id="optionsInput1" placeholder="acl test hdr_beg(host) -i some_host"></textarea>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="addName">Default backend</td>
|
||
<td class="addOption">
|
||
{{ input('backends', name='backends', placeholder="some_backend", size='30', title='If no condition is valid, the backend defined with "default_backend" will be used. If no default backend is defined, either the servers in the same section are used (in case of a "listen" section) or, in case of a frontend, no server is used and a 503 service unavailable response is returned.') }}
|
||
<div class="tooltip tooltipTop">
|
||
<b>Note</b>. If you want to use the default backend, <span title="Create backend" class="redirectBackend link">backend must exist</span>.
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr class="advance-show">
|
||
<td class="addOption" colspan="2">
|
||
<button title="Show full list of settings" class="row-down advance-show-button">Show Advanced settings</button>
|
||
<button title="Hide full list of settings" class="row-up advance-hide-button" style="display: none">Hide Advanced settings</button>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="addButton">
|
||
<a class="ui-button ui-widget ui-corner-all" title="Add Frontend" onclick="addProxy('add-frontend')">Add Frontend</a>
|
||
</td>
|
||
<td class="addButton">
|
||
<a class="ui-button ui-widget ui-corner-all" title="Generate and display config" onclick="generateConfig('add-frontend')">Generate config</a>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
</form>
|
||
</div>
|
||
|
||
<!-- Third tabs -->
|
||
|
||
<div id="backend">
|
||
<form name="add-backend" id="add-backend" action="/app/add.py" method="post">
|
||
<table>
|
||
<caption><h3>Add backend</h3></caption>
|
||
<tr>
|
||
<td class="addName">Select a server: </td>
|
||
<td class="addOption">
|
||
<select required name="serv" id="serv3">
|
||
<option disabled selected>------</option>
|
||
{% for select in selects %}
|
||
<option value="{{ select.2 }}">{{ select.1 }}</option>
|
||
{% endfor %}
|
||
</select>
|
||
<div class="tooltip tooltipTop"><b>Note:</b> If you re-configure the master server, the slave server will be re-configured automatically</div>
|
||
</td>
|
||
<td rowspan="4" class="add-note addName alert-info">
|
||
A "backend" section describes a set of servers to which the proxy will connect to forward incoming connections.
|
||
<br /><br />
|
||
All proxy names must be formed from upper and lower case letters, digits, '-' (dash), '_' (underscore) , '.' (dot) and ':' (colon). ACL names are
|
||
case-sensitive, which means that "www" and "WWW" are two different proxies.
|
||
<br /><br />
|
||
Historically, all proxy names could overlap, it just caused troubles in the logs. Since the introduction of content switching, it is mandatory that two
|
||
proxies with overlapping capabilities (frontend/backend) have different names. However, it is still permitted that a frontend and a backend share the same
|
||
name, as this configuration seems to be commonly encountered.
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="addName">Name:</td>
|
||
<td class="addOption">
|
||
{{ input('new_backend', title="Name backend", placeholder="web_80", required='required') }}
|
||
</td>
|
||
</tr>
|
||
<tr class="advance">
|
||
<td class="addName">Mode: </td>
|
||
<td class="addOption">
|
||
{% set values = dict() %}
|
||
{% set values = {'http':'http','tcp':'tcp'} %}
|
||
{{ select('backend-mode-select', name='mode', values=values, selected='http', required='required', class='force_close') }}
|
||
<span id="https-backend-span">
|
||
<label for="https-backend" style="margin-top: 5px;">Is SSL enabled on frontend?</label>
|
||
<input type="checkbox" id="https-backend" name="ssl" value="https">
|
||
</span>
|
||
<div id="https-hide-backend" style="display: none;">
|
||
<label for="ssl-dis-check-backend" style="margin-top: 5px;">Disable SSL check</label><input type="checkbox" id="ssl-dis-check-backend" name="ssl-dis-check" value="ssl-dis-check">
|
||
<label for="ssl-check-backend" style="margin-top: 5px;">Disable SSL verify on servers</label><input type="checkbox" id="ssl-check-backend" name="ssl-check" value="ssl-check" checked>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr class="advance">
|
||
<td class="addName">Balance: </td>
|
||
<td class="addOption">
|
||
{{ select('balance', values=balance_params, selected='roundrobin', required='required', class='force_close') }}
|
||
</td>
|
||
</tr>
|
||
<tr class="advance">
|
||
<td class="addName">Health check: </td>
|
||
<td class="addOption">
|
||
{{ select('backend_checks', name='health_check', values=checks, selected='', class='force_close') }}
|
||
<span id="backend_checks_note" class="tooltip tooltipTop"></span>
|
||
<br />
|
||
<span id="backend_checks_http" style="display: none;">
|
||
URI path for checking: {{ input('backend_checks_http_path', name='checks_http_path', value='/', title="URI for checking e.g. /check") }}
|
||
Domain name: {{ input('backend_checks_http_domain', name='checks_http_domain', placeholder='domain.com', title="Domain name for checking e.g. domain.com") }}
|
||
</span>
|
||
</td>
|
||
</tr>
|
||
<tr class="advance">
|
||
<td class="addName" title="Access control list">ACL: </td>
|
||
<td class="addOption">
|
||
<span title="Add ACL" id="add_backend_acl" class="link add-server"></span>
|
||
<div id="backend_acl" style="display: none;">
|
||
<p id="backend_acl_rule" style="border-bottom: 1px solid #ddd; padding-bottom: 10px;">
|
||
<b class="padding10">if</b>
|
||
{{ select('backend_acl_if', name='acl_if', values=if_values, first='Choose if', class='force_close', disabled=false) }}
|
||
<b class="padding10">value</b>
|
||
{{ input('backend_acl_value', name="acl_value") }}
|
||
<b class="padding10">then</b>
|
||
{% set values = dict() %}
|
||
{% set values = {'2':'Redirect to','3':'Allow','4':'Deny', '6': 'Return', '7': 'Set-header'} %}
|
||
{{ select('backend_acl_then', name='acl_then', values=values, first='Choose action', class='force_close', disabled=false) }}
|
||
<b class="padding10">value</b>
|
||
{{ input('backend_acl_then_value', name='acl_then_value', title="Required if \'then\' is \'Use backend\', \'Redirect\', \'Return\', or \'Set-header\'") }}
|
||
<span class="minus minus-style" onclick="deleteId('backend_acl_rule')" title="Delete this rule"></span>
|
||
</p>
|
||
</div>
|
||
<span>
|
||
<a class="link add-server" id="backend_add_acl" title="Add ACL" style="cursor: pointer; display: none;"></a>
|
||
</span>
|
||
</td>
|
||
</tr>
|
||
<tr class="advance">
|
||
<td class="addName"><span title="Cache support start 1.8 and latter" class="help_cursor">Web acceleration:</span></td>
|
||
<td class="addOption">
|
||
<span class="controlgroup">
|
||
{{ checkbox('compression3', name="compression", title='HTTP compression allows you to shrink the body of a response before it is relayed to a client, which results in using less network bandwidth per request. From a client\'s perspective, this reduces latency.',
|
||
value='1', desc='Compression') }}
|
||
{{ checkbox('cache3', name="cache", title='Enable cache', value='2', desc='Cache') }}
|
||
{{ checkbox('ssl_offloading2', title='The term SSL termination means that you are performing all encryption and decryption at the edge of your network, such as at the load balancer.', desc='SSL Offloading') }}
|
||
</span>
|
||
</td>
|
||
</tr>
|
||
<tr class="advance">
|
||
<td class="addName">Options:</td>
|
||
<td class="addOption">
|
||
<span class="controlgroup">
|
||
{{ checkbox('forward_for2', title='When HAProxy Enterprise proxies a TCP connection, it overwrites the client\'s source IP address with its own when communicating with the backend server. However, when relaying HTTP messages, it can store the client\'s address in the HTTP header X-Forwarded-For. The backend server can then be configured to read the value from that header to retrieve the client\'s IP address.',
|
||
desc='Forward for') }}
|
||
{{ checkbox('redispatch2', title='In HTTP mode, if a server designated by a cookie is down, clients may
|
||
definitely stick to it because they cannot flush the cookie, so they will not
|
||
be able to access the service anymore.
|
||
Specifying "option redispatch" will allow the proxy to break their
|
||
persistence and redistribute them to a working server.
|
||
It also allows to retry connections to another server in case of multiple
|
||
connection failures. Of course, it requires having "retries" set to a nonzero
|
||
value.', desc='Redispatch') }}
|
||
{% set values = dict() %}
|
||
{% set values = {'Off':'Off','Server only':'Server only','Force close':'Force close','Pretend keep alive':'Pretend keep alive'} %}
|
||
{{ select('force_close', values=values, first='Force HTTP close', title='123', class='force_close') }}
|
||
{{ checkbox('cookie2', title='To send a client to the same server where they were sent previously in order to reuse a session on that server, you can enable cookie-based session persistence. Add a cookie directive to the backend section and set the cookie parameter to a unique value on each server line.',
|
||
desc='Set cookie', value='1') }}
|
||
{{ checkbox('options-backend-show', title='Set options manually', desc='Set options') }}
|
||
</span>
|
||
<br>
|
||
<span id="cookie_div2" style="display: none;">
|
||
<input type="text" placeholder="name" name="cookie_name" id="cookie_name2" class="form-control"><br><br>
|
||
<input type="text" placeholder="domain" name="cookie_domain" class="form-control"><br><br>
|
||
<span class="controlgroup">
|
||
{% set values = dict() %}
|
||
{% set values = {'None':'None','rewrite':'rewrite','indirect':'indirect','insert':'insert'} %}
|
||
{{ select('rewrite2', values=values, first='rewrite/indirect/insert', class='force_close') }}
|
||
{{ checkbox('prefix2', name='prefix', title='This keyword indicates that instead of relying on a dedicated cookie for the persistence, an existing one will be completed', desc='prefix', value='prefix') }}
|
||
{{ checkbox('nocache2', name='nocache', title='This option is recommended in conjunction with the insert mode when there is a cache between the client and HAProxy', desc='nocache', value='nocache') }}
|
||
{{ checkbox('postonly2', name='postonly', title='This option ensures that cookie insertion will only be performed on responses to POST requests', desc='postonly', value='postonly') }}
|
||
{{ checkbox('dynamic2', name='dynamic', title='Activate dynamic cookies. When used, a session cookie is dynamically created for each server', desc='dynamic', value='dynamic') }}
|
||
<span id="dynamic_div2" style="display: none;">
|
||
dynamic-cookie-key: {{ input('dynamic-cookie-key2', name='dynamic-cookie-key', placeholder="your-custom-key") }}
|
||
</span>
|
||
</span>
|
||
</span>
|
||
<div id="options-backend-show-div" style="display: none;">
|
||
<div style="font-size: 12px; padding-bottom: 10px;">
|
||
<span style="padding-right: 10px;">Start typing options: </span>
|
||
{{ input('options2') }}
|
||
<span style="padding-left: 10px;">
|
||
or press the "down" button. <a href="http://cbonte.github.io/haproxy-dconv/1.7/configuration.html" target="_blanck" style="color: #23527c" title="HAproxy docs">Read more about options</a>
|
||
</span>
|
||
<br />
|
||
<span style="padding-right: 10px;">Start typing saved options: </span>
|
||
<input type="text" id="saved-options2" class="form-control">
|
||
These are the options that you saved in the "Options" tab
|
||
</div>
|
||
<textarea name="option" title="Options thru" cols=80 rows=5 id="optionsInput2" placeholder="acl test hdr_beg(host) -i some_host"></textarea>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="addName">Servers:</td>
|
||
<td class="addOption">
|
||
{% include 'include/add_servers.html' %}
|
||
<br>
|
||
<br>
|
||
{{ checkbox('template-backend', name='template', title='Create the list of servers from the template', value='template', desc='Server-template') }}
|
||
</td>
|
||
</tr>
|
||
<tr class="advance">
|
||
<td class="addName">Check:</td>
|
||
<td class="addOption">
|
||
<div>
|
||
<label for="controlgroup-backend-show" style="margin-top: 5px;" title="Set custom check parameters">Custom check params</label>
|
||
<input type="checkbox" id="controlgroup-backend-show" name="default-check">
|
||
<span class="tooltip tooltipTop"> Default params: inter 2000 rise 2 fall 5</span>
|
||
</div>
|
||
<div class="controlgroup" id="controlgroup-backend" style="display: none;">
|
||
<label for="check-servers-backend" title="Ebable servers check">Check</label>
|
||
<input type="checkbox" id="check-servers-backend" name="check-servers" checked value="1">
|
||
{% set values = dict() %}
|
||
{% set values = {'1000':'1000','2000':'2000','3000':'3000'} %}
|
||
{{ select('inter-backend', values=values, first='inter', class='force_close') }}
|
||
{% set values = dict() %}
|
||
{% set values = {'1':'1','2':'2','3':'3'} %}
|
||
{{ select('rise-backend', name='rise', values=values, first='rise', class='force_close') }}
|
||
{% set values = dict() %}
|
||
{% set values = {'4':'4','5':'5','6':'6'} %}
|
||
{{ select('fall-backend', name='fall', values=values, first='fall', class='force_close') }}
|
||
</div>
|
||
<div style="display: block">
|
||
{{ checkbox('circuit_breaking_backend', name="circuit_breaking", desc='Circuit Breaking', title='Circuit breaker is a design pattern which is used to detect failures and encapsulates the logic of preventing a failure from constantly recurring. The circuit breaker design pattern works much like an electrical circuit breaker which is intended to “trip” or open the circuit when failure is detected.',
|
||
value='1') }}
|
||
</div>
|
||
<div id="circuit_breaking_backend_div" style="display: none">
|
||
Observe:
|
||
{{ select('circuit_breaking_observe', values=observe, class='force_close') }}
|
||
error-limit: {{ input('circuit_breaking_error_limit', type='number', value='50', style='width: 50px;') }}
|
||
on-error:
|
||
{{ select('circuit_breaking_on_error', values=on_error, class='force_close') }}
|
||
<div class="tooltip tooltipTop">Read more about Circuit Breaking <a href="https://roxy-wi.org/description/circuit-breaking" title="Circuit Breaking" target="_blank">here</a></div>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
<tr class="advance-show">
|
||
<td class="addOption" colspan="2">
|
||
<button title="Show full list of settings" class="row-down advance-show-button">Show Advanced settings</button>
|
||
<button title="Hide full list of settings" class="row-up advance-hide-button" style="display: none">Hide Advanced settings</button>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="addButton">
|
||
<a class="ui-button ui-widget ui-corner-all" title="Add Backend" onclick="addProxy('add-backend')">Add Backend</a>
|
||
</td>
|
||
<td class="addButton">
|
||
<a class="ui-button ui-widget ui-corner-all" title="Generate and display config" onclick="generateConfig('add-backend')">Generate config</a>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
</form>
|
||
</div>
|
||
|
||
<div id="ssl">
|
||
<table>
|
||
<caption><h3>SSL</h3></caption>
|
||
<tr class="overviewHead">
|
||
<td class="padding10 first-collumn" style="width: 30%;">View certificates</td>
|
||
<td>
|
||
Uploaded certificates
|
||
</td>
|
||
<td></td>
|
||
</tr>
|
||
<tr>
|
||
<td class="padding10 first-collumn">
|
||
<select required name="serv" id="serv5">
|
||
<option disabled selected>------</option>
|
||
{% for select in selects %}
|
||
<option value="{{ select.2 }}">{{ select.1 }}</option>
|
||
{% endfor %}
|
||
</select>
|
||
<button id="ssl_key_view" title="View certificates">View</button>
|
||
</td>
|
||
<td colspan="2" style="padding: 10px 0 10px 0;">
|
||
<span id="ajax-show-ssl"></span>
|
||
</td>
|
||
</tr>
|
||
<tr class="overviewHead">
|
||
<td class="padding10 first-collumn" style="width: 30%;">Upload SSL certificates</td>
|
||
<td>
|
||
Certificate name
|
||
</td>
|
||
<td>
|
||
<span title="This pem file will be used to create https connection with haproxy" class="help_cursor">Paste the contents of the certificate file</span>
|
||
</td>
|
||
</tr>
|
||
<tr style="width: 50%;">
|
||
<td class="first-collumn" valign="top" style="padding-top: 15px;">
|
||
<select required id="serv4">
|
||
<option disabled selected>------</option>
|
||
{% for select in selects %}
|
||
<option value="{{ select.2 }}">{{ select.1 }}</option>
|
||
{% endfor %}
|
||
</select>
|
||
</td>
|
||
<td valign="top" style="padding-top: 27px;">
|
||
{{ input('ssl_name') }}
|
||
</td>
|
||
<td style="padding-top: 15px; padding-bottom: 15px;">
|
||
<textarea id="ssl_cert" cols="50" rows="5"></textarea><br /><br />
|
||
<button id="ssl_key_upload" title="Upload ssl certificates">Upload</button>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
<table>
|
||
<caption><h3>Let's Encrypt</h3></caption>
|
||
<tr class="overviewHead">
|
||
<td class="padding10 first-collumn">Server</td>
|
||
<td>Domain name</td>
|
||
<td>E-mail</td>
|
||
<td></td>
|
||
</tr>
|
||
<tr>
|
||
<td class="padding10 first-collumn">
|
||
<select required id="serv_for_lets">
|
||
<option disabled selected>------</option>
|
||
{% for select in selects %}
|
||
<option value="{{ select.2 }}">{{ select.1 }}</option>
|
||
{% endfor %}
|
||
</select>
|
||
</td>
|
||
<td>
|
||
{{ input('lets_domain', placeholder="example.com") }}
|
||
</td>
|
||
<td>
|
||
{{ input('lets_email') }}
|
||
</td>
|
||
<td>
|
||
<button id="lets_button">Get a certificate</button>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
<div id="ajax-ssl"></div>
|
||
</div>
|
||
<div id="option">
|
||
<table class="overview" id="option_table">
|
||
<tr class="overviewHead">
|
||
<td class="padding10 first-collumn">Id</td>
|
||
<td class="padding10 first-collumn">Options</td>
|
||
<td></td>
|
||
</tr>
|
||
{% for option in options %}
|
||
<tr id="option-{{ option.0 }}" class="{{ loop.cycle('odd', 'even') }}">
|
||
{% if option.groups == group or group == '1' %}
|
||
<td class="padding10 first-collumn">
|
||
{{ option.id }}
|
||
</td>
|
||
<td class="padding10 first-collumn" style="width: 77%;">
|
||
<input type="text" id="option-body-{{ option.id }}" value="{{ option.options }}" size="60" class="form-control">
|
||
</td>
|
||
<td>
|
||
<a class="delete" onclick="confirmDeleteOption({{ option.id }})" title="Delete option {{option.options}}" style="cursor: pointer;"></a>
|
||
</td>
|
||
{% endif %}
|
||
</tr>
|
||
{% endfor %}
|
||
</table>
|
||
<br /><span class="add-button" title="Add option" id="add-option-button">+ Add</span>
|
||
<br /><br />
|
||
<table class="overview" id="option-add-table" style="display: none;">
|
||
<tr class="overviewHead">
|
||
<td class="padding10 first-collumn"> </td>
|
||
<td>Option</td>
|
||
<td></td>
|
||
</tr>
|
||
<tr>
|
||
<td class="padding10 first-collumn">
|
||
Enter an option:
|
||
</td>
|
||
<td style="width: 77%;">
|
||
{{ input('new-option', size='60') }}
|
||
</td>
|
||
<td>
|
||
<span class="add-admin" id="add-option-new" title="Add new option" style="cursor: pointer;"></span>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
<div id="ajax-option"></div>
|
||
<div class="add-note alert addName alert-info" style="width: inherit; margin-right: 15px;">
|
||
In this section you can create, edit and delete options with given parameters. And after use them as autocomplete in the "Add" sections
|
||
</div>
|
||
<div class="add-note alert addName alert-info" style="width: inherit; margin-right: 15px;">
|
||
How to use predefined option you can see in
|
||
<a href="https://roxy-wi.org/description.py?description=saved" title="How to use pre saved options" target="_blank">
|
||
<b>this video</b>
|
||
</a>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="add-servers">
|
||
<table class="overview" id="servers_table">
|
||
<tr class="overviewHead">
|
||
<td class="padding10 first-collumn">Server</td>
|
||
<td class="padding10 first-collumn">Description</td>
|
||
<td></td>
|
||
</tr>
|
||
{% for s in saved_servers %}
|
||
<tr id="servers-saved-{{ s.id }}" class="{{ loop.cycle('odd', 'even') }}">
|
||
{% if s.groups == group or group == '1' %}
|
||
<td class="padding10 first-collumn">
|
||
<input type="text" id="servers-ip-{{ s.id }}" value="{{ s.server }}" size="15" class="form-control">
|
||
</td>
|
||
<td class="padding10 first-collumn" style="width: 77%;">
|
||
<input type="text" id="servers-desc-{{ s.id }}" value="{{ s.description }}" size="50" class="form-control">
|
||
</td>
|
||
<td>
|
||
<a class="delete" onclick="confirmDeleteSavedServer({{ s.id }})" title="Delete server {{s.server}}" style="cursor: pointer;"></a>
|
||
</td>
|
||
{% endif %}
|
||
</tr>
|
||
{% endfor %}
|
||
</table>
|
||
<br /><span class="add-button" title="Add server" id="add-saved-server-button">+ Add</span>
|
||
<br /><br />
|
||
<table class="overview" id="saved-server-add-table" style="display: none;">
|
||
<tr class="overviewHead">
|
||
<td class="padding10 first-collumn">Server</td>
|
||
<td>Description</td>
|
||
<td></td>
|
||
</tr>
|
||
<tr>
|
||
<td class="padding10 first-collumn">
|
||
{{ input('new-saved-servers', size='15') }}
|
||
</td>
|
||
<td style="width: 77%;">
|
||
{{ input('new-saved-servers-description', size='50') }}
|
||
</td>
|
||
<td>
|
||
<span class="add-admin" id="add-saved-server-new" title="Add new server" style="cursor: pointer;"></span>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
<div id="ajax-servers"></div>
|
||
<div class="add-note alert addName alert-info" style="width: inherit; margin-right: 15px;">
|
||
In this section you can create, edit and delete servers. And after use them as autocomplete in the "Add" sections
|
||
</div>
|
||
<div class="add-note alert addName alert-info" style="width: inherit; margin-right: 15px;">
|
||
How to use predefined servers you can see in
|
||
<a href="https://roxy-wi.org/description.py?description=saved" title="How to use predefined servers" target="_blank">
|
||
<b>this video</b>
|
||
</a>
|
||
</div>
|
||
</div>
|
||
<div id="userlist">
|
||
<form name="add-userlist" id="add-userlist" action="/app/add.py" method="post">
|
||
<table>
|
||
<caption><h3>Add Userlist</h3></caption>
|
||
<tr>
|
||
<td class="addName">Select a server: </td>
|
||
<td class="addOption">
|
||
<select required name="serv" id="userlist_serv">
|
||
<option disabled selected>------</option>
|
||
{% for select in selects %}
|
||
<option value="{{ select.2 }}">{{ select.1 }}</option>
|
||
{% endfor %}
|
||
</select>
|
||
<div class="tooltip tooltipTop"><b>Note:</b> If you reconfigure Master server, Slave will be re-configured automatically</div>
|
||
</td>
|
||
<td rowspan="4" class="add-note addName alert-info">
|
||
It is possible to control access to frontend/backend/listen sections or to
|
||
http stats by allowing only authenticated and authorized users. To do this,
|
||
it is required to create at least one userlist and to define users.
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="addName">Userlist name:</td>
|
||
<td class="addOption">
|
||
{{ input('new_userlist', required='required', title="Userlist name", placeholder="basic-auth-list") }}
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="addName">Groups:</td>
|
||
<td class="addOption">
|
||
<span id="userlist-groups">
|
||
{{ input('userlist-group', title="User`s group", placeholder="group_name") }}
|
||
</span>
|
||
<span>
|
||
<span class="add-server" id="add-userlist-group" title="Add extra group" style="cursor: pointer;"></span>
|
||
</span>
|
||
<div class="tooltip tooltipTop">It is also possible to attach users to this group by using a comma separated list of names preceded by "users" keyword.</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="addName">User:</td>
|
||
<td class="addOption">
|
||
<span id="userlist-users">
|
||
{{ input('userlist-user', required='required', title="Username", placeholder="user_name") }}
|
||
{{ input('userlist-password', required='required', title="User password. By default, it insecure-password", placeholder="password") }}
|
||
{{ input('userlist-user-group', title="User`s group", placeholder="user`s group") }}
|
||
</span>
|
||
<span>
|
||
<span class="add-server" id="add-userlist-user" title="Add extra user" style="cursor: pointer;"></span>
|
||
</span>
|
||
<div class="tooltip tooltipTop">It is also possible to attach groups to this user by using a comma separated list of groups.</div>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="addButton">
|
||
<a class="ui-button ui-widget ui-corner-all" title="Add Userlist" onclick="addProxy('add-userlist')">Add Userlist</a>
|
||
</td>
|
||
<td class="addButton">
|
||
<a class="ui-button ui-widget ui-corner-all" title="Generate and display config" onclick="generateConfig('add-userlist')">Generate config</a>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
</form>
|
||
<br />
|
||
<table>
|
||
<caption><h3>Existing UserList</h3></caption>
|
||
<tr>
|
||
<td class="addName">Select a server: </td>
|
||
<td class="addOption">
|
||
<select required name="serv" id="existing_userlist_serv">
|
||
<option disabled selected>------</option>
|
||
{% for select in selects %}
|
||
<option value="{{ select.2 }}">{{ select.1 }}</option>
|
||
{% endfor %}
|
||
</select>
|
||
<div class="tooltip tooltipTop"><b>Note:</b> If you reconfigure Master server, Slave will be re-configured automatically</div>
|
||
</td>
|
||
<td>
|
||
<a class="ui-button ui-widget ui-corner-all" title="Add Userlist" onclick="showUserlists()">Show Userlist</a>
|
||
</td>
|
||
</tr>
|
||
<tr id="existing_userlist_tr" style="display: none;">
|
||
<td class="addName">Existing Userlist:</td>
|
||
<td class="addOption" id="existing_userlist_ajax"></td>
|
||
</tr>
|
||
</table>
|
||
<div class="add-note addName alert-info" style="width: inherit; margin-right: 15px;">
|
||
In this section you can create userlists. And after use them in the "Add" sections
|
||
</div>
|
||
<div class="add-note alert addName alert-info" style="width: inherit; margin-right: 15px;">
|
||
Read
|
||
<a href="https://roxy-wi.org/description.py?description=userlist" title="How to use userlists" target="_blank">
|
||
<b>here</b>
|
||
</a>
|
||
How to use userlists
|
||
</div>
|
||
</div>
|
||
<div id="peers">
|
||
<form name="add-peers" id="add-peers" action="/app/add.py" method="post">
|
||
<table>
|
||
<caption><h3>Add Peer</h3></caption>
|
||
<tr>
|
||
<td class="addName">Select server: </td>
|
||
<td class="addOption">
|
||
<select required name="serv" id="peers_serv">
|
||
<option disabled selected>------</option>
|
||
{% for select in selects %}
|
||
<option value="{{ select.2 }}">{{ select.1 }}</option>
|
||
{% endfor %}
|
||
</select>
|
||
<div class="tooltip tooltipTop"><b>Note:</b> If you re-configure Master server, Slave will be re-configured automatically</div>
|
||
</td>
|
||
<td rowspan="4" class="add-note addName alert-info">
|
||
The peers section enables the replication of stick table data between two or more HAProxy instances.
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="addName">Peers name:</td>
|
||
<td class="addOption">
|
||
{{ input('peers-name', title="Peers name", placeholder="peers name") }}
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="addName">Peers servers:</td>
|
||
<td class="addOption">
|
||
<span name="add_peers">
|
||
<input name="servers_name" required title="Peer name" size=14 placeholder="haproxy1" class="form-control">:
|
||
<input name="servers" required title="Peer IP" size=14 placeholder="xxx.xxx.xxx.xxx" class="form-control">:
|
||
<input name="server_port" required title="Peer port" size=3 placeholder="yyy" class="form-control add_server_number" type="number">
|
||
<br />
|
||
<input name="servers_name" required title="Peer name" size=14 placeholder="haproxy2" class="form-control">:
|
||
<input name="servers" title="Peer IP" size=14 placeholder="xxx.xxx.xxx.xxx" class="form-control second-server"><span class="second-server">:</span>
|
||
<input name="server_port" title="Peer port" size=3 placeholder="yyy" class="form-control second-server add_server_number" type="number">
|
||
</span>
|
||
<span>
|
||
<a class="link add-server backend_server" name="add-peer-input" title="Add peer server" style="cursor: pointer;"></a>
|
||
</span>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td class="addButton">
|
||
<a class="ui-button ui-widget ui-corner-all" title="Add Userlist" onclick="addProxy('add-peers')">Add Peer</a>
|
||
</td>
|
||
<td class="addButton">
|
||
<a class="ui-button ui-widget ui-corner-all" title="Generate and display config" onclick="generateConfig('add-peers')">Generate config</a>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
</form>
|
||
<div class="alert addName alert-info" style="width: inherit; margin-right: 15px;">
|
||
Note: If you would like to use HAProxy services as Master-Master cluster you must set local servers
|
||
hostnames as peers servers names. Otherwise, peers will not work
|
||
</div>
|
||
<div class="alert addName alert-info" style="width: inherit; margin-right: 15px;">
|
||
Note: If you would like to use HAProxy services as Master-Slave cluster you must set local server
|
||
hostname for master server as peer server name. Otherwise, peers will not work
|
||
</div>
|
||
<div class="add-note alert addName alert-info" style="width: inherit; margin-right: 15px;">
|
||
Read
|
||
<a href="https://roxy-wi.org/howto.py?howto=peers" title="How to use peers" target="_blank">
|
||
<b>here</b>
|
||
</a>
|
||
How to use peers
|
||
</div>
|
||
</div>
|
||
<div id="lists">
|
||
<table class="overview">
|
||
<tr class="overviewHead">
|
||
<th class="padding10 first-collumn">New blacklist</th>
|
||
<th>Server for uploading</th>
|
||
<th>Existing blacklists</th>
|
||
</tr>
|
||
<tr>
|
||
<td class="padding10 first-collumn" style="width: 25%;">
|
||
Name: {{ input('new_blacklist_name') }}
|
||
<button onclick="createList('black')">Create</button>
|
||
</td>
|
||
<td class="padding10 first-collumn">
|
||
<select required name="serv-black-list" id="serv-black-list">
|
||
<option disabled selected>------</option>
|
||
<option value="all">ALL</option>
|
||
{% for select in selects %}
|
||
<option value="{{ select.2 }}">{{ select.1 }}</option>
|
||
{% endfor %}
|
||
</select>
|
||
</td>
|
||
<td style="width: 30%; padding: 10px 0 10px 0;">
|
||
{% for list in black_lists %}
|
||
<span class="list_of_lists">
|
||
<a onclick="editList('{{ list }}', 'black')" title="Edit the {{ list }} list">{{ list }}</a>
|
||
</span>
|
||
{% endfor %}
|
||
</td>
|
||
|
||
</tr>
|
||
{{ input('group', value=group, type='hidden') }}
|
||
</table>
|
||
<table>
|
||
<tr class="overviewHead">
|
||
<th class="padding10 first-collumn">New whitelist</th>
|
||
<th>Server for uploading</th>
|
||
<th>Existing whitelists</th>
|
||
</tr>
|
||
<tr>
|
||
<td class="padding10 first-collumn" style="width: 25%;">
|
||
Name: {{ input('new_whitelist_name') }}
|
||
<button onclick="createList('white')">Create</button>
|
||
</td>
|
||
<td class="padding10 first-collumn">
|
||
<select required name="serv-white-list" id="serv-white-list">
|
||
<option disabled selected>------</option>
|
||
<option value="all">ALL</option>
|
||
{% for select in selects %}
|
||
<option value="{{ select.2 }}">{{ select.1 }}</option>
|
||
{% endfor %}
|
||
</select>
|
||
</td>
|
||
<td style="width: 30%; padding: 10px 0 10px 0;">
|
||
{% for list in white_lists %}
|
||
<span class="list_of_lists">
|
||
<a onclick="editList('{{ list }}', 'white')" title="Edit the {{ list }} list">{{ list }}</a>
|
||
</span>
|
||
{% endfor %}
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
<div id="ajax"></div>
|
||
<div class="add-note alert addName alert-info" style="width: inherit; margin-right: 15px;">
|
||
In this section you can create and edit black and white lists. And after use them in the HAProxy configs or in the "Add proxy" pages. Read how to use it in this
|
||
<a href="https://roxy-wi.org/howto.py?howto=blacklist" title="How to create and manage blacklist" target="_blank">article</a>
|
||
</div>
|
||
<div id="dialog-confirm-cert-edit" title="View certificate " style="display: none;">
|
||
<span><b>Note:</b> Each new address must be specified from a new line</span>
|
||
<textarea id="edit_lists" style="width: 100%" rows=20></textarea>
|
||
</div>
|
||
</div>
|
||
{% include 'include/del_confirm.html' %}
|
||
<div id="dialog-confirm-cert" title="View certificate " style="display: none;">
|
||
<pre id="dialog-confirm-body"></pre>
|
||
</div>
|
||
<input type="hidden" id="group" value="{{ group }}">
|
||
</div>
|
||
</div>
|
||
<script>
|
||
$( function() {
|
||
$( ".force_close" ).selectmenu({
|
||
width: 180
|
||
});
|
||
if (window.matchMedia('(max-width: 1280px)').matches || window.matchMedia('(max-width: 1024px)').matches || window.matchMedia('(max-width: 667px)').matches) {
|
||
$( "select" ).selectmenu({
|
||
width: 150
|
||
});
|
||
}
|
||
});
|
||
var serv_ports = $('.send_proxy');
|
||
|
||
for (var i = 0; i <= serv_ports.length; i++) {
|
||
var uniqId = makeid(3);
|
||
$(serv_ports[i]).append('<label for="' + uniqId + '" class="send_proxy_label" title="Set send-proxy for this server" data-help="The Send-proxy parameter enforces the use of the PROXY protocol over any connection established to this server. The PROXY protocol informs the other end about the layer 3/4 addresses of the incoming connection so that it can know the client\'s address or the public address it accessed to, whatever the upper-layer protocol.">send-proxy</label><input type="checkbox" name="send_proxy" value="1" id="' + uniqId + '">');
|
||
var uniqId = makeid(3);
|
||
$(serv_ports[i]).append('<label for="' + uniqId + '" class="send_proxy_label" title="Set this server as backup server" data-help="When all servers in a farm are down, we want to redirect traffic to a backup server which delivers either sorry pages or a degraded mode of the application.\n' +
|
||
'This can be done easily in HAProxy by adding the keyword backup on the server line. If multiple backup servers are configured, only the first active one is used.">backup</label><input type="checkbox" name="backup" value="1" id="' + uniqId + '">');
|
||
}
|
||
</script>
|
||
{% endblock %}
|