# spug
**Repository Path**: daywsid/spug
## Basic Information
- **Project Name**: spug
- **Description**: 开源运维平台:面向中小型企业设计的无 Agent的自动化运维平台,整合了主机管理、主机批量执行、主机在线终端、文件在线上传下载、应用发布、任务计划、配置中心、监控、报警等一系列功能。
- **Primary Language**: Python
- **License**: AGPL-3.0
- **Default Branch**: 3.0
- **Homepage**: https://spug.cc
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 978
- **Created**: 2026-07-11
- **Last Updated**: 2026-07-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
Spug
Spug是面向中小型企业设计的轻量级无Agent的自动化运维平台,整合了主机管理、主机批量执行、主机在线终端、应用发布部署、在线任务计划、配置中心、监控、报警等一系列功能。
- 项目官网:https://ops.spug.cc
- 使用文档:https://ops.spug.cc/docs/about-spug/
## 演示环境
演示地址:https://demo.spug.cc
## 特性
- **批量执行**: 主机命令在线批量执行
- **在线终端**: 主机支持浏览器在线终端登录
- **文件管理**: 主机文件在线上传下载
- **任务计划**: 灵活的在线任务计划
- **发布部署**: 支持自定义发布部署流程
- **配置中心**: 支持KV、文本、json等格式的配置
- **监控中心**: 支持站点、端口、进程、自定义等监控
- **报警中心**: 支持短信、邮件、钉钉、微信等报警方式
- **优雅美观**: 基于 Ant Design 的UI界面
- **开源免费**: 前后端代码完全开源
## 环境
* Python 3.8+
* Django 2.2
* Node 12.14
* React 16.11
## 安装
[官方文档](https://ops.spug.cc/docs/install-docker)
更多使用帮助请参考: [使用文档](https://ops.spug.cc/docs/host-manage/)
### 自定义版本(含密码认证、执行历史回溯、代理主机)
本仓库在官方 Spug 基础上做了以下增强:
- **主机密码认证**:Host 模型新增 `pwd` 字段,SSH 连接优先使用密码认证,兼容私钥认证
- **执行历史回溯**:新增 `ExecResult` 模型持久化每台主机的执行结果,支持查看历史执行详情
- **代理主机功能**:通过 paramiko `direct-tcpip` channel 实现多级跳板机代理
- **private_key 容错**:未配置全局密钥时不再抛 KeyError
- **SSH 连接重试**:并发批量执行时,SSH 连接失败自动重试 3 次(间隔 1s、2s),解决代理主机并发连接限制导致的 "Error reading SSH protocol banner" 问题
#### Docker 镜像部署(推荐)
镜像已推送到阿里云容器镜像仓库,可直接拉取使用。三个镜像(spug 应用、mariadb 数据库、nginx 反向代理)都已在仓库中提供。
**1. 拉取镜像**
```bash
docker pull crpi-o2t7vcya8uijl4kc.cn-hangzhou.personal.cr.aliyuncs.com/wsid/spug:latest
docker pull crpi-o2t7vcya8uijl4kc.cn-hangzhou.personal.cr.aliyuncs.com/wsid/mariadb:10.8.2
docker pull crpi-o2t7vcya8uijl4kc.cn-hangzhou.personal.cr.aliyuncs.com/wsid/nginx:alpine
```
**2. 创建 docker-compose.yml**
```yaml
services:
db:
image: crpi-o2t7vcya8uijl4kc.cn-hangzhou.personal.cr.aliyuncs.com/wsid/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_deploy/mysql:/var/lib/mysql
environment:
- MYSQL_DATABASE=spug
- MYSQL_USER=spug
- MYSQL_PASSWORD=spug.cc
- MYSQL_ROOT_PASSWORD=spug.cc
spug:
image: crpi-o2t7vcya8uijl4kc.cn-hangzhou.personal.cr.aliyuncs.com/wsid/spug:latest
container_name: spug
privileged: true
restart: always
volumes:
- /data/spug_deploy/service:/data/spug
- /data/spug_deploy/repos:/data/repos
environment:
- MYSQL_DATABASE=spug
- MYSQL_USER=spug
- MYSQL_PASSWORD=spug.cc
- MYSQL_HOST=db
- MYSQL_PORT=3306
depends_on:
- db
nginx:
image: crpi-o2t7vcya8uijl4kc.cn-hangzhou.personal.cr.aliyuncs.com/wsid/nginx:alpine
container_name: spug-nginx
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- /data/spug_deploy/nginx.conf:/etc/nginx/nginx.conf:ro
- /data/spug_deploy/ssl:/ssl:ro
depends_on:
- spug
```
**3. 创建 nginx 配置文件(重要)**
在启动前**必须**先创建 nginx 配置文件,否则 Docker 会把 `nginx.conf` 当作目录创建,导致 nginx 容器启动失败(报错 `mount ... not a directory`):
```bash
mkdir -p /data/spug_deploy/{mysql,service,repos,ssl}
cat > /data/spug_deploy/nginx.conf <<'EOF'
worker_processes auto;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
client_max_body_size 1024m;
upstream spug_backend {
server spug:80;
}
server {
listen 80;
server_name _;
# 如需启用 HTTPS,取消下面一行注释
# return 301 https://$host$request_uri;
location / {
proxy_pass http://spug_backend;
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;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
# 如需启用 HTTPS,取消下面注释并配置证书路径
# server {
# listen 443 ssl;
# server_name your.domain.com;
# ssl_certificate /ssl/ssl.crt;
# ssl_certificate_key /ssl/ssl.key;
# ssl_protocols TLSv1.2 TLSv1.3;
# location / {
# proxy_pass http://spug_backend;
# 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;
# proxy_http_version 1.1;
# proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Connection "upgrade";
# }
# }
}
EOF
```
> 如需启用 HTTPS,将 SSL 证书文件放到 `/data/spug_deploy/ssl/` 目录下(命名为 `ssl.crt` 和 `ssl.key`),并取消 nginx.conf 中 HTTPS 部分的注释。
**4. 启动服务**
```bash
docker compose up -d
```
**5. 等待数据库就绪(重要)**
MariaDB 首次启动需要几秒到几十秒来初始化数据库,必须等数据库完全就绪后再执行初始化。否则会报 `Unknown database 'spug'` 错误。
```bash
# 方法一:等待 spug-db 日志出现 "ready for connections"
docker logs -f spug-db
# 看到 "mysqld: ready for connections" 后按 Ctrl+C 退出
# 方法二:循环检测数据库是否就绪(推荐)
until docker exec spug-db mysql -uroot -p"spug.cc" -e "SHOW DATABASES LIKE 'spug';" 2>/dev/null | grep -q spug; do
echo "等待 MariaDB 初始化完成..."
sleep 3
done
echo "MariaDB 已就绪"
```
**6. 初始化管理员账户**
```bash
docker exec -it spug init_spug admin admin123
```
访问 `http://<服务器IP>:<端口>` 即可使用,默认管理员账号 `admin` / 密码 `admin123`。
#### 从源码构建镜像
如需自行构建镜像,可使用仓库自带的 Dockerfile:
```bash
git clone https://gitee.com/daywsid/spug.git
cd spug
docker build -t spug-custom:latest -f docs/docker/Dockerfile.custom .
```
#### 升级
升级时只需拉取新镜像并重启容器,entrypoint 会自动用新代码覆盖挂载目录中的旧代码(保留 overrides.py 等运行时配置):
```bash
docker pull crpi-o2t7vcya8uijl4kc.cn-hangzhou.personal.cr.aliyuncs.com/wsid/spug:v1.1
docker compose down
docker compose up -d
# 或升级到最新版本
# docker pull crpi-o2t7vcya8uijl4kc.cn-hangzhou.personal.cr.aliyuncs.com/wsid/spug:latest
```
> 如需指定版本,可把 `latest` 替换为具体版本号,如 `v1.1`。可用版本请查看 [Releases](https://gitee.com/daywsid/spug/releases)。
#### 版本说明
| 版本 | 主要特性 |
| --- | --- |
| v1.1 | 批量执行汇总视图(实时+历史)、SSH 旧算法兼容(ssh-rsa/ssh-dss)、历史记录一键再次执行 |
| v1.0 | 密码认证、执行历史全量保留、代理主机、SSH 连接重试 |
## 推荐项目
[Yearning — MYSQL 开源SQL语句审核平台](https://github.com/cookieY/Yearning)
## 预览
### 主机管理

#### 主机在线终端

#### 文件在线上传下载

#### 主机批量执行


#### 应用发布

#### 监控报警

#### 角色权限

## 赞助
## 开发者群
#### 关注Spug运维公众号加微信群、QQ群、获取最新产品动态
## License & Copyright
[AGPL-3.0](https://opensource.org/licenses/AGPL-3.0)