Snipe-IT Docker 部署实战:从拉取镜像到生产备份的完整流程
Snipe-IT Docker 部署实战从拉取镜像到生产备份的完整流程【免费下载链接】snipe-itA free open source IT asset/license management system项目地址: https://gitcode.com/GitHub_Trending/sn/snipe-itSnipe-IT 是一个基于 Laravel 的开源 IT 资产与软件许可证管理系统用于跟踪设备去向、维保记录与许可证到期时间。本文带你用 Docker Compose 把它部署到一台 Linux 服务器上覆盖环境检查、容器启动、首次初始化、按需配置和日常运维。部署前准备在动手之前先确认下面这张环境清单。每一项都说明了它为什么必要缺任何一项后面都会卡住。项目要求为什么需要Docker / Docker Compose宿主机已安装并能拉取公共镜像应用和数据库都跑在容器里不需要手动装 PHP 8.3、Apache、MariaDB端口 8000宿主机未被占用应用容器把容器内 80 端口映射到宿主机的APP_PORT默认 8000被占用会启动失败数据库无需本地安装docker-compose.yml里已内置mariadb:11.4.7数据落在db_data卷中磁盘空间建议预留 10GB 以上上传文件、备份 zip 都存在storage卷图片多时增长很快出网 SMTP至少需要一个可用发信地址资产签收、到期提醒、密码找回都依赖邮件不通则这些功能全部失效时区明确APP_TIMEZONE资产折旧、维保到期都以时间计算时区错乱会导致报表偏移环境模板文件在 docker/docker.env容器启动逻辑在 docker/startup.sh生产编排文件为 docker-compose.yml。部署实施整个部署分成三个阶段每个阶段给出目的、可执行命令和通过标志。阶段一拉取代码与生成环境变量目的是准备.env文件Compose 文件通过env_file读取它缺了它容器起不来。git clone https://gitcode.com/GitHub_Trending/sn/snipe-it cd snipe-it cp docker/docker.env .env docker run --rm snipe/snipe-it php artisan key:generate --show把命令输出的 base64 串填回.env的APP_KEY并确认下面三项# 编辑 .env至少检查这三行 grep -E ^(APP_KEY|APP_URL|DB_DATABASE|DB_USERNAME|DB_PASSWORD) .env通过标志grep能逐行打印出APP_KEYbase64:...、APP_URLhttp://...:8000以及数据库用户名密码说明配置齐了。阶段二启动两个容器目的是让app和db两个服务同时跑起来。Compose 文件已声明depends_on: db: condition: service_healthy所以 app 会等 MariaDB 健康检查通过后再启动顺序问题不用手动管。docker compose up -d docker compose ps docker compose logs -f app通过标志docker compose ps里app和db两行都是Up (healthy)logs里能看到 Apache 与 Laravel 的启动信息没有SQLSTATE报错。启动脚本 docker/startup.sh 会自动跑php artisan migrate --force日志里出现 migrate 完成即代表数据库结构就绪。阶段三完成 Web 端初始化容器启动后并没有自动建管理员需要进浏览器走一次设置向导。这条路由由 app/Http/Controllers/SetupController.php 处理走的是web中间件不需要鉴权。# 在浏览器打开下面的地址完成三步 # 1. 检查系统依赖 # 2. 填写管理员姓名、用户名、邮箱、密码 # 3. 配置 SMTP 并发一封测试邮件 # 完成后跳转到 setup/done 即算通过 open http://127.0.0.1:8000/setup通过标志向导最后一步显示 setup complete 并跳到登录页用刚填的账号密码登录成功进入 Dashboard。首次运行验证登录后逐项过一遍下面这张清单全部打勾才算部署完成。验证项位置通过标准访问地址http://host:8000打开是登录页不是 500 或 Apache 默认页管理员账号登录页阶段三创建的账号能登录且权限为 superuser资产列表侧边栏 Hardware → Assets能打开空列表无报错模型列表Hardware → Models能打开能看到内置厂商设置页Admin → Settings各子页签General / Branding / Security / Notifications / LDAP / Backups都能进备份页Admin → Settings → Backups能看到页面可以点 Create Backup登录后的第一件事是两件事一是把Admin → Settings → Security里APP_DEBUG关掉生产必须 false二是回到.env把APP_ENVproduction明确写死然后docker compose restart app让配置生效。按需配置按需求场景分组只动你需要的部分避免一次改一堆导致回滚困难。安全强制 HTTPS适用场景对外提供服务不允许 HTTP 明文传输登录密码。镜像里已经内置 Apache SSL 站点 docker/001-default-ssl.conf启动脚本会检测/var/lib/snipeit/ssl/下是否存在snipeit-ssl.crt与snipeit-ssl.key有就自动a2enmod ssl。# 把证书放到 storage 卷对应路径 mkdir -p ./ssl cp my-cert.crt ./ssl/snipeit-ssl.crt cp my-cert.key ./ssl/snipeit-ssl.key # 用 -v 把 ./ssl 挂到容器 /var/lib/snipeit/ssl编辑 docker-compose.yml 的 app.volumes # 然后重启 docker compose restart app验证curl -vk https://host:443能看到证书链浏览器地址栏显示锁形图标。通知接入 SMTP适用场景需要把签收邮件、到期提醒真正发到用户邮箱。在.env里改MAIL_MAILERsmtp MAIL_HOSTsmtp.your-provider.com MAIL_PORT587 MAIL_USERNAMEyoucompany.com MAIL_PASSWORDapp-password MAIL_FROM_ADDRitcompany.com MAIL_FROM_NAMEIT-Asset改完执行docker compose restart app进Admin → Settings → Notifications点 Send test email 收得到信即通过。性能换 Redis 缓存适用场景并发用户超过 50file 缓存开始成为瓶颈。修改.envCACHE_DRIVERredis SESSION_DRIVERredis QUEUE_CONNECTIONredis REDIS_HOSTredis REDIS_PORT6379并在 docker-compose.yml 里加一段redis: redis:7-alpine服务、给app加depends_on: redis。改完docker compose up -d生效。数据调整上传上限适用场景要批量导入带图资产默认 2M 太小。在.env加一行PHP_UPLOAD_LIMIT100启动脚本 docker/startup.sh 里检测到PHP_UPLOAD_LIMIT变量后会 sed 改upload_max_filesize和post_max_size。docker compose up -d app后Admin → Settings → General里上传 50MB 图片不报 413 即通过。生产环境运维备份系统自带备份命令把数据库 dump 和上传目录一起打成 zip。docker compose exec app php artisan snipeit:backup --filenameprod-$(date %Y%m%d) docker compose exec app ls -lh storage/app/backups验证ls能看到刚生成的 zip 文件大小和数据库行数、上传目录总量匹配。备份实际落在storage/app/backups软链到/var/lib/snipeit/dumps也就是storage卷随容器持久化。用 cron 做定时echo 0 3 * * * cd /path/to/snipe-it docker compose exec -T app php artisan snipeit:backup --filenameauto-\$(date \%Y\%m\%d) /var/log/snipe-backup.log 21 | crontab -升级流程先备份 → 更新代码 → 重拉镜像 → 迁移 → 清缓存。docker compose exec app php artisan snipeit:backup --filenamepre-upgrade git pull docker compose pull docker compose up -d docker compose exec app php artisan migrate --force docker compose exec app php artisan config:clear docker compose exec app php artisan view:clear启动脚本本身已经会跑 migrate但手动再执行一次能确保升级过程中新加的 migration 都落库。日志应用日志在容器内/var/www/html/storage/logs/laravel.logApache 与 supervisor 日志走 stdout。docker compose logs --tail200 -f app docker compose logs --since1h app | grep -iE error|exception docker compose exec app tail -n 100 /var/www/html/storage/logs/laravel.log验证能连续跟踪日志、能按时间段过滤说明监控链路可用。恢复出问题时的恢复入口是snipeit:restore命令签名见 app/Console/Commands/RestoreFromBackup.php。docker compose stop app docker compose exec -it db bash -c mysql -uroot -p$MYSQL_ROOT_PASSWORD $MYSQL_DATABASE /dev/stdin SQL -- 从备份 zip 里提取出的 .sql 文件通过管道喂给 mysql SQL docker compose exec app php artisan snipeit:restore --filenamepre-upgrade.zip docker compose start app也可以直接在Admin → Settings → Backups里选一个 zip 点 Restore走的是同一个恢复流程只是多了一层 Web 校验。高频问题速查现象原因处理方法docker compose ps里 app 一直Restarting.env缺APP_KEY或格式不对用docker run --rm snipe/snipe-it php artisan key:generate --show重新生成粘回.env后docker compose up -d数据库容器healthyapp 启动日志刷SQLSTATE[HY000] [2002]DB_HOST在 Compose 网络里应为服务名db不是localhost编辑.env把DB_HOST改成dbdocker compose restart app登录页 500laravel.log报Vite manifest not found容器内前端构建产物缺失或过期docker compose exec app php artisan storage:link php artisan view:clear php artisan config:cache后重启上传资产图片返回 413PHP 默认upload_max_filesize2M在.env加PHP_UPLOAD_LIMIT50docker compose up -d app让启动脚本改写 php.ini管理员密码忘记收不到重置邮件SMTP 未配通或用户邮箱没填先修 SMTP 走 Web 重置急用时进db容器用php -r生成 bcrypt 哈希后UPDATE users SET password... WHERE email...setup页面打不开直接跳到登录已创建过管理员setup 路由检测到就 301属于正常行为直接登录即可想重跑向导需先把 users 表除首条外清掉生产慎用下一步部署跑通后建议先接入公司 LDAPAdmin → Settings → LDAP参考 app/Livewire/LdapSettings.php 的字段向导把账号体系统一再把snipeit:backup挂上 cron 并配一条异地推送两件事做完这套资产系统才真正算进入生产。【免费下载链接】snipe-itA free open source IT asset/license management system项目地址: https://gitcode.com/GitHub_Trending/sn/snipe-it创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

STM32 GPIO内部结构与实战详解:推挽、开漏、寄存器配置与调试

STM32 GPIO内部结构与实战详解:推挽、开漏、寄存器配置与调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 1:41:26 阅读更多 →
高德地图点聚合与Vue集成实战:大数据量标记点性能优化方案

高德地图点聚合与Vue集成实战:大数据量标记点性能优化方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 1:41:26 阅读更多 →
如何免费在现代系统玩《主题医院》:CorsixTH 开源重制版完整指南

如何免费在现代系统玩《主题医院》:CorsixTH 开源重制版完整指南

如何免费在现代系统玩《主题医院》:CorsixTH 开源重制版完整指南 【免费下载链接】CorsixTH Open source clone of Theme Hospital 项目地址: https://gitcode.com/GitHub_Trending/co/CorsixTH CorsixTH 是《主题医院》的开源重制版,完整复刻 19…

2026/10/18 3:54:33 阅读更多 →

最新新闻

SpringBoot3断代升级实战:从零搭建到部署的完整指南

SpringBoot3断代升级实战:从零搭建到部署的完整指南

前两周帮某电商团队做技术迁移评审,对方项目经理一上来就问:能不能在 SpringBoot2.7 基础上直接改版本号升到 3?我当时就告诉他:这可不是改一行版本号的事。编译直接红一片,javax消失,Tomcat行为变了&#…

2026/10/18 3:54:22 阅读更多 →
Widget是配置不是UI:Flutter三棵树与状态管理核心解析

Widget是配置不是UI:Flutter三棵树与状态管理核心解析

前两周帮同事排查一个非常诡异的问题:商品列表滚动到某个位置后界面卡成PPT,CPU直接飙满。代码翻了三轮,最终定位到的根因,居然不在列表渲染逻辑,而在于有人把一个封装的 Widget 实例存在字段里,每次 build…

2026/10/18 3:54:22 阅读更多 →
OpenHarmony上Flutter三方库适配实战:以carousel_slider为例

OpenHarmony上Flutter三方库适配实战:以carousel_slider为例

刚开始做 OpenHarmony 上的 Flutter 适配时,不少人一脸懵——明明 Flutter 在三方库生态上已经非常成熟,随便pub add一个库就能跑,怎么一到 OpenHarmony 上就不是这么回事了?实际上,OpenHarmony 的 Flutter 引擎适配层…

2026/10/18 3:54:22 阅读更多 →
用户登录案例与随机验证码结合:从表单校验到会话管理

用户登录案例与随机验证码结合:从表单校验到会话管理

不少刚学完 Web 基础的朋友,都会拿“用户登录”当第一个综合项目来做。但很多人做到最后发现,自己写的登录功能除了能查一下数据库、比对一下密码,根本谈不上“系统”。原因很简单:真实场景里的登录,永远不会只靠“用户…

2026/10/18 3:54:22 阅读更多 →
PHP+MySQL+百度地图全链路打点方案:从数据库到前端渲染

PHP+MySQL+百度地图全链路打点方案:从数据库到前端渲染

简介:这是一份面向Web开发初学者与地理信息系统(GIS)入门者的PHPMySQLHTML百度地图打点实战示例,解决动态数据驱动地图标记的核心问题,适用于LBS位置服务、门店展示、轨迹可视化等常见业务场景。资源共4个精简文件&…

2026/10/18 3:54:22 阅读更多 →
Delphi 11下EhLib 10.0.031安装与DBGridEh实战指南

Delphi 11下EhLib 10.0.031安装与DBGridEh实战指南

简介:EhLib 10.0.031是一套面向Delphi 11开发者的功能型组件库,核心覆盖图形图像处理、多类数据库连接、报表设计、图表分析与界面增强等常见开发场景。该版本已通过Delphi 11.1.5环境安装测试,适合中高级Delphi工程师和需要构建数据密集型桌…

2026/10/18 3:53:22 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →