haproxy/templates/haproxy.cfg.j2
2024-12-20 17:15:44 +01:00

187 lines
7.7 KiB
Django/Jinja
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# {{ ansible_managed }}
##########
# Global #
##########
global
ca-base /etc/ssl/certs
chroot /var/lib/haproxy
crt-base /etc/ssl/private
log /dev/log local0 info
log /dev/log local1 notice
log-tag haproxy
maxconn 20000
pidfile /var/run/haproxy.pid
spread-checks 8
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options prefer-client-ciphers no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets
ssl-default-server-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-HA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-server-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-server-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets
ssl-server-verify none
stats socket /var/lib/haproxy/stats mode 600 level admin
tune.bufsize 65536
tune.maxrewrite 32768
tune.ssl.cachesize 100000
tune.ssl.default-dh-param 2048
tune.ssl.lifetime 600
tune.ssl.maxrecord 1460
############
# Defaults #
############
defaults 000-main
compression algo gzip
compression type text/html text/plain text/xml text/css text/javascript application/javascript application/json text/json image/svg+xml
log global
mode http
option httplog
option http-server-close
option dontlognull
option forwardfor
option redispatch
retries 3
stats realm Haproxy\ Statistics
stats show-desc Haproxy\ Statistics
stats show-node {{ ansible_hostname }}
stats uri /haproxy-stats
stats refresh 5s
stats hide-version
stats show-legends
timeout http-request 60s
timeout queue 60s
timeout connect 60s
timeout client 60s
timeout server 60s
timeout check 10s
############
# Userlist #
############
userlist prod
group ADMIN
user brainsys password $6$whKvhQcRLecqnNlC$CZS.p3EHfJDmC9H6KDeLkwOddLOPvPuEUDsaR3iLGbXU3eJ9kKcGDfq.Y59qgX2Q10x2Q2QuJ0lAcs0T2eAfa. groups ADMIN
#############
# Frontends #
#############
frontend stats
bind *:8404
option httpclose
stats enable
stats uri /stats
stats refresh 10s
http-request use-service prometheus-exporter if { path /metrics }
frontend prd_frontend1
bind {{ haproxy_bind_ip }}:80
bind {{ haproxy_bind_ip }}:443 ssl crt /etc/haproxy/ssl/certs
mode http
option http-server-close
option forwardfor
log-format %ci\ -\ [%Tl]\ %{+Q}r\ %ST\ %B\ %{+Q}hrl\ ---\ %{+Q}[var(txn.SCHEME)]\ %{+Q}[var(txn.COUNTRY)]\ %b\ %s\ %{+Q}hsl\ %Tq/%Tw/%Tc/%Tr/%Tt
## acl ##
acl has_DEBUG always_false
acl has_SCHEME_HTTPS ssl_fc
acl has_BYPASS_MAINTENANCE always_false
acl has_MAINTENANCE always_false
acl has_BYPASS_CACHE hdr_sub(X-Requested-With) XMLHttpRequest
acl has_BYPASS_CACHE method POST
acl has_AUTHORIZATION always_false
acl has_HEADER_X_FORWARDED_FOR hdr(X-Forwarded-For) -m found
acl has_HEADER_CF_CONNECTING_IP hdr(CF-Connecting-IP) -m found
acl has_HEADER_CF_TRUE_CLIENT_IP hdr(True-Client-IP) -m found # was cf_hdr_found
acl to_RESTRICTED_AREA path_beg -i /haproxy-stats
acl to_ACME_CHALLENGE path_beg /.well-known/acme-challenge/
acl is_auth_ok http_auth(prod)
acl is_HAPROXY_STATS path_beg -i /haproxy
acl is_localhost hdr(host) -i localhost
acl is_POST method POST
acl is_DELETE method DELETE
acl disable_AUTH_to_RESTRICTED_AREA always_false
acl disable_REDIRECT_TO_HTTPS always_false
acl disable_REDIRECT_TO_HTTPS hdr(host) -i localhost {{ ansible_hostname }}
acl disable_REDIRECT_TO_HTTPS path_beg -i /.well-known/acme-challenge/
## capture ##
capture request header X-Forwarded-For len 64
capture request header CF-Connecting-IP len 64
capture request header Referer len 64
capture request header User-Agent len 512
capture request header Host len 128
capture response header Content-Length len 10
capture response header X-Cache len 4
capture response header X-Cache-Hits len 8
capture response header Cache-Control len 64
capture response header X-UA-Device len 8
## http-response ##
http-response add-header Strict-Transport-Security max-age=15768000
http-response add-header Referrer-Policy no-referrer-when-downgrade
http-response del-header Server if !has_DEBUG
http-response del-header X-Generator if !has_DEBUG
http-response del-header X-Apache-Server-ID if !has_DEBUG
http-response del-header X-Vhost-ID if !has_DEBUG
http-response del-header x-url if !has_DEBUG
http-response del-header X-UA-Device if !has_DEBUG
http-response del-header X-Cache-Hits if !has_DEBUG
http-response del-header X-Powered-By if !has_DEBUG
http-response del-header X-Served-By if !has_DEBUG
http-response del-header X-Varnish-Ip if !has_DEBUG
http-response del-header X-Varnish-Port if !has_DEBUG
http-response del-header via if !has_DEBUG
http-response set-header X-XSS-Protection "1; mode=block"
http-response set-header X-Content-Type-Options nosniff
http-response del-header content-security-policy-report-only
# no follow / no index !!!
http-response set-header X-Robots-Tag "noindex, nofollow"
## http-request ##
http-request set-src hdr_ip(CF-Connecting-IP) if has_HEADER_CF_CONNECTING_IP
http-request set-src hdr_ip(X-Forwarded-For) if has_HEADER_X_FORWARDED_FOR
http-request set-src hdr(True-Client-IP) if has_HEADER_CF_TRUE_CLIENT_IP
http-request set-header X-Client-IP %[src]
http-request set-header X-Forwarded-For %[src]
http-request set-header X-Forwarded-Proto https if has_SCHEME_HTTPS
http-request set-header X-Forwarded-Port 443 if has_SCHEME_HTTPS
http-request set-header X-Forwarded-Port 80 if !has_SCHEME_HTTPS
http-request set-var(txn.SCHEME) hdr(X-Forwarded-Proto)
http-request set-var(txn.host) hdr(Host)
http-request set-var(txn.path) path
http-request redirect code 301 scheme https if !has_SCHEME_HTTPS !disable_REDIRECT_TO_HTTPS
http-request del-header authorization if to_RESTRICTED_AREA has_AUTHORIZATION
http-request del-header user-agent if { hdr(user-agent) -i HAPROXY-LB-Check VARNISH-LB-Check }
http-request del-header Authorization if is_auth_ok
http-request deny if to_RESTRICTED_AREA !has_AUTHORIZATION
http-request deny if is_HAPROXY_STATS !is_localhost
http-request auth realm "haproxy statistics - Limited access" if !is_auth_ok is_HAPROXY_STATS
http-request auth realm "You need a valid user and password to access this content. Unauthorized access to this system is forbidden and will be prosecuted by law. By accessing this system, you agree that your actions may be monitored if unauthorized usage is suspected" if to_RESTRICTED_AREA !has_AUTHORIZATION !disable_AUTH_to_RESTRICTED_AREA
## end http-request ##
## use backends ##
default_backend prd_backend
############
# Backends #
############
backend prd_backend
mode http
server nginx 127.0.0.1:80 check inter 3s