Shell-Gen 教程:Linux 一键部署脚本生成器
Shell-Gen 是一个 Linux 一键部署脚本生成器:打开网页,选一个生成器,填几个参数,右侧实时生成一份可以直接拿去执行的 Bash 安装脚本。装 Nginx、Redis、MySQL、Docker、WireGuard、Prometheus 这些常见服务,不用再到处翻文档拼命令,也不用担心不同发行版的包管理器、服务名、配置文件路径各不相同——脚本生成时已经按目标发行版做了自动适配。
一、项目简介
Shell-Gen 的定位是“安装脚本的生成器”,而不是“远程执行器”。它本身不登录目标机器,所有生成的脚本都要拿到目标机器上用 sudo bash 执行。服务本身基于 Python Flask,零 pip 依赖(仅需 Python 3.8+ 和 Flask),内置 50 个生成器,覆盖中间件、数据库、开发语言运行时、systemd 服务、系统工具、网络工具和监控告警七大类。
- 技术栈:Python 3.8+、Flask(后端)、原生 HTML 模板(前端)
- 默认端口:5099
- 支持发行版:Ubuntu、Debian、CentOS、RHEL、Rocky、Alma,脚本运行时自动检测
- 开源协议:MIT License
二、功能特性
- 50 个生成器开箱即用:中间件 10 个、数据库 8 个、开发语言运行时 10 个、systemd 服务 6 个、系统工具 8 个、网络工具 4 个、监控告警 4 个。
- 发行版自动适配:Ubuntu/Debian 自动用 apt,RHEL/CentOS/Rocky/Alma 自动用 yum,未知发行版回退到 iptables。脚本运行时输出带 [shell-gen] 前缀的日志,方便 grep 搜索。
- 实时预览:填参数的同时右侧实时显示生成的脚本,所见即所得。
- 三种交付方式:复制到剪贴板、下载 .sh 文件、加入套餐(多个生成器合并成 zip + master installer,一次性装一整套环境)。
- 语法已校验:50 个生成器默认参数生成的脚本均通过 bash -n 语法检查。
- 幂等设计:多数脚本支持重复运行(用 cp + bak 备份旧配置,改完 systemd 配置会自动 daemon-reload)。
- 零依赖部署:仅需 Python 3.8+ 和 Flask,无其他 pip 依赖。
三、适用场景
- 新机器批量初始化:一次开十台云主机,每台都要装 Docker、配防火墙、调 sysctl、同步时间——用套餐功能把多个生成器打包成一个 zip,逐台执行 master installer 即可。
- 开发测试环境搭建:本地虚拟机或测试服务器上快速装 Redis、MySQL、MongoDB,填几个参数就能拿到可执行的脚本,不用翻各家官方文档。
- 异构发行版混管:手里同时有 Ubuntu 和 Rocky 的机器,同一个 Redis 生成器能按目标发行版自动选择包管理器和服务配置,少踩很多坑。
- 标准化交付:团队内部统一用 Shell-Gen 生成安装脚本,装出来的环境配置一致,新人接手也不用猜之前是怎么装的。
- 离线环境准备:在有网的机器上生成脚本,拷贝到内网目标机执行,脚本本身不依赖 Shell-Gen 服务。
不适用场景:Shell-Gen 生成的是一次性安装脚本,不负责后续的配置管理、版本升级和状态收敛。如果需要持续保证几百台机器的配置一致,应该用 Ansible、SaltStack 这类配置管理工具;如果需要编排多容器应用,应该用 Docker Compose 或 Kubernetes。Shell-Gen 解决的是“第一次装起来”这个问题。
四、50 个生成器一览
| 分类 | 数量 | 生成器 |
|---|---|---|
| 中间件服务 | 10 | VNC 远程桌面、Nginx、HAProxy、Keepalived、Redis、RabbitMQ、Tomcat、Docker、etcd、ZooKeeper |
| 数据库 | 8 | PostgreSQL、MySQL / MariaDB、MongoDB、Memcached、SQLite、Elasticsearch、ClickHouse、Consul |
| 开发语言运行时 | 10 | Python、Node.js、GCC、Make、CMake、Go、OpenJDK、PHP、Ruby、Rust |
| systemd 服务 | 6 | 通用 systemd、Gunicorn、Node.js、Java -jar、Go binary、Shell 脚本 |
| 系统工具 | 8 | 防火墙、Swap、时间同步、SSH 加固、Sysctl 调优、ulimit、主机名 / hosts、磁盘自动挂载 |
| 网络工具 | 4 | WireGuard、Tailscale、Dnsmasq、OpenVPN |
| 监控告警 | 4 | Prometheus Node Exporter、Prometheus Server、Grafana、Logrotate |
几个亮点值得单独说:Nginx 生成器支持静态站点、反向代理和自签 SSL 三种模式;Redis 生成器支持密码、AOF 持久化和 ACL;MySQL 支持 5.7 / 8.0 / 8.4,MariaDB 支持 10.11 / 11.4;MongoDB 支持 4.4 到 7.0 多个版本加副本集;WireGuard 生成器会自动生成客户端配置和二维码,手机扫码就能连;Python 支持 2.7 到 3.13 源码编译安装,适合需要特定版本的老项目。
五、安装部署
部署 Shell-Gen 本身非常简单:它是一个 Flask 应用,默认监听 5099 端口。推荐用 systemd 托管,重启后自动恢复;仓库里同时提供了 Dockerfile 和 start.sh,可按需选择部署方式。
# 方式一:直接启动(开发或临时使用)
cd /root/shell-gen
bash start.sh
# 浏览器打开 http://<server>:5099/
# 方式二:systemd 托管(推荐,生产使用)
cp shell-gen.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable --now shell-gen
systemctl status shell-gen --no-pager
journalctl -u shell-gen -f
# 方式三:Docker 部署(仓库提供 Dockerfile,以文件内容为准)
docker build -t shell-gen .
docker run -d --name shell-gen -p 5099:5099 --restart always shell-gen
环境要求:Python 3.8+ 和 Flask。README 的说法是“零依赖,仅需 Python 3.8+ 与 Flask 标准库即可,无 pip 依赖”,但仓库中同时提供了 requirements.txt,如果 start.sh 没有自动处理依赖,可以手动安装:
# 如果缺少 Flask,先安装依赖
pip install -r requirements.txt
# 或
pip install flask
# 检查端口是否在监听
ss -tlnp | grep 5099
curl -s http://localhost:5099/api/categories | python3 -m json.tool | head -30
六、项目结构
shell-gen/
├── app.py # Flask 应用入口(路由 + API)
├── generators/ # 生成器模块(按分类拆分)
│ ├── __init__.py # 注册机制、Generator 基类、Field 定义
│ ├── middleware.py # 中间件服务(Nginx/Redis/Docker 等)
│ ├── databases.py # 数据库(MySQL/PostgreSQL/MongoDB 等)
│ ├── runtimes.py # 开发语言运行时
│ ├── systemd_svc.py # systemd 服务
│ ├── system.py # 系统工具
│ ├── network.py # 网络工具
│ └── monitoring.py # 监控告警
├── templates/ # 前端模板(首页/详情页)
├── static/style.css # 前端样式
├── shell-gen.service # systemd 单元文件
├── start.sh # 启动脚本
├── requirements.txt # Python 依赖
└── README.md
生成器按分类拆成多个 Python 模块,每个模块里是若干个 Generator 子类。这种结构的好处是加新生成器不用改核心逻辑:写一个类、注册一下就能用,第八节会完整演示。
七、使用流程:从选生成器到执行脚本
标准流程只有四步:打开首页浏览 50 个生成器,点击进入详情页填写参数,右侧实时预览生成的脚本,然后选择一种交付方式拿到脚本。
# 1. 在目标机器上先检查发行版与网络
cat /etc/os-release | head -3
curl -sI --max-time 10 https://mirrors.aliyun.com/ | head -1
# 2. 生成脚本后先做语法检查(不要跳过这一步)
bash -n redis.sh && echo "语法 OK"
# 3. 先看一遍脚本里要装什么、改哪些配置,确认无误再执行
less redis.sh
# 4. 执行(必须用 sudo,安装服务和写系统配置需要 root 权限)
sudo bash redis.sh
# 5. 验证服务状态
systemctl status redis --no-pager
redis-cli -a '你的密码' ping # 应返回 PONG
三种交付方式怎么选:单个服务直接复制粘贴最快;要反复用或发给别人就下载 .sh 文件;一次装多个服务(比如 Nginx + Redis + Node.js + 防火墙)就用套餐功能,多个生成器合并成一个 zip,里面带一个 master installer,按顺序逐个执行,适合新机器整机初始化。
重要提醒:生成的脚本是在生成器所在机器之外的目标机器上运行的。不要在 Shell-Gen 服务所在的机器上随手 sudo bash 执行刚生成的脚本,除非那台机器本身就是目标机。脚本开头有 [shell-gen] 前缀的日志输出,执行后可以用 journalctl 或重定向日志搜索这个前缀来复核。
八、实战示例:Nginx、Redis 与 WireGuard
下面用三个典型场景演示生成器的用法。示例一是 Nginx 反向代理:填域名和监听端口,生成器会产出安装 Nginx、写站点配置、申请自签 SSL(如果选了)并启动服务的完整脚本。
# 示例一:通过 API 预览 Nginx 生成器(反向代理模式)
curl -s -X POST http://localhost:5099/api/preview \
-H 'Content-Type: application/json' \
-d '{"generator": "nginx", "params": {"server_name": "demo.local", "listen_port": "80"}}'
# 示例二:下载 Redis 安装脚本(端口 6379,带密码与 AOF)
curl -s -X POST http://localhost:5099/api/download \
-H 'Content-Type: application/json' \
-d '{"generator": "redis", "params": {"port": "6379"}}' \
-o redis.sh
bash -n redis.sh && sudo bash redis.sh
# 示例三:打包套餐——Redis + Nginx 一次下载
curl -s -X POST http://localhost:5099/api/bundle \
-H 'Content-Type: application/json' \
-d '{"items": [{"generator": "redis", "params": {}}, {"generator": "nginx", "params": {}}]}' \
-o bundle.zip
unzip bundle.zip && ls -l
WireGuard 的场景值得单独讲:生成器除了装服务端,还会自动生成客户端配置和二维码。服务端装完后,把客户端配置扫码导入手机或分发给同事就能用,省去了手写 wg0.conf 和分发密钥的麻烦。OpenVPN 生成器同理,也会生成客户端配置,适合需要给多人分发 VPN 账号的场景。
数据库场景以 MySQL 为例:生成器支持 5.7 / 8.0 / 8.4 三个大版本,参数里可以指定 root 密码、字符集和端口。注意 MySQL 8.0 默认认证插件是 caching_sha2_password,老客户端连不上时要么升级客户端,要么在生成参数里改认证方式,装完再改会比较麻烦。
九、API 接口
除了网页操作,Shell-Gen 还提供 HTTP API,适合写自动化脚本批量生成:先调 /api/categories 列出所有生成器,再调 /api/preview 预览、/api/download 下载、/api/bundle 打包。
# 列出所有生成器(按分类)
curl -s http://localhost:5099/api/categories | python3 -m json.tool
# 预览脚本(不下载,只看内容)
curl -s -X POST http://localhost:5099/api/preview \
-H 'Content-Type: application/json' \
-d '{"generator": "nginx", "params": {"server_name": "demo.local", "listen_port": "80"}}'
# 下载单个脚本
curl -s -X POST http://localhost:5099/api/download \
-H 'Content-Type: application/json' \
-d '{"generator": "redis", "params": {"port": "6379"}}' \
-o redis.sh
# 打包多个生成器
curl -s -X POST http://localhost:5099/api/bundle \
-H 'Content-Type: application/json' \
-d '{"items": [{"generator": "redis", "params": {}}, {"generator": "nginx", "params": {}}]}' \
-o bundle.zip
API 的典型用法是写个小脚本批量出脚本:比如新开一批云主机,先调 API 把防火墙、Swap、时间同步、SSH 加固、Docker、Node Exporter 六个生成器的脚本一次下载齐,再用 Ansible 或 scp 分发到各台机器执行。生成器本身不负责分发和执行,分发那层交给已有的运维工具链。
十、添加自定义生成器
内置的 50 个生成器覆盖不了所有场景时,可以自己写一个。生成器的结构很简单:一个 Generator 子类,定义 id、标题、分类、字段和 render 方法,render 返回拼接好的 Bash 脚本字符串。
# generators/myapp.py
from . import register, Generator, Field
from . import bash_header, quote, bool_str
class MyService(Generator):
id = "myservice"
title = "我的服务"
category = "middleware" # middleware/databases/runtimes/systemd/system/network/monitoring/security
icon = "🚀"
tags = ["custom"]
description = "..."
fields = [
Field("port", "端口", "number", default="8080"),
]
def render(self, p):
port = p.get("port", "8080")
out = [bash_header(self.title)]
out.append('apt-get install -y mypkg')
# ...按参数拼接更多命令
return "\n".join(out) + "\n"
register(MyService())
# 在 app.py 的 import 块加一行,注册新生成器
# from generators import myapp # noqa
# 重启服务后验证
curl -s http://localhost:5099/api/categories | grep -i myservice
# 生成一次默认参数脚本并做语法检查
curl -s -X POST http://localhost:5099/api/preview \
-H 'Content-Type: application/json' \
-d '{"generator": "myservice", "params": {}}' > myservice.sh
bash -n myservice.sh && echo "语法 OK"
写自定义生成器要注意三件事:第一,render 里拼接命令时,对用户输入的参数要做转义(用框架提供的 quote 这类工具),防止参数里的特殊字符破坏脚本;第二,安装步骤要写幂等逻辑(判断是否已安装、备份旧配置),否则重复执行会报错;第三,生成后务必用 bash -n 校验,README 明确说了 50 个内置生成器默认参数生成的脚本都通过了 bash -n 检查,自定义的也要达到同一标准。
十一、常见问题
- 生成的脚本在目标机上执行报错“命令不存在”?先确认目标机的发行版是否在支持列表里(Ubuntu/Debian/CentOS/RHEL/Rocky/Alma),未知发行版会回退到默认逻辑,部分包名可能对不上。生成时按目标机的实际发行版选参数,执行前先看一遍脚本。
- 脚本执行到一半失败了,能重跑吗?多数脚本支持重复运行(cp + bak 备份、daemon-reload),先看报错在哪一步,修好前置条件后重跑即可。但涉及数据库初始化的步骤重跑前要确认数据是否已存在,避免重复初始化覆盖数据。
- 服务起不来怎么查?先看脚本输出里 [shell-gen] 前缀的日志定位到哪一步,再用 systemctl status 和 journalctl -u 服务名查 systemd 的报错。
- 能用 Shell-Gen 装生产数据库吗?可以,但生成器给的是标准安装流程,生产环境还要另外做备份策略、主从复制、监控告警和权限收紧,这些不在生成器覆盖范围内。
- 套餐里的 master installer 是按什么顺序执行的?按加入套餐的顺序执行。依赖关系要自己排好顺序,比如先装防火墙和时间同步,再装中间件,最后装监控。
- 生成的脚本里密码是明文吗?参数里填的密码会直接写进生成的脚本和目标机的配置文件。脚本文件用完后及时删除,不要留在服务器上,也不要提交进 Git。
十二、运维建议
- 执行前三检查:bash -n 语法检查、通读一遍脚本确认要改的配置、确认目标机已做快照或备份。三个都做了再 sudo 执行。
- 不要在生产机上直接试新生成器:先在测试机或虚拟机上跑通,确认服务状态和端口监听都正常,再推广到生产。
- 脚本即文档:把生成并执行过的脚本按机器和日期归档,出了问题能快速知道这台机器当初是怎么装的。
- 服务本身也要维护:Shell-Gen 服务建议用 systemd 托管并限制访问来源(内网访问或加反向代理认证),它虽然不直接操作目标机,但生成的脚本里可能包含你填的密码等敏感参数。
- 定期更新生成器:中间件版本更新很快,生成器里写死的版本号会过时。团队使用时建议定期同步上游更新,或按第十节的方法自己维护一份内部生成器。
总结:Shell-Gen 把“装服务”这件事从翻文档、拼命令变成了填表单、拿脚本。它不替代配置管理工具,但能把新机器初始化和常用服务部署的时间从小时级压缩到分钟级。先在测试机上跑通两三个生成器,熟悉交付流程后,再把它纳入团队的新机交付标准流程。




