103 lines
2.1 KiB
Bash
Executable File
103 lines
2.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -Eeuo pipefail
|
|
|
|
cd -- "$(dirname -- "${BASH_SOURCE[0]}")"
|
|
|
|
readonly SERVICE="nginx"
|
|
|
|
if ! docker compose exec -T "$SERVICE" true >/dev/null 2>&1; then
|
|
echo "Error: nginx container is not running." >&2
|
|
exit 1
|
|
fi
|
|
|
|
docker compose exec -T "$SERVICE" sh <<'EOF'
|
|
set -eu
|
|
|
|
TEMPLATE_DIR="/etc/nginx/templates"
|
|
OUTPUT_DIR="/etc/nginx"
|
|
ENVSUBST_SCRIPT="/docker-entrypoint.d/20-envsubst-on-templates.sh"
|
|
MANAGED_DIRS="conf.d snippets"
|
|
|
|
if [ ! -d "$TEMPLATE_DIR" ]; then
|
|
echo "Error: template directory does not exist: $TEMPLATE_DIR" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -x "$ENVSUBST_SCRIPT" ]; then
|
|
echo "Error: envsubst script is not executable: $ENVSUBST_SCRIPT" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Only allow templates in directories managed by this script.
|
|
find "$TEMPLATE_DIR" -type f -name '*.template' -print | while IFS= read -r template; do
|
|
relative="${template#"$TEMPLATE_DIR"/}"
|
|
|
|
case "$relative" in
|
|
conf.d/* | snippets/*)
|
|
;;
|
|
*)
|
|
echo "Error: unmanaged template path: $relative" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
backup_dir="$(mktemp -d /tmp/nginx-reload.XXXXXX)"
|
|
committed=0
|
|
|
|
rollback() {
|
|
status=$?
|
|
|
|
if [ "$committed" -eq 0 ]; then
|
|
echo "Reload failed. Restoring previous generated configuration." >&2
|
|
|
|
for dir in $MANAGED_DIRS; do
|
|
rm -rf "$OUTPUT_DIR/$dir"
|
|
|
|
if [ -d "$backup_dir/$dir" ]; then
|
|
cp -a "$backup_dir/$dir" "$OUTPUT_DIR/$dir"
|
|
fi
|
|
done
|
|
fi
|
|
|
|
rm -rf "$backup_dir"
|
|
exit "$status"
|
|
}
|
|
|
|
trap rollback EXIT HUP INT TERM
|
|
|
|
for dir in $MANAGED_DIRS; do
|
|
if [ -d "$OUTPUT_DIR/$dir" ]; then
|
|
cp -a "$OUTPUT_DIR/$dir" "$backup_dir/$dir"
|
|
fi
|
|
done
|
|
|
|
for dir in $MANAGED_DIRS; do
|
|
if [ -d "$OUTPUT_DIR/$dir" ]; then
|
|
find "$OUTPUT_DIR/$dir" -type f -print | while IFS= read -r output; do
|
|
relative="${output#"$OUTPUT_DIR"/}"
|
|
|
|
if [ ! -f "$TEMPLATE_DIR/$relative.template" ]; then
|
|
echo "Removing stale generated file: $relative"
|
|
fi
|
|
done
|
|
fi
|
|
|
|
rm -rf "$OUTPUT_DIR/$dir"
|
|
mkdir -p "$OUTPUT_DIR/$dir"
|
|
done
|
|
|
|
"$ENVSUBST_SCRIPT"
|
|
|
|
nginx -t
|
|
|
|
committed=1
|
|
trap - EXIT HUP INT TERM
|
|
rm -rf "$backup_dir"
|
|
EOF
|
|
|
|
docker compose exec -T "$SERVICE" nginx -s reload
|
|
|
|
echo "Nginx configuration reloaded successfully."
|