灭火器巡检系统 — 部署与使用教程
一、项目概述
灭火器巡检系统是一款轻量级 Web 应用,专为单位/学校的月度灭火器巡检工作设计。巡检人员用手机打开网页即可完成拍照、签名、提交,无需安装任何 App。
| 技术栈 | |
| 部署方式 | |
| 运行环境 | |
| 访问方式 | |
| 数据库 |
二、功能清单
三、项目文件结构
fire-extinguisher-check/├── Dockerfile # Docker 镜像定义├── requirements.txt # Python 依赖(Flask, Pillow, Werkzeug)├── deploy.sh # 一键部署脚本├── app.py # Flask 后端主程序├── .gitignore # Git 忽略规则├── README.md # 项目说明├── static/│ └── uploads/│ └── .gitkeep # 占位文件└── templates/ ├── index.html # 巡检登记主页 ├── records.html # 巡检记录查看页 ├── report.html # 领导报表页(只读) └── settings.html # 设置管理页部署后自动生成的目录:
fire-extinguisher-check/└── data/ # 数据目录(Docker 挂载,持久化) ├── data.db # SQLite 数据库 ├── config.json # 配置文件(位置、巡检人列表) └── uploads/ # 照片和签名存储四、环境要求
| 操作系统 | |
| Docker | |
| 网络 | |
| 浏览器 |
五、部署到飞牛 NAS
5.1 上传项目文件
将项目文件夹上传到飞牛 NAS,例如:
/vol2/1000/docker/fire-extinguisher-check/飞牛 NAS 文件管理:通过 SMB 共享(
\\192.168.1.109)或 SFTP 客户端(如 WinSCP)上传。
5.2 SSH 登录 NAS 并部署
ssh 用户名@192.168.1.109# 进入项目目录cd /vol2/1000/docker/fire-extinguisher-check# 一键部署bash deploy.shdeploy.sh 会自动完成以下 4 步:
[1/4] 创建 data/ 目录(数据库持久化)[2/4] 构建 Docker 镜像(基于 python:3.11-slim)[3/4] 停止并删除旧容器[4/4] 启动新容器,绑定 5000 端口,挂载 data/ 目录5.3 手动部署(可选)
如果不想用 deploy.sh,可以手动执行:
cd /vol2/1000/docker/fire-extinguisher-check# 1. 创建数据目录mkdir -p data/uploads# 2. 构建镜像docker build -t fire-extinguisher-check .# 3. 启动容器docker run -d \ --name fire-extinguisher-check \ -p 5000:5000 \ -v /vol2/1000/docker/fire-extinguisher-check/data:/app/data \ --restart always \ fire-extinguisher-check5.4 验证部署
浏览器打开 http://192.168.1.109:5000,应看到巡检登记页面。
查看运行状态:
docker logs fire-extinguisher-check # 查看日志docker ps | grep fire-extinguisher # 查看容器状态六、内网穿透(外网访问)
内网穿透使用 frpc 服务,已配置文件 fire-extinguisher-check,代理内网 192.168.1.109:5000 到域名。


当前访问地址
http://firecheck.lepose.cnfrpc 配置示例
# 在 frpc 配置中添加[fire-extinguisher-check]type = httplocal_ip = 192.168.1.109local_port = 5000custom_domains = firecheck.lepose.cn飞牛 NAS 已配置好 frpc,通过节点小宝 VIP 域名实现外网穿透。
七、使用教程
7.1 首次配置
浏览器打开 http://firecheck.lepose.cn/settings添加巡检位置:输入位置名称(如"教学楼一楼东"),点击添加 添加巡检人:输入姓名(如"郑小强"),点击添加 点击「💾 保存配置」
位置和巡检人会保存到
data/config.json,重启容器不丢失。
7.2 每日巡检流程
📱 手机打开 http://firecheck.lepose.cn📍 选择位置 — 点击位置网格卡片 👤 输入姓名 — 点击预设标签或手写输入 📞 输入电话 — 必填,用于后续联系 📸 拍照上传 — 点击拍照区域调起摄像头,拍完自动叠加防伪水印 ✍️ 手写签名 — 手指在签名区书写,点击「确认签名」 🔍 选择结果 — 正常 / 异常 正常:直接提交 异常:勾选问题(压力不够/瓶体损坏/超过有效期等)→ 可补充说明 → 点击红色「📞 立即报修」按钮拨号 ✅ 提交巡检记录
重要规则:同一个位置 + 同一个月只能保留一条记录,新提交会覆盖旧记录。
7.3 查看记录
底部导航 → 📊 记录
选择月份查看该月所有巡检记录 点击照片可放大预览 显示每个位置的巡检人、电话、巡查结果 支持打印(浏览器打印功能)
7.4 领导报表
访问 http://firecheck.lepose.cn/report(无需登录,纯只读):
选择月份 绿点 = 已巡检,红点 = 未巡检 显示巡检人、日期、照片、签名 支持打印

可用「草料二维码」生成报表链接二维码,打印贴在墙上,扫码即看。
7.5 设置管理
底部导航 → ⚙️ 设置
八、日常维护
8.1 查看运行状态
# 容器是否在运行docker ps | grep fire-extinguisher# 查看日志docker logs --tail 50 fire-extinguisher-check# 健康检查curl http://192.168.1.109:5000/api/health8.2 重启容器
docker restart fire-extinguisher-check8.3 数据备份
# 复制整个 data 目录cp -r /vol2/1000/docker/fire-extinguisher-check/data \ /vol2/1000/docker/fire-extinguisher-check/data_backup_$(date +%Y%m%d)8.4 清除数据
# 方法一:删除 data.db(需重启容器)docker stop fire-extinguisher-checkrm /vol2/1000/docker/fire-extinguisher-check/data/data.dbdocker start fire-extinguisher-check# 容器启动后会自动创建新数据库# 方法二:直接清空表数据(推荐,保留结构)docker exec fire-extinguisher-check python -c "import sqlite3conn = sqlite3.connect('/app/data/data.db')conn.execute('DELETE FROM inspections')conn.execute('DELETE FROM repairs')conn.commit()print('已清空所有巡检和报修记录')conn.close()"8.5 更新代码
当本地修改代码后,需要同步到 NAS:
# 1. 将更新文件上传到 NAS 项目目录(覆盖旧文件)# 2. 如果修改了 Python 代码或模板文件,重建镜像部署:cd /vol2/1000/docker/fire-extinguisher-checkbash deploy.sh# 3. 如果只修改了模板文件,可快速更新:docker cp /vol2/1000/docker/fire-extinguisher-check/templates/新文件.html \ fire-extinguisher-check:/app/templates/docker restart fire-extinguisher-check九、常见问题
Q1:手机打开页面时提示"仅支持实时拍照"
原因:系统要求必须用摄像头实时拍摄,不能从相册选择旧照片。
解决:在摄像头界面拍新照片即可。这是防伪设计。
Q2:提交时报错「提交失败」
可能原因:
网络不稳定 — 尝试切换流量/WiFi 照片过大 — 系统已自动压缩到 800px/60% 品质,通常 < 200KB frpc 代理超时 — 稍后重试
排查:看浏览器 F12 控制台输出的详细错误信息。
Q3:打开页面显示空白或样式异常
解决:强制刷新浏览器(Ctrl+F5 或清除缓存)。
Q4:如何更换域名/访问地址?
修改 frpc 的 custom_domains 配置,指向新域名即可。
Q5:数据库字段错误 no such column: telephone
原因:升级了代码但数据库是旧结构。
解决:
# 重建容器(deploy.sh 会自动重建镜像)cd /vol2/1000/docker/fire-extinguisher-checkbash deploy.sh或者手动添加缺失字段:
docker exec fire-extinguisher-check python -c "import sqlite3conn = sqlite3.connect('/app/data/data.db')try: conn.execute('ALTER TABLE inspections ADD COLUMN telephone TEXT DEFAULT \"\" ') conn.commit()except: passconn.close()"Q6:如何查看所有容器占用的磁盘空间?
docker system df十、技术细节
数据库结构
inspections 表:
唯一索引:
(月份, 位置)— 同月同位置覆盖更新
repairs 表:报修单全生命周期管理(待维修→维修中→已完成)。
安全特性
拍照自动叠加时间+位置+巡检人水印(右下角半透明黑底白字) EXIF 时间校验(30分钟内拍摄才接受) 照片上传后压缩至 800px 宽、JPEG 60% 品质 手写签名 Canvas 绘制,转为 PNG 存储






夜雨聆风