chore: 初始提交 - 移除所有硬编码凭据,统一从环境变量读取

This commit is contained in:
yangxiangyuan
2026-06-11 17:10:58 +08:00
commit c223c79b36
1699 changed files with 313940 additions and 0 deletions
@@ -0,0 +1,291 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>BOX容灾哨兵</title>
<link rel="stylesheet" href="/tools/box_disaster_sentinel/box_disaster_sentinel.css">
</head>
<body>
<div class="page">
<header class="hero">
<div>
<h1>BOX容灾哨兵</h1>
<p>OSS 二线备份控制台:状态、操作、告警、配置一体化</p>
</div>
<div class="hero-actions">
<button id="btn-refresh" class="btn btn-primary">刷新</button>
</div>
</header>
<div id="auth-warning" class="notice notice-err" style="display:none;"></div>
<div id="save-notice" class="notice" style="display:none;"></div>
<main class="grid">
<section class="card">
<div class="card-head">
<h2>1. 状态总览</h2>
</div>
<div class="overview-grid">
<div class="mini-card">
<div class="mini-title">高频备份</div>
<div id="highfreq-status" class="status-text">-</div>
<div id="highfreq-last" class="muted">上次:-</div>
<div id="highfreq-next" class="muted">下次:-</div>
</div>
<div class="mini-card">
<div class="mini-title">低频备份</div>
<div id="lowfreq-status" class="status-text">-</div>
<div id="lowfreq-last" class="muted">上次:-</div>
<div id="lowfreq-next" class="muted">下次:-</div>
</div>
<div class="mini-card">
<div class="mini-title">当前任务</div>
<div id="current-run-status" class="status-text">空闲</div>
<div id="current-run-stage" class="muted">阶段:-</div>
<div id="current-run-message" class="muted">消息:-</div>
</div>
<div class="mini-card">
<div class="mini-title">百度云盘手工备份</div>
<div id="manual-last" class="status-text">-</div>
<div class="inline-actions">
<input id="manual-note" class="input" placeholder="备注,可选">
<button id="btn-manual-record" class="btn">我已完成</button>
</div>
</div>
</div>
<div class="meta-row">
<span id="oss-ready" class="pill">OSS状态:-</span>
<span id="verify-last" class="pill">最近抽检:-</span>
<span id="restore-last" class="pill">最近演练:-</span>
<span id="credential-file" class="muted">凭证文件:-</span>
</div>
</section>
<section class="card">
<div class="card-head">
<h2>2. 备份操作</h2>
</div>
<div class="inline-actions wrap">
<button id="btn-run-high" class="btn btn-primary">手动触发高频</button>
<button id="btn-run-low" class="btn btn-primary">手动触发低频</button>
<button id="btn-run-all" class="btn btn-primary">手动触发全部</button>
<button id="btn-run-verify" class="btn">回读抽检</button>
<button id="btn-run-restore" class="btn">恢复演练</button>
</div>
<div class="progress-block">
<div class="progress-head">
<span id="progress-title">当前无任务</span>
<span id="progress-percent">0%</span>
</div>
<div class="progress-bar">
<div id="progress-inner" class="progress-inner"></div>
</div>
<div id="progress-detail" class="muted">等待任务启动</div>
</div>
<pre id="run-summary" class="summary-box">暂无结果</pre>
</section>
<section class="card">
<div class="card-head">
<h2>3. 告警 & 日志</h2>
<div class="inline-actions">
<label class="checkbox">
<input id="filter-failures" type="checkbox">
<span>只看失败/重试</span>
</label>
</div>
</div>
<div class="table-wrap alerts-wrap">
<table>
<thead>
<tr>
<th>时间</th>
<th>级别</th>
<th>标题</th>
<th>内容</th>
</tr>
</thead>
<tbody id="alerts-body"></tbody>
</table>
</div>
<div class="table-wrap logs-wrap">
<table>
<thead>
<tr>
<th>时间</th>
<th>模式</th>
<th>类型</th>
<th>内容</th>
</tr>
</thead>
<tbody id="logs-body"></tbody>
</table>
</div>
</section>
<section class="card">
<div class="card-head">
<h2>4. 备份清单</h2>
<div class="inline-actions">
<label class="field field-inline">
<span>低频状态</span>
<select id="catalog-status-filter" class="input">
<option value="">全部</option>
<option value="uploaded">已上传</option>
<option value="failed">失败</option>
<option value="pending">待上传</option>
</select>
</label>
<button id="btn-catalog-refresh" class="btn">刷新清单</button>
</div>
</div>
<div class="catalog-grid">
<div>
<div class="section-subtitle">高频批次</div>
<div class="table-wrap catalog-wrap">
<table>
<thead>
<tr>
<th>时间</th>
<th>状态</th>
<th>Run GUID</th>
<th>内容</th>
<th>OSS Key</th>
<th>操作</th>
</tr>
</thead>
<tbody id="catalog-highfreq-body"></tbody>
</table>
</div>
</div>
<div>
<div class="section-subtitle">低频对象</div>
<div class="table-wrap catalog-wrap">
<table>
<thead>
<tr>
<th>时间</th>
<th>状态</th>
<th>原始路径</th>
<th>存储名</th>
<th>OSS Key</th>
<th>操作</th>
</tr>
</thead>
<tbody id="catalog-lowfreq-body"></tbody>
</table>
</div>
</div>
</div>
</section>
<section class="card">
<div class="card-head">
<h2>5. 配置管理</h2>
<div class="inline-actions">
<button id="btn-config-reload" class="btn">重新读取</button>
<button id="btn-config-save" class="btn btn-primary">保存并热生效</button>
</div>
</div>
<div class="form-grid">
<label class="field">
<span>高频 cron</span>
<input id="cfg-high-cron" class="input">
</label>
<label class="field">
<span>低频 cron</span>
<input id="cfg-low-cron" class="input">
</label>
<label class="field">
<span>轮询秒数</span>
<input id="cfg-poll-seconds" class="input" type="number" min="10">
</label>
<label class="field">
<span>OSS 根目录</span>
<input id="cfg-oss-root-prefix" class="input">
</label>
<label class="field">
<span>根目录 Key 名</span>
<input id="cfg-oss-root-prefix-key" class="input">
</label>
<label class="field">
<span>低频固定目录</span>
<input id="cfg-lowfreq-dir-name" class="input">
</label>
<label class="field">
<span>OSS Bucket</span>
<input id="cfg-oss-bucket" class="input">
</label>
<label class="field">
<span>OSS Endpoint</span>
<input id="cfg-oss-endpoint" class="input">
</label>
<label class="field">
<span>凭证文件名</span>
<input id="cfg-credential-file" class="input">
</label>
<label class="field">
<span>AK Key 名</span>
<input id="cfg-ak-key" class="input">
</label>
<label class="field">
<span>SK Key 名</span>
<input id="cfg-sk-key" class="input">
</label>
<label class="field">
<span>Bucket Key 名</span>
<input id="cfg-bucket-key" class="input">
</label>
<label class="field">
<span>Endpoint Key 名</span>
<input id="cfg-endpoint-key" class="input">
</label>
<label class="field">
<span>通知方式</span>
<input id="cfg-notification-placeholder" class="input" value="第一版预留,暂不启用" readonly>
</label>
<label class="field">
<span>抽检样本数</span>
<input id="cfg-sample-size" class="input" type="number" min="1">
</label>
<label class="field">
<span>恢复演练最大下载(MB)</span>
<input id="cfg-restore-max-mb" class="input" type="number" min="128">
</label>
</div>
<div class="textarea-grid">
<label class="field">
<span>高频代码路径(每行一个)</span>
<textarea id="cfg-high-code-paths" class="textarea"></textarea>
</label>
<label class="field">
<span>高频根文件(每行一个)</span>
<textarea id="cfg-high-root-files" class="textarea"></textarea>
</label>
<label class="field">
<span>高频扩展名(每行一个)</span>
<textarea id="cfg-high-exts" class="textarea"></textarea>
</label>
<label class="field">
<span>低频路径(每行一个)</span>
<textarea id="cfg-low-paths" class="textarea"></textarea>
</label>
<label class="field">
<span>高频排除目录(每行一个)</span>
<textarea id="cfg-high-excludes" class="textarea"></textarea>
</label>
<label class="field">
<span>低频排除目录(每行一个)</span>
<textarea id="cfg-low-excludes" class="textarea"></textarea>
</label>
</div>
</section>
</main>
</div>
<script src="/tools/box_disaster_sentinel/box_disaster_sentinel.js"></script>
</body>
</html>