Configuration & environment variables
Almost everything is configured comfortably in the web interface. Environment variables only cover what has to be fixed before startup: ports, data directory, certificate, logging and a few special cases.
All environment variables
Every variable starts with NODE64_. An empty value counts as “not set”, so the default applies.
| Variable | Default | Meaning | Example |
|---|---|---|---|
NODE64_DATA_DIR | /data | The only writable directory: database, backups, keys, certificate. | /data |
NODE64_HTTP_PORT | 8080 | Port of the web interface and API – HTTP and HTTPS on the same port. 0 = off. | 8080 |
NODE64_HTTPS_PORT | 0 | Additional HTTPS-only port. 0 = off. | 8443 |
NODE64_BIND_ADDR | empty (all interfaces) | Address the web interface listens on. | 0.0.0.0 |
NODE64_TLS_CERT | empty | Your own certificate (PEM) instead of the self-signed one. Only together with NODE64_TLS_KEY. | /data/my/cert.pem |
NODE64_TLS_KEY | empty | Private key for your own certificate. | /data/my/key.pem |
NODE64_LOG_LEVEL | info | debug, info, warn or error. Can be changed at runtime in the interface. | debug |
NODE64_LOG_FORMAT | text | Log output format: text or json. | json |
NODE64_ADMIN_USER | empty | Creates the admin on the very first start – only while no user exists, ignored afterwards. Only together with NODE64_ADMIN_PASSWORD. | admin |
NODE64_ADMIN_PASSWORD | empty | The matching password. As in the setup wizard, use at least 10 characters. | – |
NODE64_TRUST_PROXY | false | Honors X-Forwarded-For. Only enable behind your own reverse proxy (1, true, yes, on). | true |
NODE64_DOCKER_HOST | unix:///var/run/docker.sock | Default Docker host for Docker container checks. Allowed: unix://, tcp://, http://, https://. Can be overridden per check. | tcp://socket-proxy:2375 |
The HTTP and HTTPS ports must not both be 0 and must not be equal; valid values are 0–65535. Certificate and key, as well as admin user and password, are only accepted in pairs. If something is off, Node64 refuses to start and says why in the log.
NODE64_ADMIN_PASSWORD sits in plain text in your Compose file. Remove both admin variables after the first start – Node64 ignores them anyway once a user exists.
Example
environment:
NODE64_LOG_LEVEL: info
NODE64_LOG_FORMAT: json
NODE64_HTTPS_PORT: 8443
# NODE64_ADMIN_USER: admin # very first start only
# NODE64_ADMIN_PASSWORD: YOUR_PASSWORD # very first start only
Volumes
Node64 needs exactly one volume: /data (or whatever you set in NODE64_DATA_DIR). Everything else in the container can be read-only with read_only: true. What's inside is listed in the table under Installation.
- Named volume (
node64-data:/data) – the easiest option; Docker takes care of permissions. - Host folder (
./data:/data) – handy for your own backups. The process runs as user65532, so the folder must belong to it:sudo chown -R 65532:65532 ./data. - Your own certificate: put the files for
NODE64_TLS_CERT/NODE64_TLS_KEYunder/data, or mount them additionally as read-only. - Docker socket (optional):
/var/run/docker.sock:/var/run/docker.sock:rofor Docker checks, see below.
Ports
By default only 8080 is open. DNS64 (53, 853) and the shared entry point (80, 443) only open their ports while they are needed. The full table is in Installation → Ports.
- The DNS64 and shared entry point ports are set in the interface, not via environment variables.
- Settings → Ports shows all ports of the node in a table – web interface, common entrance with PROXY64 streams, DNS64 and Honeypot64 with syslog: module, purpose, protocol, bind address, configured or open, and whether a listener is really listening on Linux (via
/proc/net, inside the container's network). Plus conflicts and module errors such as “address already in use” or “permission denied”. Whatever runs along on the entrance or the web port (proxy hosts, DoH, cluster, MCP, Prometheus) is listed as “shared” below, the CDN64 tunnel as an outgoing connection. Filters by module and state; below that, notes on ports below 1024 and Docker port forwarding. A binding to0.0.0.0only covers IPv4, not IPv6; ports below 1024 needcap_net_bind_service– root alone isn't enough. - The API can also check whether a port is free on the host:
GET /api/ports/probe?proto=tcp&port=443.
Network mode: bridge or host
| Bridge (default) | Host (network_mode: host) | |
|---|---|---|
| Ports | each port published with ports: | Node64 binds directly on the host, no ports: |
| Web interface | on the published port | on NODE64_HTTP_PORT (8080) |
| DNS64 | works; enter the router for local names in the settings | recommended: sees real device IPs and finds the router itself |
| PROXY64 | 80, 443, 443/udp plus one mapping per stream | recommended: streams open any port without extra mappings |
| DynDNS, “interface” IPv6 mode | not possible | required |
| IPv6 | only with enable_ipv6 on the Docker network | same as the host |
| ICMP checks | sysctls: net.ipv4.ping_group_range=0 65535 | cap_add: NET_RAW |
Rule of thumb: only health checks, notifications and DynDNS? Bridge is fine. As soon as DNS64 or PROXY64 come into play, use the host network. Ready-made Compose files for both cases are in Installation.
Behind your own reverse proxy
If you already run a reverse proxy in front of Node64 (such as Traefik, Caddy or Nginx), just forward to http://node64:8080. So that Node64 sees the browser's real address (e.g. for rate limiting and the audit log) and knows which hostname was used and whether it was HTTPS, set:
environment:
NODE64_TRUST_PROXY: "true"
With NODE64_TRUST_PROXY, Node64 trusts the X-Forwarded-For, X-Forwarded-Host and X-Forwarded-Proto headers – behind a proxy it needs the latter two for passkeys and the SSO callback. If Node64's port is also reachable directly, someone could forge these headers. In that case, don't expose the port.
- Login via the proxy: with Authelia or Authentik as forward auth, the proxy can pass the user in the
Remote-Userheader. Set this up under Login & security; only the proxy's real connection address counts there. - Without an extra proxy: Node64 can also serve its own interface under a custom name on port 443 – via the shared entry point, with a certificate from certificate management.
- Passkeys need HTTPS with a hostname and only work for the name they were created under.
Docker host for container checks
Everything about Docker monitoring – including remote hosts via SSH or TLS – is under Monitoring Docker. This is only about the local socket. It is only monitored once you add it under Health checks → Docker with Add this machine (local socket).
Docker container checks query the Docker API – by default via unix:///var/run/docker.sock. Node64 only sends GET requests. Docker checks always run locally, never online.
Because the socket grants control over the host despite :ro, you can put a docker-socket-proxy in front that only allows reading containers:
services:
socket-proxy:
image: tecnativa/docker-socket-proxy
restart: unless-stopped
environment:
CONTAINERS: 1
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
node:
image: ghcr.io/ipv64net/node64:latest
container_name: node64
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- node64-data:/data
environment:
NODE64_DOCKER_HOST: tcp://socket-proxy:2375
read_only: true
tmpfs:
- /tmp
volumes:
node64-data:
You can also override the Docker host per check in the “Docker host” field. Without a proxy you need group_add with the socket's group instead – see Installation.
Log level and log format
- Initial value via
NODE64_LOG_LEVEL(debug,info,warn,error) andNODE64_LOG_FORMAT(textorjson, e.g. for a log collector). - Switch at runtime under Settings → Logging – globally and per area (module). With “Reset after”, the level falls back automatically after the chosen time, so debug doesn't stay on forever.
- View under Logs in the interface (the last 2000 lines) with download, or as usual with
docker logs node64. - No secrets in the log: values that look like passwords, tokens or keys are always masked.
Via the API: GET /api/logs and GET|PUT /api/logging – see Local API.
Language, dark mode and appearance
The settings in the web interface are split into four pages: General (node, user, appearance, two-factor, reachability of this node with the UI certificate, ipv64 API key, AI interface, logging, about), Modules (per module version, status, short description, on/off switch with a confirmation when switching off, and a link to the module), Ports (see Ports) and Data & backup (data retention, backup, export and import, reset – see Update & backup).
These are set directly in the interface, not via environment variables:
- Language: English or German, per user under Settings → User (along with time zone and password). Notifications go out in the language of each channel.
- Color scheme: light, dark or automatic following your device's system setting.
- Font size: small, normal, large or extra large under Settings → Appearance. Applies immediately in this browser.
- Dashboard: tiles, order and width via Customize on the dashboard.
- Data retention: how long raw measurements, hourly values and the audit log are kept locally, under Settings → Data & backup – overview under Data retention.
Something unclear, missing, or a question about Node64? Ask in the official forum v64.tech.