Snipe-IT 是一款开源的 IT 资产管理系统(ITAM),用于跟踪企业 IT 设备、许可证、维护记录等。它基于 Laravel 框架开发,并支持 Docker 部署,适用于中小型企业和 IT 部门。如果你愿意自己动手解决环境问题,并能管理 Laravel / MariaDB / Docker,Snipe-IT 是一个性价比极高的 IT 资产管理工具。
Snipe-IT 较为适合需要开源、可定制 IT 资产管理系统的团队,预算有限,无法购买商业 ITAM 解决方案的公司,以及习惯使用 Docker 或 Laravel 生态的开发者。
不过对于大规模企业来说(需要深度 ERP/资产财务集成),数据库兼容性、性能优化、邮件通知等方面可能会有挑战。建议购买定制系统,方便后续的维护管理。
功能支持
资产管理:支持录入 IT 设备(如电脑、服务器、打印机等),跟踪设备的分配和使用情况。
库存管理:可以管理库存设备,并支持资产的采购、报废、借出等生命周期。
条形码 & RFID 支持:支持条形码扫描,使设备盘点更加方便。
维护 & 维修记录:可记录设备的故障、维修历史,方便 IT 维护。
软件许可证管理:跟踪软件许可证和过期时间,避免法律风险。
多用户 & 权限管理:支持管理员、普通用户等不同角色,控制访问权限。
邮件通知:可配置 SMTP 邮件服务器,发送提醒(如资产到期提醒、借用通知等)。
提前说明
关于数据库,我建议按照项目方给出的模版直接内置部署。独立数据库兼容性问题非常多(几乎每个版本都有变动),而且几乎每个应用都有自己独立的数据库版本,一般部署完轻易别动(不然应用崩了挽救的机会可能都没),因此建议打消所有服务共用数据库的想法。不过想要做 数据/服务 分离这本身并没什么问题,但仍然不是太建议共用,除非你对所部署的项目非常了解。
目前 Snipe-IT 更新频繁,想要长时间使用,请做好备份以应对大版本更新。
本文会以介威联通NAS为例,用 Docker Compose 演示 Snipe-IT 部署流程。有些部分可能比较啰嗦,但希望能对大家有所助力。
部署过程出现问题,可以参考文章最后一部分的问题说明(建议先看看)。
准备工作
先拉取镜像
SSH 链接 NAS:
docker pull mariadb:latest # 镜像加速自行加上前缀
docker pull snipe/snipe-it:latest
生成APP_KEY
# 生成APP_KEY,记下来备用!
docker run --rm snipe/snipe-it
修改环境配置文件
把下图的文件下载下来。
如下图,放进为 Snipe-IT 准备的Docker目录中,使用 Text Editor 修改后保存。也可先用PC的记事本方式打开修改后再放进去。修改完毕后重命名为.env
,NAS中默认是隐藏文件。
建议修改的部分如下:
# 基础配置修改
APP_ENV=production # 定义生产环境
APP_DEBUG=false # 关闭debug
APP_KEY=base64:pc9ehtgSHlAlHuPaBUOovGil7vPabCeV42ilbikTcPg= # 上面生成的KEY
APP_URL=XXX.XXX.XXX.XXX # 访问地址,本地就是服务器IP,或填域名(提前反代好)
APP_TIMEZONE=Asia/Shanghai
APP_LOCALE=zh-CN
# 数据库相关
DB_CONNECTION=mysql
DB_HOST=mariadb # 如果Snipe-IT 和数据库在同一 Docker 网络。否则填写IP
DB_PORT=3306
DB_DATABASE=snipeit_db
DB_USERNAME=ydxian
DB_PASSWORD=ydxian123456
DB_PREFIX=null
# 邮件服务器配置(163 邮箱为例),按需要自行修改
MAIL_MAILER=smtp
MAIL_HOST=smtp.163.com # 163 邮箱的 SMTP 服务器
MAIL_PORT=465 # 163 邮箱推荐使用 465 端口(SSL),如果使用 STARTTLS 则是 587
MAIL_USERNAME=your_email@163.com # 你的163邮箱账号
MAIL_PASSWORD=your_email_password # 你的163邮箱SMTP授权码(不是邮箱登录密码)
MAIL_ENCRYPTION=ssl # 163邮箱推荐使用 SSL 加密(465 端口)
MAIL_FROM_ADDR=your_email@163.com # 发件人邮箱
MAIL_FROM_NAME='Snipe-IT' # 发送邮件时显示的名称
MAIL_REPLYTO_ADDR=your_email@163.com # 回复邮件的地址
MAIL_REPLYTO_NAME='Snipe-IT' # 回复邮件时显示的名称
MAIL_AUTO_EMBED_METHOD='attachment'
MAIL_TLS_VERIFY_PEER=true # 默认开启 TLS 证书验证
# 一些其他可选配置,大家自行查看吧,还有强制SSL、重定向啥的
# 指定会话应保持有效的时间(以分钟为单位)。
SESSION_LIFETIME=12000
# 指定当用户关闭浏览器窗口时登录的会话是否应过期。
EXPIRE_ON_CLOSE=false
# 是否希望在 Snipe-IT 会话中使用加密 cookie。
ENCRYPT=false
# 若使用独立数据库(运行在宿主机或独立的数据库服务器上)
# Mysql Parameters
MYSQL_PORT_3306_TCP_ADDR=XXX.XXX.XXX.XXX
MYSQL_PORT_3306_TCP_PORT=3306
MYSQL_DATABASE=snipe_it
MYSQL_USER=snipe_it_db_user
MYSQL_PASSWORD=snipe_it_db_user_password
后续有新增配置,修改此文件重启应用即可。
更多配置比如登录限制、缓存设置、会话设置、备份设置、图库设置等,点我查看,Docker部分的额外内容点我查看(官方这个wiki,真乱!)
简化部署(建议)
上面的准备工作完成后,可以进行部署。
打开Docker管理工具。威联通为Container Station。
部署代码如下:
networks:
shared_network:
driver: bridge
services:
mariadb:
image: mariadb:latest
container_name: mariadb
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: root123456 # Root 账户密码,可自定义,下同
MYSQL_DATABASE: snipeit_db # Snipe-IT 数据库名称
MYSQL_USER: ydxian # 数据库用户
MYSQL_PASSWORD: ydxian123456 # 数据库密码
PUID: 0 # 指定用户 ID
PGID: 0 # 组ID,这俩都是admin,根据所用账户自行调整
volumes:
- /share/Container/mariadb/data:/var/lib/mysql:rw # 数据库持久化存储,冒号左侧可改
networks:
- shared_network
ports:
- "3306:3306"
snipeit:
image: snipe/snipe-it:latest
container_name: snipeit
restart: unless-stopped
depends_on:
- mariadb
env_file:
- /share/Container/snipeit/.env # 指定外部的 .env 文件,匹配上文的路径
volumes:
- /share/Container/snipeit/storage:/var/www/html/storage:rw # 确保 Laravel 能写入 storage,冒号左侧可改
networks:
- shared_network
ports:
- "9090:80" # 你访问 Snipe-IT 的端口,可自定义
web输入域名 或 NAS_IP:9090。邮箱配置可以点击进行测试,没问题就点右下角进行下一步。
第二步创建用户
这部分就纯自定义,很多朋友可能已经比较熟悉了。站点名称建议改成你的组织名。邮件域玩过企业微信的朋友大概熟悉,这个教程也很多,不过多啰嗦。
搞定后就完成,进入后台进行使用了。
修改语言。
顺便改改头像。
各种功能都有。
独立部署(谨慎)
这前置的准备工作不可跳过。我没有设置网络,是默认部署自动建网状态。APP_URL也替换成了域名,测试外网使用。
部署 MariaDB
部署代码如下:
services:
mariadb:
image: mariadb:latest
container_name: mariadb
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: root123456 # Root 账户密码
MYSQL_USER: ydxian # 应用程序用的数据库用户
MYSQL_PASSWORD: ydxian123456 # 应用程序用户的密码
volumes:
- /share/Container/mariadb/data:/var/lib/mysql # 持久化数据
ports:
- "3306:3306"
MYSQL_USER
和MYSQL_PASSWORD
这两项可以删除,在后面我们可以手动创建,会分情况给大家说明。
# 通过SSH链接NAS,进入容器
docker exec -it mariadb mariadb -u root -p
输入你的 root 密码(默认是 MYSQL_ROOT_PASSWORD
,在docker-compose.yml
里定义的)。
MariaDB 现在 正常运行,并且mariadb
命令可用!🎉
或者也可以在NAS的WEB端直接进入输入命令,这点威联通的Container Station是相当方便的。
成功登录后,你应该会看到 MariaDB 命令行:
MariaDB [(none)]>
这表示 MariaDB 正常运行,你现在可以执行 SQL 语句。
# 查看已有数据库
SHOW DATABASES;
# 创建新数据库(如果需要)
CREATE DATABASE my_app_db;
# 查看数据库用户
SELECT user, host FROM mysql.user;
假设你要创建一个名为 my_app_db
的数据库(仅举例,不用创建):
CREATE DATABASE my_app_db;
SHOW DATABASES;
# 如果你看到 my_app_db,说明创建成功!
创建数据库
接着上面部分。
情况一:预设用户密码
我们上面常规用户使用的是ydxian
,密码为ydxian123456
。现在打算使用 ydxian 账户管理snipeit_db
。
CREATE DATABASE snipeit_db;
GRANT ALL PRIVILEGES ON snipeit_db.* TO 'ydxian'@'%' IDENTIFIED BY 'ydxian123456';
FLUSH PRIVILEGES;
情况二:手动创建用户和数据库
在仅有root账户情况下,单独创建用户并授权,依次输入以下命令,大家自行替换掉即可。
# 创建数据库
CREATE DATABASE snipeit_db;
# 创建用户
CREATE USER 'ydxian'@'%' IDENTIFIED BY 'ydxian123456';
# 赋予权限
GRANT ALL PRIVILEGES ON snipeit_db.* TO 'ydxian'@'%';
FLUSH PRIVILEGES;
部署Snipe-IT
代码如下:
services:
snipeit:
image: snipe/snipe-it:latest
container_name: snipeit
restart: unless-stopped
env_file:
- /share/Container/snipeit/.env # 上文环境文件位置
volumes:
- /share/Container/snipeit/storage:/var/lib/snipeit:rw # 冒号左侧自定义
ports:
- "9090:80" # 冒号左侧自定义
部署完毕之后,通过域名访问Snipe-IT,初次会进行预检,我这里提示APP_URL
有误(可以无视),以及不能联通数据库。
可以通过下面板块解决。
注意问题&解决方案
测试过三台威联通NAS,问题相同。
容器互通
项目能跑起来的前提是数据库和服务必须互通。
直接 Docker Compose 一并部署默认会创建一个独立的 bridge 网络,同一个 docker-compose.yml
里的容器可以直接用 服务名(service_name)
互相访问。
如果你部署前什么都没有做,部署完后可SSH使用 docker network
创建自定义网络
# 找到服务对应网络名
docker network ls
# 创建一个专用网络,名称自定
docker network create shared_network
# 连接专用网络和断开原有网络
docker network connect shared_network mariadb
docker network disconnect mariadb_default mariadb
docker network connect shared_network snipeit
docker network disconnect snipeit_default snipeit
或者直接yaml文件使用network_mode: host
网络,所有容器共享宿主机的网络,但个人并不是太建议。
Snipe-IT无法初始化
一次部署数据库能过够完成初始化,但Snipe-IT可能不会,因此无法创建表。重启一下就好了。
初始化第二步一直 500 Server Error
查看日志,基本是目录权限不足问题,在这部分会卡住循环报错。
进入 Snipe-IT 容器
docker exec -it snipeit bash
或者也可以在NAS的WEB端直接进入。
确保 storage 和 bootstrap/cache 目录存在
mkdir -p /var/www/html/storage/framework/{cache,data,sessions,views}
mkdir -p /var/www/html/bootstrap/cache
修改目录权限
chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache
chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache
如果 775 仍然不行,可尝试
chmod -R 777 storage
chmod -R 777 public/uploads
chmod -R 777 bootstrap/cache
chmod -R 777 /var/www/html/storage
清理 Laravel 缓存
php artisan config:clear
php artisan cache:clear
php artisan config:cache
php artisan view:clear
php artisan route:clear
退出容器
exit
重新启动 Snipe-IT
docker restart snipeit
等待过后,再进入WEB就没问题了。
关于简化部署部分,想要后续新项目继续加入该网络
只需要docker-compose.yml
代码中模版换为:
networks:
shared_network:
external: true # 告诉 Docker,这个网络是已经存在的
最后
感谢观看,本文完~!
评论区