目录
简介
下载与安装
初始化配置
启动与日志
版本更新
登录与使用
工作台
主机管理
批量执行
配置中心
应用发布
系统管理
监控与告警
使用问题
手动部署 | Spug walle的升级版本
如果有测试错误请指出。
测试环境:
Python 3.7.8
CentOS Linux release 7.4.1708 (Core)
spug v3.3.2
mysql Ver 14.14 Distrib 5.7.36
git version 2.22.0
rsync version 3.1.2 protocol version 31
Redis server v=4.0.11
# 安装依赖-- 视情况安装
yum install mariadb-devel python3-devel gcc openldap-devel redis nginx supervisor rsync sshfs
下载:
前端:wget https://github.com/openspug/spug/releases/download/v3.3.2/web_v3.3.2.tar.gz
后端:wget https://github.com/openspug/spug/archive/refs/tags/v3.3.2.tar.gz
创建python3虚拟环境
cd /export/app/venv/
/usr/local/python3.7/bin/python3 -m venv spug
cd spug
#解压 --注意目录结构
tar -xvf web_v3.3.2.tar.gz
tar -xvf v3.3.2.tar.gz
mv build web #nginx目录需要使用,这里已经不是文档中的默认目录了
ln -s spug-3.3.2 spug
source bin/activate
cd spug/spug_api
pip install -U pip setuptools -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install gunicorn mysqlclient -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip freeze >>requirements_online.txt
deactivate 退出
cd /export/app/venv/spug/spug
#spug_api/spug/overrides.py 用户覆盖默认配置文件settings.py 配置
配置db
spug_api/spug/overrides.py 也可以直接改settings.py配置 -- 正常的django配置格式
调整端口 -- 根据实际情况
spug_api/tools/start-api.sh:11:exec gunicorn -b 127.0.0.1:9001 -w 2 --threads 8 --access-logfile - spug.wsgi
spug_api/tools/start-ws.sh:11:exec daphne -p 9002 spug.asgi:application
其他配置
DEBUG = True #默认False 测试期间改为True
TOKEN_TTL = 8 * 3600 #默认
CACHES #必须
CHANNEL_LAYERS #必须
初始化db
(spug) [root@tserver121 spug_api]# cd spug_api
(spug) [root@tserver121 spug_api]# python manage.py updatedb
Running migrations:
Applying alarm.0001_initial... OK
······
初始化/更新成功
#关于db权限,初始化的时候可能需要较高的权限,之后应该正常的可写权限即可
django.db.utils.OperationalError: (1142, "REFERENCES command denied to user 'spug'@'tserver121' for table 'users'")
初始化密码与更新密码
(spug) [root@tserver121 spug_api]# python manage.py user add -u admin -p xxxxx -s -n 管理员
(spug) [root@tserver121 spug_api]# python manage.py user reset -u admin -p xxxxx
# -u 用户名
# -p 密码
# -s 超级管理员
# -n 用户昵称
web配置 -nginx配置模版见官网
- 调整代理后端ip和端口
- 调整访问域名
- 调整项目root路径
server_name spug.localhosts.com;
root /export/app/venv/spug/web;
index index.htm index.php index.html;
client_max_body_size 20m; # 该值会影响文件管理器可上传文件的大小限制,请合理调整
#X-Forwarded-For #Spug 使用该请求头提高安全性(当登用户的 IP 发生变化时 Token 自动失效)
#配置完成能打开首页了
临时系统配置
manage.py set xxx xxx 语法
日志分离
/export/app/venv/spug/spug/spug_api/logs 分离出来存放 -- 也可以改配置文件/启动脚本路径
(spug) [root@tserver121 spug_api]# mkdir /export/logs/spug
(spug) [root@tserver121 spug_api]# rm logs -rf
(spug) [root@tserver121 spug_api]# ln -s /export/logs/spug logs
服务进程使用supervisor管理
(spug) [root@tserver121 spug_api]# cp tools/supervisor-spug.ini /etc/supervisord.d/
#修改/etc/supervisord.d/supervisor-spug.ini配置文件路径 注意文件名后缀
(spug) [root@tserver121 spug_api]# sed -i "s#data#export/app/venv/spug#g" /etc/supervisord.d/supervisor-spug.ini
切换普通用户启动
#supervisor-spug.ini 中的每个项目 添加如下配置
directory=/export/app/venv/spug
user = www
redirect_stderr = true
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=20
修改目录权限
cd /export/app/venv/spug
(spug) [root@tserver121 spug]# chown www.www web spug-3.3.2 /export/logs/spug -R
启动&开机启动
#因为使用普通用户和修改了部署目录结构 所以启动脚本得调整 先备份 /bin/cp -rfp tools tools.bak
supervisorctl update
systemctl enable supervisord
#systemctl restart supervisord
(spug) [root@tserver121 spug]# ll spug_api/tools/start-*
start-api.sh
start-monitor.sh
start-scheduler.sh
start-worker.sh
start-ws.sh
#如start-api.sh
#cd $(dirname $(dirname $0))
BINDIR="/export/app/venv/spug"
source ${BINDIR}/bin/activate
cd ${BINDIR}/spug/spug_api
exec ${BINDIR}/bin/gunicorn -b 127.0.0.1:9003 -w 2 --threads 8 --access-logfile - spug.wsgi
start-ws.sh #Daphne 是一个用于 Python 的 ASGI(异步服务器网关接口)服务器,主要用于运行 Django Channels 和其他基于 ASGI 的应用程序。它允许你轻松地处理 WebSockets 和其他异步协议,从而扩展 Django 应用的功能。
------------------------------------------------
问题:ModuleNotFoundError: No module named 'spug'
exec gunicorn 执行命令 所在的目录不对 需要cd ${BINDIR}/spug/spug_api
问题:redis.exceptions.ConnectionError: Error 111 connecting to 127.0.0.1:6379. Connection refused.
#还是需要配置redis,带密码的格式为"redis://:[email protected]:6379/0
#可以写到spug_api/spug/overrides.py 文件中
问题:请求失败: 502 Bad Gateway
#端口监听改为本机ip 或者 0.0.0.0
问题:请求失败: 400 Bad Request
Invalid HTTP_HOST header: 'spug.localhosts.com'. You may need to add 'spug.localhosts.com' to ALLOWED_HOSTS.
2024-10-09 12:12:00,124 ERROR Invalid HTTP_HOST header: 'spug.localhosts.com'. You may need to add 'spug.localhosts.com' to ALLOWED_HOSTS.
#ALLOWED_HOSTS 是一个安全设置,用于防止 HTTP Host 头攻击
#overrides.py 添加
ALLOWED_HOSTS = ['127.0.0.1', "spug.localhosts.com"]
重启:supervisorctl restart spug-ws
升级前备份一下数据库
# 默认更新到最新版本
cd spug_api
source venv/bin/activate
python manage.py update
# 重启服务
supervisorctl restart all
说的不对请指示
便捷导航感觉也很实用 -- 不过没有针对用户显示权限控制
待办事项 没有找到那里配置。
管理维护平台可操作的主机,首次添加主机时需要输入 ssh 指定用户的密码。
目标主机不支持密钥认证,则直接抛出异常(错误代码 E01)并终止请求。
如果密钥认证通过则直接完成主机添加,结束流程。 #不需要首次验证请输入密码
如果密钥认证失败,则弹出密码输入框,让用户输入密码然后设置密钥认证 #通过后自动配置authorized_keys 再尝试密钥认证
#排版模式下,可通过拖拽分组实现快速排序 很好用
执行任务
支持shell、python 命令或者脚本、支持模版编辑
只有历史命令 没有历史结果。
任务执行:基本和执行任务一样,后面选择执行周期,失败有通知
模版管理
参数是通过环境变量传入的
#变量名称,固定前缀_SPUG_ + 输入的变量名,例如变量名name,则最终生成环境变量为 _SPUG_name
linux可以通过export查看
计划任务中也可以使用, 不过参数都是默认参数
文件分发
需要安装sshfs ,主机传输文件之后有残留
lsof: WARNING: can't lstat(./e9eab26d53934046bbf395a1b3abc331): Permission denied'
[root@tserver121 transfer]# fusermount -u e9eab26d53934046bbf395a1b3abc331 #卸载
分发是串行的。
临时存储位置 #TRANSFER_DIR ./spug_api/storage/transfer
环境管理
方便配置的划分与管理
服务配置
#4.0将移除公共/私有配置概念,所有配置将被视为公共配置,应用中配置的时候选公共
服务可以理解为一些配置的集合
环境&服务关系:每个环境中的服务配置都独立的
应用&服务关系:主要是应用的公共配置,应用通过依赖关联服务
应用配置
公共配置会提供给依赖应用, 而私有配置不会。
#应用之间也能依赖。
提示
当需要一次性录入大量配置时可以使用 文本模式 或 JSON模式。
当使用 文本模式 或 JSON模式 创建应用的配置时默认会创建为 私有 配置。#需要修改为公有
总结:
配置中心用于解决不同环境间配置的差异,配置需要逻辑清楚。
服务为应用服务,应偏向功能区分,比如push_db,push_redis
key的命名避免重名,#变量名称,固定前缀标识符_ + 输入的变量名 ,通过api可以看到。
------------------------------------------------
问题:应用和服务关联之后 相同参数的配置的优先级
#相同参数优先级:应用 < 服务, 服务的配置会覆盖应用
# 依赖多个服务,排序靠前的优先级高
问题:应用的公共配置是否会提供给其他依赖应用
#会,但是只提供本身的配置,其自身依赖的服务的配置 不会提供给其他依赖应用
问题:配置怎么查询
内部:
#这里可以使用内置全局变量,
#请参考官方文档https://spug. dev/docs/deploy-config/
#如果使用了配置中心,可以在这里获取该应用的配置
#该操作会在把该应用的配置以key=value的格式保存为.env文件
curl -so .env "http://spug.localhosts.com/api/apis/config/?apiToken=$SPUG_API_TOKEN"|
外部:
去掉重复:http://spug.localhosts.com/api/apis/config/?apiKey=JLV8IGO0DhoxcM7I&app=sec&env=other&noPrefix=1
保留重复显示:http://spug.localhosts.com/api/apis/config/?apiKey=JLV8IGO0DhoxcM7I&app=sec&env=other
主要的功能之一
发布配置
应用列表:和【配置中心】->【应用配置】 数据是互通的 #每个应用都可以创建多个环境发布
#分两种发布
常规发布配置项:
#请关注各个步骤的目录,发布审核建议开启
#发布审核 开启后创建的发布申请单需要审核后才可以进行发布。
#文件过滤 #排除常用的git/svn 的隐藏目录
#自定义全局变量 可在后边的钩子命令内使用,Spug 本身也包含一些内置全局变量
#消息通知:
自定义发布-- #更自由 可以完成命令执行等操作
#发布环境
#发布审核 开启后创建的发布申请单需要审核后才可以进行发布。
#数据传输动作 用于文件分发传输
#消息通知:
webhook:可以用来与Git结合实现触发后自动发布。
构建仓库
应用的构建信息,新建构建不会发布,在发布申请时会新自动构建
可以指定commit构建
发布申请
支持选择分支和 CommitID 或 Tag 来确定发布的代码
#回滚:指定构建保留历史版本来回滚。
#控制回滚时行为执行不同的操作,可以在 发布前任务 和 发布后任务 中使用内置的全局变量 SPUG_DEPLOY_TYPE, 通过判断其值来做不同的操作。
if [ "$SPUG_DEPLOY_TYPE" = "1" ]; then
echo "执行正常发布的操作,巴啦啦..."
else
echo "这里只有回滚时才会执行"
fi
系统设置
密钥设置:使用非系统登录的ssh,临时申请一对ssh-key,#修改密钥对需要重启服务后生效
开放服务设置:访问凭据apiKey
角色管理:
分的比较精细,#审核权限没有按每个应用区分,环境也是。
待测试....
问题:一天内连续输入三次错误就被禁用 #账户已被系统禁用
#管理员需要python manage.py user enable -u admin 启用
问题:登录MFA
#私有的MFA 需要官方的登录推送助手
问题:全局密钥设置 后台和db存储是明文的
#希望不是明文存储
问题:未能获取到访问者的真实IP,无法提供基于请求来源IP的合法性验证,详细信息请参考官方文档。
#spug_api/apps/account/models.py: ipaddress.ip_address(x_real_ip).is_global #有判断是否是公网ip
#先去掉 改为:'has_real_ip': x_real_ip if verify_ip else True,
问题:未能获取到访问者的真实IP,登录成功后 再次打开首页没有跳转到home页面,而是在登录页
#问题不大。
问题: GET /ws/notify/?x-token=a5ac0dda03684373ba940b0ea55ae1c6 HTTP/1.1 404
#应该初始化配置有问题,过期后重新生成就好了
问题:REPOS_DIR 目录问题
#可以放在数据盘
#REPOS_DIR = os.path.join(os.path.dirname(os.path.dirname(BASE_DIR)), 'repos')
#BUILD_DIR = os.path.join(REPOS_DIR, 'build')
#TRANSFER_DIR = os.path.join(BASE_DIR, 'storage', 'transfer')
项目目录结构 storage 与 repos 是同级目录
REPOS_DIR应该改为 os.path.join(BASE_DIR, 'repos') # settings.py