cosmo/DEPLOYMENT.md

575 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Cosmo Docker 部署指南
## 📦 系统架构
### 服务组件
| 服务 | 镜像版本 | 说明 | 配置位置 |
|------|---------|------|---------|
| **PostgreSQL** | `postgres:15-alpine` | 数据库 | `docker-compose.yml` |
| **Redis** | `redis:7-alpine` | 缓存服务 | `docker-compose.yml` |
| **Backend** | `python:3.12-slim` | FastAPI 后端 | `backend/Dockerfile` |
| **Frontend Build** | `node:22-alpine` | Vite 构建环境 | `frontend/Dockerfile` |
| **Frontend Server** | `nginx:1.25-alpine` | 静态文件服务 | `frontend/Dockerfile` |
### 版本说明
- **PostgreSQL 15**: 稳定的长期支持版本,性能优秀
- **Redis 7**: 最新稳定版,支持更多数据结构和优化
- **Python 3.12**: 最新稳定版,性能提升显著
- **Node 22**: LTS 长期支持版本,与开发环境一致
- **Nginx 1.25**: 稳定版本,完整支持 HTTP/2 和性能优化
## 🚀 镜像加速配置
### 已配置的加速
本项目已预配置以下镜像加速,无需额外配置:
#### 1. Docker 基础镜像
- 使用华为云 SWR 镜像仓库
- 地址: `swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/`
#### 2. 系统软件包Debian/Alpine
- **Backend (Debian)**: 阿里云 APT 镜像
- `mirrors.aliyun.com`
- **Frontend (Alpine)**: 自动使用最近的镜像源
#### 3. Python 依赖pip
- 阿里云 PyPI 镜像
- 地址: `https://mirrors.aliyun.com/pypi/simple/`
- 配置文件: `backend/pip.conf`
#### 4. Node.js 依赖npm
- 阿里云 npm 镜像npmmirror
- 地址: `https://registry.npmmirror.com`
- 配置文件: `frontend/.npmrc`
### 加速效果
| 操作 | 未加速 | 已加速 | 提升 |
|------|--------|--------|------|
| 拉取基础镜像 | ~2-3 分钟 | ~20-30 秒 | **6x** ⚡ |
| apt-get update | ~1 分钟 | ~10 秒 | **6x** ⚡ |
| pip install | ~3-5 分钟 | ~30-60 秒 | **5x** ⚡ |
| npm install | ~5-10 分钟 | ~1-2 分钟 | **5x** ⚡ |
| **总构建时间** | **~15-20 分钟** | **~3-5 分钟** | **4-5x** ⚡ |
### 开发环境配置
开发时如需使用镜像加速:
#### Python 开发
```bash
# 方式 1: 使用配置文件
export PIP_CONFIG_FILE=./backend/pip.conf
pip install -r requirements.txt
# 方式 2: 命令行指定
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
```
#### Node.js 开发
```bash
# 方式 1: 项目已有 .npmrc直接使用
cd frontend
npm install
# 方式 2: 临时使用
npm install --registry=https://registry.npmmirror.com
```
### 其他可选镜像源
如果阿里云镜像不可用,可以使用以下备选:
#### Docker 镜像
- 腾讯云: `mirror.ccs.tencentyun.com`
- 网易: `hub-mirror.c.163.com`
- Docker 中国: `registry.docker-cn.com`
#### npm 镜像
- 淘宝镜像: `https://registry.npmmirror.com`
- 腾讯云: `https://mirrors.cloud.tencent.com/npm/`
#### PyPI 镜像
- 清华大学: `https://pypi.tuna.tsinghua.edu.cn/simple`
- 豆瓣: `https://pypi.douban.com/simple`
- 腾讯云: `https://mirrors.cloud.tencent.com/pypi/simple`
## 📋 目录结构
```
cosmo/
├── docker-compose.yml # Docker Compose 配置
├── .env.production # 生产环境变量(需配置)
├── deploy.sh # 一键部署脚本
├── nginx/
│ └── nginx.conf # Nginx 反向代理配置
├── backend/
│ ├── Dockerfile # 后端镜像配置
│ ├── .dockerignore
│ └── scripts/
│ └── init_db.sql # 数据库初始化 SQL
└── frontend/
├── Dockerfile # 前端镜像配置(多阶段构建)
└── .dockerignore
```
## 🚀 快速开始
### 前置要求
- Docker 20.10+
- Docker Compose 2.0+
- 至少 4GB 可用内存
- 至少 20GB 可用磁盘空间
### 1. 配置环境变量
编辑 `.env.production` 文件:
```bash
# 修改数据库密码(必须)
DATABASE_PASSWORD=your_secure_password_here
# 修改 JWT Secret Key必须用于生成和验证 JWT token
# 使用随机字符串,至少 32 位
JWT_SECRET_KEY=your-random-secret-key-at-least-32-characters-long
# 修改 CORS 配置(支持内网 IP 和外网域名访问)
# 方式 1: 允许所有来源(开发/测试环境)
CORS_ORIGINS=*
# 方式 2: 仅允许特定 IP内网访问
CORS_ORIGINS=http://192.168.1.100
# 方式 3: 仅允许特定域名(外网访问)
CORS_ORIGINS=http://your-domain.com,https://your-domain.com
# 方式 4: 同时允许内网 IP 和外网域名(推荐生产环境)
CORS_ORIGINS=http://192.168.1.100,http://your-domain.com,https://your-domain.com
# 前端 API 地址配置
# 推荐:留空(默认),让前端使用相对路径 /api自动适配所有访问方式
# VITE_API_BASE_URL=
# 如果前后端分离部署在不同服务器,才需要设置完整地址:
# VITE_API_BASE_URL=http://your-domain.com/api
# HTTP 代理配置(用于访问 NASA JPL Horizons API
# 如果服务器在中国境内无法直接访问 NASA API需要配置 HTTP 代理
# 格式http://host:port 或 https://host:port
# 示例HTTP_PROXY=http://192.168.124.203:20171
HTTP_PROXY=
HTTPS_PROXY=
```
**重要说明**:
- `CORS_ORIGINS` 使用逗号分隔多个来源,无需引号或方括号
- 每个来源必须包含协议http:// 或 https://
- 不要在来源末尾添加斜杠
- 使用 `*` 允许所有来源(仅用于开发环境)
- **推荐不设置 `VITE_API_BASE_URL`**,让前端使用相对路径,自动适配内网 IP 和外网域名访问
### 2. 初始化部署
```bash
# 赋予执行权限
chmod +x deploy.sh
# 初始化系统(首次部署)
./deploy.sh --init
```
初始化脚本会自动:
1. ✅ 创建数据目录 `/opt/cosmo/data`
2. ✅ 构建 Docker 镜像
3. ✅ 启动 PostgreSQL 和 Redis
4. ✅ 自动执行 `init_db.sql` 初始化数据库
5. ✅ 启动所有服务
### 3. 访问系统
- **前端**: http://your-server-ip
- **后端 API**: http://your-server-ip/api
- **API 文档**: http://your-server-ip/api/docs
## 📂 数据持久化
所有数据存储在 `/opt/cosmo/data/` 目录下:
```
/opt/cosmo/data/
├── postgres/ # PostgreSQL 数据文件
├── redis/ # Redis 持久化文件
├── upload/ # 用户上传文件(纹理、模型等)
├── logs/ # 应用日志
│ └── backend/ # 后端日志
└── backups/ # 备份文件
```
### 目录权限
```bash
sudo chown -R $(whoami):$(whoami) /opt/cosmo/data
sudo chmod -R 755 /opt/cosmo/data
```
## 🛠️ 常用命令
### 服务管理
```bash
# 启动服务
./deploy.sh --start
# 停止服务
./deploy.sh --stop
# 重启服务
./deploy.sh --restart
# 查看状态
./deploy.sh --status
# 查看日志
./deploy.sh --logs
```
### 数据备份
```bash
# 创建备份(数据库 + 上传文件)
./deploy.sh --backup
# 备份文件位置
ls -lh /opt/cosmo/data/backups/
```
### 系统更新
```bash
# 拉取最新代码并重启
./deploy.sh --update
```
### 清理操作
```bash
# 删除容器(保留数据)
./deploy.sh --clean
# 完全清除(删除容器和所有数据)⚠️ 危险操作
./deploy.sh --full-clean
```
## 🔧 手动操作
### 查看容器状态
```bash
docker-compose ps
```
### 进入容器
```bash
# 进入后端容器
docker-compose exec backend bash
# 进入数据库容器
docker-compose exec postgres psql -U postgres -d cosmo_db
```
### 查看日志
```bash
# 查看所有日志
docker-compose logs -f
# 查看特定服务日志
docker-compose logs -f backend
docker-compose logs -f postgres
```
### 重启单个服务
```bash
docker-compose restart backend
docker-compose restart frontend
```
## 🔒 生产环境安全配置
### 1. 修改默认密码
编辑 `.env.production`:
```bash
DATABASE_PASSWORD=strong_random_password_here
```
### 2. 配置 HTTPS推荐
使用 Let's Encrypt 免费证书:
```bash
# 安装 certbot
sudo apt install certbot python3-certbot-nginx
# 获取证书
sudo certbot --nginx -d your-domain.com
# 证书自动续期
sudo crontab -e
# 添加: 0 3 * * * certbot renew --quiet
```
修改 `nginx/nginx.conf` 添加 SSL 配置:
```nginx
server {
listen 443 ssl http2;
server_name your-domain.com;
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
# 其他配置...
}
# HTTP 重定向到 HTTPS
server {
listen 80;
server_name your-domain.com;
return 301 https://$server_name$request_uri;
}
```
### 3. 防火墙配置
```bash
# 开放端口
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
# 限制数据库和 Redis 只能内部访问
# docker-compose.yml 中不要映射 5432 和 6379 到宿主机
```
## 📊 监控和日志
### 查看资源使用
```bash
docker stats
```
### 日志轮转
创建 `/etc/logrotate.d/cosmo`:
```
/opt/cosmo/data/logs/backend/*.log {
daily
rotate 7
compress
delaycompress
notifempty
create 0640 www-data www-data
sharedscripts
}
```
## 🐛 故障排查
### 前端 API 请求配置
前端的 API 地址有三种工作模式(见 `frontend/src/utils/request.ts`
1. **生产模式(推荐)** - 使用相对路径 `/api`
- **配置**: 不设置或注释掉 `VITE_API_BASE_URL`
- **工作原理**: 请求发送到当前访问地址的 `/api` 路径,由 Nginx 反向代理到后端
- **优点**: 自动适配所有访问方式(内网 IP、外网域名
- **示例**:
- 访问 `http://192.168.1.100` → API 请求到 `http://192.168.1.100/api`
- 访问 `http://domain.com` → API 请求到 `http://domain.com/api`
2. **指定完整 API 地址** - 跨域或前后端分离部署
- **配置**: `VITE_API_BASE_URL=http://your-server.com/api`
- **工作原理**: 所有 API 请求都发送到指定的完整地址
- **缺点**: 只能指定一个地址,无法同时支持多种访问方式
3. **开发模式** - 自动检测
- **配置**: 不设置 `VITE_API_BASE_URL` + `npm run dev`
- **工作原理**: 自动使用 `http://当前主机名:8000/api`
**常见问题**:
**问题**: 内网 IP 访问时API 请求跳到外网域名
```bash
# 原因:设置了完整的 API 地址
VITE_API_BASE_URL=http://your-domain.com/api
```
**解决**: 注释掉或删除 `VITE_API_BASE_URL`,让前端使用相对路径
**问题**: API 请求 404 Not Found
```bash
# 检查 Nginx 是否正常运行
docker-compose ps frontend
docker-compose logs frontend
# 检查 Nginx 配置是否正确
docker-compose exec frontend nginx -t
```
### CORS 配置错误
**错误信息**:
```
pydantic_settings.sources.SettingsError: error parsing value for field "cors_origins"
```
**原因**: CORS_ORIGINS 配置格式错误
**解决方案**:
```bash
# ✅ 正确格式(逗号分隔,无引号)
CORS_ORIGINS=http://192.168.1.100,http://domain.com,https://domain.com
# ✅ 允许所有来源
CORS_ORIGINS=*
# ❌ 错误格式(不要使用 JSON 数组格式)
CORS_ORIGINS=["http://domain.com", "https://domain.com"]
# ❌ 错误格式(不要在域名后加斜杠)
CORS_ORIGINS=http://domain.com/,https://domain.com/
```
修改 `.env.production` 后需要重启服务:
```bash
./deploy.sh --restart
```
### 服务启动失败
1. 查看日志:
```bash
docker-compose logs backend
```
2. 检查数据库连接:
```bash
docker-compose exec backend python -c "from app.database import engine; print('DB OK')"
```
### 数据库连接失败
```bash
# 检查数据库是否就绪
docker-compose exec postgres pg_isready -U postgres
# 查看数据库日志
docker-compose logs postgres
```
### 前端访问 502
1. 检查后端是否运行:
```bash
docker-compose ps backend
curl http://localhost:8000/health
```
2. 检查 Nginx 配置:
```bash
docker-compose exec frontend nginx -t
```
### 磁盘空间不足
```bash
# 清理未使用的镜像和容器
docker system prune -a
# 检查磁盘使用
df -h /opt/cosmo/data
```
## 📝 版本升级
### 升级流程
1. 备份数据:
```bash
./deploy.sh --backup
```
2. 拉取最新代码:
```bash
git pull origin main
```
3. 重建镜像:
```bash
docker-compose build --no-cache
```
4. 重启服务:
```bash
docker-compose down
docker-compose up -d
```
## 🔄 数据迁移
### 导出数据
```bash
# 导出数据库
docker-compose exec postgres pg_dump -U postgres cosmo_db > cosmo_backup.sql
# 打包上传文件
tar -czf upload_backup.tar.gz /opt/cosmo/data/upload
```
### 导入数据
```bash
# 导入数据库
docker-compose exec -T postgres psql -U postgres cosmo_db < cosmo_backup.sql
# 恢复上传文件
tar -xzf upload_backup.tar.gz -C /opt/cosmo/data/
```
## 📞 技术支持
- 项目文档: [README.md](./README.md)
- Issue 反馈: GitHub Issues
- 配置说明: [CONFIG.md](./backend/CONFIG.md)
## 🎯 性能优化建议
1. **数据库优化**:
- 增加 `shared_buffers` 至系统内存的 25%
- 启用连接池复用
2. **Redis 优化**:
- 根据需要调整 `maxmemory` 配置
- 使用 AOF 持久化策略
3. **Nginx 优化**:
- 启用 gzip 压缩(已配置)
- 配置静态资源缓存(已配置)
4. **Docker 优化**:
- 为容器设置资源限制
- 使用 SSD 存储数据
---
**祝部署顺利!🚀**