# RunBin

RunBin 是一个在线代码执行和分享平台，支持多种编程语言的代码运行、编译和结果展示。

## ✨ 功能特性

- 🚀 在线代码执行 - 支持多种编程语言的代码运行
- 📝 代码分享 - 通过唯一 ID 分享代码片段
- 🐳 Docker 隔离 - 使用 Docker 容器保证代码执行安全
- 💾 灵活存储 - 支持内存和数据库两种存储方式
- 🔄 异步处理 - Worker 进程异步处理代码执行任务
- 📊 性能统计 - 记录执行时间和内存使用情况
- 🌐 Web 界面 - 现代化的前端界面，支持代码编辑器

## 🏗️ 架构

项目采用前后端分离架构：

```
┌─────────────┐      ┌─────────────┐      ┌─────────────┐
│             │      │             │      │             │
│  Web 前端   │─────▶│  API 服务   │─────▶│  PostgreSQL │
│   (Vue 3)   │      │   (Gin)     │      │   数据库    │
│             │      │             │      │             │
└─────────────┘      └─────────────┘      └─────────────┘
                            │
                            │
                            ▼
                     ┌─────────────┐      ┌─────────────┐
                     │             │      │             │
                     │   Worker    │─────▶│   Docker    │
                     │   服务      │      │   运行环境   │
                     │             │      │             │
                     └─────────────┘      └─────────────┘
```

### 组件说明

- **Web 前端**: 基于 Vue 3 + Vite 的现代化前端应用
- **API 服务**: 使用 Gin 框架构建的 RESTful API 服务
- **Worker 服务**: 后台任务处理服务，负责执行用户提交的代码
- **PostgreSQL**: 持久化存储代码和执行结果
- **Docker**: 提供安全的代码执行环境

## 📋 前置要求

- Go 1.24.2 或更高版本
- Docker 和 Docker daemon
- PostgreSQL 数据库（可选，用于生产环境）
- Node.js 和 npm（用于前端开发）

## 🚀 快速开始

### 1. 克隆项目

```bash
git clone https://github.com/dreamstarsky/runbin.git
cd runbin
```

### 2. 安装依赖

```bash
# 安装 Go 依赖
go mod download

# 安装前端依赖
cd web
npm install
cd ..
```

### 3. 配置数据库（可选）

如果使用数据库存储，需要先创建数据库并运行迁移：

```bash
# 创建数据库
createdb runbin

# 运行迁移
psql -d runbin -f migrations/0001_init_pastes.sql
psql -d runbin -f migrations/0002_create_queue_table.sql
psql -d runbin -f migrations/0003_add_compilelog_column.sql
```

### 4. 配置服务

编辑配置文件：

#### API 服务配置 (`config/api.yaml`)

```yaml
app:
  env: "release" # release or debug
  port: 8080

storage:
  type: "database"  # memory or database
  database:
    dsn: "host=localhost port=5432 user=postgres password=password dbname=runbin sslmode=disable"
```

#### Worker 服务配置 (`config/worker.yaml`)

```yaml
storage:
  type: "database" 
  database:
    dsn: "host=localhost port=5432 user=postgres password=password dbname=runbin sslmode=disable"

limit:
  time: 10.0      # 最大执行时间（秒）
  cpu: 1.0        # CPU 限制
  memory: 512     # 内存限制（MB）
  size: 1024000   # 输出大小限制（字节）

process: 1        # Worker 进程数

name: "default name"
  
compilerimage: "cpp_gcc-latest:latest"  # 编译器镜像
```

### 5. 启动服务

#### 启动 API 服务

```bash
go run cmd/api/main.go
```

API 服务将在 `http://localhost:8080` 上运行。

#### 启动 Worker 服务

```bash
go run cmd/worker/main.go
```

#### 启动前端开发服务器

```bash
cd web
npm run dev
```

前端将在 `http://localhost:5173` 上运行。

## 🐳 Docker 部署

### 前端 Web 部署

前端支持 Docker 部署：

```bash
cd web
docker build -t runbin-web .
docker run -d -p 80:80 -e BACKEND_URL=http://your-api-url:8080 runbin-web
```

详细前端部署说明请参考 [web/README.md](web/README.md)。

> **注意**: API 和 Worker 服务目前尚不支持 Docker 部署，请使用 Go 直接运行。

## 📡 API 文档

### 提交代码

```http
POST /api/pastes
Content-Type: application/json

{
  "code": "your code here",
  "language": "c++20",
  "stdin": "input data",
  "run": true
}
```

响应：

```json
{
  "message": "Created",
  "paste_id": "uuid-string",
  "url": "/api/pastes/uuid-string"
}
```

### 获取代码结果

```http
GET /api/pastes/:id
```

响应：

```json
{
  "ID": "uuid-string",
  "code": "your code here",
  "language": "c++20",
  "stdin": "input data",
  "stdout": "program output",
  "stderr": "error output",
  "status": "completed",
  "compile_log": "compilation output",
  "execution_time_ms": 100,
  "memory_usage_kb": 1024,
  "created_at": "2024-01-01T00:00:00Z",
  "updated_at": "2024-01-01T00:00:01Z",
  "backend": "worker-name"
}
```

### 获取支持的语言列表

```http
GET /api/languages
```

响应：

```json
{
  "languages": ["c++20"]
}
```

## 🗂️ 项目结构

```
.
├── cmd/
│   ├── api/          # API 服务入口
│   └── worker/       # Worker 服务入口
├── config/           # 配置文件
│   ├── api.yaml
│   └── worker.yaml
├── internal/
│   ├── config/       # 配置加载
│   ├── controller/   # 控制器层
│   ├── model/        # 数据模型
│   ├── repository/   # 数据访问层
│   ├── router/       # 路由配置
│   └── worker/       # Worker 任务处理
├── migrations/       # 数据库迁移文件
├── web/              # 前端应用
│   ├── src/          # 源代码
│   ├── public/       # 静态资源
│   └── dist/         # 构建输出
├── workerEnv/        # Worker 环境配置
├── go.mod            # Go 模块定义
└── LICENSE           # Apache 2.0 许可证
```

## 🔧 开发指南

### 添加新的编程语言支持

1. 在 Worker 中添加新的任务处理器（参考 `internal/worker/RunCppTask.go`）
2. 准备相应的 Docker 镜像
3. 在 `worker.yaml` 中配置编译器镜像
4. 在控制器中更新支持的语言列表

### 本地开发

```bash
# 启动开发模式 API
go run cmd/api/main.go

# 启动开发模式 Worker
go run cmd/worker/main.go

# 启动前端热重载
cd web && npm run dev
```

### 构建生产版本

```bash
# 构建 API
go build -o bin/api cmd/api/main.go

# 构建 Worker
go build -o bin/worker cmd/worker/main.go

# 构建前端
cd web && npm run build
```

## 🔒 安全性

- 所有代码在 Docker 容器中执行，与主机隔离
- 配置了资源限制（CPU、内存、执行时间）
- 支持输出大小限制，防止恶意代码
- CORS 配置保护 API 访问

## 🤝 贡献

欢迎贡献代码！请遵循以下步骤：

1. Fork 本仓库
2. 创建特性分支 (`git checkout -b feature/AmazingFeature`)
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 开启 Pull Request

## 📄 许可证

本项目采用 Apache License 2.0 许可证。详见 [LICENSE](LICENSE) 文件。

## 📞 联系方式

如有问题或建议，请通过 GitHub Issues 联系我们。

---

Made with ❤️ by dreamstarsky
