【spug】使用

目录

简介

下载与安装

初始化配置

启动与日志

版本更新 

登录与使用

工作台

主机管理

批量执行

配置中心

应用发布

系统管理

监控与告警

使用问题


简介

    手动部署 | Spug  walle的升级版本

  • 轻量级无 Agent 
  • 主机管理
  • 主机批量执行
  • 主机在线终端
  • 文件在线上传下载
  • 应用发布部署
  • 在线任务计划
  • 配置中心
  • 监控报警

如果有测试错误请指出。

下载与安装

测试环境:
    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

登录与使用

说的不对请指示

工作台

便捷导航感觉也很实用 -- 不过没有针对用户显示权限控制
待办事项 没有找到那里配置。

主机管理
  1. 提供了 web 终端,只不过没有复制粘贴快捷键,命令行限制也还没看到。
管理维护平台可操作的主机,首次添加主机时需要输入 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
配置中心
  1. 应用配置没有把当前应用所有的配置显示出来(包含依赖配置),重命名key需要提示,不过可以通过api获取
环境管理
	方便配置的划分与管理

服务配置
	#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 

你可能感兴趣的:(CI/CD,python,django,ci/cd,运维,devops)