4a1d949e41
完整 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
112 lines
5.6 KiB
HTML
112 lines
5.6 KiB
HTML
{% 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 %}
|