# VBase 部署指南

## 1. 环境要求

### 1.1 系统要求

| 组件 | 最低配置 | 推荐配置 |
|------|----------|----------|
| CPU | 1核 | 4核 |
| 内存 | 512MB | 2GB |
| 硬盘 | 1GB | 10GB |
| 网络 | 10Mbps | 100Mbps |

### 1.2 依赖服务

| 服务 | 版本 | 说明 |
|------|------|------|
| Go | 1.21+ | 运行环境 |
| MySQL | 5.7+ | 推荐 8.0 |
| PostgreSQL | 12+ | 可选 |
| Redis | 6.0+ | 缓存与会话 |

---

## 2. 安装步骤

### 2.1 从源码编译

```bash
# 克隆代码
git clone https://github.com/veypi/vbase.git
cd vbase

# 安装依赖
go mod download

# 编译
go build -o vbase-server ./cmd/server

# 运行
./vbase-server
```

### 2.2 使用 Docker

```bash
# 构建镜像
docker build -t vbase:latest .

# 运行
docker run -d \
  -p 8080:8080 \
  -e DB_TYPE=mysql \
  -e DB_DSN="root:password@tcp(mysql:3306)/vbase" \
  -e REDIS_ADDR="redis:6379" \
  -e JWT_SECRET="your-secret-key" \
  vbase:latest
```

### 2.3 Docker Compose（推荐）

```yaml
version: '3.8'

services:
  app:
    image: vbase:latest
    build: .
    ports:
      - "8080:8080"
    environment:
      - SERVER_HOST=0.0.0.0
      - SERVER_PORT=8080
      - DB_TYPE=mysql
      - DB_DSN=root:${DB_PASSWORD}@tcp(mysql:3306)/vbase?charset=utf8mb4&parseTime=True&loc=Local
      - REDIS_ENABLED=true
      - REDIS_ADDR=redis:6379
      - JWT_SECRET=${JWT_SECRET}
      - INIT_ADMIN_PASSWORD=${ADMIN_PASSWORD}
    depends_on:
      - mysql
      - redis
    restart: unless-stopped

  mysql:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=${DB_PASSWORD}
      - MYSQL_DATABASE=vbase
    volumes:
      - mysql_data:/var/lib/mysql
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    volumes:
      - redis_data:/data
    restart: unless-stopped

volumes:
  mysql_data:
  redis_data:
```

启动：

```bash
# 创建环境变量文件
cat > .env << EOF
DB_PASSWORD=your-db-password
JWT_SECRET=your-jwt-secret-min-32-characters
ADMIN_PASSWORD=your-admin-password
EOF

# 启动服务
docker-compose up -d
```

---

## 3. 环境变量配置

### 3.1 服务配置

| 变量名 | 默认值 | 说明 |
|--------|--------|------|
| SERVER_HOST | 0.0.0.0 | 服务监听地址 |
| SERVER_PORT | 8080 | 服务端口 |
| SERVER_MODE | debug | 运行模式: debug/release |

### 3.2 数据库配置

| 变量名 | 默认值 | 说明 |
|--------|--------|------|
| DB_TYPE | mysql | 数据库类型: mysql/postgres/sqlite |
| DB_DSN | - | 数据库连接字符串 |
| DB_MAX_OPEN | 100 | 最大连接数 |
| DB_MAX_IDLE | 10 | 最大空闲连接 |

**MySQL DSN 格式:**
```
user:password@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local
```

**PostgreSQL DSN 格式:**
```
host=localhost user=postgres password=secret dbname=vbase port=5432 sslmode=disable
```

**SQLite DSN 格式:**
```
./vbase.db
```

### 3.3 Redis 配置

| 变量名 | 默认值 | 说明 |
|--------|--------|------|
| REDIS_ENABLED | true | 是否启用 Redis |
| REDIS_ADDR | localhost:6379 | Redis 地址 |
| REDIS_PASSWORD | - | Redis 密码 |
| REDIS_DB | 0 | 数据库编号 |

### 3.4 JWT 配置

| 变量名 | 默认值 | 说明 |
|--------|--------|------|
| JWT_SECRET | - | JWT 签名密钥（最少32字符） |
| JWT_ACCESS_EXPIRY | 1h | Access Token 有效期 |
| JWT_REFRESH_EXPIRY | 720h | Refresh Token 有效期 |
| JWT_ISSUER | vbase | Token 签发者 |

### 3.5 安全配置

| 变量名 | 默认值 | 说明 |
|--------|--------|------|
| BCRYPT_COST | 12 | 密码哈希成本因子 |
| MAX_LOGIN_ATTEMPTS | 5 | 最大登录尝试次数 |
| CAPTCHA_ENABLED | true | 是否启用验证码 |

### 3.6 OAuth 配置

| 变量名 | 默认值 | 说明 |
|--------|--------|------|
| OAUTH_GOOGLE_ENABLED | false | 启用 Google 登录 |
| OAUTH_GOOGLE_CLIENT_ID | - | Google Client ID |
| OAUTH_GOOGLE_CLIENT_SECRET | - | Google Client Secret |
| OAUTH_GITHUB_ENABLED | false | 启用 GitHub 登录 |
| OAUTH_GITHUB_CLIENT_ID | - | GitHub Client ID |
| OAUTH_GITHUB_CLIENT_SECRET | - | GitHub Client Secret |
| OAUTH_WECHAT_ENABLED | false | 启用微信登录 |
| OAUTH_WECHAT_APP_ID | - | 微信 App ID |
| OAUTH_WECHAT_APP_SECRET | - | 微信 App Secret |

### 3.7 初始化配置

| 变量名 | 默认值 | 说明 |
|--------|--------|------|
| INIT_ADMIN_USERNAME | admin | 初始管理员用户名 |
| INIT_ADMIN_PASSWORD | - | 初始管理员密码（空则随机生成） |
| INIT_ADMIN_EMAIL | admin@example.com | 初始管理员邮箱 |

---

## 4. 数据库迁移

### 4.1 自动迁移

服务启动时会自动执行数据库迁移，创建所需表结构。

### 4.2 手动迁移

```bash
# 使用 migrate 工具
go install github.com/golang-migrate/migrate/v4/cmd/migrate@latest

# 创建迁移文件
migrate create -ext sql -dir migrations create_users_table

# 执行迁移
migrate -path migrations -database "mysql://user:password@tcp(localhost:3306)/vbase" up
```

---

## 5. Nginx 反向代理

### 5.1 基本配置

```nginx
upstream vbase {
    server 127.0.0.1:8080;
    keepalive 32;
}

server {
    listen 80;
    server_name iam.example.com;

    # 强制 HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name iam.example.com;

    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    # 日志
    access_log /var/log/nginx/vbase_access.log;
    error_log /var/log/nginx/vbase_error.log;

    location / {
        proxy_pass http://vbase;
        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_connect_timeout 5s;
        proxy_send_timeout 10s;
        proxy_read_timeout 10s;
    }
}
```

### 5.2 负载均衡配置

```nginx
upstream vbase {
    least_conn;
    server 10.0.1.10:8080 weight=5;
    server 10.0.1.11:8080 weight=5;
    server 10.0.1.12:8080 backup;
    keepalive 32;
}
```

---

## 6. 系统服务

### 6.1 systemd 服务

创建 `/etc/systemd/system/vbase.service`：

```ini
[Unit]
Description=VBase IAM Service
After=network.target mysql.service redis.service

[Service]
Type=simple
User=vbase
Group=vbase
WorkingDirectory=/opt/vbase
ExecStart=/opt/vbase/vbase-server
Restart=always
RestartSec=5
Environment="SERVER_HOST=0.0.0.0"
Environment="SERVER_PORT=8080"
Environment="DB_TYPE=mysql"
Environment="DB_DSN=root:password@tcp(localhost:3306)/vbase"
Environment="JWT_SECRET=your-secret-key"

# 安全设置
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/opt/vbase/logs

[Install]
WantedBy=multi-user.target
```

启用服务：

```bash
sudo systemctl daemon-reload
sudo systemctl enable vbase
sudo systemctl start vbase
sudo systemctl status vbase
```

---

## 7. 监控与日志

### 7.1 日志配置

日志输出到 stdout，使用 journald 或 docker 收集：

```bash
# 查看服务日志
sudo journalctl -u vbase -f

# 查看 Docker 日志
docker logs -f vbase_app_1
```

### 7.2 Prometheus 监控

添加 Prometheus 指标端点（需自行集成）：

```go
// 在 main.go 中添加
import "github.com/prometheus/client_golang/prometheus/promhttp"

r.Get("/metrics", promhttp.Handler())
```

### 7.3 健康检查

```bash
# 健康检查端点
curl http://localhost:8080/health

# 预期响应
{"code":200,"data":{"status":"ok","timestamp":"2024-01-01T00:00:00Z"}}
```

---

## 8. 备份与恢复

### 8.1 数据库备份

```bash
#!/bin/bash
# backup.sh

DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR=/backup/vbase

# MySQL
mysqldump -u root -p'password' vbase > $BACKUP_DIR/vbase_$DATE.sql

# PostgreSQL
pg_dump -U postgres vbase > $BACKUP_DIR/vbase_$DATE.sql

# 保留最近 7 天
cd $BACKUP_DIR && ls -t *.sql | tail -n +8 | xargs rm -f
```

### 8.2 数据库恢复

```bash
# MySQL
mysql -u root -p'password' vbase < backup_file.sql

# PostgreSQL
psql -U postgres vbase < backup_file.sql
```

---

## 9. 故障排查

### 9.1 常见问题

**服务无法启动**

```bash
# 检查端口占用
lsof -i :8080

# 检查环境变量
cat /opt/vbase/.env

# 查看详细错误日志
sudo journalctl -u vbase -n 100 --no-pager
```

**数据库连接失败**

```bash
# 测试数据库连接
mysql -u root -p -h localhost -e "SELECT 1"

# 检查网络连通性
telnet mysql-host 3306

# 检查用户权限
mysql> SHOW GRANTS FOR 'user'@'host';
```

**Redis 连接失败**

```bash
# 测试 Redis 连接
redis-cli ping

# 检查 Redis 状态
redis-cli INFO server
```

### 9.2 性能调优

**数据库优化**

```sql
-- 添加索引
ALTER TABLE users ADD INDEX idx_email (email);
ALTER TABLE org_members ADD INDEX idx_org_user (org_id, user_id);
ALTER TABLE oauth_tokens ADD INDEX idx_access_token (access_token);

-- 分析表
ANALYZE TABLE users, orgs, org_members;
```

**Redis 优化**

```conf
# redis.conf
maxmemory 256mb
maxmemory-policy allkeys-lru
save 900 1
save 300 10
save 60 10000
```

---

## 10. 安全加固

### 10.1 网络安全

- 使用防火墙限制访问：仅开放 80/443 端口
- 配置 fail2ban 防止暴力破解
- 使用 CloudFlare 等 CDN 防护 DDoS

### 10.2 应用安全

- 定期更换 JWT 密钥
- 启用验证码防止暴力破解
- 配置 CORS 白名单

### 10.3 数据安全

- 数据库密码复杂度要求
- 定期备份并加密存储
- 敏感操作记录审计日志

---

## 11. 升级指南

### 11.1 平滑升级

```bash
# 1. 拉取新版本
git pull origin main

# 2. 编译新版本
go build -o vbase-server-new ./cmd/server

# 3. 备份数据库
./backup.sh

# 4. 停止旧版本
sudo systemctl stop vbase

# 5. 替换二进制文件
mv vbase-server vbase-server-old
mv vbase-server-new vbase-server

# 6. 启动新版本
sudo systemctl start vbase

# 7. 验证服务
curl http://localhost:8080/health
```

### 11.2 回滚

```bash
# 停止服务
sudo systemctl stop vbase

# 恢复旧版本
mv vbase-server-old vbase-server

# 恢复数据库
mysql -u root -p vbase < backup_before_upgrade.sql

# 启动服务
sudo systemctl start vbase
```
