Snipe_it资产管理系统部署

84次阅读
没有评论

共计 7931 个字符,预计需要花费 20 分钟才能阅读完成。

Snipe-IT 是一款开源的资产管理系统,用于 IT 运营中的资产管理。

GitHub 项目地址:https://github.com/snipe/snipe-it

官方文档地址:https://snipe-it.readme.io/docs/introduction

一,部署 Snipe_it

docker-compose 方式部署:

# 切换到指定安装目录
cd /root
#创建项目所需的目录
mkdir snipe_it
mkdir snipe_mysql
#进入网站项目文件夹
cd /root/snipe_it
#编辑 docker-compose 文件
vim docker-compose.yml

以下是 docker-compose.yml 配置内容:

version: '3'

services:
  # Snipe-IT 服务配置
  snipeit:
    container_name: snipeit
    image: snipe/snipe-it:latest  # 使用最新版 Snipe-IT 镜像
    restart: always  # 总是在容器退出时重启
    ports:
      - "8080:80"  # 映射容器端口 80 到主机端口 8080
    volumes:
      - /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime  # 设置容器时区为上海
      - ./logs:/var/www/html/storage/logs  # 映射日志目录到本地 logs 目录
      - ./snipe-vol:/var/lib/snipeit  # 映射 Snipe-IT 数据目录到本地 snipe-vol 目录
    depends_on:
      - mysql  # 依赖于 mysql 服务
    env_file:
      - .env.docker  # 使用 .env.docker 文件中的环境变量配置
    networks:
      - snipeit-backend  # 使用 snipeit-backend 网络

  # MySQL 服务配置
  mysql:
    image: mysql:8.0  # 使用 MySQL 8.0 镜像
    container_name: mysql
    ports:
      - "127.0.0.1:3306:3306"  #避免暴露到公网
    restart: always  # 总是在容器退出时重启
    volumes:
      - ./db:/var/lib/mysql  # 映射数据库目录到本地 db 目录
      - /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime  # 设置容器时区为上海
    environment:
      MYSQL_ROOT_PASSWORD: ****  # MySQL root 用户密码
      MYSQL_DATABASE: snipeit_data  # 新建数据库名称
      MYSQL_USER: snipeit  # 新建用户
      MYSQL_PASSWORD: ****  # 设置用户密码
    command:
      - --default-authentication-plugin=mysql_native_password  # 设置 MySQL 默认认证插件为 mysql_native_password
      - --character-set-server=utf8mb4  # 设置 MySQL 服务器使用 utf8mb4 字符集
      - --collation-server=utf8mb4_unicode_ci  # 设置 MySQL 服务器的字符校对规则为 utf8mb4_unicode_ci
    networks:
      - snipeit-backend  # 使用 snipeit-backend 网络

networks:
  snipeit-backend:  # Snipe-IT 和 MySQL 服务共用的网络
# 确保当前在 /root/snipe_it 目录下, 创建 docker-compose.yml 文件中所需要的.env.docker 配置依赖
touch .env.docker

#生成 APP_KEY 值
docker run --rm snipe/snipe-it

#你将得到如下的显示
Please re-run this container with an environment variable $APP_KEY
An example APP_KEY you could use is: 
base64:NmdqaKr26AgISUXkrlvIPB0G8jRwZiWcQsB7sJUvsIc=

编辑 .env.docker 内容:

# --------------------------------------------
# REQUIRED: DB SETUP
# --------------------------------------------
# 当数据库使用 mysql 的时候的配置
MYSQL_PORT_3306_TCP_ADDR=mysql
MYSQL_PORT_3306_TCP_PORT=3306
MYSQL_DATABASE=snipeit_data
MYSQL_USER=snipeit
MYSQL_PASSWORD=****
MYSQL_ROOT_PASSWORD=****
# --------------------------------------------
# REQUIRED: BASIC APP SETTINGS
# --------------------------------------------
#环境设置成生产环境
APP_ENV=production
#关掉 debug
APP_DEBUG=false

#上面命令生成的 APP_KEY 值
APP_KEY=base64:NmdqaKr26AgISUXkrlvIPB0G8jRwZiWcQsB7sJUvsIc=
#设置网站访问地址
APP_URL=<ip>:8080
#设置语言为中文
APP_TIMEZONE='Asia/Shanghai'
APP_LOCALE=zh-CN
MAX_RESULTS=1000
#每分钟访问限制
API_THROTTLE_PER_MINUTE=2000

# --------------------------------------------
# REQUIRED: UPLOADED FILE STORAGE SETTINGS
# --------------------------------------------
PRIVATE_FILESYSTEM_DISK=local
PUBLIC_FILESYSTEM_DISK=local_public

# --------------------------------------------
# REQUIRED: DATABASE SETTINGS
# --------------------------------------------
#设置数据库
DB_CONNECTION=mysql
DB_HOST=mysql
DB_DATABASE=snipeit_data
DB_USERNAME=snipeit
DB_PASSWORD=****
DB_PREFIX=null
DB_DUMP_PATH='/usr/bin'
DB_CHARSET=utf8mb4
DB_COLLATION=utf8mb4_unicode_ci

# --------------------------------------------
# OPTIONAL: SSL DATABASE SETTINGS
# --------------------------------------------
DB_SSL=false
DB_SSL_IS_PAAS=false
DB_SSL_KEY_PATH=null
DB_SSL_CERT_PATH=null
DB_SSL_CA_PATH=null
DB_SSL_CIPHER=null

# --------------------------------------------
# REQUIRED: OUTGOING MAIL SERVER SETTINGS
# --------------------------------------------
#设置邮箱
MAIL_DRIVER=smtp
MAIL_HOST=smtp.163.com
MAIL_PORT=25
MAIL_USERNAME=xxxxxxxx@163.com
MAIL_PASSWORD=xxxxxxxxxxxxxx
MAIL_ENCRYPTION=null
MAIL_FROM_ADDR=xxxxxxxxxxxxx@163.com
MAIL_FROM_NAME='Snipe-IT-From'
MAIL_REPLYTO_ADDR=xxxxxxxxxxx@163.com
MAIL_REPLYTO_NAME='Snipe-IT-Replyto'
MAIL_AUTO_EMBED_METHOD='attachment'

# --------------------------------------------
# REQUIRED: IMAGE LIBRARY
# This should be gd or imagick
# --------------------------------------------
IMAGE_LIB=gd


# --------------------------------------------
# OPTIONAL: BACKUP SETTINGS
# --------------------------------------------
MAIL_BACKUP_NOTIFICATION_DRIVER=null
MAIL_BACKUP_NOTIFICATION_ADDRESS=null
BACKUP_ENV=true


# --------------------------------------------
# OPTIONAL: SESSION SETTINGS
# --------------------------------------------
# 指定会话应保持有效的时间(以分钟为单位)。SESSION_LIFETIME=12000
# 指定当用户关闭浏览器窗口时登录的会话是否应过期。EXPIRE_ON_CLOSE=false
# 指定您是否希望在 Snipe-IT 会话中使用加密 cookie。ENCRYPT=false
COOKIE_NAME=snipeit_session
COOKIE_DOMAIN=null
SECURE_COOKIES=false
API_TOKEN_EXPIRATION_YEARS=40

# --------------------------------------------
# OPTIONAL: SECURITY HEADER SETTINGS
# --------------------------------------------
APP_TRUSTED_PROXIES=192.168.1.1,10.0.0.1
ALLOW_IFRAMING=false
REFERRER_POLICY=same-origin
ENABLE_CSP=false
CORS_ALLOWED_ORIGINS=null
ENABLE_HSTS=false

# --------------------------------------------
# OPTIONAL: CACHE SETTINGS
# --------------------------------------------
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync
CACHE_PREFIX=snipeit

# --------------------------------------------
# OPTIONAL: REDIS SETTINGS
# --------------------------------------------
REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379

# --------------------------------------------
# OPTIONAL: MEMCACHED SETTINGS
# --------------------------------------------
MEMCACHED_HOST=null
MEMCACHED_PORT=null

# --------------------------------------------
# OPTIONAL: PUBLIC S3 Settings
# --------------------------------------------
PUBLIC_AWS_SECRET_ACCESS_KEY=null
PUBLIC_AWS_ACCESS_KEY_ID=null
PUBLIC_AWS_DEFAULT_REGION=null
PUBLIC_AWS_BUCKET=null
PUBLIC_AWS_URL=null
PUBLIC_AWS_BUCKET_ROOT=null

# --------------------------------------------
# OPTIONAL: PRIVATE S3 Settings
# --------------------------------------------
PRIVATE_AWS_ACCESS_KEY_ID=null
PRIVATE_AWS_SECRET_ACCESS_KEY=null
PRIVATE_AWS_DEFAULT_REGION=null
PRIVATE_AWS_BUCKET=null
PRIVATE_AWS_URL=null
PRIVATE_AWS_BUCKET_ROOT=null

# --------------------------------------------
# OPTIONAL: AWS Settings
# --------------------------------------------
AWS_ACCESS_KEY_ID=null
AWS_SECRET_ACCESS_KEY=null
AWS_DEFAULT_REGION=null

# --------------------------------------------
# OPTIONAL: LOGIN THROTTLING
# --------------------------------------------
LOGIN_MAX_ATTEMPTS=5
LOGIN_LOCKOUT_DURATION=60
RESET_PASSWORD_LINK_EXPIRES=900

# --------------------------------------------
# OPTIONAL: MISC
# --------------------------------------------
LOG_CHANNEL=stderr
LOG_LEVEL=debug
LOG_MAX_DAYS=10
APP_LOCKED=false
APP_CIPHER=AES-256-CBC
GOOGLE_MAPS_API=
LDAP_MEM_LIM=500M
LDAP_TIME_LIM=600


# 允许清除已删除信息
ALLOW_DATA_PURGE=true
# 允许删除备份
ALLOW_BACKUP_DELETE=true
# 创建并启动 Snipe-IT 和 MySQL 两个容器
docker-compose up -d

打开浏览器,访问 <ip>: 端口就可以访问了。

二,反代 Snipe_it

如果要使用 NGINX 反代,则需要将 .env.docker 内的 APP_URL 更新为:

APP_URL=https://snipeit.example.com  # 替换为你的域名 

同时附上 NGINX 反代配置:

server {
    listen 80;
    server_name snipeit.example.com;  # 替换为你的域名

    # 强制 HTTPS
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name snipeit.example.com;
    
    ssl_certificate /etc/letsencrypt/live/snipeit.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/snipeit.example.com/privkey.pem;
    ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1;

    location / {

        proxy_pass http://127.0.0.1:8080;   #上面 docker 容器配置的端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    } 

}

同时防止外部直接访问容器真实端口,使用 iptables 规则:

 iptables -A INPUT -p tcp --dport 8080 -s 172.0.0.1 -j ACCEPT
 iptables -A INPUT -p tcp --dport 8080 -j REJECT

第一条规则 :允许来自 127.0.0.18080 端口请求,这样本地的 NGINX 可以继续访问该端口。

第二条规则 :阻止所有其他来源对 8080 端口的访问,从而确保该端口不对外暴露。

PS:配置文件设置为中文,登录后依然是英文,需要修改个人简介(右上角 - 账号 - 修改简介)

Snipe_it 资产管理系统部署

四,迁移 Snipe_it

# 停止 docker compose
docker compose down
#打包整个容器目录
tar czvf  20240911snipe_it.tar.gz  ./snipe_it 
#把压缩包拷到新 vps,在新环境下解压
tar xzvf 20240911snipe_it.tar.gz 

修改.env.docker 变量,我这里修改了域名,这里注意:APP key 不要重新生成,不要改动!!!

vim .env.docker 
#启动
docker compose up -d

我这里登录报了 500 的错误,查看日志发现错误来自 Laravel 应用(Snipe-IT 基于 Laravel),检查发现在 snipe_it 容器能够正常登录 MySQL

docker exec -it snipeit bash
apt-get update && apt-get install -y mysql-client  # 如果没有安装 MySQL 客户端
mysql -h mysql -u snipeit -p snipeit_data     #检查发现能够正常登录 MySQL
#尝试清理 Laravel 的缓存
php artisan config:clear
php artisan cache:clear
php artisan route:clear
php artisan view:clear
#如果清理缓存还是不行,检查数据库迁移的状态
php artisan migrate:status
Snipe_it 资产管理系统部署

发现有多个迁移处于 Pending(待处理)状态,看来问题出在这里。在 snipeit 容器中运行以下命令,执行未完成的数据库迁移:

docker exec -it snipeit bash
php artisan migrate
Snipe_it 资产管理系统部署

然后发现迁移全部运行完成(Ran),再次尝试访问可以正常登录了,数据也都在。

正文完
 9
xjd
版权声明:本站原创文章,由 xjd 于2024-07-18发表,共计7931字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)