Files
homelab/site/index.html

210 lines
8.5 KiB
HTML

<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="liooil 的个人主页与 Homelab 动态服务目录。">
<meta name="color-scheme" content="light">
<meta name="theme-color" content="#f0c94b">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="default">
<meta name="apple-mobile-web-app-title" content="Xiteng">
<title>liooil / xiteng.site</title>
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
<link rel="icon" href="/icons/favicon-32.png" sizes="32x32" type="image/png">
<link rel="apple-touch-icon" href="/icons/apple-touch-icon.png">
<link rel="manifest" href="/manifest.webmanifest">
<link rel="stylesheet" href="/styles.css">
<script src="/app.js?v=7" defer></script>
</head>
<body>
<header class="topbar">
<nav class="shell nav" aria-label="主导航">
<a class="brand" href="#top">liooil / xiteng.site</a>
<div class="nav-links">
<a href="#services">服务</a>
<a href="#infrastructure">基础设施</a>
<a href="#now">Now</a>
<a href="/account">我的凭据</a>
<a href="/admin">管理</a>
<a href="https://github.com/liooil" rel="me">GitHub</a>
</div>
</nav>
</header>
<main id="top">
<section class="hero shell">
<div class="hero-copy">
<p class="eyebrow">PERSONAL INDEX / HOMELAB CATALOG</p>
<h1>一个入口,<br>完整呈现。</h1>
<p class="intro">
服务是否存在与谁能使用它是两件事。这里公开展示全部应用与基础设施;
登录、密钥和内网边界仍由各组件自己负责。
</p>
<div class="actions">
<a class="button primary" href="#services">浏览全部服务</a>
<a class="button" href="#infrastructure">查看系统组成</a>
</div>
</div>
<div class="hero-panel" aria-label="动态目录状态">
<div class="hero-panel-head">
<span>LIVE CATALOG</span>
<span class="live-dot" aria-hidden="true"></span>
</div>
<dl class="hero-stats">
<div>
<dt id="component-count"></dt>
<dd>已声明组件</dd>
</div>
<div>
<dt id="running-count"></dt>
<dd>服务可用</dd>
</div>
<div>
<dt id="restricted-count"></dt>
<dd>受控入口</dd>
</div>
</dl>
<p id="catalog-updated" class="catalog-updated" aria-live="polite">正在读取 Docker Label…</p>
</div>
</section>
<section class="device-status" aria-labelledby="device-heading">
<div class="shell">
<div class="device-heading-row">
<div>
<p class="section-kicker">DEVICE STATUS / <span id="device-hostname">HOMELAB</span></p>
<h2 id="device-heading">设备状态</h2>
</div>
<p id="metrics-updated" class="metrics-updated" aria-live="polite">正在读取主机指标…</p>
</div>
<div class="metric-grid">
<article class="metric-card metric-cpu">
<div class="metric-card-head"><span>CPU</span><span>PROCESSOR</span></div>
<strong id="cpu-value" class="metric-value"></strong>
<progress id="cpu-progress" max="100" value="0">0%</progress>
<p id="cpu-detail" class="metric-detail">正在读取处理器状态…</p>
<p id="cpu-secondary" class="metric-secondary">LOAD —</p>
</article>
<article class="metric-card metric-memory">
<div class="metric-card-head"><span>MEM</span><span>MEMORY</span></div>
<strong id="memory-value" class="metric-value"></strong>
<progress id="memory-progress" max="100" value="0">0%</progress>
<p id="memory-detail" class="metric-detail">正在读取内存状态…</p>
<p id="memory-secondary" class="metric-secondary">AVAILABLE —</p>
</article>
<article class="metric-card metric-disk">
<div class="metric-card-head"><span>DISK</span><span>ROOT FS</span></div>
<strong id="disk-value" class="metric-value"></strong>
<progress id="disk-progress" max="100" value="0">0%</progress>
<p id="disk-detail" class="metric-detail">正在读取磁盘状态…</p>
<p id="disk-secondary" class="metric-secondary">/</p>
</article>
<article class="metric-card metric-gpu">
<div class="metric-card-head"><span>GPU</span><span>NVIDIA</span></div>
<strong id="gpu-value" class="metric-value"></strong>
<progress id="gpu-progress" max="100" value="0">0%</progress>
<p id="gpu-detail" class="metric-detail">正在读取显卡状态…</p>
<p id="gpu-secondary" class="metric-secondary">VRAM —</p>
</article>
</div>
</div>
</section>
<section class="principles">
<div class="shell principle-grid">
<article>
<span class="principle-number">01</span>
<strong>存在是公开信息</strong>
<p>组件名称、用途、技术栈、入口和运行状态对所有访客可见。</p>
</article>
<article>
<span class="principle-number">02</span>
<strong>授权保护数据与操作</strong>
<p>SSO、Access Key、SSH Key 或内网边界在进入组件时生效。</p>
</article>
<article>
<span class="principle-number">03</span>
<strong>Label 决定目录内容</strong>
<p>容器自行声明展示信息;页面不维护硬编码服务清单。</p>
</article>
</div>
</section>
<section id="services" class="catalog-section shell">
<div class="section-heading">
<div>
<p class="section-kicker">APPLICATIONS / ENDPOINTS</p>
<h2>服务目录</h2>
</div>
<p>所有可使用的应用和协议入口。需要认证的服务会在卡片上明确标注。</p>
</div>
<div class="filters" role="group" aria-label="筛选组件">
<button class="filter active" type="button" data-filter="all">全部</button>
<button class="filter" type="button" data-filter="public">无需登录</button>
<button class="filter" type="button" data-filter="restricted">受控访问</button>
<button class="filter" type="button" data-filter="online">服务可用</button>
</div>
<div id="services-catalog" class="catalog" aria-live="polite">
<div class="loading-card">正在发现服务…</div>
</div>
</section>
<section id="infrastructure" class="catalog-section infrastructure-section">
<div class="shell">
<div class="section-heading">
<div>
<p class="section-kicker">EDGE / IDENTITY / DATA / OPS</p>
<h2>基础设施</h2>
</div>
<p>公开系统的组成与职责;不公开密码、Token、私钥和其他秘密值。</p>
</div>
<div id="infrastructure-catalog" class="catalog" aria-live="polite">
<div class="loading-card">正在发现基础设施…</div>
</div>
</div>
</section>
<section id="now" class="now-section shell">
<div class="section-heading">
<div>
<p class="section-kicker">OPERATING MODEL</p>
<h2>Now</h2>
</div>
</div>
<div class="now-grid">
<article class="now-card accent-yellow">
<span>DISCOVERY</span>
<h3>统一入口</h3>
<p><code>xiteng.site</code> 是唯一目录;组件由 Docker Label 自动加入或移除。</p>
</article>
<article class="now-card accent-blue">
<span>ACCESS</span>
<h3>按服务授权</h3>
<p>门户保持公开,受控服务在点击后交给 Authentik 或对应凭据系统。</p>
</article>
<article class="now-card accent-green">
<span>TRANSPARENCY</span>
<h3>架构默认公开</h3>
<p>公开组件、镜像与状态;环境变量、挂载、原始 Label 和秘密值不进入目录 API。</p>
</article>
</div>
</section>
</main>
<footer>
<div class="shell footer-inner">
<span>xiteng.site · <span id="year">2026</span> · liooil</span>
<span>Docker labels → catalog + monitoring</span>
</div>
</footer>
</body>
</html>