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后重启 |
| 上传资产图片返回 413 | PHP 默认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),仅供参考