一、概要
Spug是一款使用Python+Flask+React+Ant Design Ui开发的开源运维管理系统,系统前后端分离,项目创建于2017年,2018 年 2 月第一个开源运维平台版本发布,设计为面向中小型企业设计的轻量级无Agent的自动化运维平台,UI基于Ant Design设计,整合了主机管理、主机批量执行、主机在线终端、应用发布部署、在线任务计划、配置中心、监控、报警等一系列功能,且二次开发很方便。它采用授权协议AGPL-3.0,使用开发语言Python JavaScript;软件采用无 Agent 设计,只需简单部署就可完成。
Spug 主要特性:
批量执行: 命令在线批量执行
文件管理: 主机文件在线上传下载
在线终端: 主机支持浏览器在线终端登录
任务计划: 灵活的任务计划,支持间隔执行,一次性执行,Crontab 风格执行
发布部署: 支持自动创建应用,支持工单流程发布,标准发布、自定义发布等
配置中心: 支持 KV、文本、Json 等格式的配置
监控中心: 支持站点、端口、进程、自定义脚本等监控方式
报警中心: 支持短信、邮件、钉钉、微信等报警方式
优雅美观: 基于 Ant Design 的 UI 界面
开源免费: 前后端代码完全开源
关联资源:官网、官方用户使用手册、 Github 、 Gitee、更新日志、FAQ、相关博客、视频教程
Demo: https://demo.spug.dev
二、部署
1)3.x版本环境依赖
Python 3.6+
Django 2.2,Django 2.2 Sqlite 的版本最低要求为 3.8.3
Node 12.14
React 16.11
Docker
Mysql 5.6及以上
自 v2.3.9 开始 ,Git 版本需要 2.17.0+ (影响新建常规发布申请单)
2)Docker方式部署( Centos7.x为例)
#Docker安装 $ yum install -y yum-utils $ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo $ yum install docker-ce docker-ce-cli containerd.io $ systemctl start docker #拉取/下载阿里云项目镜像,阿里云的镜像与 Docker hub 同步更新,国内用户建议使用阿里云的镜像。官方镜像内置了 Mysql 数据库,也可以使用外部数据库(Mysql 5.6+) #配置阿里云镜像地址 vim /etc/docker/daemon.json {
"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"] } $ docker pull registry.cn-hangzhou.aliyuncs.com/openspug/spug $ docker image ls|grep spug #验证 registry.cn-hangzhou.aliyuncs.com/openspug/spug latest # vi docker-compose.yml #编写如下 version: "3.3" services: db: image: mariadb:10.8.2 container_name: spug-db restart: always command: --port 3306 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci volumes: - /data/spug/mysql:/var/lib/mysql environment: - MYSQL_DATABASE=spug - MYSQL_USER=spug - MYSQL_PASSWORD=spug.cc - MYSQL_ROOT_PASSWORD=spug.cc spug: image: openspug/spug-service container_name: spug privileged: true restart: always volumes: - /data/spug/service:/data/spug - /data/spug/repos:/data/repos ports: # 如果80端口被占用可替换为其他端口,例如: - "8000:80" - "80:80" environment: - MYSQL_DATABASE=spug - MYSQL_USER=spug - MYSQL_PASSWORD=spug.cc - MYSQL_HOST=db - MYSQL_PORT=3306 depends_on: - db #启动容器 # 第一种:持久化存储启动容器 # 其中,/spug 指的是映射宿主机本地的磁盘路径,/data是容器内代码和数据初始化存储的路径,使用-v /spug:/data制定映射到容器外,进行持久化 $ docker run -d --restart=always --name=spug -p 80:80 -v /spug:/data registry.cn-hangzhou.aliyuncs.com/openspug/spug # 如果需要在spug内使用docker命令则需要添加额外的参数 $ docker run -d --restart=always --name=spug -p 80:80 -v /spug/:/data -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker registry.aliyuncs.com/openspug/spug #进入容器,完成项目初始化;该过程会创建一个用户名为 admin 密码为 spug.dev 的管理员账户,可自行替换管理员账户。 $ docker exec spug init_spug admin spug.dev #如果提示连接数据失败,再次执行尝试 # 执行完毕后需要重启容器 $ docker restart spug 使用外部 Mysql $ docker exec -it spug bash #进入容器 #修改配置文件使----->访问外部数据库 $ vi /data/spug/spug_api/spug/overrides.py #如下所示: DATABASES = {
'default': {
'ATOMIC_REQUESTS': True, 'ENGINE': 'django.db.backends.mysql', 'NAME': 'spug', 'USER': 'spug', # 修改为外部数据库的用户 'PASSWORD': 'spug.dev', # 修改为外部数据的用户密码 'HOST': 'localhost', # 修改为外部数据的ip 'OPTIONS': {
'unix_socket': '/var/lib/mysql/mysql.sock', # !!!删除该行 'charset': 'utf8mb4', 'sql_mode': 'STRICT_TRANS_TABLES', } } } #停止容器内的数据库服务 $ vi /etc/supervisord.d/spug.ini # 找到如下行并删除 [program:mariadb] command = /usr/libexec/mysqld --user=mysql autostart = true #退出并重启容器 $ exit $ docker restart spug 默认更新到最新版本;spug 是容器名称,也可以替换为自己的容器ID $ docker exec -i spug python3 /data/spug/spug_api/manage.py update # 更新完成后重启容器 $ docker restart spug
【使用一键部署脚本部署】:
$ curl https://spug.dev/installer/spug-installer | bash
注意:
#默认代码安装路径:
/data/spug
/
#默认创建的数据库账号
用户:spug
密码:spug.dev
#默认创建的系统管理员
账户:admin
密码:spug.dev
3)访问测试
在浏览器中输入 http://localhost:80 访问。默认用户名: admin 密码: spug.dev
可以在 系统管理/系统设置/关于 中查看当前运行的 Spug 版本,可以在 更新日志 查看当前最新版本。
1>部署登陆常见问题,单击参看;
4)手动部署
#拉取项目 $ git clone https://github.com/openspug/spug /data/spug 或git clone https://gitee.com/openspug/spug $ cd /data/spug $ git checkout x.x.x # x.x.x 为指定的发行版本,例如:git checkout v2.2.2 #将下载好的前端压缩包解压到指定目录,假设web_x.y.z.tar.gz $ tar xf web_x.y.z.tar.gz -C /data/spug/spug_web/ #创建运行环境 # 安装依赖,如需要使用常规发布功能,则需要安装 git v2.17.0+ $ yum install mariadb-devel python3-devel gcc openldap-devel redis nginx supervisor # 创建虚拟环境 $ cd /data/spug/spug_api $ python3 -m venv venv $ source venv/bin/activate # 安装python包 $ pip install -U pip -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/ #修改后端配置;后端默认使用的 Sqlite 数据库,通过修改配置使用 MYSQL 作为后端数据库; #在 spug_api/spug/ 目录下创建 overrides.py 文件,启动后端服务后会自动覆盖默认的配置,避免直接修改 settings.py 以便于后期获取新版本 $ vi spug_api/spug/overrides.py DEBUG = False DATABASES = {
'default': {
'ATOMIC_REQUESTS': True, 'ENGINE': 'django.db.backends.mysql', 'NAME': 'spug', # 替换为自己的数据库名,请预先创建好编码为utf8mb4的数据库 'USER': 'spug_user', # 数据库用户名 'PASSWORD': 'spug_passwd', # 数据库密码 'HOST': '127.0.0.1', # 数据库地址 'OPTIONS': {
'charset': 'utf8mb4', 'sql_mode': 'STRICT_TRANS_TABLES', #'unix_socket': '/opt/mysql/mysql.sock' # 如果是本机数据库,且不是默认安装的Mysql,需要指定Mysql的socket文件路径 } } } #初始化数据库 $ cd /data/spug/spug_api $ python manage.py updatedb #创建默认管理员账户 $ python manage.py user add -u admin -p spug.dev -s -n 管理员 #-s 超级管理员,-n 用户昵称 # 创建启动服务脚本 $ vi /etc/supervisord.d/spug.ini [program:spug-api] command = bash /data/spug/spug_api/tools/start-api.sh autostart = true stdout_logfile = /data/spug/spug_api/logs/api.log redirect_stderr = true [program:spug-ws] command = bash /data/spug/spug_api/tools/start-ws.sh autostart = true stdout_logfile = /data/spug/spug_api/logs/ws.log redirect_stderr = true [program:spug-worker] command = bash /data/spug/spug_api/tools/start-worker.sh autostart = true stdout_logfile = /data/spug/spug_api/logs/worker.log redirect_stderr = true [program:spug-monitor] command = bash /data/spug/spug_api/tools/start-monitor.sh autostart = true stdout_logfile = /data/spug/spug_api/logs/monitor.log redirect_stderr = true [program:spug-scheduler] command = bash /data/spug/spug_api/tools/start-scheduler.sh autostart = true stdout_logfile = /data/spug/spug_api/logs/scheduler.log redirect_stderr = true #创建前端nginx配置文件;、如果没有在 spug.conf 中指定 server_name 则需要把 /etc/nginx/nginx.conf 中默认的 server 块注释或删除后才能正常访问, 否则会打开 Nginx 默认页面 $ vi /etc/nginx/conf.d/spug.conf server {
listen 80; server_name _; # 修改为自定义的访问域名 root /data/spug/spug_web/build/; client_max_body_size 20m; # 该值会影响文件管理器可上传文件的大小限制,请合理调整 gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 7; gzip_types text/plain text/css text/javascript application/javascript application/json; gzip_vary on; location ^~ /api/ {
rewrite ^/api(.*) $1 break; proxy_pass http://127.0.0.1:9001; proxy_read_timeout 180s; proxy_redirect off; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location ^~ /api/ws/ {
rewrite ^/api(.*) $1 break; proxy_pass http://127.0.0.1:9002; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location / {
try_files $uri /index.html; } } #启动服务 # 设置开机启动 $ systemctl enable nginx $ systemctl enable redis $ systemctl enable supervisord $ systemctl restart nginx $ systemctl restart redis #请确保Redis仅监听在 127.0.0.1 $ systemctl restart supervisord 默认更新到最新版本 $ cd spug_api $ source venv/bin/activate $ python manage.py update # 重启服务 $ supervisorctl restart all
注意:确保服务端接收到请求 HTTP Header 的 X-Real-IP 为真实的客户端地址,Spug 会使用该 IP 提高安全性(当登用户的 IP 发生变化时 Token 自动失效。
5)平台功能概览
1>主机管理:可以对主机进行管理、主机也可以通过表格批量导入
2>批量在线执行:可以执行模版命令和临时命令,例如经常执行的安装、更新、初始化的脚本或者命令就可以保存成模版来方便的快速批量执行。
3>文件在线上传下载:可以很方便的在执行命令过程中上传或者下载需要的文件
4>在线终端:在线终端方便平台远程调试,跟本地执行一样
5>应用部署:可以快速部署任意开发语言的的应用,例如PHP、Java、Nodejs、Go等
6>监控报警:支持常见的网站监控,也可以针对主机的进程、端口进行监控,如果端口、进程监控满足不了需要,可以自己写脚本进行监控,报警支持钉钉、微信、邮件、企业微信、(短信报警下个版本支持)
注:可查询最近30天内的报警记录,超过30天的报警记录会被自动删除,且通道沉默期发送的报警信息不会被记录。另外,监控实例删除后,告警信息不会同步删除;
目前,Spug 运维平台已集成推送助手替代原先内置的推送服务;Spug仅同步推送助手里语音、短信、邮件和微信公众号类型的推送对象。集成推送助手是可选的,除上述特性外对 Spug 运维平台功能无任何其他影响,如果不需要上述功能可忽略。为了平衡技术服务与运营成本,原内置服务将于 2024年5月31日 停止服务并切换至推送助手,如果使用了内置的邮件和微信告警/MFA验证功能届时将会受到影响,如未使用相关功能则可忽略。更多参看集成推送助手说明。
7>配置管理:(支持KV,txt,json等格式)
8>任务计划:
三、附录:
1)Python中Django和Flask框架的区别
它们是ython编程语言的世界里,功能最强大、最流行的两个框架。不仅在web后端开发、微服务开发,同时在ERP系统开发、API接口开发等领域,这两个框架也应用非常广泛。
关于两者的区别,网络流行一个生动的比喻就是:Django类似于精装修的房子,自带豪华家具、非常齐全功能强大的家电,什么都有了,拎包入住即可,十分方便。而Flask类似于毛坯房,自己想把房子装修成什么样自己找材料,买家具自己装。材料和家具种类非常丰富,并且都是现成免费的,直接拿过去用即可。
Flask:
小巧、灵活,让程序员自己决定定制哪些功能,非常适用于小型网站。
对于普通的工人来说将毛坯房装修为城市综合体还是很麻烦的,使用Flask来开发大型网站也一样,开发的难度较大,代码架构需要自己设计,开发成本取决于开发者的能力和经验。
如果想搞懂Python web开发WSGI协议原理以及实现过程、或者你想灵活定制组件,完全DIY你的应用、想实现微服务,那么建议你选择Flask。
Django:
大而全,功能极其强大,是Python web框架的先驱,用户多,第三方库极其丰富。
非常适合企业级网站的开发,但是对于小型的微服务来说,总有“杀鸡焉有宰牛刀”的感觉,体量较大,非常臃肿,定制化程度没有Flask高,也没有Flask那么灵活。
如果关注产品的最终交付、想快速开发一个大的应用系统(比如新闻类网站、商城、ERP等),那么建议你选择Django,你想得到的功能它都有,想不到的功能它也有。
2)阿里云镜像仓库访问失败:Error response from daemon……Client.Timeout exceeded while awaiting headers
docker pull registry.aliyuncs.com/openspug/spug
#报错如下
需要单独配置使用Registry的独立登录密码。而Registry的登陆密码是在容器镜像服务的控制台上设置与修改的,如下所示:
之后报错:FIXME: Got an API for which error does not match any expected type!!,是网络问题,直接出公网就没说,暂未找到原因,换如下方式:
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/do-yunw/7196.html