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 个生成器一览

分类数量生成器
中间件服务10VNC 远程桌面、Nginx、HAProxy、Keepalived、Redis、RabbitMQ、Tomcat、Docker、etcd、ZooKeeper
数据库8PostgreSQL、MySQL / MariaDB、MongoDB、Memcached、SQLite、Elasticsearch、ClickHouse、Consul
开发语言运行时10Python、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、磁盘自动挂载
网络工具4WireGuard、Tailscale、Dnsmasq、OpenVPN
监控告警4Prometheus 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 把“装服务”这件事从翻文档、拼命令变成了填表单、拿脚本。它不替代配置管理工具,但能把新机器初始化和常用服务部署的时间从小时级压缩到分钟级。先在测试机上跑通两三个生成器,熟悉交付流程后,再把它纳入团队的新机交付标准流程。

发表回复

后才能评论