Repository navigation
OpenRC
This page is the complete guide to running the URnetwork provider on Alpine Linux and other OpenRC distributions: install, authenticate, start, update, boot persistence and the limits of OpenRC supervision. For the other platforms and the general installer, see the Installation Guide.
The installer detects OpenRC on its own, so there is nothing new to type: the install command is the one every other Linux uses. This page walks through a first install from a root shell, which is how Alpine starts out.
You need a root shell and a regular account for the provider to run as. OpenRC has no per-user service manager, so the provider runs as a system service under a dedicated, unprivileged user. The installer expects that user to exist and uses urnet by default.
adduser -D urnet
apk add --no-cache curladduser -D urnet creates the urnet user with a home directory and no password. If the user does not exist when you install, the installer still downloads the files but does not install the service, and prints the commands to finish. To run the provider under a different account, set URNET_OPENRC_USER=<name> for the install command:
URNET_OPENRC_USER=provider sh -c 'curl -fSsL https://dl.fullbars.xyz/install.sh | sh'curl -fSsL https://dl.fullbars.xyz/install.sh | sh| What it does | Why |
|---|---|
Installs the provider and urnet-tools under /usr/local/lib/urnetwork-provider, owned by root and readable by everyone. Only the state dir (/home/urnet/.urnetwork) lives in the service user's home, because the provider must write it. |
The scheduled auto-update runs as root, and sudo urnet-tools update is the documented upgrade path. Root-owned files do not defend a path whose ancestor a user can rewrite: a tree under /home/urnet could be renamed aside and replaced with the service user's own binary, which root would then execute. Keeping the tree off any user-writable path makes that impossible by construction. |
Writes the service script /etc/init.d/urnetwork and runs rc-update add urnetwork default. |
The default runlevel is what OpenRC starts at boot, so the provider comes back after a reboot with nobody logged in. |
Runs the provider under supervise-daemon as the urnet user. |
The provider drops root, and supervise-daemon restarts it after a crash (see Restart policy). |
Sends the provider's output to /var/log/urnetwork.log (stdout) and /var/log/urnetwork.err (stderr), both owned by the service user; /var/log remains root-owned. |
supervise-daemon opens these files after dropping privileges, so the service user must be able to write them. Because the log is a plain file, urnet-tools logs can read it even while the service is stopped. |
Keeps the provider's state, including the login token, in /home/urnet/.urnetwork. |
The provider reads its credentials from the home directory of the user it runs as. |
The installer does not start the service. It finishes by printing the commands for the next two steps.
supervise-daemon restarts the provider when it exits. The delay before a restart starts at 5 seconds and grows by 5 seconds per restart up to a cap of 60 seconds, and the supervisor gives up after 10 restarts within one hour. The limit is deliberate: unlimited respawn would turn a broken binary into a tight crash loop.
The provider needs an auth code from https://ur.io, and the login token it produces has to land in the urnet user's home, not root's. A token written to /root/.urnetwork is invisible to the service, which would start and then have no credentials.
Run the authentication as the service user:
su -s /bin/sh urnet -c 'urnetwork auth <code>'The installer prints this exact command when it finishes. When you run it in an interactive terminal it can also offer to do this step for you: answer y, enter the code, and the installer runs the authentication as urnet. The prompt is read from the terminal device itself, not from standard input, so it works for the one-line curl ... | sh form as well. Where there is no terminal at all (a provisioning script, a CI job, a cron entry) the prompt is skipped and the command is printed instead. If the prompt was skipped, or the authentication did not complete, run the command above at any time. Auth codes are single-use, so fetch a new one if a code was already submitted.
rc-service urnetwork start
rc-service urnetwork statusstatus should report started. To see what the provider is doing:
urnet-tools logs
tail -f /var/log/urnetwork.logurnet-tools logs follows the same file. If the service does not stay up, read /var/log/urnetwork.err as well as the main log. If you have not authenticated yet, go back to Authenticate.
A node with no proxy list configured serves traffic directly from the box's own address. The [profit] line in the log says so with mode=direct; see the Log Reference.
To add proxies, see Adding Proxies.
rc-update add urnetwork default places a symlink to the service script in /etc/runlevels/default, and OpenRC starts everything in that runlevel at boot. Check it with:
rc-update show defaulturnetwork should be listed. OpenRC has no equivalent of systemd's enable-linger, and none is needed: a service in the default runlevel starts at boot whether or not anyone logs in.
Stop the provider now (it starts again at the next boot):
rc-service urnetwork stopStop it and keep it from starting at boot:
rc-service urnetwork stop
rc-update del urnetwork defaultTurn boot start back on later:
rc-update add urnetwork default
rc-service urnetwork startUpdating is a root action on OpenRC, the same way systemctl restart is for a system service under systemd. Restarting an OpenRC service needs root, and so does replacing the root-owned binaries, so run the update from a root shell:
urnet-tools updateTo have it run on a schedule, turn on auto-update as root. On OpenRC it is a busybox crond entry, not a systemd timer:
urnet-tools auto-update weeklyThe interval can be daily, weekly or monthly, and urnet-tools auto-update off removes it. The entry is a script at /etc/periodic/<interval>/urnetwork-update that runs urnet-tools update -f. It only fires while crond is running. urnet-tools still writes the entry when crond is missing, and prints a note; to install and start crond, run:
apk add busybox-openrc
rc-update add crond default
rc-service crond startThere is no zero-downtime HotSwap under OpenRC. HotSwap depends on the old process telling the init system, through sd_notify, that the main PID has changed. supervise-daemon has no equivalent: it watches the one process it started, so a successor started by the old provider would run outside supervision while supervise-daemon launched a second copy of its own.
urnet-tools update and urnet-tools hotswap therefore decline the handoff and print:
zero-downtime hotswap unavailable: the provider is supervised by OpenRC's supervise-daemon, which has no sd_notify MainPID handoff; this update uses a stop/start service restart
update then does an ordinary stop, binary swap and start, with a brief gap with no provider process. To restart without updating, use rc-service urnetwork restart. Background and measurements for the systemd path are on the HotSwap page.
On a host where OpenRC is the running init system and the installer's urnetwork service exists, the lifecycle commands act on that service. The backend is chosen at run time by looking at the running init system, never by operating system. A host where systemd is running keeps the systemd behavior even if OpenRC is installed beside it.
| Command | What it runs on OpenRC |
|---|---|
start |
rc-service urnetwork start |
stop |
rc-service urnetwork stop |
restart |
rc-service urnetwork restart, behind the usual confirm gate (-f skips the prompt) |
auto-start on / off
|
rc-update add urnetwork default / rc-update del urnetwork default
|
auto-update daily|weekly|monthly / off
|
A busybox crond entry in /etc/periodic/<interval>/urnetwork-update that runs urnet-tools update -f. There is no systemd timer. off removes it from every interval. |
logs [N] |
Follows the service's log file, /var/log/urnetwork.log (the file named by output_log in /etc/init.d/urnetwork), falling back to the error log. |
status |
Prints rc-service urnetwork status, then the usual table with the live control-socket view. |
uninstall |
When it targets the service's provider: stops the service, runs rc-update del, removes /etc/init.d/urnetwork and clears the auto-update entry. |
These commands need root, because they change a system service. Run as an ordinary user, a failing command adds a hint to re-run as root.
Several providers on one box. start is not gated. But a stop or restart with no selector, on a box where the service runs beside another provider, is refused rather than acted on, because stopping only the service would leave the other provider running while the tool reported success. Name the target with --user, --unit or --state-dir (the selectors in Targeting & Selectors):
N providers found on this box, specify a target: [alice (pid 4242)]
urnet-tools stop --user <user> # a specific provider
urnet-tools stop --unit urnetwork # the OpenRC service
urnet-tools providers # list what was found
N is the provider count the tool reports, and the bracketed list names the providers that are not the service's own (here, alice's). restart prints the same message with restart in the example commands. A selector that matches the service's own provider, such as --unit urnetwork or --user urnet, goes straight to rc-service.
The provider's swap-thrash watchdog restarts it by exiting with status 75 and letting the supervisor start it again. Under OpenRC:
-
There is no sd_notify watchdog.
supervise-daemonoffers no systemd-style keep-alive, so after 10 minutes without a tick the provider exits with status 75 itself andsupervise-daemonrestarts it. The start cap and the 3 restarts per 24 hours ring are the same as under systemd. -
OpenRC counts as a supervisor. The service script exports
URNETWORK_INIT=openrc, becausesupervise-daemonsets neitherINVOCATION_IDnorNOTIFY_SOCKET. Without that marker the provider could not tell it is supervised and would refuse the watchdog's restart. -
Declined handoffs are recorded. When
updatedeclines HotSwap on a supervised provider, the decline ledger records the reasonopenrc.
As root:
curl -fSsL https://dl.fullbars.xyz/uninstall.sh | shThis stops the service, removes /etc/init.d/urnetwork, its default runlevel entry and any auto-update entry, and deletes the install directory. It also deletes /home/urnet/.urnetwork, which holds the login token, so you would need a new auth code to install again. It leaves two things behind: the urnet user and the log files. Remove them if you want a clean slate:
deluser urnet
rm -f /var/log/urnetwork.log /var/log/urnetwork.err-
Updates need root. Every update restarts the service and replaces root-owned files, so run
urnet-tools updatefrom a root shell. There is no rootless update path on OpenRC. - No zero-downtime HotSwap. See HotSwap is not available.
-
Auto-update needs
crond. The entry does nothing whilecrondis stopped.
- Configuration Reference
- Node Identity
- HotSwap
- urnet-tools (Go)
- urnet-docker
- Proxy Management
- Proxy URL Sources
- Proxy Hot Reload
- Proxy Admission Pipeline
- High-Volume Tuning
- Bittensor Operations (Subnet 25)