做一个云主机面板(如宝塔、1Panel 这类 Web 管理工具)是一个大型后端全栈项目,涉及系统底层、Web 服务、数据库、安全等多个领域。
如果你是想自己开发一个(而非使用现成的),通常需要掌握以下核心架构和实现步骤,这里以最常用的LNMP/LAMP 环境管理面板为例,详细拆解怎么做。
一个云主机面板通常分为三层:
1、前端(Web UI):用户看到的界面,负责展示状态、触发操作。
技术选型:Vue.js / React(SPA 应用)、Element Plus / Ant Design(组件库)、WebSocket(实时推送状态)。
2、后端(API Server):处理业务逻辑,接收前端请求,调用系统命令。
技术选型:Go(性能好,宝塔用的语言)、Python(Flask/Django,开发快)、Node.js(Express)。
关键任务:鉴权、任务队列、进程管理。
3、底层执行层(Shell/守护进程):真正对系统进行操作(安装软件、修改配置、执行命令)。
- 通过exec、subprocess 或SSH 执行 Shell 脚本。
- 利用Supervisor/Systemd 管理面板自身的进程(确保面板挂了能自启)。
监控:CPU、内存、磁盘、网络流量。
实现:读取/proc/stat、/proc/meminfo、df -h、sar 或使用gopsutil 库(Python/Go)。
进程管理:查看、杀死进程。
实现:ps aux、top、kill -9 [PID]。
文件管理:上传、下载、编辑、权限修改。
实现:后端操作os 模块,解压用tar/zip 命令,编辑器用 CodeMirror/Ace Editor。
核心:操作 Nginx/Apache 配置文件。
实现:
- 后端根据用户输入(域名、端口、目录)生成.conf 文件(例如/etc/nginx/sites-available/yourdomain.conf)。
- 内容模板示例(Go 模板引擎):
server {
listen 80;
server_name {{ .Domain }};
root {{ .RootPath }};
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php{{ .PhpVersion }}-fpm.sock;
}
} - 生成后执行nginx -t 检查配置,然后systemctl reload nginx。
Mysql/MariaDB:
- 安装:使用包管理器(apt install -y mysql-server)或编译安装。
- 创建数据库/用户:通过执行 SQL 语句(CREATE DATABASE ...、GRANT ALL ON ...)。
管理工具:内置 phpMyAdmin,或自己写一个简单的 sql 执行器(注意防注入)。
核心:操作iptables、firewalld 或ufw。
实现:通过命令添加/删除规则,并持久化(iptables-save > /etc/iptables.rules)。
SSH安全:修改/etc/ssh/sshd_config(端口、禁止 root 登录),然后systemctl restart sshd。
⚠️ 危险操作:改端口一定要先确保自己不会断连,建议采用双通道(先执行sshd -t 校验配置,再重启)。
5. 应用安装(如 PHP、Redis、Nginx 等)
实现:编写 Shell 脚本(或者用 Ansible 触发),面板后端可以:
1. 调用命令行apt install -y php8.1-fpm
2. 从源码编译(复杂面板如宝塔会从自己服务器下载预编译二进制包,加速安装)
3. 配置多版本共存(通过不同的 Sock 文件路径)。
实现:通过 crontab 命令读/写/var/spool/cron/crontabs/root 文件。
- 添加任务:echo "0 2 * * * /usr/bin/php /home/site/cron.php > /dev/null 2>&1" >> /var/spool/cron/crontabs/root
- 注意需要重启 cron 服务才能立即生效(systemctl restart cron)。
如果你从零开始,可以按迭代顺序来做:
1、环境准备:安装 Go/Python + MySQL/SQLite(存储面板自己的用户、网站配置)。
2、用户登录:后端做 JWT 鉴权,前端存 Token。
3、硬编码执行命令:创建一个简单的 API,比如/api/exec?cmd=ls -la(千万不要在生产这么用,这里仅用于学习演示)。
- Go 示例:
func ExecCmd(w http.ResponseWriter, r *http.Request) {
cmd := r.URL.Query().Get("cmd")
out, _ := exec.Command("sh", "-c", cmd).Output()
fmt.Fprint(w, string(out))
}1、数据库设计:建表websites(id, domain, root_path, php_version, status)。
2、创建网站:点击按钮 -> 后端生成配置文件 -> 检查语法 -> 重载 Nginx。
3、删除网站:备份原配置 -> 删除配置 -> 重载 Nginx。
1、 前端轮询(每秒)后端/api/monitor 接口。
2、 后端实时读取/proc/stat(CPU)、/proc/net/dev(流量)等。
优化:用 WebSocket 或 SSE(Server-Sent Events)推送,避免频繁 HTTP 请求。
1、 所有执行命令的操作必须做参数白名单(例如只允许运行nginx、systemctl、apt 等特定命令)。
2、 使用非 root 用户运行面板(如www-data),需要执行系统操作时通过sudo 提权(配置/etc/sudoers 只允许特定命令)。
3、限制 IP:面板默认只绑定127.0.0.1,通过 Nginx 反代出去(这样可以利用 Nginx 的安全特性)。
1、权限问题:大部分面板以root 运行(宝塔就是),安全风险极高,如果你不是专业做安全的,不建议以 root 运行,更安全的方式是给面板用户sudo 权限但限制可执行的命令。
2、命令执行时的卡死:怕有些命令执行时间太长(比如安装 PHP),要用协程/异步任务,前端轮询任务状态,后端用一个队列(Redis + Celery 或 Go 的 goroutine + channel)来管理。
3、系统环境差异:CentOS 用yum,Ubuntu 用apt,Alpine 用apk,面板需要适配不同发行版。
4、手动修改配置:用户可能在服务器上用 vim 改了 Nginx 配置文件,你面板的数据库里还是旧记录,需要定期扫描/etc/nginx/ 下的文件与数据库同步,否则会出现“面板显示启用,实际上配置已删除”的情况。
如果你不是想“完全自研”,而是想快速做一个自己的面板或定制公司内部工具,建议这样组合:
1、Web 框架:用Nginx Web UI(一个开源的 Nginx 管理面板,Go 写的),可以快速获得 Nginx 管理能力。
2、监控:集成Netdata 或Glances(监控直接嵌入 iframe)。
3、文件管理:用FileGator 或Nextcloud 的接口。
4、流程编排:用Ansible API 来执行复杂运维任务(安装 LNMP 环境)。
最小可用的技术组合:
前端:Vue + Vite + Axios
后端:Python Flask + Flask-SocketIO
数据库:SQLite(单机足够)
执行层:subprocess.run() +sudo 提权
包管理:apt-get install -y
开发一个完整的生产级面板(如宝塔稳定版)需要一个 10-20 人团队开发 2-3 年,作为个人开发者,建议先做个Nginx 站点管理 + PHP 版本切换的小工具,这个大概几百行代码就能搞定。
文章摘自:https://idc.huochengrm.cn/zj/25843.html
评论