诊所网络 MIS 审计与稳定化
原承包商解散、代码原样移交。六周内关闭 152-FZ 风险、消除早高峰数据库宕机,云成本几乎减半。
项目概况
一家联邦级私立诊所网络(数十家分院、数百名医生、每日数千次就诊)。Web 版 MIS(预约、电子病历、实验室与 1C 集成)由本地承包商开发约一年半。团队解散后源码无支持移交。高峰期系统迟缓,数据库偶发锁死,内部隐私审计也提出了问题。
接手前的痛点
云成本超预算
Yandex Cloud 约 32 万 ₽/月,业务期望约 18 万 ₽。
周一早高峰
打开患者卡片与医生排班超过 8 秒——医生抱怨“系统卡”。
数据库宕机
每月高峰时段约一次因锁导致库不可用,前台无法办理就诊。
风险与资金
同一时段重复预约、152-FZ/医密内部审计问题,以及 1C 支付同步错误导致重复入账。
六周后的结果
−48%
Yandex Cloud:32 万 → 16.5 万 ₽/月
0.6 秒
早高峰打开卡片 p95(原 8.2 秒)
152-FZ
复审内部审计通过
×4.5
CI/CD 加速:构建 18 → 4 分钟
审计时的技术栈
后端
主 API 为 FastAPI,后台与用户管理为 Django REST Framework。队列 RabbitMQ,后台任务 Celery。
前端
前台与医生端 Angular SPA,UI 基于 Angular Material。
数据与基础设施
业务数据 PostgreSQL,院长报表 ClickHouse。Yandex Cloud:托管 Kubernetes / PostgreSQL / Object Storage。CI 为 GitLab CE,监控 VictoriaMetrics + Grafana + EFK。
审计发现
性能、152-FZ 合规与 DevOps 的关键问题。
架构与性能
对 1C 的同步 requests.post() 阻塞 FastAPI 事件循环——1C 变慢则整个 API 停摆。
患者列表 Django ORM N+1:100 行约 300+ 次数据库查询。
无 PgBouncer:每请求新建连接,高峰触达 max_connections。
ClickHouse「医生负荷」报表 40 秒,绕过物化视图做全表扫描。
安全与 152-FZ
Kibana 明文记录姓名、医保单号与 ICD-10 诊断。
RBAC 仅在前端:医生可通过 API 读取同事排班与病历。
JWT 存 localStorage,易受 XSS 会话窃取。
基础设施与 DevOps
K8s 节点过度配置(16 vCPU / 64 GB),利用率 ≤20%。
自研 Postgres cron 备份无告警——连续三周无可用副本。
Angular CI 构建约 18 分钟,无 node_modules 缓存且使用旧 Webpack。
我们做了什么
三个两周阶段:先安全与备份,再数据库与集成,最后容量与 CI。
阶段 1 · 安全、152-FZ、备份
FastAPI/Django 中间件掩码日志中的 SNILS、护照与姓名;更新 Fluentd 解析。
硬性 RBAC:令牌中 doctor_id 校验对 patient_id 的访问(院长看全部,医生看自己的)。
JWT 迁至 HttpOnly / Secure / SameSite=Strict Cookie;Angular 拦截器自动带 Cookie。
托管 PostgreSQL 备份至 Object Storage,服务端加密、30 天轮转;失败 Telegram 告警。
阶段 2 · 数据库与集成
1C:httpx.AsyncClient + RabbitMQ 事件;Celery 指数退避——前台 UI 不再等待 1C。
select_related / prefetch_related 与针对性 RawSQL 消除 N+1。
Postgres 前部署 PgBouncer:Too many clients 消失。
ClickHouse 物化视图:医生报表 40 秒 → 0.8 秒。
阶段 3 · 基础设施与 CI/CD
节点 right-sizing 至 8 vCPU / 32 GB;备份/日志盘改 network-hdd。
esbuild 替代 Webpack;GitLab CI 缓存 Docker 层与 node_modules:18 → 4 分钟。
VictoriaMetrics 看板与 RabbitMQ 队列深度告警——1C 故障早于患者投诉可见。
关键成效
可预期的云支出
按月度指标做虚拟机 right-sizing,高峰预约 SLA 不受损。
稳定的早高峰
异步 1C、连接池与 ORM 优化消除卡片卡顿与锁导致宕机。
面向 152-FZ 的边界
日志脱敏、服务端 RBAC 与安全会话关闭内部审计问题。
1C 重复支付降至零
备份按计划创建并加密
XSS 与水平越权已关闭