mirror of
https://github.com/myronblair/web-dashboard
synced 2026-07-28 12:12:29 -05:00
Merge branch 'main' of https://github.com/myronblair/web-dashboard
This commit is contained in:
+115
-20
@@ -54,11 +54,9 @@
|
||||
}
|
||||
|
||||
.grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
|
||||
gap: 1.25rem;
|
||||
max-width: 1400px;
|
||||
margin: 0 auto;
|
||||
columns: 320px;
|
||||
column-gap: 1.25rem;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.card {
|
||||
@@ -67,6 +65,8 @@
|
||||
border-radius: var(--radius);
|
||||
overflow: hidden;
|
||||
transition: border-color 0.2s, transform 0.2s;
|
||||
break-inside: avoid;
|
||||
margin-bottom: 1.25rem;
|
||||
}
|
||||
.card:hover { border-color: var(--accent); transform: translateY(-2px); }
|
||||
|
||||
@@ -89,11 +89,11 @@
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.card-header h2 {
|
||||
font-size: 0.8rem;
|
||||
font-weight: 600;
|
||||
font-size: 1rem;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
color: var(--muted);
|
||||
color: var(--text);
|
||||
}
|
||||
|
||||
.links { padding: 0.5rem 0; }
|
||||
@@ -115,7 +115,7 @@
|
||||
border-radius: 50%;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.link-item .name { flex: 1; font-weight: 500; }
|
||||
.link-item .name { flex: 1; font-weight: 500; font-size: 0.85rem; }
|
||||
.link-item .sub {
|
||||
font-size: 0.75rem;
|
||||
color: var(--muted);
|
||||
@@ -128,6 +128,32 @@
|
||||
}
|
||||
.link-item:hover .arrow { opacity: 1; }
|
||||
|
||||
.copy-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.75rem;
|
||||
padding: 0.6rem 1rem;
|
||||
color: var(--text);
|
||||
font-size: 0.9rem;
|
||||
transition: background 0.15s;
|
||||
cursor: pointer;
|
||||
border: none;
|
||||
background: none;
|
||||
width: 100%;
|
||||
text-align: left;
|
||||
font-family: inherit;
|
||||
}
|
||||
.copy-item:hover { background: var(--surface2); }
|
||||
.copy-item .name { font-size: 0.85rem; }
|
||||
.copy-item .copy-icon {
|
||||
color: var(--muted);
|
||||
font-size: 0.7rem;
|
||||
opacity: 0;
|
||||
transition: opacity 0.15s;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.copy-item:hover .copy-icon { opacity: 1; }
|
||||
|
||||
.dot-blue { background: var(--accent); }
|
||||
.dot-purple { background: var(--accent2); }
|
||||
.dot-green { background: var(--green); }
|
||||
@@ -155,7 +181,7 @@
|
||||
|
||||
@media (max-width: 600px) {
|
||||
body { padding: 1rem; }
|
||||
.grid { grid-template-columns: 1fr; }
|
||||
.grid { columns: 1; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
@@ -220,6 +246,21 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- INSTALL COMMANDS (copy to clipboard, not clickable links) -->
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<div class="icon icon-cyan">📋</div>
|
||||
<h2>Install Commands</h2>
|
||||
</div>
|
||||
<div class="links">
|
||||
<button type="button" class="copy-item" onclick="copyCmd(this, 'curl -sSL http://jarvis.orbishosting.com/agent/install.sh | bash -s -- $(hostname) linux')">
|
||||
<span class="dot dot-orange"></span><span class="name">JARVIS Agent</span><span class="sub">Linux install one-liner — prompts for registration key, run as root</span><span class="copy-icon">copy</span>
|
||||
</button>
|
||||
<button type="button" class="copy-item" onclick="copyCmd(this, 'apt update && apt install -y git && git clone https://github.com/fusionpbx/fusionpbx-install.sh.git && cd fusionpbx-install.sh/debian && ./install.sh')">
|
||||
<span class="dot dot-purple"></span><span class="name">FusionPBX Full Installer</span><span class="sub">Official latest-version install script — Debian 12, run as root</span><span class="copy-icon">copy</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- BACKUP STATUS -->
|
||||
<div class="card">
|
||||
@@ -233,6 +274,20 @@
|
||||
<p id="backup-status-updated" style="color:var(--muted);font-size:0.7rem;margin-top:0.5rem;padding:0 0.25rem;"></p>
|
||||
</div>
|
||||
|
||||
<!-- BACKUP DOWNLOADS — added 2026-07-07: full-content backup files (JARVIS
|
||||
app+DB, DO server sites+DB dumps+configs), pulled here daily so they're
|
||||
downloadable from one place. Actual files require the /downloads/ login
|
||||
(this card's metadata JSON does not). -->
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<div class="icon icon-cyan">💾</div>
|
||||
<h2>Backup Downloads</h2>
|
||||
</div>
|
||||
<div class="links" id="backup-downloads-list">
|
||||
<div class="link-item"><span class="sub">Loading…</span></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- HOME AUTOMATION -->
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
@@ -240,7 +295,7 @@
|
||||
<h2>Home Automation</h2>
|
||||
</div>
|
||||
<div class="links">
|
||||
<a class="link-item" href="https://hoa.orbishosting.com" target="_blank">
|
||||
<a class="link-item" href="http://web.orbishosting.com:8123" target="_blank">
|
||||
<span class="dot dot-green"></span><span class="name">Home Assistant</span><span class="sub">hoa.orbishosting.com</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="http://10.48.200.18:8581" target="_blank">
|
||||
@@ -259,20 +314,23 @@
|
||||
<h2>Media</h2>
|
||||
</div>
|
||||
<div class="links">
|
||||
<a class="link-item" href="http://10.48.200.33:8096" target="_blank">
|
||||
<span class="dot dot-purple"></span><span class="name">Jellyfin</span><span class="sub">Media server</span><span class="arrow">↗</span>
|
||||
<a class="link-item" href="http://10.48.200.104:8080" target="_blank">
|
||||
<span class="dot dot-red"></span><span class="name">StreamHoard</span><span class="sub">Netflix-style server</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="http://10.48.200.35:8989" target="_blank">
|
||||
<a class="link-item" href="http://10.48.200.104:8989" target="_blank">
|
||||
<span class="dot dot-blue"></span><span class="name">Sonarr</span><span class="sub">TV shows</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="http://10.48.200.35:7878" target="_blank">
|
||||
<a class="link-item" href="http://10.48.200.104:7878" target="_blank">
|
||||
<span class="dot dot-yellow"></span><span class="name">Radarr</span><span class="sub">Movies</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="http://10.48.200.35:9696" target="_blank">
|
||||
<a class="link-item" href="http://10.48.200.104:9696" target="_blank">
|
||||
<span class="dot dot-orange"></span><span class="name">Prowlarr</span><span class="sub">Indexers</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="http://10.48.200.35:8080" target="_blank">
|
||||
<span class="dot dot-green"></span><span class="name">qBittorrent</span><span class="sub">Downloads</span><span class="arrow">↗</span>
|
||||
<a class="link-item" href="http://10.48.200.104:8082" target="_blank">
|
||||
<span class="dot dot-green"></span><span class="name">qBittorrent</span><span class="sub">Downloads (VPN'd)</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://10.48.200.104:9443" target="_blank">
|
||||
<span class="dot dot-cyan"></span><span class="name">Portainer</span><span class="sub">Docker container manager</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -427,8 +485,8 @@
|
||||
<a class="link-item" href="https://github.com/myronblair/infra" target="_blank">
|
||||
<span class="dot dot-gray"></span><span class="name">Infra</span><span class="sub">myronblair/infra</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://github.com/myronblair/mediastack" target="_blank">
|
||||
<span class="dot dot-gray"></span><span class="name">MediaStack</span><span class="sub">myronblair/mediastack</span><span class="arrow">↗</span>
|
||||
<a class="link-item" href="https://github.com/myronblair/kino-app" target="_blank">
|
||||
<span class="dot dot-gray"></span><span class="name">StreamHoard</span><span class="sub">myronblair/kino-app</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://github.com/myronblair/do-server-config" target="_blank">
|
||||
<span class="dot dot-gray"></span><span class="name">DO Server Config</span><span class="sub">myronblair/do-server-config</span><span class="arrow">↗</span>
|
||||
@@ -688,6 +746,18 @@
|
||||
}
|
||||
tick(); setInterval(tick, 1000);
|
||||
|
||||
// ── Install Commands card: copy-to-clipboard, never auto-navigates ──
|
||||
function copyCmd(btn, text) {
|
||||
navigator.clipboard.writeText(text).then(() => {
|
||||
const iconEl = btn.querySelector('.copy-icon');
|
||||
const prev = iconEl.textContent;
|
||||
iconEl.textContent = 'copied!';
|
||||
iconEl.style.opacity = '1';
|
||||
setTimeout(() => { iconEl.textContent = prev; iconEl.style.opacity = ''; }, 1500);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// ── Backup Status card — reads daily-refreshed JSON from MSP360 collector ──
|
||||
async function loadBackupStatus() {
|
||||
const el = document.getElementById('backup-status-list');
|
||||
@@ -726,6 +796,31 @@
|
||||
}
|
||||
loadBackupStatus();
|
||||
|
||||
// ── Backup Downloads card — added 2026-07-07 ───────────────────────────
|
||||
async function loadBackupDownloads() {
|
||||
const el = document.getElementById('backup-downloads-list');
|
||||
try {
|
||||
const r = await fetch('/downloads/backup-files-status.json', { cache: 'no-store' });
|
||||
const data = await r.json();
|
||||
const fmt = (iso) => {
|
||||
if (!iso) return 'No backup found';
|
||||
const d = new Date(iso);
|
||||
return d.toLocaleString('en-US', {month:'short', day:'numeric', hour:'2-digit', minute:'2-digit'});
|
||||
};
|
||||
const row = (label, entry) => `
|
||||
<a class="link-item" href="/downloads/${entry.file}" download="${entry.file}">
|
||||
<span class="dot ${entry.ok ? 'dot-green' : 'dot-red'}"></span>
|
||||
<span class="name">${label}</span>
|
||||
<span class="sub">${entry.source} — ${fmt(entry.timestamp)}${entry.size ? ' · ' + entry.size : ''}</span>
|
||||
<span class="arrow">↓</span>
|
||||
</a>`;
|
||||
el.innerHTML = row('JARVIS Backup', data.jarvis) + row('DO Server Backup', data.do_server);
|
||||
} catch (e) {
|
||||
el.innerHTML = '<div class="link-item"><span class="sub">Status unavailable</span></div>';
|
||||
}
|
||||
}
|
||||
loadBackupDownloads();
|
||||
|
||||
|
||||
// ── Notes — server-backed so they sync across all devices ─────────────
|
||||
const API = '/notes.php';
|
||||
|
||||
Reference in New Issue
Block a user