|
|
|
|
|
# A股智投分析平台 - Docker 部署指南
|
|
|
|
|
|
|
|
|
|
|
|
## 📋 概述
|
|
|
|
|
|
|
|
|
|
|
|
本项目提供完整的 Docker 化部署方案,包含:
|
|
|
|
|
|
- **MySQL 8.0** - 带分区表的数据库
|
|
|
|
|
|
- **Redis 7** - 缓存服务
|
|
|
|
|
|
- **后端应用** - Node.js + Express + TypeScript
|
|
|
|
|
|
- **AKShare** - 可选的数据源服务
|
|
|
|
|
|
|
|
|
|
|
|
## 🚀 快速开始
|
|
|
|
|
|
|
|
|
|
|
|
### 方式一:一键启动(推荐)
|
|
|
|
|
|
|
|
|
|
|
|
**Linux/Mac:**
|
|
|
|
|
|
```bash
|
|
|
|
|
|
./docker-start.sh
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**Windows:**
|
|
|
|
|
|
```bash
|
|
|
|
|
|
docker-start.bat
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 方式二:手动启动
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 1. 进入后端目录
|
|
|
|
|
|
cd app/backend
|
|
|
|
|
|
|
|
|
|
|
|
# 2. 启动服务
|
|
|
|
|
|
docker-compose up --build -d
|
|
|
|
|
|
|
|
|
|
|
|
# 3. 查看日志
|
|
|
|
|
|
docker-compose logs -f app
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 📁 文件结构
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
app/backend/
|
|
|
|
|
|
├── docker-compose.yml # Docker 编排配置
|
|
|
|
|
|
├── Dockerfile # 后端应用镜像
|
|
|
|
|
|
├── .env.docker # Docker 环境变量
|
|
|
|
|
|
├── .dockerignore # Docker 忽略文件
|
|
|
|
|
|
├── docker-start.sh # Linux/Mac 启动脚本
|
|
|
|
|
|
├── docker-start.bat # Windows 启动脚本
|
|
|
|
|
|
├── init-scripts/ # 数据库初始化脚本
|
|
|
|
|
|
│ ├── 01-init-database.sql # 创建表结构(含分区)
|
|
|
|
|
|
│ └── 02-seed-data.sql # 种子数据
|
|
|
|
|
|
└── DOCKER_README.md # 本文档
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 🔧 配置说明
|
|
|
|
|
|
|
|
|
|
|
|
### 环境变量 (`.env.docker`)
|
|
|
|
|
|
|
|
|
|
|
|
| 变量名 | 默认值 | 说明 |
|
|
|
|
|
|
|-------|-------|------|
|
|
|
|
|
|
| `DATABASE_URL` | mysql://root:1qazse42W3@mysql:3306/aguzhitou | MySQL 连接 |
|
|
|
|
|
|
| `REDIS_URL` | redis://redis:6379 | Redis 连接 |
|
|
|
|
|
|
| `JWT_SECRET` | aguzhitou-docker... | JWT 密钥 |
|
|
|
|
|
|
| `PORT` | 3000 | 服务端口 |
|
|
|
|
|
|
|
|
|
|
|
|
### 数据库分区设计
|
|
|
|
|
|
|
|
|
|
|
|
| 表名 | 分区字段 | 分区范围 | 分区数 |
|
|
|
|
|
|
|------|---------|---------|-------|
|
|
|
|
|
|
| `stock_quotes_history` | quote_time | 2024-01 ~ 2026-12 | 37 |
|
|
|
|
|
|
| `sector_quotes` | quote_time | 2024-01 ~ 2026-12 | 37 |
|
|
|
|
|
|
| `high_low_stocks` | date | 2024-01 ~ 2026-12 | 37 |
|
|
|
|
|
|
| `momentum_stocks` | date | 2024-01 ~ 2026-12 | 37 |
|
|
|
|
|
|
|
|
|
|
|
|
## 📊 服务访问
|
|
|
|
|
|
|
|
|
|
|
|
启动后可通过以下地址访问:
|
|
|
|
|
|
|
|
|
|
|
|
| 服务 | 地址 | 说明 |
|
|
|
|
|
|
|------|------|------|
|
|
|
|
|
|
| API 接口 | http://localhost:3000/api/v1 | 后端 API |
|
|
|
|
|
|
| 健康检查 | http://localhost:3000/api/v1/health | 服务状态 |
|
|
|
|
|
|
| MySQL | localhost:3306 | 数据库 |
|
|
|
|
|
|
| Redis | localhost:6379 | 缓存 |
|
|
|
|
|
|
|
|
|
|
|
|
### 默认账号
|
|
|
|
|
|
|
|
|
|
|
|
- **MySQL**: root / 1qazse42W3
|
|
|
|
|
|
|
|
|
|
|
|
## 🔍 常用命令
|
|
|
|
|
|
|
|
|
|
|
|
### 查看状态
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 查看所有容器状态
|
|
|
|
|
|
docker-compose ps
|
|
|
|
|
|
|
|
|
|
|
|
# 查看资源使用
|
|
|
|
|
|
docker-compose top
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 查看日志
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 查看所有服务日志
|
|
|
|
|
|
docker-compose logs
|
|
|
|
|
|
|
|
|
|
|
|
# 查看后端应用日志(实时)
|
|
|
|
|
|
docker-compose logs -f app
|
|
|
|
|
|
|
|
|
|
|
|
# 查看 MySQL 日志
|
|
|
|
|
|
docker-compose logs -f mysql
|
|
|
|
|
|
|
|
|
|
|
|
# 查看 Redis 日志
|
|
|
|
|
|
docker-compose logs -f redis
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 服务管理
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 停止服务
|
|
|
|
|
|
docker-compose stop
|
|
|
|
|
|
|
|
|
|
|
|
# 启动服务
|
|
|
|
|
|
docker-compose start
|
|
|
|
|
|
|
|
|
|
|
|
# 重启服务
|
|
|
|
|
|
docker-compose restart
|
|
|
|
|
|
|
|
|
|
|
|
# 停止并删除容器(保留数据)
|
|
|
|
|
|
docker-compose down
|
|
|
|
|
|
|
|
|
|
|
|
# 完全重置(删除容器和数据卷)
|
|
|
|
|
|
docker-compose down -v
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 数据库操作
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 进入 MySQL 容器
|
|
|
|
|
|
mysql -h localhost -P 3306 -u root -p1qazse42W3
|
|
|
|
|
|
|
|
|
|
|
|
# 备份数据库
|
|
|
|
|
|
docker-compose exec mysql mysqldump -u root -p1qazse42W3 aguzhitou > backup.sql
|
|
|
|
|
|
|
|
|
|
|
|
# 恢复数据库
|
|
|
|
|
|
docker-compose exec -T mysql mysql -u root -p1qazse42W3 aguzhitou < backup.sql
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 🗄️ 数据持久化
|
|
|
|
|
|
|
|
|
|
|
|
数据通过 Docker Volumes 持久化:
|
|
|
|
|
|
|
|
|
|
|
|
| 卷名 | 用途 | 位置 |
|
|
|
|
|
|
|------|------|------|
|
|
|
|
|
|
| `mysql_data` | MySQL 数据 | /var/lib/mysql |
|
|
|
|
|
|
| `redis_data` | Redis 数据 | /data |
|
|
|
|
|
|
| `./logs` | 应用日志 | /app/logs |
|
|
|
|
|
|
|
|
|
|
|
|
## 🛠️ 自定义配置
|
|
|
|
|
|
|
|
|
|
|
|
### 修改数据库密码
|
|
|
|
|
|
|
|
|
|
|
|
1. 编辑 `docker-compose.yml`:
|
|
|
|
|
|
```yaml
|
|
|
|
|
|
mysql:
|
|
|
|
|
|
environment:
|
|
|
|
|
|
MYSQL_ROOT_PASSWORD: your-new-password
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
2. 编辑 `.env.docker`:
|
|
|
|
|
|
```env
|
|
|
|
|
|
DATABASE_URL=mysql://root:your-new-password@mysql:3306/aguzhitou
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
3. 重启服务:
|
|
|
|
|
|
```bash
|
|
|
|
|
|
docker-compose down -v
|
|
|
|
|
|
docker-compose up --build -d
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 修改服务端口
|
|
|
|
|
|
|
|
|
|
|
|
编辑 `docker-compose.yml`:
|
|
|
|
|
|
```yaml
|
|
|
|
|
|
app:
|
|
|
|
|
|
ports:
|
|
|
|
|
|
- "8080:3000" # 改为 8080 端口
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 添加 AKShare 数据源
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
docker-compose --profile with-akshare up -d
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 📈 性能优化
|
|
|
|
|
|
|
|
|
|
|
|
### MySQL 配置
|
|
|
|
|
|
|
|
|
|
|
|
已针对生产环境优化:
|
|
|
|
|
|
- `innodb_buffer_pool_size=512M`
|
|
|
|
|
|
- `max_connections=200`
|
|
|
|
|
|
- 字符集:utf8mb4
|
|
|
|
|
|
|
|
|
|
|
|
### Redis 配置
|
|
|
|
|
|
|
|
|
|
|
|
使用 Alpine 版本,轻量级:
|
|
|
|
|
|
- 数据持久化
|
|
|
|
|
|
- 自动清理策略
|
|
|
|
|
|
|
|
|
|
|
|
## 🔒 安全配置
|
|
|
|
|
|
|
|
|
|
|
|
### 生产环境建议
|
|
|
|
|
|
|
|
|
|
|
|
1. **修改默认密码**
|
|
|
|
|
|
- MySQL root 密码
|
|
|
|
|
|
- JWT Secret
|
|
|
|
|
|
|
|
|
|
|
|
2. **使用 HTTPS**
|
|
|
|
|
|
- 配置 Nginx 反向代理
|
|
|
|
|
|
- 使用 Let's Encrypt 证书
|
|
|
|
|
|
|
|
|
|
|
|
3. **限制端口访问**
|
|
|
|
|
|
- 仅开放必要端口
|
|
|
|
|
|
- 使用防火墙规则
|
|
|
|
|
|
|
|
|
|
|
|
## 🐛 故障排查
|
|
|
|
|
|
|
|
|
|
|
|
### 问题1:数据库连接失败
|
|
|
|
|
|
|
|
|
|
|
|
**现象**:
|
|
|
|
|
|
```
|
|
|
|
|
|
Error: Can't reach database server
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**解决方案**:
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 检查 MySQL 容器状态
|
|
|
|
|
|
docker-compose ps mysql
|
|
|
|
|
|
|
|
|
|
|
|
# 查看 MySQL 日志
|
|
|
|
|
|
docker-compose logs mysql
|
|
|
|
|
|
|
|
|
|
|
|
# 手动测试连接
|
|
|
|
|
|
docker-compose exec mysql mysql -u root -p1qazse42W3 -e "SHOW DATABASES;"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 问题2:端口被占用
|
|
|
|
|
|
|
|
|
|
|
|
**现象**:
|
|
|
|
|
|
```
|
|
|
|
|
|
Bind for 0.0.0.0:3306 failed: port is already allocated
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**解决方案**:
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 查找占用进程
|
|
|
|
|
|
sudo lsof -i :3306
|
|
|
|
|
|
|
|
|
|
|
|
# 停止占用进程或修改端口
|
|
|
|
|
|
# 编辑 docker-compose.yml 修改端口映射
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 问题3:内存不足
|
|
|
|
|
|
|
|
|
|
|
|
**现象**:
|
|
|
|
|
|
```
|
|
|
|
|
|
Error: Out of memory
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**解决方案**:
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 查看内存使用
|
|
|
|
|
|
docker stats
|
|
|
|
|
|
|
|
|
|
|
|
# 减少 MySQL 内存占用
|
|
|
|
|
|
# 编辑 docker-compose.yml 调整 innodb_buffer_pool_size
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 📝 更新记录
|
|
|
|
|
|
|
|
|
|
|
|
### v1.0.0
|
|
|
|
|
|
- ✨ 初始版本
|
|
|
|
|
|
- ✨ MySQL 8.0 带分区表
|
|
|
|
|
|
- ✨ Redis 7 缓存
|
|
|
|
|
|
- ✨ 自动初始化脚本
|
|
|
|
|
|
- ✨ 健康检查
|
|
|
|
|
|
|
|
|
|
|
|
## 📞 技术支持
|
|
|
|
|
|
|
|
|
|
|
|
如有问题,请检查:
|
|
|
|
|
|
1. Docker 和 Docker Compose 版本
|
|
|
|
|
|
2. 端口占用情况
|
|
|
|
|
|
3. 日志文件中的错误信息
|
|
|
|
|
|
4. 系统资源(内存、磁盘)
|
|
|
|
|
|
|
|
|
|
|
|
## 📄 许可证
|
|
|
|
|
|
|
|
|
|
|
|
MIT License
|