|
|
# 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
|
|
|
```
|