如何搭建自己的云主机面板?

HCRM技术_小炮 云主机 2026-05-21 2 0

做一个云主机面板(如宝塔、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/守护进程):真正对系统进行操作(安装软件、修改配置、执行命令)。

- 通过execsubprocessSSH 执行 Shell 脚本。

- 利用Supervisor/Systemd 管理面板自身的进程(确保面板挂了能自启)。

二、 核心功能模块与实现思路

服务器基础管理

监控:CPU、内存、磁盘、网络流量。

实现:读取/proc/stat/proc/meminfodf -hsar 或使用gopsutil 库(Python/Go)。

进程管理:查看、杀死进程。

实现ps auxtopkill -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 执行器(注意防注入)。

防火墙与安全

核心:操作iptablesfirewalldufw

实现:通过命令添加/删除规则,并持久化(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 文件路径)。

定时任务(Cron)

实现:通过 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)。

三、 开发步骤(Mini 版)

如果你从零开始,可以按迭代顺序来做:

阶段 1:基础框架

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))
        }

阶段 2:核心功能(Nginx 管理)

1、数据库设计:建表websites(id, domain, root_path, php_version, status)

2、创建网站:点击按钮 -> 后端生成配置文件 -> 检查语法 -> 重载 Nginx。

3、删除网站:备份原配置 -> 删除配置 -> 重载 Nginx。

阶段 3:系统监控

1、 前端轮询(每秒)后端/api/monitor 接口。

2、 后端实时读取/proc/stat(CPU)、/proc/net/dev(流量)等。

优化:用 WebSocket 或 SSE(Server-Sent Events)推送,避免频繁 HTTP 请求。

阶段 4:安全加固

1、 所有执行命令的操作必须做参数白名单(例如只允许运行nginxsystemctlapt 等特定命令)。

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、监控:集成NetdataGlances(监控直接嵌入 iframe)。

3、文件管理:用FileGatorNextcloud 的接口。

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

评论