Node Identity - full-bars/urnetwork-3.23-fix GitHub Wiki
Every URNetwork provider reports a dashboard identity label when it authenticates with the backend. This label appears in your Client Manager as a single human-readable string:
Name @ first.x.x.last [Version]
For example: us-east-1 @ 66.x.x.96 [v3.23.0-fix.30.9]
The label is built by providerDescription() in provider/main.go and is sent at every mint and renewal — so changes take effect within one auth cycle (~once per day), no restart required.
The label is separate from the client_id the platform assigns to each proxy slot. Those ids, and how they are kept stable across restarts, are covered in Hot-Restart.md.
The provider resolves each component in priority order:
| Priority | Source | Description |
|---|---|---|
| 1 |
URNETWORK_NODE_NAME env var |
Explicit override — set this for full control |
| 2 |
HOST_HOSTNAME env var |
Docker: pass the host's actual hostname with -e HOST_HOSTNAME=$(hostname)
|
| 3 | OS hostname |
os.Hostname() — what the container or machine reports |
| 4 | Auto-detect | If the name looks like a 12-char Docker container ID, it's replaced with provider
|
If no name is set and the hostname is a container ID (e.g. a1b2c3d4e5f6), the label shows only the redacted IP or just provider.
| Priority | Source | Description |
|---|---|---|
| 1 |
URNETWORK_PUBLIC_IP env var |
Explicit override — takes priority over all other methods |
| 2 |
~/.urnetwork/disable_ip_autodetect file |
If this file exists, IP detection is skipped (see below) |
| 3 | Auto-fetch via ip.me
|
The provider fetches its public IPv4 with a 5s timeout |
The IP is always redacted to only show the first and last octets (first.x.x.last). The full IP is never sent to the backend or displayed in the dashboard.
Automatically appended from Go build info.
# Via urnet-tools — no restart, takes effect on next renewal tick
urnet-tools rename us-east-1
# Or via systemd drop-in for persistence across restarts
echo 'Environment="URNETWORK_NODE_NAME=us-east-1"' >> /etc/systemd/system/urnetwork.service.d/override.conf
# Docker
docker run -e URNETWORK_NODE_NAME="us-east-1" ...# Sets the dashboard identity label on the targeted container
urnet-docker rename us-east-1 --unit my-provider
# Or directly inside the container (does not affect the container's hostname)
docker exec -it <container> urnet-tools rename us-east-1
# Clear the override (reverts to hostname)
urnet-docker rename off --unit my-providerNote: The
renamecommand is a convenience alias forurnet-tools set node-name <name>. Both write to~/.urnetwork/node_name, which the provider re-reads on its next renewal tick. No restart is needed.
Docker startup scripts already set URNETWORK_PUBLIC_IP at container startup. For native/systemd installs where the binary auto-fetches its own IP, you can disable this:
# Disable (provider won't try to fetch public IP)
urnet-tools ip-detect off
# Re-enable (provider will fetch from ip.me at next renewal)
urnet-tools ip-detect on
# Check current status
urnet-tools ip-detect statusThis creates/removes ~/.urnetwork/disable_ip_autodetect — a marker file the provider checks on every renewal tick, so no restart is needed.
# Useful behind a NAT where ip.me returns the router's IP, not yours
# Use TEST-NET range (192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24) for examples
export URNETWORK_PUBLIC_IP=192.0.2.5The dashboard label above shows the build's own version, such as [v3.23.0-fix.34.2]. The provider also sends a separate app_version in its connect auth (and the X-UR-AppVersion header), and that is what the platform records against the node. Since v3.23.0-fix.34.2 it is written in the platform's own format instead of the git tag:
YYYY.M.D-<code>-fix.<N.M>
2026.10.20-1076955500-fix.34.1
| Part | Meaning |
|---|---|
YYYY.M.D |
UTC commit date of the tagged commit, no zero padding. The platform's provider rollout gauge keeps only this part. |
<code> |
The house build code, (seconds since 2023-05-23T00:00:00Z) x 10, taken at the tagged commit's time. The same formula gives upstream's own tag codes. Stored by the platform, not read. |
fix.<N.M> |
This line's release number. Keeps the node identifiable as a 3.23-fix provider. |
A version that does not start with a real calendar date (every release before 34.2 sent the raw tag) is filed under other by the platform. The string is 64 characters or fewer, which is the limit the platform stores.
It is set at build time with -X main.AuthVersion=..., computed from the release tag by scripts/compute-app-version.sh <tag>. A build without the flag, such as a local make build, a main-branch Docker image, or a test mint, reports its plain version instead. Everything else, including logs, metrics, hotswap and the update checks, keeps using the git tag.
Note
This is how a node is recorded and counted by release. It is not what makes a node count as a modern provider: the platform's modern provider gate measures post-quantum encryption and resizable transfer windows on the wire and does not read the version.
The provider is designed to give you flexibility in how you identify your nodes without compromising privacy:
-
Redacted IP: Only
first.x.x.lastis ever reported — the full IP is never sent to the backend or shown in the dashboard. -
Custom names: Use
urnet-tools rename <name>to label nodes however you want — no IP exposure at all. -
Hostname passthrough: Docker users can pass the host's real hostname via
HOST_HOSTNAMEfor fleet-wide consistency. -
Opt out entirely: Run
urnet-tools ip-detect offto report only the node name without any IP.
Besides the redacted IP, you can also have it report either the server's hostname or something entirely custom that you choose — so there are multiple ways to identify your own nodes without resorting to a full IP address. The provider is designed to give users that flexibility without compromising privacy.
The ENABLE_IP_CHECKER env var is a separate diagnostic that logs your full unredacted IP to container logs at startup — it is not related to dashboard identity reporting and is off by default.
The Docker startup scripts (start_stable.sh, pelican_panel.sh) set URNETWORK_PUBLIC_IP on container startup via curl -s --max-time 5 ip.me -4. This env var takes priority in the provider, so Docker containers don't rely on the binary's autodetect. If you run the provider binary directly (systemd, bare metal), the binary fetches its own IP.