';
- // Onboard
+ // Onboard — disabled until a partner hostname is configured in master.conf
html += ``;
@@ -223,6 +227,18 @@ function _renderActions(nodes, cfg) {
html += '
';
+ // Contextual note under actions
+ if (!hasPartner) {
+ html += `
+ No partner hostname configured. Edit master.conf (Scheduler tab) and set HOST2.
+
`;
+ } else if (!cfg.enabled) {
+ html += `
+ Onboard will generate your SSH key, exchange it with the partner, and establish the partnership.
+ Run on the mirror (HOST2) first, then on the owner (HOST1).
+
`;
+ }
+
// Transfer — show manual command, too destructive to one-click
if (cfg.enabled && isOwner) {
const confirmStr = 'i-understand-this-transfers-ownership';
diff --git a/Plugin/unraid/pages/scheduler.php b/Plugin/unraid/pages/scheduler.php
index 90b8d12..2a32fda 100644
--- a/Plugin/unraid/pages/scheduler.php
+++ b/Plugin/unraid/pages/scheduler.php
@@ -2635,13 +2635,16 @@ function vvSaveRawConf() {
}
// Normal save: show push status
- const push = d.push ?? [];
- if (push.length === 0) {
- btn.textContent = '✓ Saved';
- } else if (push.every(p => p.ok)) {
- btn.textContent = '✓ Saved · synced to ' + push.map(p => p.host).join(', ');
+ // ready:false = partner not set up yet (pre-onboard) — treat as silent, not an error
+ const push = d.push ?? [];
+ const synced = push.filter(p => p.ok);
+ const realFailed = push.filter(p => !p.ok && p.ready !== false);
+ if (realFailed.length > 0) {
+ btn.textContent = '✓ Saved · push failed: ' + realFailed.map(p => p.host).join(', ');
+ } else if (synced.length > 0) {
+ btn.textContent = '✓ Saved · synced to ' + synced.map(p => p.host).join(', ');
} else {
- btn.textContent = '✓ Saved · push failed: ' + push.filter(p => !p.ok).map(p => p.host).join(', ');
+ btn.textContent = '✓ Saved';
}
setTimeout(() => { btn.textContent = 'Save Conf'; }, 3500);
})