diff --git a/.version b/.version index b0e185b74..5404e7292 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -2.9.18 +2.9.19 diff --git a/README.md b/README.md index a97d3ba87..80393647a 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,13 @@



- + - - Gitter - - - Reddit -

This project comes as a pre-built docker image that enables you to easily forward to your websites @@ -80,6 +74,10 @@ services: ```bash docker-compose up -d + +# If using docker-compose-plugin +docker compose up -d + ``` 4. Log in to the Admin UI @@ -100,433 +98,12 @@ Immediately after logging in with this default user you will be asked to modify ## Contributors -Special thanks to the following contributors: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
chaptergy -
-
- - -
Kyle Klaus -
-
- - -
ƬHE ЯAW -
-
- - -
Spencer -
-
- - -
Xantios Krugor -
-
- - -
David Panesso -
-
- - -
IronTooch -
-
- - -
Damiano -
-
- - -
Russ -
-
- - -
Marcelo Castagna -
-
- - -
Steven Harris -
-
- - -
Jocelyn Le Sage -
-
- - -
Carl Mercier -
-
- - -
Paul Mansfield -
-
- - -
OhHeyAlan -
-
- - -
Carl Sutton -
-
- - -
Gergő Törcsvári -
-
- - -
vrenjith -
-
- - -
David Rivera -
-
- - -
Jaap-Jan de Wit -
-
- - -
James Morgan -
-
- - -
Sebastian Valle -
-
- - -
Philip Mooney -
-
- - -
WaterCalm -
-
- - -
lebrou34 -
-
- - -
Mário Franco -
-
- - -
Kyle Harding -
-
- - -
Alex Graber -
-
- - -
MooBaloo -
-
- - -
Shuro -
-
- - -
Loris Bergeron -
-
- - -
hepelayo -
-
- - -
Jonas Leder -
-
- - -
Bastian Stegmann -
-
- - -
Stealthii -
-
- - -
THEGamingninja -
-
- - -
Italo Borssatto -
-
- - -
Gurjinder Singh -
-
- - -
David Dosoudil -
-
- - -
ijaron -
-
- - -
Niels Bouma -
-
- - -
Orko Garai -
-
- - -
Filippo Baruffaldi -
-
- - -
Bikramjeet Singh -
-
- - -
Razvan Stoica -
-
- - -
RBXII3 -
-
- - -
demize -
-
- - -
PUP-Loki -
-
- - -
Daniel Sörlöv -
-
- - -
Theyooo -
-
- - -
Justin Peacock -
-
- - -
Chris Tracy -
-
- - -
Fuechslein -
-
- - -
Amir Zarrinkafsh -
-
- - -
gabbe -
-
- - -
bmbvenom -
-
- - -
Florian Meinicke -
-
- - -
Rahul Somasundaram -
-
- - -
Björn Heinrichs -
-
- - -
Josh Byrnes -
-
- - -
bergi9 -
-
- - -
luoweihua7 -
-
- - -
Tobias Kneidl -
-
- - -
Pius Walter -
-
- - -
Troy Kelly -
-
- - -
Ivan Kristianto -
-
- - -
Omer Cohen -
-
- - +Special thanks to [all of our contributors](https://github.com/NginxProxyManager/nginx-proxy-manager/graphs/contributors). + + +## Getting Support + +1. [Found a bug?](https://github.com/NginxProxyManager/nginx-proxy-manager/issues) +2. [Discussions](https://github.com/NginxProxyManager/nginx-proxy-manager/discussions) +3. [Development Gitter](https://gitter.im/nginx-proxy-manager/community) +4. [Reddit](https://reddit.com/r/nginxproxymanager) diff --git a/backend/internal/certificate.js b/backend/internal/certificate.js index 7c8fddeea..d6b72f577 100644 --- a/backend/internal/certificate.js +++ b/backend/internal/certificate.js @@ -874,7 +874,12 @@ const internalCertificate = { // Escape single quotes and backslashes const escapedCredentials = certificate.meta.dns_provider_credentials.replaceAll('\'', '\\\'').replaceAll('\\', '\\\\'); const credentialsCmd = 'mkdir -p /etc/letsencrypt/credentials 2> /dev/null; echo \'' + escapedCredentials + '\' > \'' + credentialsLocation + '\' && chmod 600 \'' + credentialsLocation + '\''; - const prepareCmd = 'pip install ' + dns_plugin.package_name + (dns_plugin.version_requirement || '') + ' ' + dns_plugin.dependencies; + let prepareCmd = 'pip install ' + dns_plugin.package_name + (dns_plugin.version_requirement || '') + ' ' + dns_plugin.dependencies; + + // Special case for cloudflare + if (dns_plugin.package_name === 'certbot-dns-cloudflare') { + prepareCmd = 'pip install certbot-dns-cloudflare --index-url https://www.piwheels.org/simple --prefer-binary'; + } // Whether the plugin has a ---credentials argument const hasConfigArg = certificate.meta.dns_provider !== 'route53'; diff --git a/backend/setup.js b/backend/setup.js index 47fd1e7b0..239c8c0bb 100644 --- a/backend/setup.js +++ b/backend/setup.js @@ -169,18 +169,23 @@ const setupCertbotPlugins = () => { .andWhere('provider', 'letsencrypt') .then((certificates) => { if (certificates && certificates.length) { - let plugins = []; - let promises = []; + let plugins = []; + let promises = []; + let install_cloudflare_plugin = false; certificates.map(function (certificate) { if (certificate.meta && certificate.meta.dns_challenge === true) { - const dns_plugin = dns_plugins[certificate.meta.dns_provider]; - const packages_to_install = `${dns_plugin.package_name}${dns_plugin.version_requirement || ''} ${dns_plugin.dependencies}`; + const dns_plugin = dns_plugins[certificate.meta.dns_provider]; - if (plugins.indexOf(packages_to_install) === -1) plugins.push(packages_to_install); + if (dns_plugin.package_name === 'certbot-dns-cloudflare') { + install_cloudflare_plugin = true; + } else { + const packages_to_install = `${dns_plugin.package_name}${dns_plugin.version_requirement || ''} ${dns_plugin.dependencies}`; + if (plugins.indexOf(packages_to_install) === -1) plugins.push(packages_to_install); + } // Make sure credentials file exists - const credentials_loc = '/etc/letsencrypt/credentials/credentials-' + certificate.id; + const credentials_loc = '/etc/letsencrypt/credentials/credentials-' + certificate.id; // Escape single quotes and backslashes const escapedCredentials = certificate.meta.dns_provider_credentials.replaceAll('\'', '\\\'').replaceAll('\\', '\\\\'); const credentials_cmd = '[ -f \'' + credentials_loc + '\' ] || { mkdir -p /etc/letsencrypt/credentials 2> /dev/null; echo \'' + escapedCredentials + '\' > \'' + credentials_loc + '\' && chmod 600 \'' + credentials_loc + '\'; }'; @@ -193,10 +198,14 @@ const setupCertbotPlugins = () => { promises.push(utils.exec(install_cmd)); } + if (install_cloudflare_plugin) { + promises.push(utils.exec('pip install certbot-dns-cloudflare --index-url https://www.piwheels.org/simple --prefer-binary')); + } + if (promises.length) { return Promise.all(promises) - .then(() => { - logger.info('Added Certbot plugins ' + plugins.join(', ')); + .then(() => { + logger.info('Added Certbot plugins ' + plugins.join(', ')); }); } } diff --git a/docker/rootfs/etc/cont-init.d/01_s6-secret-init.sh b/docker/rootfs/etc/cont-init.d/01_s6-secret-init.sh index f145807ab..7a2e2d02d 100644 --- a/docker/rootfs/etc/cont-init.d/01_s6-secret-init.sh +++ b/docker/rootfs/etc/cont-init.d/01_s6-secret-init.sh @@ -2,7 +2,7 @@ # ref: https://github.com/linuxserver/docker-baseimage-alpine/blob/master/root/etc/cont-init.d/01-envfile # in s6, environmental variables are written as text files for s6 to monitor -# seach through full-path filenames for files ending in "__FILE" +# search through full-path filenames for files ending in "__FILE" for FILENAME in $(find /var/run/s6/container_environment/ | grep "__FILE$"); do echo "[secret-init] Evaluating ${FILENAME##*/} ..." diff --git a/docker/rootfs/etc/nginx/conf.d/include/assets.conf b/docker/rootfs/etc/nginx/conf.d/include/assets.conf index e95c2e8b7..b7037343d 100644 --- a/docker/rootfs/etc/nginx/conf.d/include/assets.conf +++ b/docker/rootfs/etc/nginx/conf.d/include/assets.conf @@ -1,4 +1,4 @@ -location ~* ^.*\.(css|js|jpe?g|gif|png|woff|eot|ttf|svg|ico|css\.map|js\.map)$ { +location ~* ^.*\.(css|js|jpe?g|gif|png|webp|woff|eot|ttf|svg|ico|css\.map|js\.map)$ { if_modified_since off; # use the public cache diff --git a/docker/rootfs/etc/nginx/conf.d/include/proxy.conf b/docker/rootfs/etc/nginx/conf.d/include/proxy.conf index fcaaf0038..d346c4ef3 100644 --- a/docker/rootfs/etc/nginx/conf.d/include/proxy.conf +++ b/docker/rootfs/etc/nginx/conf.d/include/proxy.conf @@ -2,7 +2,7 @@ add_header X-Served-By $host; proxy_set_header Host $host; proxy_set_header X-Forwarded-Scheme $scheme; proxy_set_header X-Forwarded-Proto $scheme; -proxy_set_header X-Forwarded-For $remote_addr; +proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_pass $forward_scheme://$server:$port$request_uri; diff --git a/docker/rootfs/etc/services.d/nginx/run b/docker/rootfs/etc/services.d/nginx/run index 51ca5ea18..b5b66f0d6 100755 --- a/docker/rootfs/etc/services.d/nginx/run +++ b/docker/rootfs/etc/services.d/nginx/run @@ -24,8 +24,12 @@ chown root /tmp/nginx # Dynamically generate resolvers file, if resolver is IPv6, enclose in `[]` # thanks @tfmm -echo resolver "$(awk 'BEGIN{ORS=" "} $1=="nameserver" { sub(/%.*$/,"",$2); print ($2 ~ ":")? "["$2"]": $2}' /etc/resolv.conf) valid=10s;" > /etc/nginx/conf.d/include/resolvers.conf - +if [ "$DISABLE_IPV6" == "true" ] || [ "$DISABLE_IPV6" == "on" ] || [ "$DISABLE_IPV6" == "1" ] || [ "$DISABLE_IPV6" == "yes" ]; +then + echo resolver "$(awk 'BEGIN{ORS=" "} $1=="nameserver" { sub(/%.*$/,"",$2); print ($2 ~ ":")? "["$2"]": $2}' /etc/resolv.conf) ipv6=off valid=10s;" > /etc/nginx/conf.d/include/resolvers.conf +else + echo resolver "$(awk 'BEGIN{ORS=" "} $1=="nameserver" { sub(/%.*$/,"",$2); print ($2 ~ ":")? "["$2"]": $2}' /etc/resolv.conf) valid=10s;" > /etc/nginx/conf.d/include/resolvers.conf +fi # Generate dummy self-signed certificate. if [ ! -f /data/nginx/dummycert.pem ] || [ ! -f /data/nginx/dummykey.pem ] then diff --git a/docs/advanced-config/README.md b/docs/advanced-config/README.md index c7b51a846..78b9654d5 100644 --- a/docs/advanced-config/README.md +++ b/docs/advanced-config/README.md @@ -18,8 +18,8 @@ services running on this Docker host: ```yml networks: default: - external: - name: scoobydoo + external: true + name: scoobydoo ``` Let's look at a Portainer example: @@ -38,8 +38,8 @@ services: networks: default: - external: - name: scoobydoo + external: true + name: scoobydoo ``` Now in the NPM UI you can create a proxy host with `portainer` as the hostname, diff --git a/docs/third-party/README.md b/docs/third-party/README.md index 9b533ef12..2961f34e6 100644 --- a/docs/third-party/README.md +++ b/docs/third-party/README.md @@ -1,6 +1,6 @@ # Third Party -As this software gains popularity it's common to see it integrated with other platforms. Please be aware that unless specifically mentioned in the documenation of those +As this software gains popularity it's common to see it integrated with other platforms. Please be aware that unless specifically mentioned in the documentation of those integrations, they are *not supported* by me. Known integrations: diff --git a/docs/yarn.lock b/docs/yarn.lock index 83ec845a6..9d0cdca02 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -5977,9 +5977,9 @@ loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4 json5 "^1.0.1" loader-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" - integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + version "2.0.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.3.tgz#d4b15b8504c63d1fc3f2ade52d41bc8459d6ede1" + integrity sha512-THWqIsn8QRnvLl0shHYVBN9syumU8pYWEHPTmkiVGd+7K5eFNVSY6AJhRvgGF70gg1Dz+l/k8WicvFCxdEs60A== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" diff --git a/frontend/js/login/ui/login.ejs b/frontend/js/login/ui/login.ejs index b6f52b7a9..693bc050c 100644 --- a/frontend/js/login/ui/login.ejs +++ b/frontend/js/login/ui/login.ejs @@ -17,7 +17,7 @@
<%- i18n('login', 'title') %>
- +
diff --git a/global/certbot-dns-plugins.js b/global/certbot-dns-plugins.js index 60f39232f..38026e457 100644 --- a/global/certbot-dns-plugins.js +++ b/global/certbot-dns-plugins.js @@ -202,6 +202,25 @@ dns_dnspod_api_token = "id,key"`, full_plugin_name: 'dns-dnspod', }, //####################################################// + domainoffensive: { + display_name: 'DomainOffensive (do.de)', + package_name: 'certbot-dns-do', + version_requirement: '~=0.31.0', + dependencies: '', + credentials: 'dns_do_api_token = YOUR_DO_DE_AUTH_TOKEN', + full_plugin_name: 'dns-do', + }, + //####################################################// + domeneshop: { + display_name: 'Domeneshop', + package_name: 'certbot-dns-domeneshop', + version_requirement: '~=0.2.8', + dependencies: '', + credentials: `dns_domeneshop_client_token=YOUR_DOMENESHOP_CLIENT_TOKEN +dns_domeneshop_client_secret=YOUR_DOMENESHOP_CLIENT_SECRET`, + full_plugin_name: 'dns-domeneshop', + }, + //####################################################// dynu: { display_name: 'Dynu', package_name: 'certbot-dns-dynu', @@ -359,6 +378,16 @@ dns_luadns_token = 0123456789abcdef0123456789abcdef`, full_plugin_name: 'dns-luadns', }, //####################################################// + namecheap: { + display_name: 'Namecheap', + package_name: 'certbot-dns-namecheap', + version_requirement: '~=1.0.0', + dependencies: '', + credentials: `dns_namecheap_username = 123456 +dns_namecheap_api_key = 0123456789abcdef0123456789abcdef01234567`, + full_plugin_name: 'dns-namecheap', + }, + //####################################################// netcup: { display_name: 'netcup', package_name: 'certbot-dns-netcup', diff --git a/scripts/docs-upload b/scripts/docs-upload index ea71fb8ea..75d44a670 100755 --- a/scripts/docs-upload +++ b/scripts/docs-upload @@ -12,7 +12,7 @@ ALL_FILES=$(find . -follow) for FILE in $ALL_FILES do - # remove preceeding ./ + # remove preceding ./ FILE=$(echo "$FILE" | sed -E "s/\.\///g") echo '=======================================' echo "FILE: $FILE"