Dockerized nginx server for logging visitor IP data, requested paths, and browser fingerprints.
It serves the same blank page for any normal HTTPS path. If you send a unique path to one person, the request path in the logs can be used to identify that visit.
Use this only where you have authorization or a lawful basis to collect this data.
logs/access.log: nginx JSON-style access logs with client IP, host, URI, method, status, user agent, forwarded-for header, TLS protocol, and TLS cipher.logs/fingerprint.log: one JSON object per browser fingerprint submission, including IP headers, host, user agent, referrer, request path, FingerprintJSvisitorId, confidence, components, and the posted payload.
Edit .env:
DOMAIN_NAME=your-domain.example
CERTBOT_EMAIL=you@example.com
CERTBOT_STAGING=0
CERTBOT_AUTO=1Point DOMAIN_NAME to the server and make sure ports 80 and 443 are reachable.
Start the service:
docker compose up -d --buildOpen any path on your domain:
https://your-domain.example/unique-path-for-target
Stop the service:
docker compose down- nginx listens on
80and443. - HTTP traffic redirects to HTTPS, except Let's Encrypt challenge paths.
- Certbot requests and renews a certificate for
DOMAIN_NAMEwhen configured. - Every normal HTTPS path falls back to
html/index.html. - The page loads local FingerprintJS from
html/vendor/fingerprintjs.min.js. html/fingerprint-client.jsposts the result to/fingerprint.- The internal Python logger writes fingerprint records to
logs/fingerprint.log.
| Variable | Purpose | Default |
|---|---|---|
DOMAIN_NAME |
Domain used for the Let's Encrypt certificate. | example.com |
CERTBOT_EMAIL |
Let's Encrypt registration email. | admin@example.com |
CERTBOT_STAGING |
Use staging certs for testing when set to 1. |
1 |
CERTBOT_AUTO |
Automatically request and renew certificates. | 1 |
CERTBOT_FORCE_RENEWAL |
Force a new certificate request. Useful when switching from staging to production. | 0 |
FINGERPRINT_LOG |
Fingerprint log path inside the container. | /var/log/nginx/fingerprint.log |
If you test with staging first, switch to production with:
CERTBOT_STAGING=0
CERTBOT_FORCE_RENEWAL=1Restart the container, wait for the production certificate, then set CERTBOT_FORCE_RENEWAL=0 again.
html/: served website files.html/index.html: blank default page that loads the fingerprint scripts.html/fingerprint-client.js: sends browser fingerprint data to/fingerprint.fingerprint-logger.py: internal service that writes fingerprint POST data.nginx.conf.template: nginx config template.docker-entrypoint.sh: starts nginx, certbot, renewals, and the logger.
This project is licensed under the MIT License. See LICENSE.
The vendored FingerprintJS browser build keeps its own MIT license notice in html/vendor/fingerprintjs.min.js.