Project Documentation · Public Edition

fwq-portal — GPU 服务器统一入口 · 运维门户 · AI 网关

面向内部小团队的 GPU 服务器共享基础设施:把远程 SSH 接入、账号/密钥/审计/监控管理与 OpenAI 兼容的 AI 网关收敛进一个轻量门户,同一台公网主机同时托管团队官网与实时看板。 本页为公开版技术文档,内部网络地址、端口与部署手册不在公开范围。

项目定位

团队共享一台内网 GPU 服务器,但没有公网 IP,也不能给每个成员开系统账号了事。 fwq-portal 用一台公网 ECS 做统一大门:SSH 走 frp 反向隧道(内网侧主动出网,穿透无公网环境), Web 门户负责账号审批、密钥登记、命令审计与监控告警,同时在门户内内置一个 OpenAI 兼容的 AI 网关(vLLM 本地推理),成员用门户签发的 Key 就能调用本地大模型。

三个入口:Web 门户(fwq.heartshinemedical.com)· SSH(统一域名入口,仅公钥登录)· AI API(OpenAI 兼容 /v1,门户签发 Key)。

功能特性

分组能力
SSH 接入 frp 反向隧道统一入口;成员 / 访客 / 管理员分级账号;仅公钥登录(公网密码登录关闭);多公钥 + 设备别名;成员自助提交公钥 → 管理员审批
运维门户 成员/账号管理(自动同步系统用户组)、SSH 命令审计(auditd auid 归因,su/sudo 提权后仍归因登录人,保留 90 天)、登录日志、操作日志、申请审批、邮件通知
AI 网关 vLLM 本地推理(开源模型,可切换);门户 AI 对话(SSE 流式);OpenAI 兼容 /v1 端点给外部 agent;Key 签发与配额管理
监控 链路概览拓扑图(动效)、健康灯带、主机指标、安全态势(Web 扫描 / 蜜罐 / SSH 抗爆破)、告警邮件 + alerts.log(看门狗:隧道掉线 / 磁盘 / 证书 / SSH 红线)

技术栈

层技术说明
后端 Python 3 · Flask ≥3.0 · gunicorn systemd 托管;零数据库——账号/日志全部 JSON 文件 + 原子写(tmp + os.replace)
前端 Vue 3(<script setup>)· vue-router · Vite 5 · @ai-sdk/vue 构建产物随服务部署;图表全部自绘 SVG(刻意不引入图表库);PWA(可添加到主屏幕)
推理 vLLM OpenAI 兼容 API,仅本机监听;门户经 localhost 反代,不占隧道带宽
网关 nginx · frp(frps/frpc) 反向代理 + 反向隧道(CGNAT 穿透);限流 / 蜜罐 / 自动封禁均在 nginx 层
安全 auditd · fail2ban · certbot(Let's Encrypt) SSH 强制命令只读通道,详见安全设计
采集 自研轻量采集器 ×4 30s 级自轮询、自轮转,经只读通道回传门户
运维 systemd · scp · cron 备份脚本 + 恢复手册(内部文档)

架构

成员浏览器 / SSH 客户端 │ HTTPS · SSH(仅公钥) ▼ 公网 ECS —— nginx 统一大门:官网静态 · 门户反代 · 实时看板 · 限流/蜜罐/自动封禁 │ frp 反向隧道(内网侧主动出网,穿透无公网环境) ▼ 内网 GPU 服务器(64 核 / 125Gi / 96GB VRAM) · 门户应用(Flask,仅本机监听) · vLLM 推理(仅本机监听) · auditd 命令审计 · 虚拟机 ×2 · 容器 ×2
只读通道:门户对云主机的所有读取走专用密钥 + authorized_keys 强制命令 (command="cat …",restrict)——只能 cat 指定文件、拿不到 shell, 刻意不做"门户直接写云主机"的通道。

安全设计