三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Snipe-IT 容器化部署实战:IT资产管理系统从两次翻车到十分钟上线的完整记录

Snipe-IT 容器化部署实战:IT资产管理系统从两次翻车到十分钟上线的完整记录

Snipe-IT 容器化部署实战:IT资产管理系统从两次翻车到十分钟上线的完整记录

【免费下载链接】snipe-itA free open source IT asset/license management system项目地址: https://gitcode.com/GitHub_Trending/sn/snipe-it

Snipe-IT 是一款开源免费的 IT 资产管理系统,支持设备、软件授权、维护工单和耗材的全流程追踪。这篇文章记录我用 Docker 完成 Snipe-IT 容器化部署的真实历程——前后翻车两次,第三次才真正跑通,最终沉淀出一套十分钟可复用的最小方案。每一步我都会讲清楚"为什么要这么做",让你能理解着照做,而不是盲抄命令。

被三千行 Excel 记录逼上容器化这条路

在部署之前,我一直用共享表格管理资产。直到一次季度盘点,三个人花了整整两天对账,还漏掉了二十多台设备,我才下定决心换系统。可手动安装 Snipe-IT 并不轻松:它依赖特定版本的 PHP 扩展、Composer 依赖和 Apache 配置,稍有偏差安装就中断。

容器化解决的正是这类问题——镜像里把运行环境打包好,我只需要管数据和配置。当然它也有代价:要理解卷、网络、环境变量这些新概念。如果只是单机装一次、团队没人懂 Docker,直接装可能更快;但只要你有测试/生产两套环境,或者打算未来迁移扩容,容器化就是更省心的选择。

对比维度手动部署容器化部署
环境一致性每台机器都要重新调镜像即环境,开箱即用
升级回滚手动覆盖文件,易残留换镜像标签即可,可快速回退
数据备份靠自己写脚本卷+导出,流程清晰

第一次翻车:APP_KEY 没配,容器像抽风一样重启

环境准备妥当后,我拉取了官方镜像并写好docker-compose.ymldocker compose up -d一敲,看着容器状态从starting跳到restarting,反复横跳,日志刷屏。折腾了快一个小时,我才在启动脚本里找到原因:容器启动时会强制检查APP_KEY环境变量,没设置就直接退出。

APP_KEY是 Laravel 应用(Snipe-IT 的底层框架)用来加密数据的密钥,Session、Cookie、用户密码都依赖它。它的值必须是 32 位随机字符串,官方写死的默认值绝对不能直接用。正确做法是用镜像自带的命令生成一把新钥匙:

# 镜像里自带 artisan,直接用它生成 32 位随机密钥 docker run --rm snipe/snipe-it php artisan key:generate --show

把输出复制进.envAPP_KEY=后面,再docker compose up -d,容器才安稳地跑起来。

第二次翻车:数据库装好了,应用却连不上

App 起来了,可网页一直报数据库连接失败。问题出在环境变量上:应用容器读取的是.env里的DB_HOSTDB_USERNAMEDB_PASSWORD,数据库容器却通过MYSQL_DATABASEMYSQL_USERMYSQL_PASSWORD初始化账号。两边必须完全对齐,一个字母错了就连接失败。

这也是容器部署最容易踩的坑——镜像之间靠环境变量"对话",而不是靠人去记忆。我在.env里统一了这套配置:

DB_DATABASE=snipeit DB_USERNAME=snipeit DB_PASSWORD=替换成你自己的强密码 MYSQL_ROOT_PASSWORD=再替换一个,别跟上面相同

改完重启服务,登录界面终于出现了。可紧接着我注意到一个更要命的问题:如果当初没有声明命名卷,容器一删,数据库数据就跟着灰飞烟灭。官方docker-compose.yml里用db_datastorage两个命名卷分别保存数据库文件和上传附件,这一步千万别图省事改掉。

跑通的方案:十分钟最小可行部署

踩完两个坑,我把整个过程压缩成了五个步骤,照着做就不会出错:

# 1. 拉取项目代码(仓库里自带生产环境的 compose 配置) git clone https://gitcode.com/GitHub_Trending/sn/snipe-it cd snipe-it # 2. 复制环境变量模板并填写 cp docker/docker.env .env

接着在.env里填三样东西:上一步生成的APP_KEY、数据库密码、APP_URL(改成你部署机器的实际域名或 IP)。然后启动并验证:

# 3. 后台启动全部服务,数据库会先做健康检查再拉起应用 docker compose up -d # 4. 确认两个容器都处于 Up 状态 docker compose ps # 5. 追踪应用日志,看到 migrate 执行成功基本就稳了 docker compose logs -f app

首次启动时,应用容器会自动执行数据库迁移并创建表结构,这一步由官方启动脚本接管,你不用手动跑php artisan migrate。打开浏览器访问http://你的服务器IP:8000,看到登录页就算部署成功。

部署完成后,我顺手把部门里那台进水报废的笔记本录进系统,登记了维护工单和报废状态——这套界面就是以后每天要用的主战场。

上线后的调优:性能瓶颈一次说清

本以为大功告成,结果同事汇报 30 人同时登录时页面明显变慢。一番排查后,我把这五个参数调到位:

# 限制上传文件大小,默认值偏小,改大后记得重启应用容器 PHP_UPLOAD_LIMIT=50M # 时区不配,所有时间记录都会偏差 APP_TIMEZONE=Asia/Shanghai # 默认用文件缓存,请求一多就拖慢;换成 Redis 能显著减压 CACHE_DRIVER=redis SESSION_DRIVER=redis # 邮件发送从同步改为异步队列,避免用户等页面转圈 QUEUE_CONNECTION=redis

💡 进阶技巧:上面三个redis配置需要在docker-compose.yml里额外加一个redis服务并设置REDIS_HOST环境变量。如果你只是 20 人以内的小团队,保持默认的file驱动完全够用,不必为了"看起来很专业"增加复杂度。

数据库侧也别闲着。给高频查询字段补上索引,是最便宜的提速手段:

ALTER TABLE assets ADD INDEX idx_asset_tag (asset_tag); ALTER TABLE assets ADD INDEX idx_assigned_to (assigned_to);

数据是命根子:备份不能靠运气

优化完性能,我开始焦虑备份问题——毕竟系统里存着全公司的家当。容器化之后备份思路很简单:数据库在db容器里,用mysqldump导出即可。

# 每天凌晨两点执行一次全量备份,保留最近 30 天 docker compose exec -T db mysqldump -u snipeit -p"$DB_PASSWORD" snipeit \ > backup_$(date +%Y%m%d).sql

把这条命令写进 crontab,再配一条find ./backups -name "*.sql" -mtime +30 -delete做旧备份清理。⚠️ 风险提醒:备份脚本里的密码通过环境变量传入,不要硬编码在文件里;首次恢复前一定要拿测试库演练一遍,别等真出事才发现备份是坏的。

常见误区小结

最后把我踩过的坑浓缩成一份避坑清单,供你对照自查:

  • APP_KEY 用默认值——容器会直接拒绝启动,这是新手最高频的翻车点。
  • 数据库密码不一致——.env里应用和数据库两套变量必须对齐,改完记得重启两个容器。
  • 省掉命名卷——匿名卷随容器删除而销毁,数据会静默丢失。
  • 跳过备份验证——备份文件存在 ≠ 备份可恢复,务必定期演练还原。
  • 小团队盲目上 Redis——先评估真实并发,性能优化要跟着业务规模走。

回看这趟部署,最大的体会是:容器化并没有消灭复杂度,而是把复杂度从"PHP 环境配置"转移到了"镜像编排与环境变量管理"上。但只要按本文的最小方案起步,先把系统跑起来,再逐步叠加 Redis、HTTPS、自动备份这些增强项,你也能在一小时内拥有一个稳定、可维护的 IT 资产管理平台。下一步,建议你从录入第一批真实资产开始,让数据流动起来。

【免费下载链接】snipe-itA free open source IT asset/license management system项目地址: https://gitcode.com/GitHub_Trending/sn/snipe-it

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

← 返回列表