various bug fixes related to Swarm

This commit is contained in:
bunkerity 2021-06-06 23:22:33 +02:00
parent 678ad70b01
commit fcc6b3b5e4
No known key found for this signature in database
GPG Key ID: 3D80806F12602A7C
17 changed files with 162 additions and 97 deletions

26
CHANGELOG.md Normal file
View File

@ -0,0 +1,26 @@
# Changelog
## v1.2.6 - 2021/06/06
- Move from "ghetto-style" shell scripts to generic jinja2 templating
- Init work on a basic plugins system
- Move ClamAV to external plugin
- Reduce image size by removing unnecessary dependencies
- Fix CrowdSec example
- Change some global variables to multisite
- Add LOG_LEVEL environment variable
- Read-only container support
- Improved antibot javascript with a basic proof of work
- Update nginx to 1.20.1
- Support of docker-socket-proxy with web UI
- Add certbot-cloudflare example
- Disable DNSBL checks when IP is local
## v1.2.5 - 2021/05/14
- Performance improvement : move some nginx security checks to LUA and external blacklist parsing enhancement
- Init work on official documentation on readthedocs
- Fix default value for CONTENT_SECURITY_POLICY to allow file downloads
- Add ROOT_SITE_SUBFOLDER environment variable
## TODO - retrospective changelog

View File

@ -1,4 +1,3 @@
# TODO : hard tests, jobs if swarm mode, check state when generating env, ...
from Config import Config from Config import Config
import utils import utils
import os import os
@ -94,13 +93,9 @@ class AutoConf :
if self.__swarm and len(self.__instances) == 1 : if self.__swarm and len(self.__instances) == 1 :
if self.__config.generate(self.__env) : if self.__config.generate(self.__env) :
utils.log("[*] Initial config succeeded") utils.log("[*] Initial config succeeded")
with open("/etc/nginx/autoconf", "w") as f :
f.write("ok")
if not self.__config.swarm_wait(self.__instances) : if not self.__config.swarm_wait(self.__instances) :
utils.log("[!] Removing bunkerized-nginx instances from list") utils.log("[!] Removing bunkerized-nginx instances from list")
del self.__instances[id] del self.__instances[id]
os.remove("/etc/nginx/autoconf")
else : else :
utils.log("[!] Initial config failed") utils.log("[!] Initial config failed")
utils.log("[*] bunkerized-nginx instance created : " + name + " / " + id) utils.log("[*] bunkerized-nginx instance created : " + name + " / " + id)
@ -118,11 +113,6 @@ class AutoConf :
elif event == "destroy" or event == "remove" : elif event == "destroy" or event == "remove" :
del self.__instances[id] del self.__instances[id]
self.__gen_env() self.__gen_env()
if self.__swarm and len(self.__instances) == 0 :
with open("/etc/crontabs/nginx", "w") as f :
f.write("")
if os.path.exists("/etc/nginx/autoconf") :
os.remove("/etc/nginx/autoconf")
utils.log("[*] bunkerized-nginx instance removed : " + name + " / " + id) utils.log("[*] bunkerized-nginx instance removed : " + name + " / " + id)
def __process_server(self, instance, event, id, name, labels) : def __process_server(self, instance, event, id, name, labels) :

View File

@ -9,8 +9,26 @@ class Config :
self.__swarm = swarm self.__swarm = swarm
self.__api = api self.__api = api
def __jobs(self) :
utils.log("[*] Starting jobs ...")
proc = subprocess.run(["/bin/su", "-c", "/opt/entrypoint/jobs.sh", "nginx"], capture_output=True)
stdout = proc.stdout.decode("ascii")
stderr = proc.stderr.decode("ascii")
if stdout != "" :
utils.log("[*] Jobs stdout :")
utils.log(stdout)
if stderr != "" :
utils.log("[!] Jobs stderr :")
utils.log(stderr)
if proc.returncode != 0 :
utils.log("[!] Jobs error : return code != 0")
return False
return True
def swarm_wait(self, instances) : def swarm_wait(self, instances) :
try : try :
with open("/etc/nginx/autoconf", "w") as f :
f.write("ok")
utils.log("[*] Waiting for bunkerized-nginx tasks ...") utils.log("[*] Waiting for bunkerized-nginx tasks ...")
i = 1 i = 1
started = False started = False
@ -23,16 +41,7 @@ class Config :
utils.log("[!] Waiting " + str(i) + " seconds before retrying to contact bunkerized-nginx tasks") utils.log("[!] Waiting " + str(i) + " seconds before retrying to contact bunkerized-nginx tasks")
if started : if started :
utils.log("[*] bunkerized-nginx tasks started") utils.log("[*] bunkerized-nginx tasks started")
proc = subprocess.run(["/bin/su", "-c", "/opt/entrypoint/jobs.sh", "nginx"], capture_output=True) return True
stdout = proc.stdout.decode("ascii")
stderr = proc.stderr.decode("ascii")
if stdout != "" :
for line in stdout.split("\n") :
utils.log("[*] Jobs output : " + stdout)
if stderr != "" :
for line in stderr.split("\n") :
utils.log("[!] Jobs error : " + stderr)
return proc.returncode == 0
else : else :
utils.log("[!] bunkerized-nginx tasks are not started") utils.log("[!] bunkerized-nginx tasks are not started")
except Exception as e : except Exception as e :
@ -52,15 +61,17 @@ class Config :
# Print stdout/stderr # Print stdout/stderr
stdout = proc.stdout.decode("ascii") stdout = proc.stdout.decode("ascii")
stderr = proc.stderr.decode("ascii") stderr = proc.stderr.decode("ascii")
if stdout != "": if stdout != "" :
for line in stdout.split("\n") : utils.log("[*] Generator output :")
utils.log("[*] Generator output : " + stdout) utils.log(stdout)
if stderr != "" : if stderr != "" :
for line in stderr.split("\n") : utils.log("[*] Generator error :")
utils.log("[*] Generator error : " + stderr) utils.log(error)
# We're done # We're done
if proc.returncode == 0 : if proc.returncode == 0 :
if self.__swarm :
return self.__jobs()
return True return True
utils.log("[!] Error while generating site config for " + env["SERVER_NAME"] + " : return code = " + str(proc.returncode)) utils.log("[!] Error while generating site config for " + env["SERVER_NAME"] + " : return code = " + str(proc.returncode))

View File

@ -9,7 +9,6 @@ if [ "$?" -ne 0 ] ; then
fi fi
if [ "$SWARM_MODE" = "yes" ] ; then if [ "$SWARM_MODE" = "yes" ] ; then
cp -r /opt/confs/nginx/* /etc/nginx
chown -R root:nginx /etc/nginx chown -R root:nginx /etc/nginx
chmod -R 770 /etc/nginx chmod -R 770 /etc/nginx
fi fi

25
confs/global/fastcgi.conf Normal file
View File

@ -0,0 +1,25 @@
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;

View File

@ -2,5 +2,10 @@ server {
{% if LISTEN_HTTP == "yes" %}listen 0.0.0.0:{{ HTTP_PORT }} default_server{% endif %}; {% if LISTEN_HTTP == "yes" %}listen 0.0.0.0:{{ HTTP_PORT }} default_server{% endif %};
server_name _; server_name _;
{% if has_value("AUTO_LETS_ENCRYPT", "yes") %}include /etc/nginx/multisite-default-server-https.conf;{% endif %} {% if has_value("AUTO_LETS_ENCRYPT", "yes") %}include /etc/nginx/multisite-default-server-https.conf;{% endif %}
{% if USE_API == "yes" %}
location ^~ {{ API_URI }} {
include /etc/nginx/api.conf;
}
{% endif %}
{% if DISABLE_DEFAULT_SERVER == "yes" %}include /etc/nginx/multisite-disable-default-server.conf;{% endif %} {% if DISABLE_DEFAULT_SERVER == "yes" %}include /etc/nginx/multisite-disable-default-server.conf;{% endif %}
} }

View File

@ -14,7 +14,7 @@ Any environment variable tagged as *multisite* context can be used for a specifi
`SERVER_NAME` `SERVER_NAME`
Values : *<first name> <second name> ...* Values : *<first name> <second name> ...*
Default value : *www.bunkerity.com* Default value : *www.bunkerity.com*
Context : *global* Context : *global*, *multisite*
Sets the host names of the webserver separated with spaces. This must match the Host header sent by clients. Sets the host names of the webserver separated with spaces. This must match the Host header sent by clients.
Useful when used with `MULTISITE=yes` and/or `AUTO_LETSENCRYPT=yes` and/or `DISABLE_DEFAULT_SERVER=yes`. Useful when used with `MULTISITE=yes` and/or `AUTO_LETSENCRYPT=yes` and/or `DISABLE_DEFAULT_SERVER=yes`.
@ -55,7 +55,7 @@ The IP addresses of the DNS resolvers to use when performing DNS lookups.
Values : *\<any valid path to web files\>* Values : *\<any valid path to web files\>*
Default value : */www* Default value : */www*
Context : *global* Context : *global*
The default folder where nginx will search for web files. Don't change it unless you want to make your own image. The default folder where nginx will search for web files. Don't change it unless you know what you are doing.
`ROOT_SITE_SUBFOLDER` `ROOT_SITE_SUBFOLDER`
Values : *\<any valid directory name\>* Values : *\<any valid directory name\>*
@ -115,12 +115,12 @@ List of header to remove when sending responses to clients.
### Custom error pages ### Custom error pages
`ERROR_XXX` `ERRORS`
Values : *\<relative path to the error page\>* Values : *\<error1=/page1 error2=/page2\>*
Default value : Default value :
Context : *global*, *multisite* Context : *global*, *multisite*
Use this kind of environment variable to define custom error page depending on the HTTP error code. Replace XXX with HTTP code. Use this kind of environment variable to define custom error page depending on the HTTP error code. Replace errorX with HTTP code.
For example : `ERROR_404=/404.html` means the /404.html page will be displayed when 404 code is generated. The path is relative to the root web folder. Example : `ERRORS=404=/404.html 403=/403.html` the /404.html page will be displayed when 404 code is generated (same for 403 and /403.html page). The path is relative to the root web folder.
### HTTP basic authentication ### HTTP basic authentication
@ -431,55 +431,55 @@ Full path of the key file to use when `USE_CUSTOM_HTTPS` is set to yes.
`GENERATE_SELF_SIGNED_SSL` `GENERATE_SELF_SIGNED_SSL`
Values : *yes* | *no* Values : *yes* | *no*
Default value : *no* Default value : *no*
Context : *global* Context : *global*, *multisite*
If set to yes, HTTPS will be enabled with a container generated self-signed certificate. If set to yes, HTTPS will be enabled with a container generated self-signed certificate.
`SELF_SIGNED_SSL_EXPIRY` `SELF_SIGNED_SSL_EXPIRY`
Values : *integer* Values : *integer*
Default value : *365* (1 year) Default value : *365* (1 year)
Context : *global* Context : *global*, *multisite*
Needs `GENERATE_SELF_SIGNED_SSL` to work. Needs `GENERATE_SELF_SIGNED_SSL` to work.
Sets the expiry date for the self generated certificate. Sets the expiry date for the self generated certificate.
`SELF_SIGNED_SSL_COUNTRY` `SELF_SIGNED_SSL_COUNTRY`
Values : *text* Values : *text*
Default value : *Switzerland* Default value : *Switzerland*
Context : *global* Context : *global*, *multisite*
Needs `GENERATE_SELF_SIGNED_SSL` to work. Needs `GENERATE_SELF_SIGNED_SSL` to work.
Sets the country for the self generated certificate. Sets the country for the self generated certificate.
`SELF_SIGNED_SSL_STATE` `SELF_SIGNED_SSL_STATE`
Values : *text* Values : *text*, *multisite*
Default value : *Switzerland* Default value : *Switzerland*
Context : *global* Context : *global*, *multisite*
Needs `GENERATE_SELF_SIGNED_SSL` to work. Needs `GENERATE_SELF_SIGNED_SSL` to work.
Sets the state for the self generated certificate. Sets the state for the self generated certificate.
`SELF_SIGNED_SSL_CITY` `SELF_SIGNED_SSL_CITY`
Values : *text* Values : *text*
Default value : *Bern* Default value : *Bern*
Context : *global* Context : *global*, *multisite*
Needs `GENERATE_SELF_SIGNED_SSL` to work. Needs `GENERATE_SELF_SIGNED_SSL` to work.
Sets the city for the self generated certificate. Sets the city for the self generated certificate.
`SELF_SIGNED_SSL_ORG` `SELF_SIGNED_SSL_ORG`
Values : *text* Values : *text*
Default value : *AcmeInc* Default value : *AcmeInc*
Context : *global* Context : *global*, *multisite*
Needs `GENERATE_SELF_SIGNED_SSL` to work. Needs `GENERATE_SELF_SIGNED_SSL` to work.
Sets the organisation name for the self generated certificate. Sets the organisation name for the self generated certificate.
`SELF_SIGNED_SSL_OU` `SELF_SIGNED_SSL_OU`
Values : *text* Values : *text*
Default value : *IT* Default value : *IT*
Context : *global* Context : *global*, *multisite*
Needs `GENERATE_SELF_SIGNED_SSL` to work. Needs `GENERATE_SELF_SIGNED_SSL` to work.
Sets the organisitional unit for the self generated certificate. Sets the organisitional unit for the self generated certificate.
`SELF_SIGNED_SSL_CN` `SELF_SIGNED_SSL_CN`
Values : *text* Values : *text*
Default value : *bunkerity-nginx* Default value : *bunkerity-nginx*
Context : *global* Context : *global*, *multisite*
Needs `GENERATE_SELF_SIGNED_SSL` to work. Needs `GENERATE_SELF_SIGNED_SSL` to work.
Sets the CN server name for the self generated certificate. Sets the CN server name for the self generated certificate.
@ -625,13 +625,13 @@ The minimum score required when `USE_ANTIBOT` is set to *recaptcha*.
`ANTIBOT_RECAPTCHA_SITEKEY` `ANTIBOT_RECAPTCHA_SITEKEY`
Values : *\<public key given by Google\>* Values : *\<public key given by Google\>*
Default value : Default value :
Context : *global* Context : *global*, *multisite*
The sitekey given by Google when `USE_ANTIBOT` is set to *recaptcha*. The sitekey given by Google when `USE_ANTIBOT` is set to *recaptcha*.
`ANTIBOT_RECAPTCHA_SECRET` `ANTIBOT_RECAPTCHA_SECRET`
Values : *\<private key given by Google\>* Values : *\<private key given by Google\>*
Default value : Default value :
Context : *global* Context : *global*, *multisite*
The secret given by Google when `USE_ANTIBOT` is set to *recaptcha*. The secret given by Google when `USE_ANTIBOT` is set to *recaptcha*.
### External blacklists ### External blacklists
@ -682,7 +682,7 @@ If set to *yes*, DNSBL checks will be performed to the servers specified in the
`DNSBL_LIST` `DNSBL_LIST`
Values : *\<list of DNS zones separated with spaces\>* Values : *\<list of DNS zones separated with spaces\>*
Default value : *bl.blocklist.de problems.dnsbl.sorbs.net sbl.spamhaus.org xbl.spamhaus.org* Default value : *bl.blocklist.de problems.dnsbl.sorbs.net sbl.spamhaus.org xbl.spamhaus.org*
Context : *global* Context : *global*, *multisite*
The list of DNSBL zones to query when `USE_DNSBL` is set to *yes*. The list of DNSBL zones to query when `USE_DNSBL` is set to *yes*.
### CrowdSec ### CrowdSec
@ -716,7 +716,7 @@ If set to *yes*, lets you define custom IP addresses to be whitelisted through t
`WHITELIST_IP_LIST` `WHITELIST_IP_LIST`
Values : *\<list of IP addresses and/or network CIDR blocks separated with spaces\>* Values : *\<list of IP addresses and/or network CIDR blocks separated with spaces\>*
Default value : *23.21.227.69 40.88.21.235 50.16.241.113 50.16.241.114 50.16.241.117 50.16.247.234 52.204.97.54 52.5.190.19 54.197.234.188 54.208.100.253 54.208.102.37 107.21.1.8* Default value : *23.21.227.69 40.88.21.235 50.16.241.113 50.16.241.114 50.16.241.117 50.16.247.234 52.204.97.54 52.5.190.19 54.197.234.188 54.208.100.253 54.208.102.37 107.21.1.8*
Context : *global* Context : *global*, *multisite*
The list of IP addresses and/or network CIDR blocks to whitelist when `USE_WHITELIST_IP` is set to *yes*. The default list contains IP addresses of the [DuckDuckGo crawler](https://help.duckduckgo.com/duckduckgo-help-pages/results/duckduckbot/). The list of IP addresses and/or network CIDR blocks to whitelist when `USE_WHITELIST_IP` is set to *yes*. The default list contains IP addresses of the [DuckDuckGo crawler](https://help.duckduckgo.com/duckduckgo-help-pages/results/duckduckbot/).
`USE_WHITELIST_REVERSE` `USE_WHITELIST_REVERSE`
@ -728,7 +728,7 @@ If set to *yes*, lets you define custom reverse DNS suffixes to be whitelisted t
`WHITELIST_REVERSE_LIST` `WHITELIST_REVERSE_LIST`
Values : *\<list of reverse DNS suffixes separated with spaces\>* Values : *\<list of reverse DNS suffixes separated with spaces\>*
Default value : *.googlebot.com .google.com .search.msn.com .crawl.yahoot.net .crawl.baidu.jp .crawl.baidu.com .yandex.com .yandex.ru .yandex.net* Default value : *.googlebot.com .google.com .search.msn.com .crawl.yahoot.net .crawl.baidu.jp .crawl.baidu.com .yandex.com .yandex.ru .yandex.net*
Context : *global* Context : *global*, *multisite*
The list of reverse DNS suffixes to whitelist when `USE_WHITELIST_REVERSE` is set to *yes*. The default list contains suffixes of major search engines. The list of reverse DNS suffixes to whitelist when `USE_WHITELIST_REVERSE` is set to *yes*. The default list contains suffixes of major search engines.
`WHITELIST_USER_AGENT` `WHITELIST_USER_AGENT`
@ -754,7 +754,7 @@ If set to *yes*, lets you define custom IP addresses to be blacklisted through t
`BLACKLIST_IP_LIST` `BLACKLIST_IP_LIST`
Values : *\<list of IP addresses and/or network CIDR blocks separated with spaces\>* Values : *\<list of IP addresses and/or network CIDR blocks separated with spaces\>*
Default value : Default value :
Context : *global* Context : *global*, *multisite*
The list of IP addresses and/or network CIDR blocks to blacklist when `USE_BLACKLIST_IP` is set to *yes*. The list of IP addresses and/or network CIDR blocks to blacklist when `USE_BLACKLIST_IP` is set to *yes*.
`USE_BLACKLIST_REVERSE` `USE_BLACKLIST_REVERSE`
@ -766,7 +766,7 @@ If set to *yes*, lets you define custom reverse DNS suffixes to be blacklisted t
`BLACKLIST_REVERSE_LIST` `BLACKLIST_REVERSE_LIST`
Values : *\<list of reverse DNS suffixes separated with spaces\>* Values : *\<list of reverse DNS suffixes separated with spaces\>*
Default value : *.shodan.io* Default value : *.shodan.io*
Context : *global* Context : *global*, *multisite*
The list of reverse DNS suffixes to blacklist when `USE_BLACKLIST_REVERSE` is set to *yes*. The list of reverse DNS suffixes to blacklist when `USE_BLACKLIST_REVERSE` is set to *yes*.
### Requests limiting ### Requests limiting
@ -856,25 +856,25 @@ If set to yes, bunkerized-nginx will block users getting too much "suspicious" H
`BAD_BEHAVIOR_STATUS_CODES` `BAD_BEHAVIOR_STATUS_CODES`
Values : *\<HTTP status codes separated with space\>* Values : *\<HTTP status codes separated with space\>*
Default value : *400 401 403 404 405 429 444* Default value : *400 401 403 404 405 429 444*
Context : *global* Context : *global*, *multisite*
List of HTTP status codes considered as "suspicious". List of HTTP status codes considered as "suspicious".
`BAD_BEHAVIOR_THRESHOLD` `BAD_BEHAVIOR_THRESHOLD`
Values : *<any positive integer>* Values : *<any positive integer>*
Default value : *10* Default value : *10*
Context : *global* Context : *global*, *multisite*
The number of "suspicious" HTTP status code before the corresponding IP is banned. The number of "suspicious" HTTP status code before the corresponding IP is banned.
`BAD_BEHAVIOR_BAN_TIME` `BAD_BEHAVIOR_BAN_TIME`
Values : *<any positive integer>* Values : *<any positive integer>*
Default value : *86400* Default value : *86400*
Context : *global* Context : *global*, *multisite*
The duration time (in seconds) of a ban when the corresponding IP has reached the `BAD_BEHAVIOR_THRESHOLD`. The duration time (in seconds) of a ban when the corresponding IP has reached the `BAD_BEHAVIOR_THRESHOLD`.
`BAD_BEHAVIOR_COUNT_TIME` `BAD_BEHAVIOR_COUNT_TIME`
Values : *<any positive integer>* Values : *<any positive integer>*
Default value : *60* Default value : *60*
Context : *global* Context : *global*, *multisite*
The duration time (in seconds) before the counter of "suspicious" HTTP is reset. The duration time (in seconds) before the counter of "suspicious" HTTP is reset.
## misc ## misc

View File

@ -8,18 +8,18 @@ if [ "$(has_value BLACKLIST_COUNTRY .+)" != "" ] || [ "$(has_value WHITELIST_COU
if [ -f "/cache/geoip.mmdb" ] ; then if [ -f "/cache/geoip.mmdb" ] ; then
echo "[*] Copying cached geoip.mmdb ..." echo "[*] Copying cached geoip.mmdb ..."
cp /cache/geoip.mmdb /etc/nginx/geoip.mmdb cp /cache/geoip.mmdb /etc/nginx/geoip.mmdb
else elif [ "$(ps aux | grep "geoip\.sh")" = "" ] ; then
echo "[*] Downloading GeoIP database (in background) ..." echo "[*] Downloading GeoIP database ..."
/opt/scripts/geoip.sh > /dev/null 2>&1 & /opt/scripts/geoip.sh > /dev/null 2>&1
fi fi
fi fi
# User-Agents # User-Agents
if [ "$(has_value BLOCK_USER_AGENT yes)" != "" ] ; then if [ "$(has_value BLOCK_USER_AGENT yes)" != "" ] ; then
if [ -f "/cache/user-agents.list" ] ; then if [ -f "/cache/user-agents.list" ] && [ "$(wc -l /cache/user-agents.list | cut -d ' ' -f 1)" -gt 1 ] ; then
echo "[*] Copying cached user-agents.list ..." echo "[*] Copying cached user-agents.list ..."
cp /cache/user-agents.list /etc/nginx/user-agents.list cp /cache/user-agents.list /etc/nginx/user-agents.list
else elif [ "$(ps aux | grep "user-agents\.sh")" = "" ] ; then
echo "[*] Downloading bad user-agent list (in background) ..." echo "[*] Downloading bad user-agent list (in background) ..."
/opt/scripts/user-agents.sh > /dev/null 2>&1 & /opt/scripts/user-agents.sh > /dev/null 2>&1 &
fi fi
@ -27,10 +27,10 @@ fi
# Referrers # Referrers
if [ "$(has_value BLOCK_REFERRER yes)" != "" ] ; then if [ "$(has_value BLOCK_REFERRER yes)" != "" ] ; then
if [ -f "/cache/referrers.list" ] ; then if [ -f "/cache/referrers.list" ] && [ "$(wc -l /cache/referrers.list | cut -d ' ' -f 1)" -gt 1 ] ; then
echo "[*] Copying cached referrers.list ..." echo "[*] Copying cached referrers.list ..."
cp /cache/referrers.list /etc/nginx/referrers.list cp /cache/referrers.list /etc/nginx/referrers.list
else elif [ "$(ps aux | grep "referrers\.sh")" = "" ] ; then
echo "[*] Downloading bad referrer list (in background) ..." echo "[*] Downloading bad referrer list (in background) ..."
/opt/scripts/referrers.sh > /dev/null 2>&1 & /opt/scripts/referrers.sh > /dev/null 2>&1 &
fi fi
@ -38,10 +38,10 @@ fi
# exit nodes # exit nodes
if [ "$(has_value BLOCK_TOR_EXIT_NODE yes)" != "" ] ; then if [ "$(has_value BLOCK_TOR_EXIT_NODE yes)" != "" ] ; then
if [ -f "/cache/tor-exit-nodes.list" ] ; then if [ -f "/cache/tor-exit-nodes.list" ] && [ "$(wc -l /cache/tor-exit-nodes.list | cut -d ' ' -f 1)" -gt 1 ] ; then
echo "[*] Copying cached tor-exit-nodes.list ..." echo "[*] Copying cached tor-exit-nodes.list ..."
cp /cache/tor-exit-nodes.list /etc/nginx/tor-exit-nodes.list cp /cache/tor-exit-nodes.list /etc/nginx/tor-exit-nodes.list
else elif [ "$(ps aux | grep "exit-nodes\.sh")" = "" ] ; then
echo "[*] Downloading tor exit nodes list (in background) ..." echo "[*] Downloading tor exit nodes list (in background) ..."
/opt/scripts/exit-nodes.sh > /dev/null 2>&1 & /opt/scripts/exit-nodes.sh > /dev/null 2>&1 &
fi fi
@ -49,10 +49,10 @@ fi
# proxies # proxies
if [ "$(has_value BLOCK_PROXIES yes)" != "" ] ; then if [ "$(has_value BLOCK_PROXIES yes)" != "" ] ; then
if [ -f "/cache/proxies.list" ] ; then if [ -f "/cache/proxies.list" ] && [ "$(wc -l /cache/proxies.list | cut -d ' ' -f 1)" -gt 1 ] ; then
echo "[*] Copying cached proxies.list ..." echo "[*] Copying cached proxies.list ..."
cp /cache/proxies.list /etc/nginx/proxies.list cp /cache/proxies.list /etc/nginx/proxies.list
else elif [ "$(ps aux | grep "proxies\.sh")" = "" ] ; then
echo "[*] Downloading proxies list (in background) ..." echo "[*] Downloading proxies list (in background) ..."
/opt/scripts/proxies.sh > /dev/null 2>&1 & /opt/scripts/proxies.sh > /dev/null 2>&1 &
fi fi
@ -60,10 +60,10 @@ fi
# abusers # abusers
if [ "$(has_value BLOCK_ABUSERS yes)" != "" ] ; then if [ "$(has_value BLOCK_ABUSERS yes)" != "" ] ; then
if [ -f "/cache/abusers.list" ] ; then if [ -f "/cache/abusers.list" ] && [ "$(wc -l /cache/abusers.list | cut -d ' ' -f 1)" -gt 1 ] ; then
echo "[*] Copying cached abusers.list ..." echo "[*] Copying cached abusers.list ..."
cp /cache/abusers.list /etc/nginx/abusers.list cp /cache/abusers.list /etc/nginx/abusers.list
else elif [ "$(ps aux | grep "abusers\.sh")" = "" ] ; then
echo "[*] Downloading abusers list (in background) ..." echo "[*] Downloading abusers list (in background) ..."
/opt/scripts/abusers.sh > /dev/null 2>&1 & /opt/scripts/abusers.sh > /dev/null 2>&1 &
fi fi
@ -105,6 +105,9 @@ fi
files=$(has_value AUTO_LETS_ENCRYPT yes) files=$(has_value AUTO_LETS_ENCRYPT yes)
if [ "$files" != " " ] ; then if [ "$files" != " " ] ; then
for file in $files ; do for file in $files ; do
if [ "$(echo "$file" | grep 'site.env$')" = "" ] ; then
continue
fi
SERVER_NAME="$(sed -nE 's/^SERVER_NAME=(.*)$/\1/p' $file)" SERVER_NAME="$(sed -nE 's/^SERVER_NAME=(.*)$/\1/p' $file)"
FIRST_SERVER="$(echo $SERVER_NAME | cut -d ' ' -f 1)" FIRST_SERVER="$(echo $SERVER_NAME | cut -d ' ' -f 1)"
EMAIL_LETS_ENCRYPT="$(sed -nE 's/^EMAIL_LETS_ENCRYPT=(.*)$/\1/p' $file)" EMAIL_LETS_ENCRYPT="$(sed -nE 's/^EMAIL_LETS_ENCRYPT=(.*)$/\1/p' $file)"
@ -112,6 +115,5 @@ if [ "$files" != " " ] ; then
EMAIL_LETS_ENCRYPT="contact@${FIRST_SERVER}" EMAIL_LETS_ENCRYPT="contact@${FIRST_SERVER}"
fi fi
/opt/scripts/certbot-new.sh "$(echo -n $SERVER_NAME | sed 's/ /,/g')" "$EMAIL_LETS_ENCRYPT" /opt/scripts/certbot-new.sh "$(echo -n $SERVER_NAME | sed 's/ /,/g')" "$EMAIL_LETS_ENCRYPT"
done done
fi fi

View File

@ -3,8 +3,8 @@
# you need to run it before starting bunkerized-nginx to get the first certificate # you need to run it before starting bunkerized-nginx to get the first certificate
# edit according to your values # edit according to your values
DOMAINS="kakou-corp.fr,*.kakou-corp.fr" DOMAINS="website.com,*.website.com"
EMAIL="contact@kakou-corp.fr" EMAIL="contact@website.com"
SERVICE="mywww" SERVICE="mywww"
# ask for the certificate # ask for the certificate

View File

@ -11,6 +11,7 @@ services:
- /shared/confs:/etc/nginx - /shared/confs:/etc/nginx
- /shared/letsencrypt:/etc/letsencrypt - /shared/letsencrypt:/etc/letsencrypt
- /shared/acme-challenge:/acme-challenge - /shared/acme-challenge:/acme-challenge
- /shared/cache:/cache
environment: environment:
- SWARM_MODE=yes - SWARM_MODE=yes
- API_URI=/ChangeMeToSomethingHardToGuess # must match API_URI from nginx - API_URI=/ChangeMeToSomethingHardToGuess # must match API_URI from nginx
@ -36,10 +37,11 @@ services:
# bunkerized-nginx runs as an unprivileged user with UID/GID 101 # bunkerized-nginx runs as an unprivileged user with UID/GID 101
# don't forget to edit the permissions of the files and folders accordingly # don't forget to edit the permissions of the files and folders accordingly
volumes: volumes:
- /shared/confs:/etc/nginx - /shared/confs:/etc/nginx:ro
- /shared/letsencrypt:/etc/letsencrypt:ro - /shared/letsencrypt:/etc/letsencrypt:ro
- /shared/acme-challenge:/acme-challenge:ro - /shared/acme-challenge:/acme-challenge:ro
- /shared/www:/www:ro - /shared/www:/www:ro
- /shared/cache:/cache:ro
environment: environment:
- SWARM_MODE=yes - SWARM_MODE=yes
- USE_API=yes - USE_API=yes

View File

@ -49,7 +49,7 @@ if __name__ == "__main__" :
variables = utils.load_variables(args.variables) variables = utils.load_variables(args.variables)
configurator.load_variables(variables) configurator.load_variables(variables)
config = configurator.get_config() config = configurator.get_config()
print(config) #print(config)
# Remove old config # Remove old config
for filename in os.listdir(args.output): for filename in os.listdir(args.output):

View File

@ -12,7 +12,7 @@ if [ "$(has_value BLOCK_ABUSERS yes)" = "" ] ; then
fi fi
# copy old conf to cache # copy old conf to cache
cp /etc/nginx/abusers.list /cache cp /etc/nginx/abusers.list /tmp/abusers.list.bak
# generate the new conf # generate the new conf
curl -s "https://iplists.firehol.org/files/firehol_abusers_30d.netset" | \ curl -s "https://iplists.firehol.org/files/firehol_abusers_30d.netset" | \
@ -31,24 +31,25 @@ lines="$(wc -l /tmp/abusers.list | cut -d ' ' -f 1)"
if [ "$lines" -gt 1 ] ; then if [ "$lines" -gt 1 ] ; then
job_log "[BLACKLIST] abusers list updated ($lines entries)" job_log "[BLACKLIST] abusers list updated ($lines entries)"
# reload nginx with the new config # reload nginx with the new config
mv /tmp/abusers.list /etc/nginx/abusers.list cp /tmp/abusers.list /etc/nginx/abusers.list
if [ "$RELOAD" != "" ] ; then if [ "$RELOAD" != "" ] ; then
$RELOAD > /dev/null 2>&1 $RELOAD > /dev/null 2>&1
# new config is ok : save it in the cache # new config is ok : save it in the cache
if [ "$?" -eq 0 ] ; then if [ "$?" -eq 0 ] ; then
cp /etc/nginx/abusers.list /cache cp /tmp/abusers.list /cache
job_log "[NGINX] successfull nginx reload after abusers list update" job_log "[NGINX] successfull nginx reload after abusers list update"
else else
job_log "[NGINX] failed nginx reload after abusers list update fallback to old list" job_log "[NGINX] failed nginx reload after abusers list update fallback to old list"
cp /cache/abusers.list /etc/nginx #cp /tmp/abusers.list.bak /etc/nginx
$RELOAD > /dev/null 2>&1 $RELOAD > /dev/null 2>&1
fi fi
else else
cp /etc/nginx/abusers.list /cache cp /tmp/abusers.list /cache
fi fi
else else
job_log "[BLACKLIST] can't update abusers list" job_log "[BLACKLIST] can't update abusers list"
fi fi
rm -f /tmp/abusers.list 2> /dev/null rm -f /tmp/abusers.list 2> /dev/null
rm -f /tmp/abusers.list.bak 2> /dev/null

View File

@ -12,7 +12,7 @@ if [ "$(has_value BLOCK_TOR_EXIT_NODE yes)" = "" ] ; then
fi fi
# copy old conf to cache # copy old conf to cache
cp /etc/nginx/tor-exit-nodes.list /cache cp /etc/nginx/tor-exit-nodes.list /tmp/tor-exit-nodes.list.bak
# generate the new conf # generate the new conf
curl -s "https://iplists.firehol.org/files/tor_exits.ipset" | \ curl -s "https://iplists.firehol.org/files/tor_exits.ipset" | \
@ -31,23 +31,24 @@ lines="$(wc -l /tmp/tor-exit-nodes.list | cut -d ' ' -f 1)"
if [ "$lines" -gt 1 ] ; then if [ "$lines" -gt 1 ] ; then
job_log "[BLACKLIST] TOR exit node list updated ($lines entries)" job_log "[BLACKLIST] TOR exit node list updated ($lines entries)"
# reload nginx with the new config # reload nginx with the new config
mv /tmp/tor-exit-nodes.list /etc/nginx/tor-exit-nodes.list cp /tmp/tor-exit-nodes.list /etc/nginx/tor-exit-nodes.list
if [ "$RELOAD" != "" ] ; then if [ "$RELOAD" != "" ] ; then
$RELOAD > /dev/null 2>&1 $RELOAD > /dev/null 2>&1
# new config is ok : save it in the cache # new config is ok : save it in the cache
if [ "$?" -eq 0 ] ; then if [ "$?" -eq 0 ] ; then
cp /etc/nginx/tor-exit-nodes.list /cache cp /tmp/tor-exit-nodes.list /cache
job_log "[NGINX] successfull nginx reload after TOR exit node list update" job_log "[NGINX] successfull nginx reload after TOR exit node list update"
else else
job_log "[NGINX] failed nginx reload after TOR exit node list update fallback to old list" job_log "[NGINX] failed nginx reload after TOR exit node list update fallback to old list"
cp /cache/tor-exit-nodes.list /etc/nginx #cp /tmp/tor-exit-nodes.list.bak /etc/nginx/tor-exit-nodes.list
$RELOAD > /dev/null 2>&1 $RELOAD > /dev/null 2>&1
fi fi
else else
cp /etc/nginx/tor-exit-nodes.list /cache cp /tmp/tor-exit-nodes.list /cache
fi fi
else else
job_log "[BLACKLIST] can't update TOR exit node list" job_log "[BLACKLIST] can't update TOR exit node list"
fi fi
rm -f /tmp/tor-exit-nodes.list 2> /dev/null rm -f /tmp/tor-exit-nodes.list 2> /dev/null
rm -f /tmp/tor-exit-nodes.list.bak 2> /dev/null

View File

@ -12,7 +12,7 @@ if [ "$(has_value BLOCK_PROXIES yes)" = "" ] ; then
fi fi
# copy old conf to cache # copy old conf to cache
cp /etc/nginx/proxies.list /cache cp /etc/nginx/proxies.list /tmp/proxies.list.bak
# generate the new conf # generate the new conf
curl -s "https://iplists.firehol.org/files/firehol_proxies.netset" | \ curl -s "https://iplists.firehol.org/files/firehol_proxies.netset" | \
@ -31,24 +31,25 @@ lines="$(wc -l /tmp/proxies.list | cut -d ' ' -f 1)"
if [ "$lines" -gt 1 ] ; then if [ "$lines" -gt 1 ] ; then
job_log "[BLACKLIST] proxies list updated ($lines entries)" job_log "[BLACKLIST] proxies list updated ($lines entries)"
# reload nginx with the new config # reload nginx with the new config
mv /tmp/proxies.list /etc/nginx/proxies.list cp /tmp/proxies.list /etc/nginx/proxies.list
if [ "$RELOAD" != "" ] ; then if [ "$RELOAD" != "" ] ; then
$RELOAD > /dev/null 2>&1 $RELOAD > /dev/null 2>&1
# new config is ok : save it in the cache # new config is ok : save it in the cache
if [ "$?" -eq 0 ] ; then if [ "$?" -eq 0 ] ; then
cp /etc/nginx/proxies.list /cache cp /tmp/proxies.list /cache
job_log "[NGINX] successfull nginx reload after proxies list update" job_log "[NGINX] successfull nginx reload after proxies list update"
else else
job_log "[NGINX] failed nginx reload after proxies list update fallback to old list" job_log "[NGINX] failed nginx reload after proxies list update fallback to old list"
cp /cache/proxies.list /etc/nginx #cp /tmp/proxies.list.bak /etc/nginx
$RELOAD > /dev/null 2>&1 $RELOAD > /dev/null 2>&1
fi fi
else else
cp /etc/nginx/proxies.list /cache cp /tmp/proxies.list /cache
fi fi
else else
job_log "[BLACKLIST] can't update proxies list" job_log "[BLACKLIST] can't update proxies list"
fi fi
rm -f /tmp/proxies.list 2> /dev/null rm -f /tmp/proxies.list 2> /dev/null
rm -f /tmp/proxies.list.bak 2> /dev/null

View File

@ -12,7 +12,7 @@ if [ "$(has_value BLOCK_REFERRER yes)" = "" ] ; then
fi fi
# save old conf # save old conf
cp /etc/nginx/referrers.list /cache cp /etc/nginx/referrers.list /tmp/referrers.list.bak
# generate new conf # generate new conf
BLACKLIST="$(curl -s https://raw.githubusercontent.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker/master/_generator_lists/bad-referrers.list | sed 's:\.:%\.:g;s:\-:%\-:g')" BLACKLIST="$(curl -s https://raw.githubusercontent.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker/master/_generator_lists/bad-referrers.list | sed 's:\.:%\.:g;s:\-:%\-:g')"
@ -34,23 +34,24 @@ fi
# check number of lines # check number of lines
lines="$(wc -l /tmp/referrers.list | cut -d ' ' -f 1)" lines="$(wc -l /tmp/referrers.list | cut -d ' ' -f 1)"
if [ "$lines" -gt 1 ] ; then if [ "$lines" -gt 1 ] ; then
mv /tmp/referrers.list /etc/nginx/referrers.list cp /tmp/referrers.list /etc/nginx/referrers.list
job_log "[BLACKLIST] referrers list updated ($lines entries)" job_log "[BLACKLIST] referrers list updated ($lines entries)"
if [ "$RELOAD" != "" ] ; then if [ "$RELOAD" != "" ] ; then
$RELOAD > /dev/null 2>&1 $RELOAD > /dev/null 2>&1
if [ "$?" -eq 0 ] ; then if [ "$?" -eq 0 ] ; then
cp /etc/nginx/referrers.list /cache cp /tmp/referrers.list /cache
job_log "[NGINX] successfull nginx reload after referrers list update" job_log "[NGINX] successfull nginx reload after referrers list update"
else else
cp /cache/referrers.list /etc/nginx #cp /tmp/referrers.list.bak /etc/nginx
job_log "[NGINX] failed nginx reload after referrers list update fallback to old list" job_log "[NGINX] failed nginx reload after referrers list update fallback to old list"
$RELOAD > /dev/null 2>&1 $RELOAD > /dev/null 2>&1
fi fi
else else
cp /etc/nginx/referrers.list /cache cp /tmp/referrers.list /cache
fi fi
else else
job_log "[BLACKLIST] can't update referrers list" job_log "[BLACKLIST] can't update referrers list"
fi fi
rm -f /tmp/referrers.list 2> /dev/null rm -f /tmp/referrers.list 2> /dev/null
rm -f /tmp/referrers.list.bak 2> /dev/null

View File

@ -12,7 +12,7 @@ if [ "$(has_value BLOCK_USER_AGENT yes)" = "" ] ; then
fi fi
# save old conf # save old conf
cp /etc/nginx/user-agents.list /cache cp /etc/nginx/user-agents.list /tmp/user-agents.list.bak
# generate new conf # generate new conf
BLACKLIST="$( (curl -s https://raw.githubusercontent.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker/master/_generator_lists/bad-user-agents.list ; curl -s https://raw.githubusercontent.com/JayBizzle/Crawler-Detect/master/raw/Crawlers.txt) | sort -u | sed 's:\\ : :g;s:\\\.:%\.:g;s:\\\\:\\:g;s:\\/:/:g;s:\-:%\-:g')" BLACKLIST="$( (curl -s https://raw.githubusercontent.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker/master/_generator_lists/bad-user-agents.list ; curl -s https://raw.githubusercontent.com/JayBizzle/Crawler-Detect/master/raw/Crawlers.txt) | sort -u | sed 's:\\ : :g;s:\\\.:%\.:g;s:\\\\:\\:g;s:\\/:/:g;s:\-:%\-:g')"
@ -34,23 +34,24 @@ fi
# check number of lines # check number of lines
lines="$(wc -l /tmp/user-agents.list | cut -d ' ' -f 1)" lines="$(wc -l /tmp/user-agents.list | cut -d ' ' -f 1)"
if [ "$lines" -gt 1 ] ; then if [ "$lines" -gt 1 ] ; then
mv /tmp/user-agents.list /etc/nginx/user-agents.list cp /tmp/user-agents.list /etc/nginx/user-agents.list
job_log "[BLACKLIST] user-agent list updated ($lines entries)" job_log "[BLACKLIST] user-agent list updated ($lines entries)"
if [ "$RELOAD" != "" ] ; then if [ "$RELOAD" != "" ] ; then
$RELOAD > /dev/null 2>&1 $RELOAD > /dev/null 2>&1
if [ "$?" -eq 0 ] ; then if [ "$?" -eq 0 ] ; then
cp /etc/nginx/user-agents.list /cache cp /tmp/user-agents.list /cache
job_log "[NGINX] successfull nginx reload after user-agent list update" job_log "[NGINX] successfull nginx reload after user-agent list update"
else else
cp /cache/user-agents.list /etc/nginx #cp /tmp/user-agents.list.bak /etc/nginx
job_log "[NGINX] failed nginx reload after user-agent list update fallback to old list" job_log "[NGINX] failed nginx reload after user-agent list update fallback to old list"
$RELOAD > /dev/null 2>&1 $RELOAD > /dev/null 2>&1
fi fi
else else
cp /etc/nginx/user-agents.list /cache cp /tmp/user-agents.list /cache
fi fi
else else
job_log "[BLACKLIST] can't update user-agent list" job_log "[BLACKLIST] can't update user-agent list"
fi fi
rm -f /tmp/user-agents.list 2> /dev/null rm -f /tmp/user-agents.list 2> /dev/null
rm -f /tmp/user-agents.list.bak 2> /dev/null

View File

@ -884,7 +884,7 @@
"env": "REMOTE_PHP", "env": "REMOTE_PHP",
"id": "remote-php", "id": "remote-php",
"label": "Remote php", "label": "Remote php",
"regex": "^([a-z\\-0-9]+\\.?)*$", "regex": "^([a-z\\-0-9\\_]+\\.?)*$",
"type": "text" "type": "text"
}, },
{ {