容器运维面板 - Rabbit Panel

一个极致轻量化的容器运维面板,专为 4GB 内存设备设计,支持 ARM64/armv7l/x86_64 架构。

仓库地址: Rabbit Panel

特性

  • 🚀 极致轻量: 运行时内存 ≤30MB,部署包 ≤10MB
  • 🐳 容器管理: 启动/停止/重启/删除容器,实时查看日志
  • 📦 镜像管理: 查看和删除镜像
  • 📊 系统监控: 实时 CPU/内存/磁盘使用率监控
  • 🌐 响应式设计: 支持 PC/平板/手机浏览器
  • 🔧 无依赖: 单二进制文件,无需数据库,无需额外安装
  • 🎯 多节点管理: 支持 Master/Worker 模式,统一管理多服务器节点
  • 🔒 安全认证: 用户登录认证和节点间通信加密

系统要求

  • Docker 20.10+ 已安装并运行
  • Linux 系统 (Armbian/Ubuntu/Debian)
  • 4GB+ 内存设备
  • Go 1.22+ (仅编译时需要)

快速开始

1. 安装 Docker (如果未安装)

1
2
3
4
5
6
7
# Ubuntu/Debian
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# 将当前用户添加到 docker 组
sudo usermod -aG docker $USER
newgrp docker

2. 下载编译好的二进制文件

根据你的系统架构下载对应的版本:

1
2
3
4
5
6
7
8
# x86_64
wget https://github.com/your-repo/rabbit-panel/releases/download/v1.0.0/rabbit-panel-linux-amd64

# ARM64
wget https://github.com/your-repo/rabbit-panel/releases/download/v1.0.0/rabbit-panel-linux-arm64

# ARMv7
wget https://github.com/your-repo/rabbit-panel/releases/download/v1.0.0/rabbit-panel-linux-armv7

3. 从源码编译

1
2
3
4
5
6
7
8
9
10
11
12
13
# 克隆代码
git clone https://github.com/your-repo/rabbit-panel.git
cd rabbit-panel

# 安装依赖
chmod +x setup-deps.sh
./setup-deps.sh

# 编译 (支持多架构)
chmod +x build.sh
./build.sh

# 编译后的文件在 dist/ 目录

4. 运行面板

1
2
3
4
5
6
7
8
9
10
11
# 确保 static 目录存在
mkdir -p static

# 运行面板 (默认端口 9999)
./rabbit-panel-linux-amd64

# 或指定端口
PORT=9090 ./rabbit-panel-linux-amd64

# 或指定监听地址和端口
HOST=0.0.0.0 PORT=9999 ./rabbit-panel-linux-amd64

5. 访问面板

  • 本地访问: http://localhost:9999
  • 外网访问: http://<服务器IP>:9999
  • 默认账户: admin / admin

注意: 首次登录必须修改密码。默认监听 0.0.0.0:9999,可以从外网访问。

功能说明

容器管理

  • 列表展示: 显示容器 ID、名称、镜像、状态、端口映射、内存占用、创建时间
  • 操作功能: 启动、停止、重启、删除、查看日志(实时流式输出)
  • 自动刷新: 容器列表每 5 秒自动刷新

镜像管理

  • 列表展示: 显示镜像 ID、名称、标签、大小、创建时间
  • 操作功能: 删除镜像(如果被容器使用会提示先删除容器)

系统监控

  • 实时监控: CPU 使用率、内存使用率、磁盘使用率
  • 自动刷新: 每 5 秒自动刷新
  • 时间显示: 显示服务器当前时间

多节点管理

Rabbit Panel 支持多节点容器管理,类似 Kubernetes 但更轻量化。

启动 Master 节点(控制节点)

1
2
3
4
5
6
# 方法 1: 使用启动脚本
chmod +x start-master.sh
./start-master.sh

# 方法 2: 直接运行
MODE=master PORT=9999 ./rabbit-panel-linux-arm64

启动 Worker 节点(工作节点)

1
2
3
4
5
6
7
8
9
# 方法 1: 使用启动脚本
MASTER_URL=http://master-ip:9999 NODE_NAME=worker-1 ./start-worker.sh

# 方法 2: 直接运行
MASTER_URL=http://master-ip:9999 \
NODE_NAME=worker-1 \
MODE=worker \
PORT=10001 \
./rabbit-panel-linux-arm64

多节点功能

  • 统一管理: 在 Master 节点查看和管理所有 Worker 节点的容器
  • 智能调度: 自动选择最佳节点部署容器
  • 节点监控: 实时监控所有节点的资源使用情况
  • 跨节点操作: 在 Master 节点操作任意 Worker 节点的容器

详细文档请参考: MULTI-NODE.md

快速测试

创建测试容器来验证面板功能:

1
2
3
4
5
6
7
8
9
10
11
# 方法1: 一键创建测试容器(推荐)
chmod +x quick-test.sh
./quick-test.sh

# 方法2: 交互式创建测试容器
chmod +x test-containers.sh
./test-containers.sh

# 方法3: 手动创建简单测试容器
docker run -d --name test-nginx -p 8081:80 nginx:alpine
docker run -d --name test-redis -p 6379:6379 redis:alpine

开发模式(热重载)

项目支持热重载开发模式,修改代码后自动重新编译并重启。

1
2
3
4
5
6
# 使用 Air(推荐)
chmod +x dev.sh
./dev.sh

# 访问 http://localhost:9999
# 修改代码后会自动重新编译并重启

常见问题

1. 无法连接到 Docker

错误信息: 无法连接到 Docker: ...

解决方法:

1
2
3
4
5
6
7
8
9
10
11
12
# 检查 Docker 服务状态
sudo systemctl status docker

# 启动 Docker 服务
sudo systemctl start docker

# 检查当前用户是否有 Docker 权限
docker ps

# 如果提示权限错误,将用户添加到 docker 组
sudo usermod -aG docker $USER
newgrp docker

2. 端口被占用

错误信息: listen tcp :9999: bind: address already in use

解决方法:

1
2
3
4
5
6
# 使用其他端口
PORT=9090 ./rabbit-panel-linux-amd64

# 或查看占用 9999 端口的进程
sudo lsof -i :9999
sudo kill -9 <PID>

3. 容器日志无法查看

可能原因: 容器已停止、容器 ID 错误、Docker API 权限不足

解决方法:

1
2
3
4
5
# 检查容器状态
docker ps -a

# 检查 Docker 权限
docker logs <container-id>

4. 内存占用过高

优化建议:

  • 确保使用编译优化版本 (已启用 -ldflags="-s -w")
  • 定期清理无用的容器和镜像
  • 关闭不需要的容器日志流

5. 编译失败

错误信息: cannot find package "github.com/docker/docker/client"

解决方法:

1
2
3
4
5
6
7
8
# 初始化 Go 模块
go mod init rabbit-panel

# 下载依赖
go mod tidy

# 重新编译
go build -o rabbit-panel main.go

6. 网络问题 - 无法下载依赖

错误信息: dial tcp 142.250.196.209:443: i/o timeout

解决方法:

方法 1: 使用提供的脚本(推荐)

1
2
chmod +x setup-deps.sh
./setup-deps.sh

方法 2: 手动设置 Go 代理

1
2
3
4
5
6
# 设置 Go 代理为国内镜像
export GOPROXY=https://goproxy.cn,direct

# 下载依赖
go mod download
go mod tidy

方法 3: 永久设置 Go 代理

1
2
3
4
5
6
# 将代理设置写入 ~/.bashrc
echo 'export GOPROXY=https://goproxy.cn,direct' >> ~/.bashrc
source ~/.bashrc

# 或者使用 go env 设置
go env -w GOPROXY=https://goproxy.cn,direct

安全说明

用户认证

所有 Web UI 访问的 API 都需要用户登录认证:

  • 默认账户: admin / admin
  • 首次登录: 必须修改密码
  • 密码要求: 至少 8 位,包含大小写字母、数字和特殊字符

节点间认证

Master 和 Worker 节点之间的通信使用 HMAC-SHA256 认证机制。

生产环境必须设置节点密钥:

1
NODE_SECRET=your-secret-key-here ./rabbit-panel-linux-amd64

生产环境建议

  1. 使用 HTTPS: 通过 Nginx/Caddy 配置 HTTPS 反向代理
  2. 防火墙配置: 限制访问端口
  3. 定期更新密钥: 定期更换 NODE_SECRETJWT_SECRET

详细文档请参考: SECURITY.md

性能优化

资源占用

  • 运行时内存: ≤30MB
  • 二进制文件大小: ≤10MB
  • 静态资源: ≤100KB (Tailwind CSS 通过 CDN 加载)

优化措施

  1. 编译优化: 使用 -ldflags="-s -w" 去除符号表和调试信息
  2. 无数据库: 所有数据直接从 Docker API 获取,无持久化存储
  3. 连接管理: 容器日志流关闭后立即释放连接
  4. 内存管理: 定期清理无用协程,避免内存泄漏
  5. 数据缓存: 容器和镜像列表使用内存缓存,减少 Docker API 调用

项目结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
rabbit-panel/
├── main.go # 后端主文件
├── auth.go # 认证模块
├── node.go # 节点管理模块
├── scheduler.go # 容器调度模块
├── static/ # 静态文件目录
│ └── index.html # 前端页面
├── build.sh # 编译脚本
├── start.sh # 生产环境启动脚本
├── start-master.sh # Master 启动脚本
├── start-worker.sh # Worker 启动脚本
├── setup-deps.sh # 依赖下载脚本
├── dev.sh # 开发模式脚本
├── .air.toml # Air 配置文件
├── go.mod # Go 模块定义
├── go.sum # Go 模块校验和
├── README.md # 说明文档
├── ARCHITECTURE.md # 架构设计文档
├── MULTI-NODE.md # 多节点使用指南
├── NODE-COMMUNICATION.md # 节点通信详解
└── SECURITY.md # 安全说明文档

API 接口

单节点 API

  • GET /api/system/stats - 获取系统监控数据
  • GET /api/containers - 获取容器列表
  • POST /api/containers/action - 容器操作 (start/stop/restart/remove)
  • GET /api/containers/logs?id=<container-id> - 获取容器日志 (SSE 流式)
  • GET /api/images - 获取镜像列表
  • POST /api/images/remove - 删除镜像
  • GET /api/health - 健康检查

多节点 API (Master)

  • GET /api/nodes - 获取所有节点列表
  • POST /api/containers/schedule - 跨节点调度容器
  • GET /api/containers/all - 获取所有节点的容器

认证 API

  • POST /api/auth/login - 用户登录
  • POST /api/auth/logout - 用户登出
  • POST /api/auth/change-password - 修改密码

扩展开发

如需添加新功能,请遵循以下原则:

  1. 保持轻量化: 新增功能不应显著增加内存占用
  2. 无数据库: 如需缓存,使用内存临时存储
  3. 单文件后端: 尽量将代码集中在主文件中
  4. 原生前端: 使用原生 HTML/CSS/JS,避免引入框架

许可证

MIT License