Merge pull request #3866 from dokku/nginx-show-conf

Unify nginx config commands
This commit is contained in:
Jose Diaz-Gonzalez
2020-02-19 02:38:48 -05:00
committed by GitHub
13 changed files with 158 additions and 124 deletions

View File

@@ -32,7 +32,7 @@
### Additional information
- Container Inspect Output (if applicable) via `dokku ps:inspect APP_NAME`
- The nginx configuration (if applicable) via `dokku nginx:show-conf APP_NAME`
- The nginx configuration (if applicable) via `dokku nginx:show-config APP_NAME`
- Link to the exact repository being deployed (if possible/applicable):
- If a deploy is failing or behaving unexpectedly:
- Application name

View File

@@ -1,8 +1,8 @@
# 0.20.0 Migration Guide
## Deprecated command removal
## Removals
The following commands have been deprecated and were removed in this release.
The following commands were previously deprecated and were removed in this release.
- `apps`: Use `apps:list` instead.
- `certs`: Use `certs:report` instead.
@@ -13,3 +13,7 @@ The following commands have been deprecated and were removed in this release.
- `plugin`: Use `plugin:list` instead.
- `proxy`: Use `proxy:report` instead.
- `trace`: Use `trace:on` or `trace:off` instead.
## Deprecations
- `nginx:show-conf` has been deprecated in favor of `nginx:show-config`.

View File

@@ -8,8 +8,8 @@ nginx:build-config <app> # (Re)builds nginx config for given app
nginx:error-logs <app> [-t] # Show the nginx error logs for an application (-t follows)
nginx:report [<app>] [<flag>] # Displays a nginx report for one or more apps
nginx:set <app> <property> (<value>) # Set or clear an nginx property for an app
nginx:show-conf <app> # Display app nginx config
nginx:validate [<app>] [--clean] # Validates and optionally cleans up invalid nginx configurations
nginx:show-config <app> # Display app nginx config
nginx:validate-config [<app>] [--clean] # Validates and optionally cleans up invalid nginx configurations
```
## Binding to specific addresses
@@ -92,34 +92,34 @@ dokku nginx:build-config node-js-app
## Showing the nginx config
For debugging purposes, it may be useful to show the nginx config. This can be achieved via the `nginx:show-conf` command.
For debugging purposes, it may be useful to show the nginx config. This can be achieved via the `nginx:show-config` command.
```shell
dokku nginx:show-conf node-js-app
dokku nginx:show-config node-js-app
```
## Validating nginx configs
It may be desired to validate an nginx config outside of the deployment process. To do so, run the `nginx:validate` command. With no arguments, this will validate all app nginx configs, one at a time. A minimal wrapper nginx config is generated for each app's nginx config, upon which `nginx -t` will be run.
It may be desired to validate an nginx config outside of the deployment process. To do so, run the `nginx:validate-config` command. With no arguments, this will validate all app nginx configs, one at a time. A minimal wrapper nginx config is generated for each app's nginx config, upon which `nginx -t` will be run.
```shell
dokku nginx:validate
dokku nginx:validate-config
```
As app nginx configs are actually executed within a shared context, it is possible for an individual config to be invalid when being validated standalone but _also_ be valid within the global server context. As such, the exit code for the `nginx:validate` command is the exit code of `nginx -t` against the server's real nginx config.
As app nginx configs are actually executed within a shared context, it is possible for an individual config to be invalid when being validated standalone but _also_ be valid within the global server context. As such, the exit code for the `nginx:validate-config` command is the exit code of `nginx -t` against the server's real nginx config.
The `nginx:validate` command also takes an optional `--clean` flag. If specified, invalid nginx configs will be removed.
The `nginx:validate-config` command also takes an optional `--clean` flag. If specified, invalid nginx configs will be removed.
> Warning: Invalid app nginx config's will be removed _even if_ the config is valid in the global server context.
```shell
dokku nginx:validate --clean
dokku nginx:validate-config --clean
```
The `--clean` flag may also be specified for a given app:
```shell
dokku nginx:validate node-js-app --clean
dokku nginx:validate-config node-js-app --clean
```
## Customizing the nginx configuration

View File

@@ -0,0 +1,104 @@
#!/usr/bin/env bash
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/property-functions"
source "$PLUGIN_AVAILABLE_PATH/nginx-vhosts/functions"
cmd-nginx-report() {
declare desc="displays a nginx report for one or more apps"
declare cmd="nginx:report"
[[ "$1" == "$cmd" ]] && shift 1
declare APP="$1" INFO_FLAG="$2"
local INSTALLED_APPS=$(dokku_apps)
if [[ -n "$APP" ]] && [[ "$APP" == --* ]]; then
INFO_FLAG="$APP"
APP=""
fi
if [[ -z "$APP" ]] && [[ -z "$INFO_FLAG" ]]; then
INFO_FLAG="true"
fi
if [[ -z "$APP" ]]; then
for app in $INSTALLED_APPS; do
cmd-nginx-report-single "$app" "$INFO_FLAG" | tee || true
done
else
cmd-nginx-report-single "$APP" "$INFO_FLAG"
fi
}
cmd-nginx-report-single() {
declare APP="$1" INFO_FLAG="$2"
if [[ "$INFO_FLAG" == "true" ]]; then
INFO_FLAG=""
fi
verify_app_name "$APP"
local flag_map=(
"--nginx-bind-address-ipv4: $(fn-plugin-property-get-default "nginx" "$APP" "bind-address-ipv4" "")"
"--nginx-bind-address-ipv6: $(fn-plugin-property-get-default "nginx" "$APP" "bind-address-ipv6" "::")"
"--nginx-hsts: $(fn-plugin-property-get-default "nginx" "$APP" "hsts" "true")"
"--nginx-hsts-include-subdomains: $(fn-plugin-property-get-default "nginx" "$APP" "hsts-include-subdomains" "true")"
"--nginx-hsts-max-age: $(fn-plugin-property-get-default "nginx" "$APP" "hsts-max-age" "15724800")"
"--nginx-hsts-preload: $(fn-plugin-property-get-default "nginx" "$APP" "hsts-preload" "false")"
)
if [[ -z "$INFO_FLAG" ]]; then
dokku_log_info2_quiet "${APP} nginx information"
for flag in "${flag_map[@]}"; do
key="$(echo "${flag#--}" | cut -f1 -d' ' | tr - ' ')"
dokku_log_verbose "$(printf "%-30s %-25s" "${key^}" "${flag#*: }")"
done
else
local match=false
local value_exists=false
for flag in "${flag_map[@]}"; do
valid_flags="${valid_flags} $(echo "$flag" | cut -d':' -f1)"
if [[ "$flag" == "${INFO_FLAG}:"* ]]; then
value=${flag#*: }
size="${#value}"
if [[ "$size" -ne 0 ]]; then
echo "$value" && match=true && value_exists=true
else
match=true
fi
fi
done
[[ "$match" == "true" ]] || dokku_log_fail "Invalid flag passed, valid flags:${valid_flags}"
[[ "$value_exists" == "true" ]] || dokku_log_fail "not deployed"
fi
}
cmd-nginx-show-config() {
declare desc="display app nginx config"
declare cmd="nginx:show-config"
[[ "$1" == "$cmd" ]] && shift 1
if [[ "$1" == "nginx:show-conf" ]]; then
dokku_log_warn "Deprecated: Please use nginx:show-config"
shift 1
fi
declare APP="$1"
verify_app_name "$APP"
if [[ ! -f "$DOKKU_ROOT/$APP/nginx.conf" ]]; then
dokku_log_fail "No nginx.conf exists for $APP"
fi
cat "$DOKKU_ROOT/$APP/nginx.conf"
}
cmd-nginx-validate-config() {
declare desc="validates and optionally cleans up invalid nginx configurations"
declare cmd="nginx:validate-config"
[[ "$1" == "$cmd" ]] && shift 1
if [[ "$1" == "nginx:validate" ]]; then
dokku_log_warn "Deprecated: Please use nginx:validate-config"
shift 1
fi
declare APP="$1" FLAG="$2"
validate_nginx "$APP" "$FLAG"
}

View File

@@ -32,7 +32,7 @@ fn-help-content() {
nginx:error-logs <app> [-t], Show the nginx error logs for an application (-t follows)
nginx:report [<app>] [<flag>], Displays an nginx report for one or more apps
nginx:set <app> <property> (<value>), Set or clear an nginx property for an app
nginx:show-conf <app>, Display app nginx config
nginx:validate [<app>] [--clean], Validates and optionally cleans up invalid nginx configurations
nginx:show-config <app>, Display app nginx config
nginx:validate-config [<app>] [--clean], Validates and optionally cleans up invalid nginx configurations
help_content
}

View File

@@ -4,72 +4,6 @@ set -eo pipefail
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$PLUGIN_CORE_AVAILABLE_PATH/common/property-functions"
cmd-nginx-report() {
declare desc="displays a nginx report for one or more apps"
declare cmd="nginx:report"
[[ "$1" == "$cmd" ]] && shift 1
declare APP="$1" INFO_FLAG="$2"
local INSTALLED_APPS=$(dokku_apps)
if [[ -n "$APP" ]] && [[ "$APP" == --* ]]; then
INFO_FLAG="$APP"
APP=""
fi
if [[ -z "$APP" ]] && [[ -z "$INFO_FLAG" ]]; then
INFO_FLAG="true"
fi
if [[ -z "$APP" ]]; then
for app in $INSTALLED_APPS; do
cmd-nginx-report-single "$app" "$INFO_FLAG" | tee || true
done
else
cmd-nginx-report-single "$APP" "$INFO_FLAG"
fi
}
cmd-nginx-report-single() {
declare APP="$1" INFO_FLAG="$2"
if [[ "$INFO_FLAG" == "true" ]]; then
INFO_FLAG=""
fi
verify_app_name "$APP"
local flag_map=(
"--nginx-bind-address-ipv4: $(fn-plugin-property-get-default "nginx" "$APP" "bind-address-ipv4" "")"
"--nginx-bind-address-ipv6: $(fn-plugin-property-get-default "nginx" "$APP" "bind-address-ipv6" "::")"
"--nginx-hsts: $(fn-plugin-property-get-default "nginx" "$APP" "hsts" "true")"
"--nginx-hsts-include-subdomains: $(fn-plugin-property-get-default "nginx" "$APP" "hsts-include-subdomains" "true")"
"--nginx-hsts-max-age: $(fn-plugin-property-get-default "nginx" "$APP" "hsts-max-age" "15724800")"
"--nginx-hsts-preload: $(fn-plugin-property-get-default "nginx" "$APP" "hsts-preload" "false")"
)
if [[ -z "$INFO_FLAG" ]]; then
dokku_log_info2_quiet "${APP} nginx information"
for flag in "${flag_map[@]}"; do
key="$(echo "${flag#--}" | cut -f1 -d' ' | tr - ' ')"
dokku_log_verbose "$(printf "%-30s %-25s" "${key^}" "${flag#*: }")"
done
else
local match=false
local value_exists=false
for flag in "${flag_map[@]}"; do
valid_flags="${valid_flags} $(echo "$flag" | cut -d':' -f1)"
if [[ "$flag" == "${INFO_FLAG}:"* ]]; then
value=${flag#*: }
size="${#value}"
if [[ "$size" -ne 0 ]]; then
echo "$value" && match=true && value_exists=true
else
match=true
fi
fi
done
[[ "$match" == "true" ]] || dokku_log_fail "Invalid flag passed, valid flags:${valid_flags}"
[[ "$value_exists" == "true" ]] || dokku_log_fail "not deployed"
fi
}
fn-nginx-vhosts-manage-hsts() {
declare APP="$1" SSL_ENABLED="$2"
local HSTS="$(fn-plugin-property-get-default "nginx" "$APP" "hsts" "true")"

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env bash
source "$PLUGIN_AVAILABLE_PATH/nginx-vhosts/internal-functions"
source "$PLUGIN_AVAILABLE_PATH/nginx-vhosts/command-functions"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env bash
source "$PLUGIN_AVAILABLE_PATH/nginx-vhosts/functions"
source "$PLUGIN_AVAILABLE_PATH/nginx-vhosts/command-functions"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x

View File

@@ -2,19 +2,6 @@
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$PLUGIN_AVAILABLE_PATH/nginx-vhosts/command-functions"
cmd-nginx-show-conf() {
declare desc="display app nginx config"
declare cmd="nginx:show-conf"
[[ "$1" == "$cmd" ]] && shift 1
declare APP="$1"
verify_app_name "$APP"
if [[ ! -f "$DOKKU_ROOT/$APP/nginx.conf" ]]; then
dokku_log_fail "No nginx.conf exists for $APP"
fi
cat "$DOKKU_ROOT/$APP/nginx.conf"
}
cmd-nginx-show-conf "$@"
cmd-nginx-show-config "$@"

View File

@@ -0,0 +1,7 @@
#!/usr/bin/env bash
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$PLUGIN_AVAILABLE_PATH/nginx-vhosts/command-functions"
cmd-nginx-show-config "$@"

View File

@@ -2,15 +2,6 @@
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$PLUGIN_AVAILABLE_PATH/nginx-vhosts/functions"
source "$PLUGIN_AVAILABLE_PATH/nginx-vhosts/command-functions"
cmd-nginx-validate() {
declare desc="validates and optionally cleans up invalid nginx configurations"
declare cmd="nginx:validate"
[[ "$1" == "$cmd" ]] && shift 1
declare APP="$1" FLAG="$2"
validate_nginx "$APP" "$FLAG"
}
cmd-nginx-validate "$@"
cmd-nginx-validate-config "$@"

View File

@@ -0,0 +1,7 @@
#!/usr/bin/env bash
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$PLUGIN_AVAILABLE_PATH/nginx-vhosts/command-functions"
cmd-nginx-validate-config "$@"

View File

@@ -35,7 +35,7 @@ teardown() {
add_domain "node-js-app.dokku.me"
add_domain "test.dokku.me"
deploy_app
dokku nginx:show-conf $TEST_APP
dokku nginx:show-config $TEST_APP
assert_ssl_domain "node-js-app.dokku.me"
assert_http_redirect "http://test.dokku.me" "https://test.dokku.me:443/"
}
@@ -45,7 +45,7 @@ teardown() {
add_domain "wildcard1.dokku.me"
add_domain "wildcard2.dokku.me"
deploy_app
dokku nginx:show-conf $TEST_APP
dokku nginx:show-config $TEST_APP
assert_ssl_domain "wildcard1.dokku.me"
assert_ssl_domain "wildcard2.dokku.me"
}
@@ -55,8 +55,8 @@ teardown() {
TEST_APP="${TEST_APP}.example.com"
setup_test_tls wildcard
deploy_app nodejs-express dokku@dokku.me:$TEST_APP
run /bin/bash -c "dokku nginx:show-conf $TEST_APP | grep -e '*.dokku.me' | wc -l"
dokku nginx:show-conf $TEST_APP
run /bin/bash -c "dokku nginx:show-config $TEST_APP | grep -e '*.dokku.me' | wc -l"
dokku nginx:show-config $TEST_APP
assert_output "0"
}
@@ -200,7 +200,7 @@ teardown() {
echo "status: $status"
assert_success
run /bin/bash -c "dokku nginx:show-conf $TEST_APP"
run /bin/bash -c "dokku nginx:show-config $TEST_APP"
echo "output: $output"
echo "status: $status"
assert_output_contains "[::1]:80;"
@@ -221,55 +221,55 @@ teardown() {
echo "status: $status"
assert_success
run /bin/bash -c "dokku nginx:show-conf $TEST_APP"
run /bin/bash -c "dokku nginx:show-config $TEST_APP"
echo "output: $output"
echo "status: $status"
assert_output_contains "[::1]:80;" 0
assert_output_contains "127.0.0.1:80;" 0
}
@test "(nginx-vhosts) nginx:validate" {
@test "(nginx-vhosts) nginx:validate-config" {
deploy_app
run /bin/bash -c "dokku nginx:validate"
run /bin/bash -c "dokku nginx:validate-config"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku nginx:validate $TEST_APP"
run /bin/bash -c "dokku nginx:validate-config $TEST_APP"
echo "output: $output"
echo "status: $status"
assert_success
echo "invalid config" > "/home/dokku/${TEST_APP}/nginx.conf"
run /bin/bash -c "dokku nginx:validate"
run /bin/bash -c "dokku nginx:validate-config"
echo "output: $output"
echo "status: $status"
assert_failure
run /bin/bash -c "dokku nginx:validate $TEST_APP"
run /bin/bash -c "dokku nginx:validate-config $TEST_APP"
echo "output: $output"
echo "status: $status"
assert_failure
run /bin/bash -c "dokku nginx:validate --clean"
run /bin/bash -c "dokku nginx:validate-config --clean"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku nginx:validate"
run /bin/bash -c "dokku nginx:validate-config"
echo "output: $output"
echo "status: $status"
assert_success
echo "invalid config" > "/home/dokku/${TEST_APP}/nginx.conf"
run /bin/bash -c "dokku nginx:validate $TEST_APP --clean"
run /bin/bash -c "dokku nginx:validate-config $TEST_APP --clean"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku nginx:validate"
run /bin/bash -c "dokku nginx:validate-config"
echo "output: $output"
echo "status: $status"
assert_success