ServerStack
ServerStack 是一键部署 Linux 服务器软件栈(LAMP / LNMP / LNMT 等)的自动化安装项目, 由原始 OneinStack 风格脚本经过**工程化结构重构(Project Restructure,非 Rewrite)**而来。
本次重构只调整代码组织方式与目录结构,不改动任何安装逻辑、安装顺序、命令行参数、
配置格式、菜单与日志内容。原有的 include/ 大杂烩被拆分为职责单一的目录树,
入口脚本与公共库、核心编排、软件模块彻底解耦。
历史使用说明请见
docs/README.md(上游原文档,未改动)。
软件裁剪(Software Trim):在重构基础上,进一步移除了 Tengine / OpenResty / Apache(仅保留 Nginx)、Percona 全系(仅保留 MySQL / MariaDB / PostgreSQL / MongoDB)、Memcached(仅保留 Redis)、OpenJDK 8/11(仅保留 Node.js / Python)、Tomcat 7–10(仅保留 phpMyAdmin)。相关安装 / 升级 / 下载 / 检测脚本与离线包清单均已同步裁剪;详见
OFFLINE.md。
系统裁剪(OS Trim):
lib/check_os.sh仅识别并支持 Debian 9-13 / Ubuntu 16-26(apt-get 系);RHEL/CentOS/Rocky/AlmaLinux/Oracle/Fedora/Amazon/openEuler 等 yum/dnf 系一律直接退出。相应地移除了installDepsRHEL、core/os/init_RHEL.sh以及init.sh的 rhel 分发。
1. 顶层目录结构
ServerStack/
├── bin/ # 入口脚本(用户直接执行的 CLI)
├── core/ # 核心流程编排(项目专属业务逻辑)
├── lib/ # 公共函数库(纯工具,无业务决策)
├── modules/ # 软件安装模块(按类别分区,高内聚)
├── services/ # systemd / init 单元文件
├── config/ # 项目配置文件
├── templates/ # 服务器 / vhost 配置模板
├── src/ # 补丁 / 密钥 / 预置 tarball(原样保留)
├── scripts/ # 独立运维辅助脚本
├── runtime/ # 运行时生成物(install.log、锁、状态标记)
├── logs/ # 运维日志(与 runtime 分离,便于轮转)
├── backup/ # 备份归档(backup.sh / db_bk.sh 写入)
├── docs/ # 文档
├── tests/ # 测试(回归 / 冒烟脚本)
└── LICENSE
文件统计(15 个目录合计 270 文件,不含根目录文档/清单):bin 9 core 13 lib 15 modules 58 services 6
config 2 templates 19 src 135 scripts 7 runtime 1 logs 1 backup 1 docs 1 tests 1。
(另含根目录 LICENSE、README.md、OFFLINE.md、OFFLINE_MANIFEST.txt 等文档/清单文件。)
2. 各目录职责与边界
| 目录 | 职责 | 依赖关系 | 允许被谁调用 | 对外接口 |
|---|---|---|---|---|
| bin/ | 用户 CLI 入口,只做最小 argv 解析后委托给 core |
→ core | 用户直接执行 | install / uninstall / upgrade / vhost / addons / backup / backup_setup / pureftpd_vhost / reset_db_root_password |
| core/ | 项目专属编排:决定安装顺序与流程,不含具体软件安装码 | 依赖 lib(函数)+ modules(经 run_install) |
仅 bin/ | main() 及步骤函数 |
| lib/ | 纯工具函数(日志 / 颜色 / 检测 / 下载),source 时无副作用、无业务判断 | 依赖 ∅(不向上依赖) | 任何人 | load_common / log_* / 颜色变量 / check_* |
| modules/ | 单软件一文件,统一 Install_X 接口 |
仅依赖 lib;禁止 source core(无向上依赖) | 仅经 run_install 被 core 调用 |
Install_X(可选 Configure / Start) |
| services/ | 静态单元文件 | 被 service.sh / systemctl 消费 |
系统 | 单元文件本身 |
| config/ | 静态项目配置 | 被 load_common 消费 |
core / lib | 配置项 |
| templates/ | 静态服务器 / vhost 模板 | 安装时由 modules 渲染 | modules | 模板文件 |
| src/ | 静态补丁 / 密钥 / 包 | 编译期被 modules 引用 | modules | 资产文件 |
| scripts/ | 独立运维工具 | 可选 source lib | 用户 / backup 类脚本 | 独立命令 |
| runtime/ / logs/ / backup/ | 生成物(日志 / 锁 / 备份) | 被框架写入 | 框架 | 文件 |
| docs/ / tests/ | 文档 / 测试(新增) | 无依赖 | 人类 / CI | — |
依赖有向无环图(低耦合,无环)
bin → core → { lib, modules }
modules → lib
lib → ∅(纯叶子)
services / config / templates / src 为叶子资产,仅被消费
scripts → lib(可选)
任何目录都不得反向依赖 core / modules,从结构层面杜绝循环耦合。
3. 目录详解
bin/ —— 入口脚本
用户直接执行的一层薄壳,仅负责 cd 到项目根、source 公共库与编排核心、解析最少量参数后委托。
install.sh:主安装入口,驱动core/workflow.sh::main()。uninstall.sh/upgrade.sh/vhost.sh/addons.sh/backup.sh/backup_setup.sh/pureftpd_vhost.sh/reset_db_root_password.sh:各自独立职责的管理脚本。
core/ —— 核心流程编排(13 文件)
项目专属业务逻辑,决定“先做什么、后做什么”,但不持有具体软件的编译/安装代码。
workflow.sh:唯一决定安装顺序的地方(main())。environment.sh:init_environment/init_variables/prepare_install/check_environment。init.sh:init_os/install_prereqs(含os/两个 OS 初始化子脚本)。argument.sh:version/Show_Help/parse_arguments/handle_ssh_port。menu.sh:show_menu。validator.sh:is_valid/validate_options(幂等校验安全网)。installer.sh:install_modules/configure_modules/PHP_addons。service.sh:start_services/start_service(统一 systemctl | service 双路)。summary.sh:print_summary。demo.sh:演示站点生成。os/init_Debian.shos/init_Ubuntu.sh:Debian / Ubuntu 的 OS 初始化(仅支持这两类系统)。
lib/ —— 公共函数库(15 文件)
纯工具,无任何业务决策、source 时零副作用,可被任意模块安全复用。
loader.sh:load_common/load_configs/source_module/run_install(统一去重的. module; Func | tee -a install.log)。log.sh:log_info/log_warn/log_error/log_success/error_exit/cleanup/rollback/trap_handler。color.shcheck_os.shcheck_dir.shdownload.shcheck_download.shget_char.shmemory.shopenssl.shcheck_sw.sh:颜色、系统检测、目录/下载校验、随机密码等工具。py/:get_ipaddr.pyget_public_ipaddr.pyget_ipaddr_state.pycheck_port.py(Python 辅助)。
modules/ —— 软件安装模块(58 文件,按类别分区)
每个软件一个文件,统一对外暴露 Install_X(部分含 Configure_X / Start_X)。
新增软件 = 在对应子目录丢一个 Install_X 文件 + 在 installer.sh / menu.sh 注册,无需改动核心。
| 子目录 | 内容 |
|---|---|
web/ |
jemalloc, nginx |
db/ |
mysql-5.7/8.0, mariadb-10.11/11.8/12.3, postgresql-15.14/16.10/17.6, mongodb |
php/ |
php-7.4/8.0/8.1, mphp(多版本共存) |
php-addons/ |
apcu, xcache, eaccelerator, ioncube, sourceguardian, ZendGuardLoader, zendopcache, composer, pecl_calendar / fileinfo / imap / ldap / mongodb / pgsql / phalcon / swoole / xdebug / yaf / yar |
cache/ |
redis |
lang/ |
nodejs, python |
app/ |
phpmyadmin |
ftp/ |
pureftpd |
security/ |
fail2ban, ngx_lua_waf |
image/ |
GraphicsMagick, ImageMagick |
upgrade/ |
upgrade_db / oneinstack / php / phpmyadmin / redis / web |
services/ —— 服务单元(6 文件)
原 init.d/ 内容,迁移为现代 systemd 单元。
nginx.servicephp-fpm.servicemongod.servicepostgresql.servicepureftpd.serviceredis-server.service。
config/ —— 项目配置(2 文件)
options.conf:安装选项(含可存储的数据库密码等)。versions.txt:各组件版本清单。
templates/ —— 配置模板(19 文件)
服务器 / vhost 配置模板(原 config/ 的 vhost 模板),安装期由 modules 渲染。
- 通用:
nginx.confpure-ftpd.confindex.htmlindex_cn.html。 - 应用模板:
cloudflarecodeigniterdiscuzdrupalecshopjoomlalaravelmagento2nextcloudopencartthinkphptypechowhmcswordpresszblog(.conf)。
src/ —— 补丁 / 密钥 / 预置包(149 文件)
libiconv-glibc-2.16.patch php5.3patch
若干编译依赖(注:nginx-rtmp-module、ngx-fancyindex 已从 Nginx 编译中移除,因其下载源失效且无可用镜像);
其余为离线安装预置的源码 / 二进制 tarball(清单见根目录 OFFLINE_MANIFEST.txt)。
注:目录名保留
src/未改名patches/。原因:编译脚本中src/大量指代下载解压后的源码内部路径(如src/core/nginx.h、src/argon2-),盲目改名会破坏编译逻辑;保留原名零引用风险。
scripts/ —— 独立运维脚本(7 文件)
db_bk.sh website_bk.sh thread.sh mabs.sh ckssh.py mssh.exp mscp.exp。
runtime/ logs/ backup/ —— 生成物目录
runtime/install.log:安装日志(由lib/log.sh::_log_path统一写入)。logs/、backup/:预留给运维日志与备份归档。
docs/ tests/
docs/README.md:上游原使用文档(未改动)。tests/:回归 / 冒烟测试骨架(本次仅建目录,待补充)。
4. 入口与执行流程
bin/install.sh(约 40 行,纯入口):
#!/bin/bash
export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
cd "$(dirname "$(readlink -f "$0")")/.." || exit 1 # cd 到项目根
. ./lib/loader.sh
. ./lib/log.sh
. ./core/environment.sh
# ... source 其余 core 模块 ...
trap 'trap_handler' EXIT INT TERM
main "$@"
main()(core/workflow.sh)按固定顺序编排:
init_environment → load_configs → init_variables → parse_arguments →
check_environment → show_menu → validate_options → prepare_install →
init_os → install_prereqs → install_modules → configure_modules →
start_services → print_summary
5. 如何新增一个软件模块(扩展性示范)
- 在
modules/<类别>/下新建<software>.sh,实现Install_<Software>(及可选的Configure_*/Start_*)。 - 在
core/installer.sh的安装分支里加一行run_install "modules/<类别>/<software>.sh" "Install_<Software>"。 - 若需在交互菜单出现,在
core/menu.sh增加对应选项。 - 如需 systemd 单元,放入
services/。 - 如需默认配置文件,放入
templates/并在模块中渲染(经lib/工具)。
核心编排(workflow.sh / installer.sh / menu.sh)之外无需改动任何公共代码。
6. 兼容性说明
- ✅ 安装逻辑、安装顺序、CLI 参数、配置格式、菜单、日志内容全部不变。
- ⚠️ 变更仅限路径/引用:
./include/X.sh→ 新目录路径;属机械替换,算法/分支零改动。 - ⚠️
install.log落点改为runtime/install.log(仅路径,内容不变)。 - ⚠️
src/目录名保留(见第 3 节说明),其余资源目录已按规划重命名。 - ⚠️ 软件裁剪(Software Trim):在重构基础上进一步移除了 Tengine / OpenResty / Apache(仅保留 Nginx)、Percona 全系(仅保留 MySQL / MariaDB / PostgreSQL / MongoDB)、Memcached(仅保留 Redis)、OpenJDK 8/11(仅保留 Node.js / Python)、Tomcat 7–10(仅保留 phpMyAdmin)。菜单 DB 选项已重排:9 = PostgreSQL、10 = MongoDB(原 13/14 已上移)。相关安装 / 升级 / 下载 / 检测脚本与离线包清单均已同步裁剪,详见
OFFLINE.md第 4 节。
7. 校验状态
- ✅ 全部
.sh通过bash -n语法检查。 - ✅ source 冒烟测试:框架函数全部定义、路径全部解析成功。
- ✅ 所有
run_install/. modules//. lib//. core/引用均指向真实存在的文件。 - ✅ 全局无残留
include/误引用;$HOME/.oneinstack标记未受影响。 - ⏳ 待 Linux 主机动态回归:干净容器(Debian + Ubuntu 各一)交互 & CLI 两种模式,
对照原
oneinstack/install.sh.bak比较install.log/ 汇总 / 产物目录;并补shellcheck -S error。