Files
cloudnest/README.md
T

433 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CloudNest
CloudNest 是一个基于 Clean Architecture(整洁架构)的云存储后端服务,提供用户认证和文件管理功能。
## 技术栈
- **语言**: Go 1.25+
- **框架**: Gin 1.10
- **数据库**: MySQL 8.0 + GORM
- **缓存**: Redis 7
- **对象存储**: MinIO
- **认证**: JWT (github.com/golang-jwt/jwt/v5)
- **依赖注入**: Uber Dig
- **配置管理**: ViperYAML + 环境变量)
- **日志**: Go 标准库 log/slogJSON 格式)
## 架构设计
项目采用 **Clean Architecture(整洁架构)**,遵循依赖倒置原则(DIP),确保核心业务逻辑独立于框架、UI 和外部依赖。
```
┌─────────────────────────────────────────────────────────────┐
│ Interface Layer │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ Handler │ │ Routes │ │ Middleware │ │
│ └──────┬──────┘ └──────┬──────┘ └──────────┬──────────┘ │
└─────────┼────────────────┼─────────────────────┼─────────────┘
│ │ │
┌─────────▼────────────────▼─────────────────────▼─────────────┐
│ Application Layer │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ AuthService │ FileService │ │
│ │ - Register() │ - Upload() │ │
│ │ - Login() │ - List() │ │
│ │ │ - PresignDownload() │ │
│ │ │ - Delete() │ │
│ └──────────────┬────────────────┴───────────────┬─────────┘ │
└─────────────────┼────────────────────────────────┼─────────────┘
│ │
┌─────────────────▼────────────────────────────────▼─────────────┐
│ Domain Layer │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ Entity │ │ Repository │ │
│ │ - User │ │ - Interface │ │
│ │ - FileMeta │ │ - (DIP) │ │
│ └──────────────────┘ └──────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│ │
┌─────────────────▼────────────────────────────────▼─────────────┐
│ Infrastructure Layer │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
│ │ MySQL │ │ Redis │ │ MinIO │ │ Repository │ │
│ └──────────┘ └──────────┘ └──────────┘ │ Implementation│ │
│ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
```
## 目录结构
```
cloudnest/
├── cmd/ # 启动入口 / Entry points
│ ├── auth-service/ # 认证服务
│ │ ├── main.go # 服务入口(含端口检测、优雅关闭)
│ │ └── embed.go # 静态文件嵌入
│ └── file-service/ # 文件服务
│ └── main.go # 服务入口(含端口检测、优雅关闭)
├── configs/ # 配置文件 / Configuration files
│ ├── config.yaml # 基础默认配置
│ ├── config.dev.yaml # 开发环境配置
│ ├── config.prod.yaml # 生产环境配置
│ └── config.test.yaml # 测试环境配置
├── deployments/ # 部署配置 / Deployment configs
│ ├── docker/ # Dockerfile
│ └── k8s/ # Kubernetes 配置
├── internal/
│ ├── application/ # 应用层 / Application Layer
│ │ ├── auth/ # 认证应用服务
│ │ │ ├── dto.go # 请求/响应 DTO
│ │ │ └── service.go # 业务逻辑
│ │ └── file/ # 文件应用服务
│ │ ├── dto.go
│ │ └── service.go
│ ├── config/ # 配置管理 / Configuration
│ │ └── config.go # YAML + 环境变量加载
│ ├── di/ # 依赖注入 / Dependency Injection
│ │ └── container.go # Uber Dig 容器配置
│ ├── domain/ # 领域层 / Domain Layer
│ │ ├── auth/ # 认证领域
│ │ │ ├── entity/ # 实体定义
│ │ │ └── repository/ # 仓储接口(DIP
│ │ └── file/ # 文件领域
│ │ ├── entity/
│ │ └── repository/
│ ├── infrastructure/ # 基础设施层 / Infrastructure
│ │ ├── database/ # 数据库连接(MySQL、Redis
│ │ ├── repository/ # 仓储实现(GORM、MinIO
│ │ └── storage/ # 对象存储(MinIO 客户端)
│ ├── interface/ # 接口层 / Interface Layer
│ │ └── http/
│ │ ├── handler/ # HTTP Handler
│ │ └── routes/ # 路由定义
│ ├── middleware/ # 中间件 / Middleware
│ │ ├── cors.go # 跨域处理
│ │ ├── error_handler.go # 错误恢复与处理
│ │ └── jwt.go # JWT 认证
│ └── pkg/ # 工具包 / Utilities
│ ├── crypto/ # 密码加密(bcrypt
│ ├── errors/ # 应用错误类型
│ ├── jwt/ # JWT 生成与解析
│ ├── logger/ # 结构化日志(log/slog
│ ├── response/ # 统一响应格式
│ └── validator/ # 参数校验
├── docker-compose.infra.yml # 基础设施 Docker Compose
├── start-local.ps1 # Windows PowerShell 启动脚本
├── start-local.bat # Windows CMD 启动脚本
├── deploy-all.sh # Kubernetes 一键部署脚本
├── go.mod
└── go.sum
```
## 环境要求
- **Go**: 1.25+
- **MySQL**: 8.0+
- **Redis**: 7.0+
- **MinIO**: Latest
- **Docker**: 20.10+(用于本地基础设施)
## 配置管理
项目使用 **分层配置加载** 机制,支持 YAML 文件 + 环境变量覆盖:
### 加载顺序(后面的覆盖前面的)
1. `configs/config.yaml` —— 基础默认值
2. `configs/config.{env}.yaml` —— 环境特定配置
3. **环境变量** —— 最高优先级
### 环境切换
通过 `CLOUDNEST_ENV` 环境变量选择配置环境:
```bash
# 开发环境(默认)
export CLOUDNEST_ENV=dev
# 测试环境
export CLOUDNEST_ENV=test
# 生产环境
export CLOUDNEST_ENV=prod
```
### 配置文件说明
| 文件 | 用途 | 注意 |
|------|------|------|
| `config.yaml` | 所有环境的默认配置 | 不要在此存放敏感信息 |
| `config.dev.yaml` | 本地开发环境 | 使用 localhost 连接 |
| `config.test.yaml` | 自动化测试环境 | 使用独立的测试数据库 |
| `config.prod.yaml` | 生产环境 | 敏感信息通过环境变量注入 |
### 环境变量映射
以下环境变量会自动映射到配置项(优先级最高):
```bash
# 应用 / Application
APP_NAME=cloudnest
APP_LOG_LEVEL=debug
# 服务器 / Server
SERVER_HOST=0.0.0.0
SERVER_PORT=8080
# 数据库 / Database
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=yourpassword
DB_NAME=cloudnest
# Redis
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=
REDIS_DB=0
# MinIO
MINIO_ENDPOINT=localhost:9000
MINIO_ACCESS_KEY=minioadmin
MINIO_SECRET_KEY=minioadmin
MINIO_BUCKET=cloudnest-files
# JWT
JWT_SECRET=your-secret-key
JWT_EXPIRES_IN=720
```
## 快速开始
### 1. 安装依赖
```bash
go mod tidy
```
### 2. 启动基础设施
使用 Docker Compose 启动 MySQL、Redis 和 MinIO
```bash
docker compose -f docker-compose.infra.yml up -d
```
### 3. 启动服务(Windows
**PowerShell 方式(推荐):**
```powershell
# 使用 dev 配置启动(默认)
.\start-local.ps1
# 使用 test 配置启动
$env:CLOUDNEST_ENV="test"; .\start-local.ps1
```
**CMD 方式:**
```cmd
start-local.bat
```
### 4. 手动启动服务(跨平台)
```bash
# 设置环境并启动认证服务
export CLOUDNEST_ENV=dev
go run ./cmd/auth-service
# 另开终端启动文件服务
export CLOUDNEST_ENV=dev
go run ./cmd/file-service
```
### 5. 访问服务
| 服务 | 地址 | 说明 |
|------|------|------|
| **Auth Service** | `http://localhost:8081` | 认证服务,处理注册/登录 |
| **File Service** | `http://localhost:8082` | 文件服务,处理上传/下载 |
| **MinIO Console** | `http://localhost:9001` | 对象存储管理界面 (minioadmin / minioadmin) |
| **健康检查** | `GET /healthz` | 服务健康状态 |
> **注意**: 开发模式下如果端口被占用,服务会自动检测并切换到下一个可用端口。生产环境使用配置文件中指定的固定端口。
## API 文档
### 认证接口
#### 注册
```bash
POST /api/v1/auth/register
Content-Type: application/json
{
"username": "string (3-50 chars)",
"password": "string (min 6 chars)"
}
```
**响应:**
```json
{
"code": 0,
"message": "注册成功"
}
```
#### 登录
```bash
POST /api/v1/auth/login
Content-Type: application/json
{
"username": "string",
"password": "string"
}
```
**响应:**
```json
{
"code": 0,
"message": "success",
"data": {
"token": "jwt-token"
}
}
```
### 文件接口
所有文件接口需要在 Header 中携带 JWT Token
```bash
Authorization: Bearer <jwt-token>
```
#### 上传文件
```bash
POST /api/v1/files/upload
Content-Type: multipart/form-data
file: <file>
```
**响应:**
```json
{
"code": 0,
"message": "success",
"data": {
"message": "上传成功",
"file": "username/filename",
"size": 1024
}
}
```
#### 列出文件
```bash
GET /api/v1/files
```
**响应:**
```json
{
"code": 0,
"message": "success",
"data": {
"files": ["username/file1.txt", "username/file2.jpg"]
}
}
```
#### 获取下载链接
```bash
GET /api/v1/files/download/:name
```
**响应:**
```json
{
"code": 0,
"message": "success",
"data": {
"download_url": "https://minio.example.com/..."
}
}
```
#### 删除文件
```bash
DELETE /api/v1/files/:name
```
**响应:**
```json
{
"code": 0,
"message": "删除成功"
}
```
## 项目特性
- **分层架构**: 清晰的 Clean Architecture 层次划分,高内聚低耦合
- **依赖注入**: 使用 Uber Dig 实现依赖管理,便于测试和替换实现
- **配置管理**: YAML 文件 + 环境变量分层覆盖,支持多环境切换
- **端口自动检测**: 开发模式下自动检测并切换被占用的端口
- **优雅关闭**: 支持 SIGINT/SIGTERM 信号处理,确保请求完成后再关闭
- **错误处理**: 统一的错误响应格式,支持错误码和 HTTP 状态码
- **日志记录**: JSON 格式结构化日志,支持 Debug/Info/Warn/Error/Fatal 级别
- **参数校验**: 使用 go-playground/validator 进行请求参数校验
- **CORS 支持**: 跨域请求处理中间件
- **JWT 认证**: 基于 Token 的无状态认证机制
## 开发规范
- **包命名**: 小写,使用单数形式(如 `entity``repository`
- **文件命名**: 使用 snake_case(如 `auth_handler.go`
- **接口命名**: 以 `Repository` 结尾(如 `UserRepository`
- **服务命名**: 以 `Service` 结尾(如 `AuthService`
- **Handler 命名**: 以 `Handler` 结尾(如 `AuthHandler`
- **注释规范**: 中英文双语注释,包含功能说明、参数、返回值和注意事项
## 部署
### Docker
```bash
docker build -t cloudnest/auth-service -f deployments/docker/auth-service.Dockerfile .
docker build -t cloudnest/file-service -f deployments/docker/file-service.Dockerfile .
```
### Kubernetes
```bash
# 一键部署
CLOUDNEST_ENV=prod ./deploy-all.sh
# 或手动部署
kubectl apply -f deployments/k8s/
```
## License
MIT