Skip to content

Commit 835efd1

Browse files
authored
Merge pull request #4205 from IntersectMBO/fix/umami-analytics-header-forwarding
Fix/umami analytics header forwarding
2 parents 1a25121 + e01b675 commit 835efd1

3 files changed

Lines changed: 45 additions & 0 deletions

File tree

docker/docker-compose.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ services:
5858
UMAMI_URL: ${UMAMI_URL:-}
5959
UMAMI_WEBSITE_ID: ${UMAMI_WEBSITE_ID:-}
6060
UMAMI_SSL_VERIFY: ${UMAMI_SSL_VERIFY:-true}
61+
TRUSTED_PROXY_CIDRS: ${TRUSTED_PROXY_CIDRS:-}
62+
REAL_IP_HEADER: ${REAL_IP_HEADER:-X-Forwarded-For}
6163
VITE_PDF_API_URL: ${PDF_API_URL:-}
6264
VITE_OUTCOMES_API_URL: ${OUTCOMES_API_URL:-}
6365
VITE_IPFS_GATEWAY: ${IPFS_GATEWAY:-https://ipfs.io/ipfs}

govtool/frontend/docker-entrypoint.sh

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,42 @@ html_escape() {
99
jq -Rnr --arg value "${1:-}" '$value | @html'
1010
}
1111

12+
TRUSTED_PROXY_CIDRS_VALUE="${TRUSTED_PROXY_CIDRS:-}"
13+
REAL_IP_HEADER_VALUE="${REAL_IP_HEADER:-X-Forwarded-For}"
14+
REAL_IP_CONFIG=""
15+
16+
# Real IP resolution applies only to the Umami proxy location, so
17+
# $remote_addr stays the direct peer everywhere else. Unset means trust
18+
# the private ranges reverse proxies normally connect from; internet
19+
# clients cannot spoof these as a source address. Set
20+
# TRUSTED_PROXY_CIDRS=none to disable real IP resolution entirely.
21+
if [ -z "$TRUSTED_PROXY_CIDRS_VALUE" ]; then
22+
TRUSTED_PROXY_CIDRS_VALUE="10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 fc00::/7"
23+
elif [ "$(printf '%s' "$TRUSTED_PROXY_CIDRS_VALUE" | tr '[:upper:]' '[:lower:]')" = "none" ]; then
24+
TRUSTED_PROXY_CIDRS_VALUE=""
25+
fi
26+
27+
if [ -n "$TRUSTED_PROXY_CIDRS_VALUE" ]; then
28+
if ! printf '%s' "$REAL_IP_HEADER_VALUE" | grep -Eq '^[A-Za-z0-9-]+$'; then
29+
echo "WARNING: Real IP resolution is disabled because REAL_IP_HEADER contains unsupported characters." >&2
30+
else
31+
SET_REAL_IP_FROM_DIRECTIVES=""
32+
for TRUSTED_PROXY_CIDR in $(printf '%s' "$TRUSTED_PROXY_CIDRS_VALUE" | tr ',' ' '); do
33+
if printf '%s' "$TRUSTED_PROXY_CIDR" | grep -Eq '^[0-9A-Fa-f:.]+(/[0-9]{1,3})?$'; then
34+
SET_REAL_IP_FROM_DIRECTIVES="${SET_REAL_IP_FROM_DIRECTIVES} set_real_ip_from ${TRUSTED_PROXY_CIDR};
35+
"
36+
else
37+
echo "WARNING: Ignoring TRUSTED_PROXY_CIDRS entry with unsupported characters: ${TRUSTED_PROXY_CIDR}" >&2
38+
fi
39+
done
40+
41+
if [ -n "$SET_REAL_IP_FROM_DIRECTIVES" ]; then
42+
REAL_IP_CONFIG="${SET_REAL_IP_FROM_DIRECTIVES} real_ip_header ${REAL_IP_HEADER_VALUE};
43+
real_ip_recursive on;"
44+
fi
45+
fi
46+
fi
47+
1248
UMAMI_URL_VALUE="${UMAMI_URL:-}"
1349
UMAMI_WEBSITE_ID_VALUE="${UMAMI_WEBSITE_ID:-}"
1450
UMAMI_SSL_VERIFY_VALUE="$(printf '%s' "${UMAMI_SSL_VERIFY:-true}" | tr '[:upper:]' '[:lower:]')"
@@ -99,6 +135,7 @@ upstream umami_backend {
99135
esac
100136

101137
UMAMI_PROXY_CONFIG=" location /x/ {
138+
${REAL_IP_CONFIG}
102139
proxy_pass ${UMAMI_SCHEME}://umami_backend${UMAMI_BASE_PATH}/;
103140
proxy_set_header Host ${UMAMI_AUTHORITY};
104141
proxy_set_header X-Real-IP \$remote_addr;

govtool/frontend/nginx.conf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
# UMAMI_UPSTREAM_CONFIG
22

3+
log_format proxied_combined '$remote_addr - $remote_user [$time_local] '
4+
'"$request" $status $body_bytes_sent '
5+
'"$http_referer" "$http_user_agent" '
6+
'xff="$http_x_forwarded_for"';
7+
38
server {
49
listen 80;
10+
access_log /var/log/nginx/access.log proxied_combined;
511
root /usr/share/nginx/html;
612
error_page 503 @maintenance;
713

0 commit comments

Comments
 (0)