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 @@
-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') %>
<%- i18n('str', 'email-address') %>
-
+
<%- i18n('str', 'password') %>
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"