Add auth stack conf vars and storage mode selection to setup wizard
host.conf.template: add AUTH STACK section (NPM/lldap/Authelia) so conf_upgrade.sh stops stripping those keys from host*.conf at 1am. setup wizard: storage mode selector auto-detects USB vs NVMe at first run; user can override; triggers storage_migrate.sh when mode differs from current SCRIPTS_DIR location. claude_startup.sh: reads HOST*_STORAGE_MODE_INTERNAL to pick internal or appdata path rather than always requiring array to be mounted.
This commit is contained in:
@@ -86,6 +86,19 @@ hr.vv-hr { border: none; border-top: 1px solid #1e1e1e; margin: 22px 0; }
|
||||
|
||||
<div id="vv-detect-banner"><div class="loading">Detecting environment…</div></div>
|
||||
|
||||
<div class="vv-field">
|
||||
<label>Storage mode</label>
|
||||
<div class="vv-role-row" style="margin-bottom:4px">
|
||||
<div class="vv-role-btn" id="vv-store-flash" onclick="vvSetStorage('flash')">
|
||||
Appdata<br><span style="color:#555;font-size:10px;">USB boot · requires array</span>
|
||||
</div>
|
||||
<div class="vv-role-btn" id="vv-store-internal" onclick="vvSetStorage('internal')">
|
||||
Internal Boot<br><span style="color:#555;font-size:10px;">NVMe/SSD · no array dep</span>
|
||||
</div>
|
||||
</div>
|
||||
<div id="vv-store-hint" class="vv-hint"></div>
|
||||
</div>
|
||||
|
||||
<div class="vv-field">
|
||||
<label>This server's hostname</label>
|
||||
<input type="text" id="vv-hostname" value="<?= htmlspecialchars($detectedHostname) ?>" autocomplete="off" spellcheck="false">
|
||||
@@ -174,7 +187,19 @@ hr.vv-hr { border: none; border-top: 1px solid #1e1e1e; margin: 22px 0; }
|
||||
</div>
|
||||
|
||||
<script>
|
||||
let _vvRedirect = '?tab=scheduler';
|
||||
let _vvRedirect = '?tab=scheduler';
|
||||
let _vvStorageMode = 'flash';
|
||||
let _vvCurrentDir = '';
|
||||
|
||||
function vvSetStorage(mode) {
|
||||
_vvStorageMode = mode;
|
||||
document.getElementById('vv-store-flash')?.classList.toggle('active', mode === 'flash');
|
||||
document.getElementById('vv-store-internal')?.classList.toggle('active', mode === 'internal');
|
||||
const hint = document.getElementById('vv-store-hint');
|
||||
if (hint) hint.textContent = mode === 'flash'
|
||||
? 'Scripts live in appdata — requires array to be started. Recommended for USB flash boot.'
|
||||
: 'Scripts live on /boot — available before array mounts. Requires NVMe/SSD boot.';
|
||||
}
|
||||
|
||||
// ── Detection banner ──────────────────────────────────────────────────────────
|
||||
(function() {
|
||||
@@ -184,14 +209,12 @@ let _vvRedirect = '?tab=scheduler';
|
||||
.then(r => r.json()).then(d => {
|
||||
const b = document.getElementById('vv-detect-banner');
|
||||
if (!d.ok) { b.innerHTML = '<span style="color:#555">Detection unavailable</span>'; return; }
|
||||
const modeLabel = d.mode === 'internal'
|
||||
? '<span style="color:#4a8">internal (NVMe/SSD)</span>'
|
||||
: '<span style="color:#a84">flash mode (USB boot)</span>';
|
||||
_vvCurrentDir = d.scripts_dir || '';
|
||||
b.innerHTML =
|
||||
'<div class="vv-det-row"><span class="vv-det-lbl">OS</span><span class="vv-det-val">Unraid ' + (d.unraid_ver||'') + '</span></div>' +
|
||||
'<div class="vv-det-row"><span class="vv-det-lbl">Boot device</span><span class="vv-det-val">' + d.boot_device + ' (' + d.transport + ')</span></div>' +
|
||||
'<div class="vv-det-row"><span class="vv-det-lbl">Storage mode</span><span class="vv-det-val">' + modeLabel + '</span></div>' +
|
||||
'<div class="vv-det-row"><span class="vv-det-lbl">Scripts dir</span><span class="vv-det-val" style="color:#666">' + d.scripts_dir + '</span></div>';
|
||||
vvSetStorage(d.mode);
|
||||
const hf = document.getElementById('vv-hostname');
|
||||
if (hf && !hf.value.trim()) hf.value = d.hostname;
|
||||
}).catch(() => {
|
||||
@@ -377,10 +400,34 @@ function vvDoSave() {
|
||||
vvSetBtn('Saving…', true);
|
||||
fetch('/plugins/varaverk/api/setup.php', {
|
||||
method: 'POST', headers: {'Content-Type': 'application/x-www-form-urlencoded'},
|
||||
body: new URLSearchParams({action:'save', host1, host2, my_slot:mySlot, my_hostname:hostname})
|
||||
body: new URLSearchParams({action:'save', host1, host2, my_slot:mySlot, my_hostname:hostname, storage_mode:_vvStorageMode})
|
||||
}).then(r => r.json()).then(d => {
|
||||
if (d.ok) { vvShowStep2(d.redirect || '?tab=scheduler', d.api_key); }
|
||||
else { vvSetBtn('Save and continue →', false); vvSetStatus('✗ ' + (d.error||'Error'), 'err'); }
|
||||
if (d.ok) {
|
||||
if (d.needs_migration) {
|
||||
const dest = d.migrate_to === 'flash' ? 'appdata' : '/boot';
|
||||
vvSetStatus('⟳ Migrating scripts to ' + dest + '…', '');
|
||||
vvDoMigration(d.migrate_to, d.redirect || '?tab=scheduler', d.api_key);
|
||||
} else {
|
||||
vvShowStep2(d.redirect || '?tab=scheduler', d.api_key);
|
||||
}
|
||||
} else { vvSetBtn('Save and continue →', false); vvSetStatus('✗ ' + (d.error||'Error'), 'err'); }
|
||||
}).catch(() => { vvSetBtn('Save and continue →', false); vvSetStatus('✗ Request failed', 'err'); });
|
||||
}
|
||||
|
||||
function vvDoMigration(to, redirect, apiKey) {
|
||||
fetch('/plugins/varaverk/api/storage.php', {
|
||||
method: 'POST', headers: {'Content-Type': 'application/x-www-form-urlencoded'},
|
||||
body: new URLSearchParams({action: 'migrate', to})
|
||||
}).then(r => r.json()).then(d => {
|
||||
if (d.ok) {
|
||||
vvShowStep2(redirect, apiKey);
|
||||
} else {
|
||||
vvSetBtn('Save and continue →', false);
|
||||
vvSetStatus('✗ Migration failed — ' + (d.error || 'check install.log'), 'err');
|
||||
}
|
||||
}).catch(() => {
|
||||
vvSetBtn('Save and continue →', false);
|
||||
vvSetStatus('✗ Migration request failed', 'err');
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
Reference in New Issue
Block a user