mirror of
https://github.com/xiaoxinpro/nginx-proxy-manager-zh.git
synced 2025-01-22 12:58:13 -05:00
Adds env var to set certbot acme server
this is required for test suite to use dns certbot request without talking to live or staging letsencrypt servers or production level dns providers. This is a backwards port from the v3 branch and opens the door for a full certificate cypress test
This commit is contained in:
parent
f48e1b46a8
commit
929ac3bd7c
@ -20,6 +20,7 @@ const internalHost = require('./host');
|
|||||||
|
|
||||||
|
|
||||||
const letsencryptStaging = config.useLetsencryptStaging();
|
const letsencryptStaging = config.useLetsencryptStaging();
|
||||||
|
const letsencryptServer = config.useLetsencryptServer();
|
||||||
const letsencryptConfig = '/etc/letsencrypt.ini';
|
const letsencryptConfig = '/etc/letsencrypt.ini';
|
||||||
const certbotCommand = 'certbot';
|
const certbotCommand = 'certbot';
|
||||||
|
|
||||||
@ -838,7 +839,8 @@ const internalCertificate = {
|
|||||||
'--email "' + certificate.meta.letsencrypt_email + '" ' +
|
'--email "' + certificate.meta.letsencrypt_email + '" ' +
|
||||||
'--preferred-challenges "dns,http" ' +
|
'--preferred-challenges "dns,http" ' +
|
||||||
'--domains "' + certificate.domain_names.join(',') + '" ' +
|
'--domains "' + certificate.domain_names.join(',') + '" ' +
|
||||||
(letsencryptStaging ? '--staging' : '');
|
(letsencryptStaging ? '--staging' : '') +
|
||||||
|
(letsencryptServer !== null ? `--server '${letsencryptServer}'` : '');
|
||||||
|
|
||||||
logger.info('Command:', cmd);
|
logger.info('Command:', cmd);
|
||||||
|
|
||||||
|
@ -180,5 +180,15 @@ module.exports = {
|
|||||||
*/
|
*/
|
||||||
useLetsencryptStaging: function () {
|
useLetsencryptStaging: function () {
|
||||||
return !!process.env.LE_STAGING;
|
return !!process.env.LE_STAGING;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns {string|null}
|
||||||
|
*/
|
||||||
|
useLetsencryptServer: function () {
|
||||||
|
if (process.env.LE_SERVER) {
|
||||||
|
return process.env.LE_SERVER;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
|
|
||||||
# This file assumes that the frontend has been built using ./scripts/frontend-build
|
# This file assumes that the frontend has been built using ./scripts/frontend-build
|
||||||
|
|
||||||
|
FROM nginxproxymanager/testca AS testca
|
||||||
|
FROM letsencrypt/pebble AS pebbleca
|
||||||
FROM nginxproxymanager/nginx-full:certbot-node
|
FROM nginxproxymanager/nginx-full:certbot-node
|
||||||
|
|
||||||
ARG TARGETPLATFORM
|
ARG TARGETPLATFORM
|
||||||
@ -45,6 +47,8 @@ RUN yarn install \
|
|||||||
|
|
||||||
# add late to limit cache-busting by modifications
|
# add late to limit cache-busting by modifications
|
||||||
COPY docker/rootfs /
|
COPY docker/rootfs /
|
||||||
|
COPY --from=pebbleca /test/certs/pebble.minica.pem /etc/ssl/certs/pebble.minica.pem
|
||||||
|
COPY --from=testca /home/step/certs/root_ca.crt /etc/ssl/certs/NginxProxyManager.crt
|
||||||
|
|
||||||
# Remove frontend service not required for prod, dev nginx config as well
|
# Remove frontend service not required for prod, dev nginx config as well
|
||||||
RUN rm -rf /etc/s6-overlay/s6-rc.d/user/contents.d/frontend /etc/nginx/conf.d/dev.conf \
|
RUN rm -rf /etc/s6-overlay/s6-rc.d/user/contents.d/frontend /etc/nginx/conf.d/dev.conf \
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
|
FROM nginxproxymanager/testca AS testca
|
||||||
|
FROM letsencrypt/pebble AS pebbleca
|
||||||
FROM nginxproxymanager/nginx-full:certbot-node
|
FROM nginxproxymanager/nginx-full:certbot-node
|
||||||
LABEL maintainer="Jamie Curnow <jc@jc21.com>"
|
LABEL maintainer="Jamie Curnow <jc@jc21.com>"
|
||||||
|
|
||||||
# See: https://github.com/just-containers/s6-overlay/blob/master/README.md
|
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
||||||
|
|
||||||
ENV SUPPRESS_NO_CONFIG_WARNING=1 \
|
ENV SUPPRESS_NO_CONFIG_WARNING=1 \
|
||||||
S6_BEHAVIOUR_IF_STAGE2_FAILS=1 \
|
S6_BEHAVIOUR_IF_STAGE2_FAILS=1 \
|
||||||
S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0 \
|
S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0 \
|
||||||
@ -17,17 +20,20 @@ RUN echo "fs.file-max = 65535" > /etc/sysctl.conf \
|
|||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
# Task
|
# Task
|
||||||
RUN cd /usr \
|
WORKDIR /usr
|
||||||
&& curl -sL https://taskfile.dev/install.sh | sh \
|
RUN curl -sL https://taskfile.dev/install.sh | sh
|
||||||
&& cd /root
|
WORKDIR /root
|
||||||
|
|
||||||
COPY rootfs /
|
COPY rootfs /
|
||||||
RUN rm -f /etc/nginx/conf.d/production.conf
|
|
||||||
RUN chmod 644 /etc/logrotate.d/nginx-proxy-manager
|
|
||||||
|
|
||||||
# s6 overlay
|
|
||||||
COPY scripts/install-s6 /tmp/install-s6
|
COPY scripts/install-s6 /tmp/install-s6
|
||||||
RUN /tmp/install-s6 "${TARGETPLATFORM}" && rm -f /tmp/install-s6
|
RUN rm -f /etc/nginx/conf.d/production.conf \
|
||||||
|
&& chmod 644 /etc/logrotate.d/nginx-proxy-manager \
|
||||||
|
&& /tmp/install-s6 "${TARGETPLATFORM}" \
|
||||||
|
&& rm -f /tmp/install-s6
|
||||||
|
|
||||||
|
# Certs for testing purposes
|
||||||
|
COPY --from=pebbleca /test/certs/pebble.minica.pem /etc/ssl/certs/pebble.minica.pem
|
||||||
|
COPY --from=testca /home/step/certs/root_ca.crt /etc/ssl/certs/NginxProxyManager.crt
|
||||||
|
|
||||||
EXPOSE 80 81 443
|
EXPOSE 80 81 443
|
||||||
ENTRYPOINT [ "/init" ]
|
ENTRYPOINT [ "/init" ]
|
||||||
|
@ -9,6 +9,9 @@ services:
|
|||||||
environment:
|
environment:
|
||||||
DEBUG: 'true'
|
DEBUG: 'true'
|
||||||
FORCE_COLOR: 1
|
FORCE_COLOR: 1
|
||||||
|
# Required for DNS Certificate provisioning in CI
|
||||||
|
LE_SERVER: 'https://ca.internal/acme/acme/directory'
|
||||||
|
REQUESTS_CA_BUNDLE: '/etc/ssl/certs/NginxProxyManager.crt'
|
||||||
volumes:
|
volumes:
|
||||||
- 'npm_data_ci:/data'
|
- 'npm_data_ci:/data'
|
||||||
- 'npm_le_ci:/etc/letsencrypt'
|
- 'npm_le_ci:/etc/letsencrypt'
|
||||||
|
@ -33,12 +33,20 @@ services:
|
|||||||
DB_MYSQL_NAME: 'npm'
|
DB_MYSQL_NAME: 'npm'
|
||||||
# DB_SQLITE_FILE: "/data/database.sqlite"
|
# DB_SQLITE_FILE: "/data/database.sqlite"
|
||||||
# DISABLE_IPV6: "true"
|
# DISABLE_IPV6: "true"
|
||||||
|
# Required for DNS Certificate provisioning testing:
|
||||||
|
LE_SERVER: 'https://ca.internal/acme/acme/directory'
|
||||||
|
REQUESTS_CA_BUNDLE: '/etc/ssl/certs/NginxProxyManager.crt'
|
||||||
volumes:
|
volumes:
|
||||||
- npm_data:/data
|
- npm_data:/data
|
||||||
- le_data:/etc/letsencrypt
|
- le_data:/etc/letsencrypt
|
||||||
|
- './dev/resolv.conf:/etc/resolv.conf:ro'
|
||||||
- ../backend:/app
|
- ../backend:/app
|
||||||
- ../frontend:/app/frontend
|
- ../frontend:/app/frontend
|
||||||
- ../global:/app/global
|
- ../global:/app/global
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "/usr/bin/check-health"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 3s
|
||||||
depends_on:
|
depends_on:
|
||||||
- db
|
- db
|
||||||
working_dir: /app
|
working_dir: /app
|
||||||
@ -58,6 +66,23 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
- db_data:/var/lib/mysql
|
- db_data:/var/lib/mysql
|
||||||
|
|
||||||
|
stepca:
|
||||||
|
image: jc21/testca
|
||||||
|
volumes:
|
||||||
|
- './dev/resolv.conf:/etc/resolv.conf:ro'
|
||||||
|
- '/etc/localtime:/etc/localtime:ro'
|
||||||
|
networks:
|
||||||
|
nginx_proxy_manager:
|
||||||
|
aliases:
|
||||||
|
- ca.internal
|
||||||
|
|
||||||
|
dnsrouter:
|
||||||
|
image: jc21/dnsrouter
|
||||||
|
volumes:
|
||||||
|
- ./dev/dnsrouter-config.json.tmp:/dnsrouter-config.json:ro
|
||||||
|
networks:
|
||||||
|
- nginx_proxy_manager
|
||||||
|
|
||||||
swagger:
|
swagger:
|
||||||
image: swaggerapi/swagger-ui:latest
|
image: swaggerapi/swagger-ui:latest
|
||||||
container_name: npm_swagger
|
container_name: npm_swagger
|
||||||
@ -74,12 +99,71 @@ services:
|
|||||||
container_name: npm_squid
|
container_name: npm_squid
|
||||||
volumes:
|
volumes:
|
||||||
- './dev/squid.conf:/etc/squid/squid.conf:ro'
|
- './dev/squid.conf:/etc/squid/squid.conf:ro'
|
||||||
|
- './dev/resolv.conf:/etc/resolv.conf:ro'
|
||||||
- '/etc/localtime:/etc/localtime:ro'
|
- '/etc/localtime:/etc/localtime:ro'
|
||||||
networks:
|
networks:
|
||||||
- nginx_proxy_manager
|
- nginx_proxy_manager
|
||||||
ports:
|
ports:
|
||||||
- 8128:3128
|
- 8128:3128
|
||||||
|
|
||||||
|
pdns:
|
||||||
|
image: pschiffe/pdns-mysql
|
||||||
|
volumes:
|
||||||
|
- '/etc/localtime:/etc/localtime:ro'
|
||||||
|
environment:
|
||||||
|
PDNS_master: 'yes'
|
||||||
|
PDNS_api: 'yes'
|
||||||
|
PDNS_api_key: 'npm'
|
||||||
|
PDNS_webserver: 'yes'
|
||||||
|
PDNS_webserver_address: '0.0.0.0'
|
||||||
|
PDNS_webserver_password: 'npm'
|
||||||
|
PDNS_webserver-allow-from: '127.0.0.0/8,192.0.0.0/8,10.0.0.0/8,172.0.0.0/8'
|
||||||
|
PDNS_version_string: 'anonymous'
|
||||||
|
PDNS_default_ttl: 1500
|
||||||
|
PDNS_allow_axfr_ips: '127.0.0.0/8,192.0.0.0/8,10.0.0.0/8,172.0.0.0/8'
|
||||||
|
PDNS_gmysql_host: pdns-db
|
||||||
|
PDNS_gmysql_port: 3306
|
||||||
|
PDNS_gmysql_user: pdns
|
||||||
|
PDNS_gmysql_password: pdns
|
||||||
|
PDNS_gmysql_dbname: pdns
|
||||||
|
depends_on:
|
||||||
|
- pdns-db
|
||||||
|
networks:
|
||||||
|
nginx_proxy_manager:
|
||||||
|
aliases:
|
||||||
|
- ns1.pdns
|
||||||
|
- ns2.pdns
|
||||||
|
|
||||||
|
pdns-db:
|
||||||
|
image: mariadb
|
||||||
|
environment:
|
||||||
|
MYSQL_ROOT_PASSWORD: 'pdns'
|
||||||
|
MYSQL_DATABASE: 'pdns'
|
||||||
|
MYSQL_USER: 'pdns'
|
||||||
|
MYSQL_PASSWORD: 'pdns'
|
||||||
|
volumes:
|
||||||
|
- 'pdns_mysql:/var/lib/mysql'
|
||||||
|
- '/etc/localtime:/etc/localtime:ro'
|
||||||
|
- './dev/pdns-db.sql:/docker-entrypoint-initdb.d/01_init.sql:ro'
|
||||||
|
networks:
|
||||||
|
- nginx_proxy_manager
|
||||||
|
|
||||||
|
cypress:
|
||||||
|
image: "npm_dev_cypress"
|
||||||
|
build:
|
||||||
|
context: ../
|
||||||
|
dockerfile: test/cypress/Dockerfile
|
||||||
|
environment:
|
||||||
|
HTTP_PROXY: 'squid:3128'
|
||||||
|
HTTPS_PROXY: 'squid:3128'
|
||||||
|
volumes:
|
||||||
|
- '../test/results:/results'
|
||||||
|
- './dev/resolv.conf:/etc/resolv.conf:ro'
|
||||||
|
- '/etc/localtime:/etc/localtime:ro'
|
||||||
|
command: cypress run --browser chrome --config-file=cypress/config/ci.js
|
||||||
|
networks:
|
||||||
|
- nginx_proxy_manager
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
npm_data:
|
npm_data:
|
||||||
name: npm_core_data
|
name: npm_core_data
|
||||||
@ -87,6 +171,8 @@ volumes:
|
|||||||
name: npm_le_data
|
name: npm_le_data
|
||||||
db_data:
|
db_data:
|
||||||
name: npm_db_data
|
name: npm_db_data
|
||||||
|
pdns_mysql:
|
||||||
|
name: npm_pdns_mysql
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
nginx_proxy_manager:
|
nginx_proxy_manager:
|
||||||
|
@ -15,3 +15,13 @@ COMPOSE_PROJECT_NAME="npmdev"
|
|||||||
COMPOSE_FILE="docker/docker-compose.dev.yml"
|
COMPOSE_FILE="docker/docker-compose.dev.yml"
|
||||||
|
|
||||||
export COMPOSE_FILE COMPOSE_PROJECT_NAME
|
export COMPOSE_FILE COMPOSE_PROJECT_NAME
|
||||||
|
|
||||||
|
# $1: container_name
|
||||||
|
get_container_ip () {
|
||||||
|
local container_name=$1
|
||||||
|
local container
|
||||||
|
local ip
|
||||||
|
container=$(docker-compose ps --all -q "${container_name}" | tail -n1)
|
||||||
|
ip=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$container")
|
||||||
|
echo "$ip"
|
||||||
|
}
|
||||||
|
13
scripts/cypress-dev
Executable file
13
scripts/cypress-dev
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
#!/bin/bash -e
|
||||||
|
|
||||||
|
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
. "$DIR/.common.sh"
|
||||||
|
|
||||||
|
# Ensure docker-compose exists
|
||||||
|
if hash docker-compose 2>/dev/null; then
|
||||||
|
cd "${DIR}/.."
|
||||||
|
rm -rf "$DIR/../test/results"
|
||||||
|
docker-compose up --build cypress
|
||||||
|
else
|
||||||
|
echo -e "${RED}❯ docker-compose command is not available${RESET}"
|
||||||
|
fi
|
@ -7,8 +7,43 @@ DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|||||||
if hash docker-compose 2>/dev/null; then
|
if hash docker-compose 2>/dev/null; then
|
||||||
cd "${DIR}/.."
|
cd "${DIR}/.."
|
||||||
echo -e "${BLUE}❯ ${CYAN}Starting Dev Stack ...${RESET}"
|
echo -e "${BLUE}❯ ${CYAN}Starting Dev Stack ...${RESET}"
|
||||||
|
echo -e "${BLUE}❯ $(docker-compose config)${RESET}"
|
||||||
|
|
||||||
docker-compose up -d --remove-orphans --force-recreate --build
|
# Bring up a stack, in steps so we can inject IPs everywhere
|
||||||
|
docker-compose up -d pdns pdns-db
|
||||||
|
PDNS_IP=$(get_container_ip "pdns")
|
||||||
|
echo -e "${BLUE}❯ ${YELLOW}PDNS IP is ${PDNS_IP}${RESET}"
|
||||||
|
|
||||||
|
# adjust the dnsrouter config
|
||||||
|
LOCAL_DNSROUTER_CONFIG="$DIR/../docker/dev/dnsrouter-config.json"
|
||||||
|
rm -rf "$LOCAL_DNSROUTER_CONFIG.tmp"
|
||||||
|
# IMPORTANT: changes to dnsrouter-config.json will affect this line:
|
||||||
|
jq --arg a "$PDNS_IP" '.servers[0].upstreams[1].upstream = $a' "$LOCAL_DNSROUTER_CONFIG" > "$LOCAL_DNSROUTER_CONFIG.tmp"
|
||||||
|
|
||||||
|
docker-compose up -d dnsrouter
|
||||||
|
DNSROUTER_IP=$(get_container_ip "dnsrouter")
|
||||||
|
echo -e "${BLUE}❯ ${YELLOW}DNS Router IP is ${DNSROUTER_IP}"
|
||||||
|
|
||||||
|
if [ "${DNSROUTER_IP:-}" = "" ]; then
|
||||||
|
echo -e "${RED}❯ ERROR: DNS Router IP is not set${RESET}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# mount the resolver
|
||||||
|
LOCAL_RESOLVE="$DIR/../docker/dev/resolv.conf"
|
||||||
|
rm -rf "${LOCAL_RESOLVE}"
|
||||||
|
printf "nameserver %s\noptions ndots:0" "${DNSROUTER_IP}" > "${LOCAL_RESOLVE}"
|
||||||
|
|
||||||
|
# bring up all remaining containers, except cypress!
|
||||||
|
docker-compose up -d --remove-orphans stepca squid
|
||||||
|
docker-compose pull db
|
||||||
|
docker-compose up -d --remove-orphans --pull=never fullstack
|
||||||
|
docker-compose up -d --remove-orphans swagger
|
||||||
|
|
||||||
|
# docker-compose up -d --remove-orphans --force-recreate --build
|
||||||
|
|
||||||
|
# wait for main container to be healthy
|
||||||
|
bash "$DIR/wait-healthy" "$(docker-compose ps --all -q fullstack)" 120
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo -e "${CYAN}Admin UI: http://127.0.0.1:3081${RESET}"
|
echo -e "${CYAN}Admin UI: http://127.0.0.1:3081${RESET}"
|
||||||
|
Loading…
Reference in New Issue
Block a user