'', 'primary' => '', 'role' => '', 'networks' => [], 'networks_src' => '']; $vvMasterRaw = vv_read_conf_raw('master.conf'); if ($vvMasterRaw !== '' && $detectedHostname !== '') { preg_match_all('/^\s*(HOST\d+)\s*=\s*"([^"]*)"/m', $vvMasterRaw, $vvHm, PREG_SET_ORDER); $vvSlots = []; foreach ($vvHm as $m) { $val = trim($m[2]); if ($val !== '') $vvSlots[strtolower($m[1])] = $val; } foreach ($vvSlots as $slot => $name) { if (strcasecmp($name, $detectedHostname) === 0) { $vvDetected['slot'] = $slot; $vvDetected['role'] = ($slot === 'host1') ? 'primary' : 'partner'; break; } } // The primary is whatever HOST1 says, and it is only useful to a host that is not HOST1. if ($vvDetected['role'] === 'partner') $vvDetected['primary'] = $vvSlots['host1'] ?? ''; } // ── Custom docker networks, adopted from the owner ─────────────────────────────────────────── // master.conf names the hosts; it does not name the networks, which live in each host's own // host*.conf. The owner's copy is available here anyway: onboard Phase 1 caches it into // VV_CONF_RAM_CACHE_DIR as soon as SSH works, before this node has finished setup. // // This is the value a fresh mirror cannot know and cannot be expected to type. host.conf.template // ships NETWORK_CONNECT_NETWORKS with its only entry commented out, so a mirror comes up with an // empty list while the owner deploys containers onto a network named in the owner's templates — // which is exactly how twelve containers ended up created against a network that did not exist. // // Adopting the owner's list also means docker_network_connect.sh will recreate the network here // after an Unraid update wipes it, which is the whole reason that script exists. if ($vvDetected['role'] === 'partner' && $vvDetected['slot'] !== '') { $vvOwnerConf = VV_CONF_RAM_CACHE_DIR . '/host1.conf'; if (is_readable($vvOwnerConf)) { $vvOwnerRaw = (string)@file_get_contents($vvOwnerConf); $vvNets = vv_parse_conf_list($vvOwnerRaw, 'HOST1_NETWORK_CONNECT_NETWORKS'); // br* is ipvlan/macvlan tied to the owner's own hardware — its parent interface does not // transfer, and adopting the name would attach this host's containers to the wrong thing. $vvNets = array_values(array_filter($vvNets, fn($n) => $n !== '' && !preg_match('/^(bridge|host|none|br\d)/i', $n))); if ($vvNets) { $vvDetected['networks'] = $vvNets; $vvDetected['networks_src'] = basename($vvOwnerConf); } } } ?>

⬡ Varaverk — First Run

Set up this server before the plugin can start.
Detecting environment…
Appdata
USB boot · requires array
Internal Boot
NVMe/SSD · no array dep
Must match Unraid Settings → Identification exactly (case-sensitive)

Primary
HOST1 · first server
Partner
HOST2+ · joining primary
SSH key and master.conf pull are handled automatically after save.

Step 2 of 2
⟳ Running auto-populate…
Quick start
  1. Create your Unraid API key below — needed for live monitor stats
  2. Open Scheduler → Edit host.conf — a few things need manual entry:
    HOST1_EMBY_API_KEY — Emby Dashboard → API Keys → + New Key
    HOST1_JELLYFIN_API_KEY — Jellyfin Dashboard → Administration → API Keys (if using Jellyfin)
    HOST1_DISCORD_WEBHOOK — for notifications (optional)
    HOST1_DAILY_SYNC_SHARES — media paths to rsync nightly
    Everything else was auto-populated or has working defaults
  3. If partnering: the checklist below will guide you through pulling HOST1's config and running onboard
Skip →

Setup checklist
Loading…
Go to Scheduler →