Files
Hermes Agent 4a1d949e41 feat: 完整 Squid Web Manager 平台 - P0-P3 全功能
完整 Web 管理平台,涵盖:

P0 生产加固:
- 会话超时(空闲+绝对) + CSRF 防护 + 登录失败限流
- HTTPS/TLS 证书管理(自签生成/上传/删除/过期提醒)
- SSL Bump (HTTPS 透明代理) 可视化配置
- 配置文件 diff 预览 + 二次确认才写入
- 服务控制二次确认 + 操作期间按钮锁定

P1 运维能力:
- 日志轮转管理(logrotate) + 日志状态监控
- 告警规则(5xx/命中率/磁盘/客户端流量)
- 多 Squid 实例管理 + 一键切换
- squidclient mgr 实时性能指标
- 流量异常检测(突增/大文件/高频小包/新客户端)

P2 日志分析增强:
- 日志持久化到 SQLite + 历史时间范围查询
- 导出 CSV/JSON(日志/KPI/异常/审计)
- GeoIP 地图(Leaflet + ip-api.com 离线可选 GeoLite2)
- 每客户端 24h 趋势图
- 自定义 Squid logformat 解析器

P3 体验锦上添花:
- 暗/亮主题切换(cookie 持久化)
- WebSSH 终端(xterm.js + paramiko)
- 完整审计日志 + 用户管理

技术栈: Flask 3.0 + SQLAlchemy 2.0 + SQLite + Chart.js + Leaflet
总代码量: ~16500 行 (15 Python 模块 + 34 模板 + CSS)
路由数: 73
2026-07-15 10:19:21 +08:00

112 lines
5.6 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{% extends "base.html" %}
{% block title %}路径设置 - Squid Manager{% endblock %}
{% block content %}
<div class="page-header">
<h1>🗂️ 应用路径设置</h1>
</div>
<div class="card">
<p class="card-desc">配置本平台如何与 Squid 交互。这些设置仅保存在数据库,不影响 squid.conf。</p>
<form method="post">
<input type="hidden" name="_csrf" value="{{ csrf_token() }}">
<div class="config-section">
<h3 class="config-section-title">🦑 Squid 路径</h3>
<div class="filter-grid">
<div class="form-group">
<label>Squid 配置文件路径</label>
<input type="text" name="squid_conf_path" value="{{ cfg.squid_conf_path }}" class="form-input">
</div>
<div class="form-group">
<label>Squid 二进制</label>
<input type="text" name="squid_binary" value="{{ cfg.squid_binary }}" class="form-input">
</div>
<div class="form-group">
<label>systemctl 路径</label>
<input type="text" name="systemctl" value="{{ cfg.systemctl }}" class="form-input">
</div>
<div class="form-group">
<label>Systemd 服务名</label>
<input type="text" name="squid_service" value="{{ cfg.squid_service }}" class="form-input">
</div>
</div>
</div>
<div class="config-section">
<h3 class="config-section-title">📄 日志路径</h3>
<div class="filter-grid">
<div class="form-group">
<label>access.log 路径</label>
<input type="text" name="access_log_path" value="{{ cfg.access_log_path }}" class="form-input">
</div>
<div class="form-group">
<label>cache.log 路径</label>
<input type="text" name="cache_log_path" value="{{ cfg.cache_log_path }}" class="form-input">
</div>
</div>
</div>
<div class="config-section">
<h3 class="config-section-title">⚙️ 日志分析设置</h3>
<div class="filter-grid">
<div class="form-group">
<label>解析行数上限 <span class="hint">从 access.log 末尾读取的最大行数</span></label>
<input type="number" name="log_parse_limit" value="{{ cfg.log_parse_limit }}" class="form-input">
</div>
<div class="form-group">
<label>缓存秒数 <span class="hint">解析结果缓存 TTL</span></label>
<input type="number" name="log_cache_seconds" value="{{ cfg.log_cache_seconds }}" class="form-input">
</div>
<div class="form-group">
<label>实时日志显示行数</label>
<input type="number" name="live_tail_lines" value="{{ cfg.live_tail_lines }}" class="form-input">
</div>
<div class="form-group">
<label>自动刷新间隔 (秒)</label>
<input type="number" name="auto_refresh_seconds" value="{{ cfg.auto_refresh_seconds }}" class="form-input">
</div>
</div>
</div>
<div class="config-section">
<h3 class="config-section-title">🗄️ 日志存储方式</h3>
<p class="card-desc">P2-1 持久化模式会把 access.log 写入 SQLite,保留历史并支持时间范围查询;文件直读模式保持旧行为。</p>
<div class="radio-group">
<label class="radio-option">
<input type="radio" name="log_use_persistent" value="1"
{% if cfg.log_use_persistent != '0' %}checked{% endif %}>
<span class="radio-title">✅ SQLite 持久化</span>
<span class="radio-desc">日志行写入数据库,可分页/时间范围查询。同步通过 /logs/sync 触发,或设置下面自动同步间隔。</span>
</label>
<label class="radio-option">
<input type="radio" name="log_use_persistent" value="0"
{% if cfg.log_use_persistent == '0' %}checked{% endif %}>
<span class="radio-title">📂 文件直读(旧模式)</span>
<span class="radio-desc">仅读 access.log 末尾的指定行数。不保留历史,刷新即丢。</span>
</label>
</div>
<div class="filter-grid">
<div class="form-group">
<label>自动同步间隔 (秒) <span class="hint">仅在持久化模式下生效;0 表示仅手动同步</span></label>
<input type="number" name="log_sync_interval" value="{{ cfg.log_sync_interval }}" class="form-input" min="0">
</div>
</div>
</div>
<div class="form-actions">
<button type="submit" class="btn btn-primary">💾 保存</button>
</div>
</form>
</div>
<div class="card">
<h3 class="card-title">️ 说明</h3>
<ul>
<li>所有路径必须在本平台进程可访问的位置 (同一台主机或挂载的卷)</li>
<li>如果 squid 安装在远程主机,可考虑通过 SSHFS 挂载配置和日志目录</li>
<li>服务控制 (start/stop/reload) 通过本地 systemctl 执行 - 仅当 squid 与本平台同机时有效</li>
<li>降低"解析行数上限"可加快仪表盘加载速度,但会丢失早期数据</li>
</ul>
</div>
{% endblock %}