Snipe-IT Docker 部署实战:3 分钟拉起容器到生产加固的完整避坑手册
【免费下载链接】snipe-itA free open source IT asset/license management system项目地址: https://gitcode.com/GitHub_Trending/sn/snipe-it
还在用 Excel 记 IT 资产?两百台笔记本谁领走了、软件许可证还剩几个席位、上个月归还的 iPad 落在哪个工位——全靠翻表格和问人。Snipe-IT 是开源免费的 IT 资产与许可证管理系统,领用归还、维护记录、EULA 签名这些流程它都接得住。这篇文章带你把它跑进一个 Docker 容器里:怎么 3 分钟拉起、.env 哪些项不填会直接崩、数据卷挂在哪才不会丢东西,最后把常见故障一条条修掉。
先拉镜像跑通:一条 compose 命令看到登录页
官方已经把 Apache + PHP 8.3 打进了现成镜像snipe/snipe-it,你不需要在本机装任何 PHP 扩展,更不用碰仓库里的 Dockerfile——它只是构建时用的,部署阶段直接拉镜像就行。
先把代码仓库拉下来(里面有 docker-compose.yml 和环境变量模板):
git clone https://gitcode.com/GitHub_Trending/sn/snipe-it cd snipe-itcompose 文件里其实就两个服务:app跑 Snipe-IT,db是 MariaDB 11.4.7。数据库带了健康检查,depends_on配了condition: service_healthy,说白了就是库没就绪之前应用容器不会抢跑,省掉了一类"连不上库"的时序问题。
把 .env 三项填对,别让容器白拉一次
.env是整个部署里唯一要动手改的文件,它同时喂给app(通过env_file)和db(MYSQL_*变量)。为什么必须提前弄对:启动脚本 docker/startup.sh 一开头就检查APP_KEY,缺了直接打印提示然后 exit,容器会秒退,日志里那行 "Please re-run this container with an environment variable $APP_KEY" 就是这个坑。
cp docker/docker.env .env然后打开.env,重点改这几处(其余保持模板原样即可):
APP_KEY:留空或沿用占位符都会崩。先起一次空容器生成一把 32 位随机密钥,把输出填回.env:docker run --rm snipe/snipe-it php artisan key:generate --showAPP_URL:你的真实访问地址,决定邮件链接和资产标签 URL 的前缀,填错后面很难排查。APP_PORT:宿主端口,compose 里映射的是${APP_PORT:-8000}:80,不改就是 8000。数据库四件套:
MYSQL_DATABASE/MYSQL_USER/MYSQL_PASSWORD/MYSQL_ROOT_PASSWORD,自己定值。注意模板里的DB_HOST=${MYSQL_PORT_3306_TCP_ADDR}是老式服务发现的写法,直接改成DB_HOST=db(就是 compose 里的服务名),端口保持 3306。
填完拉起,然后盯日志:
docker compose up -d docker compose logs -f app日志里能看到php artisan migrate --force跑完、Supervisord 把 Apache 接管起来,基本就成了。浏览器打开http://服务器IP:8000,走/install安装向导建好数据库连接和管理员账号,就算正式跑通。
拉起来只是能看,真上生产还得先搞清楚数据落在容器的哪个位置——下一节专门讲这件事。
把数据卷指对位置,顺手跑通第一次备份
🔥 先说结论:这个镜像唯一挂载的卷是storage,指向容器里的/var/lib/snipeit,上传的设备照片、备份 dump、OAuth 密钥全在这里面(构建时 Dockerfile 里一堆ln -fs已经把public/uploads、storage/app/backups这些目录都软链过去了)。数据库则在db_data卷里。两个卷都在 docker-compose.yml 顶部声明,docker compose down删容器不删卷,但手动docker volume rm之前先想想后果。
备份不需要装额外工具,两件事覆盖全量:库用mysqldump直接导,文件卷用docker cp拷出来。
docker compose exec db sh -c \ "exec mysqldump -uroot -p\"$MYSQL_ROOT_PASSWORD\" $MYSQL_DATABASE" \ > backup-$(date +%F).sql.gz docker compose cp app:/var/lib/snipeit ./snipeit-data-backup恢复时 Snipe-IT 自带入口 app/Console/Commands/ 里的RestoreFromBackup命令可以直接用,方向反过来就行。建议把这两条塞进 crontab 每天跑一遍,别等出事再想起昨天没备份。
数据保住了,接下来是对外服务的安全面。
开 HTTPS、提上传上限:生产前必做的两件事
先说证书。启动脚本里有个很省事的判断:只要/var/lib/snipeit/ssl/下同时存在snipeit-ssl.crt和snipeit-ssl.key,它就会自动a2enmod ssl;两个文件不在就反着来。所以操作就是:把证书丢进宿主机那个storage卷对应的目录下,docker compose restart app,完事。虚拟主机细节在 docker/001-default-ssl.conf,默认端口 443 已被镜像 EXPOSE。
第二个坑是上传限制。批量导入资产 CSV、传设备大图的时候撞 413 或"文件超过大小限制",大概率是 PHP 默认upload_max_filesize太小。不用改任何配置文件,启动脚本每次开机都会读PHP_UPLOAD_LIMIT环境变量并改写所有 php.ini(顺手还能调APACHE_LIMIT_REQUEST_FIELD_SIZE这类 Apache 头长度限制)。往.env里加一行,重启即可:
echo "PHP_UPLOAD_LIMIT=100" >> .env docker compose restart app改完用一张大点的图试传一次确认生效,因为它是"重启时应用",热改.env不生效。
配置加固完,接下来是所有人都躲不过去的一环:排障。
修掉容器崩溃、数据库超时、上传被拒
现象一:容器秒退,日志只有 APP_KEY 提示。容器Exited,docker compose logs app里打印 "Please re-run this container with an environment variable $APP_KEY"。大概率原因就是.env里没填APP_KEY(或值被填成了模板占位符)。修复一条命令:先用上面给过的key:generate --show生成,追加进.env再docker compose up -d。
现象二:app 一直重启,提示连不上数据库。先看docker compose ps,db那行health: starting卡住不动、或者干脆 unhealthy,就是库没起来。九成是.env里数据库变量和MYSQL_ROOT_PASSWORD没配对(root 密码为空 MariaDB 会直接拒启动)。把四个MYSQL_*值统一改对,docker compose down && docker compose up -d重建即可;库已经起来了只是 app 连不上,再进容器查一遍DB_HOST是不是写成了db。
现象三:页面能看,上传报 403 或 Permission denied。这是卷的属主问题——容器内应用以 UID 10000 的docker用户跑,而挂载进来的卷如果是 root 属主,写文件就会撞权限。进容器把数据目录属主交还给应用用户:
docker compose exec -u root app chown -R 10000:50 /var/lib/snipeit上传成功但大文件被拒,回上一节确认PHP_UPLOAD_LIMIT真的随重启生效了(docker compose exec app php -i | grep upload_max_filesize)。
故障清完,日常运维就只剩升级和备份节奏这一件事了。
接下来你可以做什么
升级基本是三步:.env里把APP_VERSION指定到目标版本(不填就是latest),然后docker compose pull && docker compose up -d,启动脚本每次都会自动跑migrate --force,你不用手动管迁移。动手前把上一节那两条备份命令跑一遍,这是唯一不能省的前置动作。
再往后的路线看你团队规模:
- 想让离职交接不再丢资产:把 sample_csvs/ 里的模板拿去试一遍 CSV 批量导入,比逐台录快一个量级
- 邮件通知(领用提醒、到期告警)目前没配的话,补上
.env里的MAIL_*一组变量再重启 - 排障时想翻更细的应用日志:
docker compose exec app tail -f /var/www/html/storage/logs/laravel.log
常用资源:
- 官方 Docker 文档:docker/README.md
- 环境变量模板(改 .env 时对照):docker/docker.env
- 生产 compose 文件:docker-compose.yml
- 参与社区与反馈问题:CONTRIBUTING.md
【免费下载链接】snipe-itA free open source IT asset/license management system项目地址: https://gitcode.com/GitHub_Trending/sn/snipe-it
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考