news 2026/10/17 1:41:13

Snipe-IT Docker 部署实战:从拉取镜像到生产备份的完整流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Snipe-IT Docker 部署实战:从拉取镜像到生产备份的完整流程

Snipe-IT Docker 部署实战:从拉取镜像到生产备份的完整流程

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

Snipe-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_KEY=base64:...、APP_URL=http://...: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_ENV=production明确写死,然后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_MAILER=smtp MAIL_HOST=smtp.your-provider.com MAIL_PORT=587 MAIL_USERNAME=you@company.com MAIL_PASSWORD=app-password MAIL_FROM_ADDR=it@company.com MAIL_FROM_NAME=IT-Asset

改完执行docker compose restart app,进Admin → Settings → Notifications点 Send test email 收得到信即通过。

性能:换 Redis 缓存

适用场景:并发用户超过 50,file 缓存开始成为瓶颈。

修改.env:

CACHE_DRIVER=redis SESSION_DRIVER=redis QUEUE_CONNECTION=redis REDIS_HOST=redis REDIS_PORT=6379

并在 docker-compose.yml 里加一段redis: redis:7-alpine服务、给app加depends_on: redis。改完docker compose up -d生效。

数据:调整上传上限

适用场景:要批量导入带图资产,默认 2M 太小。

在.env加一行:

PHP_UPLOAD_LIMIT=100

启动脚本 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 --filename=prod-$(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 --filename=auto-\$(date +\%Y\%m\%d) >> /var/log/snipe-backup.log 2>&1" | crontab -

升级

流程:先备份 → 更新代码 → 重拉镜像 → 迁移 → 清缓存。

docker compose exec app php artisan snipeit:backup --filename=pre-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.log,Apache 与 supervisor 日志走 stdout。

docker compose logs --tail=200 -f app docker compose logs --since=1h 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 --filename=pre-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
数据库容器healthy,app 启动日志刷SQLSTATE[HY000] [2002]DB_HOST在 Compose 网络里应为服务名db,不是localhost编辑.env,把DB_HOST改成db,docker compose restart app
登录页 500,laravel.log报Vite manifest not found容器内前端构建产物缺失或过期docker compose exec app php artisan storage:link && php artisan view:clear && php artisan config:cache后重启
上传资产图片返回 413PHP 默认upload_max_filesize=2M在.env加PHP_UPLOAD_LIMIT=50,docker compose up -d app让启动脚本改写 php.ini
管理员密码忘记,收不到重置邮件SMTP 未配通,或用户邮箱没填先修 SMTP 走 Web 重置;急用时进db容器用php -r生成 bcrypt 哈希后UPDATE users SET password='...' WHERE email='...'
setup页面打不开,直接跳到登录已创建过管理员,setup 路由检测到就 301属于正常行为,直接登录即可;想重跑向导需先把 users 表除首条外清掉(生产慎用)

下一步

部署跑通后,建议先接入公司 LDAP(Admin → 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/17 1:40:46

MMDetection 安装避坑指南:从环境配置到跑通目标检测 Demo

/* 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:40:12

Linux下Qt Creator安装与Qt SDK配置全指南

1. 为什么“Linux 安装 Qt Creator”不是一句命令就能解决的事很多人点开搜索引擎&#xff0c;输入“Linux 安装 Qt Creator”&#xff0c;第一眼看到的往往是sudo apt install qtcreator或dnf install qtcreator这类一行命令——然后兴冲冲回终端敲下去&#xff0c;结果要么弹…

作者头像 李华
网站建设 2026/10/17 1:39:34

终端原生AI编程助手:Super Code深度解析

1. 这不是又一个“AI写代码”插件&#xff1a;Super Code 的终端原生基因决定了它能做什么你肯定见过太多“AI编程助手”——它们要么是 VS Code 里的一个侧边栏&#xff0c;要么是浏览器里弹出的对话框&#xff0c;要么是某个 IDE 插件&#xff0c;点一下、输一句“帮我写个冒…

作者头像 李华
网站建设 2026/10/17 1:39:31

存量代码微创手术:SKILL编排驱动AI辅助重构实战

你身边有没有这种情况&#xff1a;AI工具装了一堆&#xff0c;网页版对话、IDE插件、命令行工具、本地大模型&#xff0c;各管各的&#xff0c;真到要对存量代码动手的时候&#xff0c;却帮不上忙——要么答非所问&#xff0c;要么改完的代码不敢合入&#xff0c;要么关键模块一…

作者头像 李华
网站建设 2026/10/17 1:38:05

Fider 部署实战:Docker 三步搭好功能请求与反馈投票系统

Fider 部署实战&#xff1a;Docker 三步搭好功能请求与反馈投票系统 【免费下载链接】fider Open platform to collect and prioritize feedback 项目地址: https://gitcode.com/GitHub_Trending/fi/fider 用户的功能请求散落在工单、应用商店评论和微信群里&#xff0c…

作者头像 李华