From a7d0ca8835677d7d38eba7517124f993b18eb45b Mon Sep 17 00:00:00 2001 From: tinkle-community Date: Wed, 29 Oct 2025 18:29:49 +0800 Subject: [PATCH] =?UTF-8?q?Docs:=20Add=20Docker=20one-click=20deployment?= =?UTF-8?q?=20support=20for=20all=20languages=20Complete=20Docker=20deploy?= =?UTF-8?q?ment=20solution=20with=20beginner-friendly=20documentation:=20*?= =?UTF-8?q?*New=20Docker=20Files:**=20-=20`Dockerfile`=20-=20Multi-stage?= =?UTF-8?q?=20Go=20backend=20build=20with=20health=20checks=20-=20`web/Doc?= =?UTF-8?q?kerfile`=20-=20Frontend=20build=20with=20Nginx=20and=20API=20pr?= =?UTF-8?q?oxy=20-=20`docker-compose.yml`=20-=20Full=20orchestration=20wit?= =?UTF-8?q?h=20service=20dependencies=20-=20`.dockerignore`=20&=20`web/.do?= =?UTF-8?q?ckerignore`=20-=20Build=20optimization=20-=20`start.sh`=20-=20C?= =?UTF-8?q?onvenient=20management=20script=20(start/stop/logs/status)=20**?= =?UTF-8?q?Comprehensive=20Documentation:**=20-=20`DOCKER=5FDEPLOY.md`=20(?= =?UTF-8?q?=E4=B8=AD=E6=96=87)=20-=20Complete=20Chinese=20deployment=20gui?= =?UTF-8?q?de=20-=20`DOCKER=5FDEPLOY.en.md`=20(English)=20-=20Complete=20E?= =?UTF-8?q?nglish=20deployment=20guide=20=20=20-=20Prerequisites=20&=20Doc?= =?UTF-8?q?ker=20installation=20(macOS/Windows/Linux)=20=20=20-=203-step?= =?UTF-8?q?=20quick=20start=20(config=20=E2=86=92=20start=20=E2=86=92=20ac?= =?UTF-8?q?cess)=20=20=20-=20Service=20management=20commands=20=20=20-=20A?= =?UTF-8?q?dvanced=20configuration=20(ports,=20resources,=20env=20vars)=20?= =?UTF-8?q?=20=20-=20Data=20persistence=20&=20backups=20=20=20-=20Comprehe?= =?UTF-8?q?nsive=20troubleshooting=20=20=20-=20Security=20recommendations?= =?UTF-8?q?=20=20=20-=20Production=20deployment=20(Nginx,=20HTTPS,=20Docke?= =?UTF-8?q?r=20Swarm)=20=20=20-=20Monitoring=20&=20logging=20setup=20**REA?= =?UTF-8?q?DME=20Updates=20(All=204=20Languages):**=20-=20README.md=20(Eng?= =?UTF-8?q?lish)=20-=20README.zh-CN.md=20(=E4=B8=AD=E6=96=87)=20-=20README?= =?UTF-8?q?.uk.md=20(=D0=A3=D0=BA=D1=80=D0=B0=D1=97=D0=BD=D1=81=D1=8C?= =?UTF-8?q?=D0=BA=D0=B0)=20-=20README.ru.md=20(=D0=A0=D1=83=D1=81=D1=81?= =?UTF-8?q?=D0=BA=D0=B8=D0=B9)=20Added=20prominent=20"Option=20A:=20Docker?= =?UTF-8?q?=20One-Click=20Deployment"=20section=20at=20the=20beginning=20o?= =?UTF-8?q?f=20Quick=20Start=20in=20all=20languages.=20Clearly=20marked=20?= =?UTF-8?q?as=20EASIEST=20method=20for=20beginners.=20Shows=203=20simple?= =?UTF-8?q?=20steps=20with=20command=20examples=20and=20links=20to=20detai?= =?UTF-8?q?led=20DOCKER=5FDEPLOY=20docs.=20**Key=20Features:**=20-=20One-c?= =?UTF-8?q?ommand=20deployment:=20`./start.sh=20start=20--build`=20-=20Aut?= =?UTF-8?q?o-handles=20all=20dependencies=20(Go,=20Node.js,=20TA-Lib)=20-?= =?UTF-8?q?=20Health=20checks=20for=20both=20services=20-=20Data=20persist?= =?UTF-8?q?ence=20(logs,=20cache,=20config)=20-=20Log=20rotation=20(10MB?= =?UTF-8?q?=20=C3=97=203=20files)=20-=20Easy=20service=20management=20-=20?= =?UTF-8?q?Beginner-friendly=20for=20complete=20newcomers=20**User=20Benef?= =?UTF-8?q?its:**=20-=20No=20need=20to=20install=20Go,=20Node.js,=20or=20T?= =?UTF-8?q?A-Lib=20manually=20-=20Works=20on=20macOS,=20Windows,=20Linux?= =?UTF-8?q?=20-=20Perfect=20for=20non-developers=20-=20Production-ready=20?= =?UTF-8?q?with=20best=20practices=20This=20makes=20NOFX=20truly=20accessi?= =?UTF-8?q?ble=20to=20beginners=20as=20requested:=20"=E7=9C=9F=E5=B0=B1?= =?UTF-8?q?=E8=AE=A9=E5=B0=8F=E7=99=BD=E9=83=BD=E8=83=BD=E4=B8=80=E9=94=AE?= =?UTF-8?q?=E5=BC=80=E5=A7=8B"=20Co-Authored-By:=20tinkle-community=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dockerignore | 49 +++++ DOCKER_DEPLOY.en.md | 456 ++++++++++++++++++++++++++++++++++++++++++++ DOCKER_DEPLOY.md | 456 ++++++++++++++++++++++++++++++++++++++++++++ Dockerfile | 59 ++++++ README.md | 48 +++++ README.ru.md | 49 +++++ README.uk.md | 49 +++++ README.zh-CN.md | 48 +++++ docker-compose.yml | 70 +++++++ start.sh | 192 +++++++++++++++++++ web/.dockerignore | 52 +++++ web/Dockerfile | 72 +++++++ 12 files changed, 1600 insertions(+) create mode 100644 .dockerignore create mode 100644 DOCKER_DEPLOY.en.md create mode 100644 DOCKER_DEPLOY.md create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100755 start.sh create mode 100644 web/.dockerignore create mode 100644 web/Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..9d3ea1e6 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,49 @@ +# Git +.git +.gitignore +.github + +# Docker +Dockerfile +docker-compose.yml +.dockerignore + +# IDE +.idea +.vscode +*.swp +*.swo +*~ + +# Build artifacts +nofx +nofx_test +*.exe +*.dll +*.so +*.dylib + +# Test files +*_test.go +test_* + +# Documentation +*.md +!README.md +docs/ + +# Runtime data +decision_logs/ +coin_pool_cache/ +*.log + +# Config files (should be mounted) +config.json + +# Web directory (has its own Dockerfile) +web/ + +# Temporary files +tmp/ +temp/ +*.tmp diff --git a/DOCKER_DEPLOY.en.md b/DOCKER_DEPLOY.en.md new file mode 100644 index 00000000..1b9c42f2 --- /dev/null +++ b/DOCKER_DEPLOY.en.md @@ -0,0 +1,456 @@ +# 🐳 Docker One-Click Deployment Guide + +This guide will help you quickly deploy the NOFX AI Trading Competition System using Docker. + +## 📋 Prerequisites + +Before you begin, ensure your system has: + +- **Docker**: Version 20.10 or higher +- **Docker Compose**: Version 2.0 or higher + +### Installing Docker + +#### macOS / Windows +Download and install [Docker Desktop](https://www.docker.com/products/docker-desktop/) + +#### Linux (Ubuntu/Debian) +```bash +# Install Docker +curl -fsSL https://get.docker.com -o get-docker.sh +sudo sh get-docker.sh + +# Install Docker Compose +sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose +sudo chmod +x /usr/local/bin/docker-compose + +# Add current user to docker group +sudo usermod -aG docker $USER +newgrp docker + +# Verify installation +docker --version +docker-compose --version +``` + +## 🚀 Quick Start (3 Steps) + +### Step 1: Prepare Configuration File + +```bash +# Copy configuration template +cp config.json.example config.json + +# Edit configuration file with your API keys +nano config.json # or use any other editor +``` + +**Required fields:** +```json +{ + "traders": [ + { + "id": "my_trader", + "name": "My AI Trader", + "ai_model": "deepseek", + "binance_api_key": "YOUR_BINANCE_API_KEY", // ← Your Binance API Key + "binance_secret_key": "YOUR_BINANCE_SECRET_KEY", // ← Your Binance Secret Key + "deepseek_key": "YOUR_DEEPSEEK_API_KEY", // ← Your DeepSeek API Key + "initial_balance": 1000.0, + "scan_interval_minutes": 3 + } + ], + "use_default_coins": true, + "api_server_port": 8080 +} +``` + +### Step 2: One-Click Start + +```bash +# Build and start all services (first run) +docker-compose up -d --build + +# Subsequent starts (without rebuilding) +docker-compose up -d +``` + +**Startup options:** +- `--build`: Build Docker images (use on first run or after code updates) +- `-d`: Run in detached mode (background) + +### Step 3: Access the System + +Once deployed, open your browser and visit: + +- **Web Interface**: http://localhost:3000 +- **API Health Check**: http://localhost:8080/health + +## 📊 Service Management + +### View Running Status +```bash +# View all container status +docker-compose ps + +# View service health status +docker-compose ps --format json | jq +``` + +### View Logs +```bash +# View all service logs +docker-compose logs -f + +# View backend logs only +docker-compose logs -f backend + +# View frontend logs only +docker-compose logs -f frontend + +# View last 100 lines +docker-compose logs --tail=100 +``` + +### Stop Services +```bash +# Stop all services (keep data) +docker-compose stop + +# Stop and remove containers (keep data) +docker-compose down + +# Stop and remove containers and volumes (clear all data) +docker-compose down -v +``` + +### Restart Services +```bash +# Restart all services +docker-compose restart + +# Restart backend only +docker-compose restart backend + +# Restart frontend only +docker-compose restart frontend +``` + +### Update Services +```bash +# Pull latest code +git pull + +# Rebuild and restart +docker-compose up -d --build +``` + +## 🔧 Advanced Configuration + +### Change Ports + +Edit `docker-compose.yml` to modify port mappings: + +```yaml +services: + backend: + ports: + - "8080:8080" # Change to "your_port:8080" + + frontend: + ports: + - "3000:80" # Change to "your_port:80" +``` + +### Resource Limits + +Add resource limits in `docker-compose.yml`: + +```yaml +services: + backend: + deploy: + resources: + limits: + cpus: '2' + memory: 2G + reservations: + cpus: '1' + memory: 1G +``` + +### Environment Variables + +Create `.env` file to manage environment variables: + +```bash +# .env +TZ=Asia/Shanghai +BACKEND_PORT=8080 +FRONTEND_PORT=3000 +``` + +Then use in `docker-compose.yml`: + +```yaml +services: + backend: + ports: + - "${BACKEND_PORT}:8080" +``` + +## 📁 Data Persistence + +The system automatically persists data to local directories: + +- `./decision_logs/`: AI decision logs +- `./coin_pool_cache/`: Coin pool cache +- `./config.json`: Configuration file (mounted) + +**Data locations:** +```bash +# View data directories +ls -la decision_logs/ +ls -la coin_pool_cache/ + +# Backup data +tar -czf backup_$(date +%Y%m%d).tar.gz decision_logs/ coin_pool_cache/ config.json + +# Restore data +tar -xzf backup_20241029.tar.gz +``` + +## 🐛 Troubleshooting + +### Container Won't Start + +```bash +# View detailed error messages +docker-compose logs backend +docker-compose logs frontend + +# Check container status +docker-compose ps -a + +# Rebuild (clear cache) +docker-compose build --no-cache +``` + +### Port Already in Use + +```bash +# Find process using the port +lsof -i :8080 # backend port +lsof -i :3000 # frontend port + +# Kill the process +kill -9 +``` + +### Configuration File Not Found + +```bash +# Ensure config.json exists +ls -la config.json + +# If not exists, copy template +cp config.json.example config.json +``` + +### Health Check Failing + +```bash +# Check health status +docker inspect nofx-backend | jq '.[0].State.Health' +docker inspect nofx-frontend | jq '.[0].State.Health' + +# Manually test health endpoints +curl http://localhost:8080/health +curl http://localhost:3000/health +``` + +### Frontend Can't Connect to Backend + +```bash +# Check network connectivity +docker-compose exec frontend ping backend + +# Check if backend service is running +docker-compose exec frontend wget -O- http://backend:8080/health +``` + +### Clean Docker Resources + +```bash +# Clean unused images +docker image prune -a + +# Clean unused volumes +docker volume prune + +# Clean all unused resources (use with caution) +docker system prune -a --volumes +``` + +## 🔐 Security Recommendations + +1. **Don't commit config.json to Git** + ```bash + # Ensure config.json is in .gitignore + echo "config.json" >> .gitignore + ``` + +2. **Use environment variables for sensitive data** + ```yaml + # docker-compose.yml + services: + backend: + environment: + - BINANCE_API_KEY=${BINANCE_API_KEY} + - BINANCE_SECRET_KEY=${BINANCE_SECRET_KEY} + ``` + +3. **Restrict API access** + ```yaml + # Only allow local access + services: + backend: + ports: + - "127.0.0.1:8080:8080" + ``` + +4. **Regularly update images** + ```bash + docker-compose pull + docker-compose up -d + ``` + +## 🌐 Production Deployment + +### Using Nginx Reverse Proxy + +```nginx +# /etc/nginx/sites-available/nofx +server { + listen 80; + server_name your-domain.com; + + location / { + proxy_pass http://localhost:3000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } + + location /api/ { + proxy_pass http://localhost:8080/api/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } +} +``` + +### Configure HTTPS (Let's Encrypt) + +```bash +# Install Certbot +sudo apt-get install certbot python3-certbot-nginx + +# Get SSL certificate +sudo certbot --nginx -d your-domain.com + +# Auto-renewal +sudo certbot renew --dry-run +``` + +### Using Docker Swarm (Cluster Deployment) + +```bash +# Initialize Swarm +docker swarm init + +# Deploy stack +docker stack deploy -c docker-compose.yml nofx + +# View service status +docker stack services nofx + +# Scale services +docker service scale nofx_backend=3 +``` + +## 📈 Monitoring & Logging + +### Log Management + +```bash +# Configure log rotation (already configured in docker-compose.yml) +logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + +# View log statistics +docker-compose logs --timestamps | wc -l +``` + +### Monitoring Tool Integration + +Integrate Prometheus + Grafana for monitoring: + +```yaml +# docker-compose.yml (add monitoring services) +services: + prometheus: + image: prom/prometheus + ports: + - "9090:9090" + volumes: + - ./prometheus.yml:/etc/prometheus/prometheus.yml + + grafana: + image: grafana/grafana + ports: + - "3001:3000" +``` + +## 🆘 Get Help + +- **GitHub Issues**: [Submit an issue](https://github.com/yourusername/open-nofx/issues) +- **Documentation**: Check [README.md](README.md) +- **Community**: Join our Discord/Telegram group + +## 📝 Command Cheat Sheet + +```bash +# Start +docker-compose up -d --build # Build and start +docker-compose up -d # Start (without rebuilding) + +# Stop +docker-compose stop # Stop services +docker-compose down # Stop and remove containers +docker-compose down -v # Stop and remove containers and data + +# View +docker-compose ps # View status +docker-compose logs -f # View logs +docker-compose top # View processes + +# Restart +docker-compose restart # Restart all services +docker-compose restart backend # Restart backend + +# Update +git pull && docker-compose up -d --build + +# Clean +docker-compose down -v # Clear all data +docker system prune -a # Clean Docker resources +``` + +--- + +🎉 Congratulations! You've successfully deployed the NOFX AI Trading Competition System! + +If you encounter any issues, please check the [Troubleshooting](#-troubleshooting) section or submit an issue. diff --git a/DOCKER_DEPLOY.md b/DOCKER_DEPLOY.md new file mode 100644 index 00000000..f48b005e --- /dev/null +++ b/DOCKER_DEPLOY.md @@ -0,0 +1,456 @@ +# 🐳 Docker 一键部署教程 + +本教程将指导你使用 Docker 快速部署 NOFX AI 交易竞赛系统。 + +## 📋 前置要求 + +在开始之前,请确保你的系统已安装: + +- **Docker**: 版本 20.10 或更高 +- **Docker Compose**: 版本 2.0 或更高 + +### 安装 Docker + +#### macOS / Windows +下载并安装 [Docker Desktop](https://www.docker.com/products/docker-desktop/) + +#### Linux (Ubuntu/Debian) +```bash +# 安装 Docker +curl -fsSL https://get.docker.com -o get-docker.sh +sudo sh get-docker.sh + +# 安装 Docker Compose +sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose +sudo chmod +x /usr/local/bin/docker-compose + +# 将当前用户加入 docker 组 +sudo usermod -aG docker $USER +newgrp docker + +# 验证安装 +docker --version +docker-compose --version +``` + +## 🚀 快速开始(3步完成部署) + +### 第 1 步:准备配置文件 + +```bash +# 复制配置文件模板 +cp config.json.example config.json + +# 编辑配置文件,填入你的 API 密钥 +nano config.json # 或使用其他编辑器 +``` + +**必须配置的字段:** +```json +{ + "traders": [ + { + "id": "my_trader", + "name": "My AI Trader", + "ai_model": "deepseek", + "binance_api_key": "YOUR_BINANCE_API_KEY", // ← 填入你的币安 API Key + "binance_secret_key": "YOUR_BINANCE_SECRET_KEY", // ← 填入你的币安 Secret Key + "deepseek_key": "YOUR_DEEPSEEK_API_KEY", // ← 填入你的 DeepSeek API Key + "initial_balance": 1000.0, + "scan_interval_minutes": 3 + } + ], + "use_default_coins": true, + "api_server_port": 8080 +} +``` + +### 第 2 步:一键启动 + +```bash +# 构建并启动所有服务(首次运行) +docker-compose up -d --build + +# 后续启动(不重新构建) +docker-compose up -d +``` + +**启动过程说明:** +- `--build`: 构建 Docker 镜像(首次运行或代码更新后使用) +- `-d`: 后台运行(detached mode) + +### 第 3 步:访问系统 + +部署成功后,打开浏览器访问: + +- **Web 界面**: http://localhost:3000 +- **API 文档**: http://localhost:8080/health + +## 📊 服务管理 + +### 查看运行状态 +```bash +# 查看所有容器状态 +docker-compose ps + +# 查看服务健康状态 +docker-compose ps --format json | jq +``` + +### 查看日志 +```bash +# 查看所有服务日志 +docker-compose logs -f + +# 只查看后端日志 +docker-compose logs -f backend + +# 只查看前端日志 +docker-compose logs -f frontend + +# 查看最近 100 行日志 +docker-compose logs --tail=100 +``` + +### 停止服务 +```bash +# 停止所有服务(保留数据) +docker-compose stop + +# 停止并删除容器(保留数据) +docker-compose down + +# 停止并删除容器和卷(清除所有数据) +docker-compose down -v +``` + +### 重启服务 +```bash +# 重启所有服务 +docker-compose restart + +# 只重启后端 +docker-compose restart backend + +# 只重启前端 +docker-compose restart frontend +``` + +### 更新服务 +```bash +# 拉取最新代码 +git pull + +# 重新构建并重启 +docker-compose up -d --build +``` + +## 🔧 高级配置 + +### 修改端口 + +编辑 `docker-compose.yml`,修改端口映射: + +```yaml +services: + backend: + ports: + - "8080:8080" # 改为 "你的端口:8080" + + frontend: + ports: + - "3000:80" # 改为 "你的端口:80" +``` + +### 资源限制 + +在 `docker-compose.yml` 中添加资源限制: + +```yaml +services: + backend: + deploy: + resources: + limits: + cpus: '2' + memory: 2G + reservations: + cpus: '1' + memory: 1G +``` + +### 环境变量 + +创建 `.env` 文件来管理环境变量: + +```bash +# .env +TZ=Asia/Shanghai +BACKEND_PORT=8080 +FRONTEND_PORT=3000 +``` + +然后在 `docker-compose.yml` 中使用: + +```yaml +services: + backend: + ports: + - "${BACKEND_PORT}:8080" +``` + +## 📁 数据持久化 + +系统会自动持久化以下数据到本地目录: + +- `./decision_logs/`: AI 决策日志 +- `./coin_pool_cache/`: 币种池缓存 +- `./config.json`: 配置文件(挂载) + +**数据位置:** +```bash +# 查看数据目录 +ls -la decision_logs/ +ls -la coin_pool_cache/ + +# 备份数据 +tar -czf backup_$(date +%Y%m%d).tar.gz decision_logs/ coin_pool_cache/ config.json + +# 恢复数据 +tar -xzf backup_20241029.tar.gz +``` + +## 🐛 故障排查 + +### 容器无法启动 + +```bash +# 查看详细错误信息 +docker-compose logs backend +docker-compose logs frontend + +# 检查容器状态 +docker-compose ps -a + +# 重新构建(清除缓存) +docker-compose build --no-cache +``` + +### 端口被占用 + +```bash +# 查找占用端口的进程 +lsof -i :8080 # 后端端口 +lsof -i :3000 # 前端端口 + +# 杀死占用端口的进程 +kill -9 +``` + +### 配置文件未找到 + +```bash +# 确保 config.json 存在 +ls -la config.json + +# 如果不存在,复制模板 +cp config.json.example config.json +``` + +### 健康检查失败 + +```bash +# 检查健康状态 +docker inspect nofx-backend | jq '.[0].State.Health' +docker inspect nofx-frontend | jq '.[0].State.Health' + +# 手动测试健康端点 +curl http://localhost:8080/health +curl http://localhost:3000/health +``` + +### 前端无法连接后端 + +```bash +# 检查网络连接 +docker-compose exec frontend ping backend + +# 检查后端服务是否正常 +docker-compose exec frontend wget -O- http://backend:8080/health +``` + +### 清理 Docker 资源 + +```bash +# 清理未使用的镜像 +docker image prune -a + +# 清理未使用的卷 +docker volume prune + +# 清理所有未使用的资源(慎用) +docker system prune -a --volumes +``` + +## 🔐 安全建议 + +1. **不要将 config.json 提交到 Git** + ```bash + # 确保 config.json 在 .gitignore 中 + echo "config.json" >> .gitignore + ``` + +2. **使用环境变量存储敏感信息** + ```yaml + # docker-compose.yml + services: + backend: + environment: + - BINANCE_API_KEY=${BINANCE_API_KEY} + - BINANCE_SECRET_KEY=${BINANCE_SECRET_KEY} + ``` + +3. **限制 API 访问** + ```yaml + # 只允许本地访问 + services: + backend: + ports: + - "127.0.0.1:8080:8080" + ``` + +4. **定期更新镜像** + ```bash + docker-compose pull + docker-compose up -d + ``` + +## 🌐 生产环境部署 + +### 使用 Nginx 反向代理 + +```nginx +# /etc/nginx/sites-available/nofx +server { + listen 80; + server_name your-domain.com; + + location / { + proxy_pass http://localhost:3000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } + + location /api/ { + proxy_pass http://localhost:8080/api/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } +} +``` + +### 配置 HTTPS (Let's Encrypt) + +```bash +# 安装 Certbot +sudo apt-get install certbot python3-certbot-nginx + +# 获取 SSL 证书 +sudo certbot --nginx -d your-domain.com + +# 自动续期 +sudo certbot renew --dry-run +``` + +### 使用 Docker Swarm (集群部署) + +```bash +# 初始化 Swarm +docker swarm init + +# 部署堆栈 +docker stack deploy -c docker-compose.yml nofx + +# 查看服务状态 +docker stack services nofx + +# 扩展服务 +docker service scale nofx_backend=3 +``` + +## 📈 监控与日志 + +### 日志管理 + +```bash +# 配置日志轮转(已在 docker-compose.yml 中配置) +logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + +# 查看日志统计 +docker-compose logs --timestamps | wc -l +``` + +### 监控工具集成 + +可以集成 Prometheus + Grafana 进行监控: + +```yaml +# docker-compose.yml (添加监控服务) +services: + prometheus: + image: prom/prometheus + ports: + - "9090:9090" + volumes: + - ./prometheus.yml:/etc/prometheus/prometheus.yml + + grafana: + image: grafana/grafana + ports: + - "3001:3000" +``` + +## 🆘 获取帮助 + +- **GitHub Issues**: [提交问题](https://github.com/yourusername/open-nofx/issues) +- **文档**: 查看 [README.md](README.md) +- **社区**: 加入我们的 Discord/Telegram 群组 + +## 📝 常用命令速查表 + +```bash +# 启动 +docker-compose up -d --build # 构建并启动 +docker-compose up -d # 启动(不重新构建) + +# 停止 +docker-compose stop # 停止服务 +docker-compose down # 停止并删除容器 +docker-compose down -v # 停止并删除容器和数据 + +# 查看 +docker-compose ps # 查看状态 +docker-compose logs -f # 查看日志 +docker-compose top # 查看进程 + +# 重启 +docker-compose restart # 重启所有服务 +docker-compose restart backend # 重启后端 + +# 更新 +git pull && docker-compose up -d --build + +# 清理 +docker-compose down -v # 清除所有数据 +docker system prune -a # 清理 Docker 资源 +``` + +--- + +🎉 恭喜!你已经成功部署了 NOFX AI 交易竞赛系统! + +如有问题,请查看[故障排查](#-故障排查)部分或提交 Issue。 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..49f54a09 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,59 @@ +# 构建阶段 +FROM golang:1.21-alpine AS builder + +# 安装必要的构建工具 +RUN apk add --no-cache git gcc musl-dev + +# 设置工作目录 +WORKDIR /app + +# 复制 go mod 文件 +COPY go.mod go.sum ./ + +# 下载依赖 +RUN go mod download + +# 复制源代码 +COPY . . + +# 构建应用 +RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o nofx . + +# 运行阶段 +FROM alpine:latest + +# 安装 ca-certificates(HTTPS 请求需要) +RUN apk --no-cache add ca-certificates tzdata + +# 设置时区为上海 +ENV TZ=Asia/Shanghai + +# 创建非 root 用户 +RUN addgroup -g 1000 nofx && \ + adduser -D -u 1000 -G nofx nofx + +# 设置工作目录 +WORKDIR /app + +# 从构建阶段复制二进制文件 +COPY --from=builder /app/nofx . + +# 复制配置文件示例 +COPY config.json.example ./config.json.example + +# 创建必要的目录 +RUN mkdir -p decision_logs coin_pool_cache && \ + chown -R nofx:nofx /app + +# 切换到非 root 用户 +USER nofx + +# 暴露 API 端口 +EXPOSE 8080 + +# 健康检查 +HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ + CMD wget --no-verbose --tries=1 --spider http://localhost:8080/health || exit 1 + +# 启动应用 +CMD ["./nofx"] diff --git a/README.md b/README.md index d4d7564e..080e2293 100644 --- a/README.md +++ b/README.md @@ -166,6 +166,54 @@ Before using this system, you need a Binance Futures account. **Use our referral ## 🚀 Quick Start +### 🐳 Option A: Docker One-Click Deployment (EASIEST - Recommended for Beginners!) + +**⚡ Start trading in 3 simple steps with Docker - No installation needed!** + +Docker automatically handles all dependencies (Go, Node.js, TA-Lib) and environment setup. Perfect for beginners! + +#### Step 1: Prepare Configuration +```bash +# Copy configuration template +cp config.json.example config.json + +# Edit and fill in your API keys +nano config.json # or use any editor +``` + +#### Step 2: One-Click Start +```bash +# Option 1: Use convenience script (Recommended) +chmod +x start.sh +./start.sh start --build + +# Option 2: Use docker-compose directly +docker-compose up -d --build +``` + +#### Step 3: Access Dashboard +Open your browser and visit: **http://localhost:3000** + +**That's it! 🎉** Your AI trading system is now running! + +#### Manage Your System +```bash +./start.sh logs # View logs +./start.sh status # Check status +./start.sh stop # Stop services +./start.sh restart # Restart services +``` + +**📖 For detailed Docker deployment guide, troubleshooting, and advanced configuration:** +- **English**: See [DOCKER_DEPLOY.en.md](DOCKER_DEPLOY.en.md) +- **中文**: 查看 [DOCKER_DEPLOY.md](DOCKER_DEPLOY.md) + +--- + +### 📦 Option B: Manual Installation (For Developers) + +**Note**: If you used Docker deployment above, skip this section. Manual installation is only needed if you want to modify the code or run without Docker. + ### 1. Environment Requirements - **Go 1.21+** diff --git a/README.ru.md b/README.ru.md index e25c2365..f9737148 100644 --- a/README.ru.md +++ b/README.ru.md @@ -102,6 +102,55 @@ ## 🚀 Быстрый старт +### 🐳 Вариант A: Docker развертывание в один клик (ПРОЩЕ ВСЕГО - Рекомендуется для новичков!) + +**⚡ Начните торговать за 3 простых шага с Docker - Не нужно ничего устанавливать!** + +Docker автоматически обрабатывает все зависимости (Go, Node.js, TA-Lib) и настройку среды. Идеально для новичков! + +#### Шаг 1: Подготовьте конфигурацию +```bash +# Скопируйте шаблон конфигурации +cp config.json.example config.json + +# Отредактируйте и заполните ваши API ключи +nano config.json # или используйте любой редактор +``` + +#### Шаг 2: Запуск в один клик +```bash +# Вариант 1: Используйте удобный скрипт (Рекомендуется) +chmod +x start.sh +./start.sh start --build + +# Вариант 2: Используйте docker-compose напрямую +docker-compose up -d --build +``` + +#### Шаг 3: Доступ к панели +Откройте в браузере: **http://localhost:3000** + +**Вот и все! 🎉** Ваша AI торговая система теперь работает! + +#### Управление вашей системой +```bash +./start.sh logs # Просмотреть логи +./start.sh status # Проверить статус +./start.sh stop # Остановить сервисы +./start.sh restart # Перезапустить сервисы +``` + +**📖 Подробное руководство по развертыванию Docker, устранению неполадок и расширенной конфигурации:** +- **Русский**: См. документацию Docker (скоро будет доступно) +- **English**: See [DOCKER_DEPLOY.en.md](DOCKER_DEPLOY.en.md) +- **中文**: 查看 [DOCKER_DEPLOY.md](DOCKER_DEPLOY.md) + +--- + +### 📦 Вариант B: Ручная установка (Для разработчиков) + +**Примечание**: Если вы использовали развертывание Docker выше, пропустите этот раздел. Ручная установка нужна только если вы хотите изменить код или запустить без Docker. + ### 1. Требования к среде - **Go 1.21+** diff --git a/README.uk.md b/README.uk.md index d9460c8c..7af93d25 100644 --- a/README.uk.md +++ b/README.uk.md @@ -102,6 +102,55 @@ ## 🚀 Швидкий старт +### 🐳 Варіант A: Docker розгортання в один клік (НАЙПРОСТІШЕ - Рекомендується для новачків!) + +**⚡ Почніть торгувати за 3 прості кроки з Docker - Не потрібно нічого встановлювати!** + +Docker автоматично обробляє всі залежності (Go, Node.js, TA-Lib) та налаштування середовища. Ідеально для новачків! + +#### Крок 1: Підготуйте конфігурацію +```bash +# Скопіюйте шаблон конфігурації +cp config.json.example config.json + +# Відредагуйте та заповніть ваші API ключі +nano config.json # або використайте будь-який редактор +``` + +#### Крок 2: Запуск в один клік +```bash +# Варіант 1: Використайте зручний скрипт (Рекомендується) +chmod +x start.sh +./start.sh start --build + +# Варіант 2: Використайте docker-compose безпосередньо +docker-compose up -d --build +``` + +#### Крок 3: Доступ до панелі +Відкрийте у браузері: **http://localhost:3000** + +**От і все! 🎉** Ваша AI торгова система зараз працює! + +#### Керування вашою системою +```bash +./start.sh logs # Переглянути логи +./start.sh status # Перевірити статус +./start.sh stop # Зупинити сервіси +./start.sh restart # Перезапустити сервіси +``` + +**📖 Детальний посібник з розгортання Docker, усунення несправностей та розширеної конфігурації:** +- **Українська**: Дивіться документацію Docker (скоро буде доступно) +- **English**: See [DOCKER_DEPLOY.en.md](DOCKER_DEPLOY.en.md) +- **中文**: 查看 [DOCKER_DEPLOY.md](DOCKER_DEPLOY.md) + +--- + +### 📦 Варіант B: Ручне встановлення (Для розробників) + +**Примітка**: Якщо ви використали розгортання Docker вище, пропустіть цей розділ. Ручне встановлення потрібне лише якщо ви хочете змінити код або запустити без Docker. + ### 1. Вимоги до середовища - **Go 1.21+** diff --git a/README.zh-CN.md b/README.zh-CN.md index a62f4d02..66b4979e 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -166,6 +166,54 @@ nofx/ ## 🚀 快速开始 +### 🐳 方式A:Docker 一键部署(最简单 - 新手推荐!) + +**⚡ 使用Docker只需3步即可开始交易 - 无需安装任何环境!** + +Docker会自动处理所有依赖(Go、Node.js、TA-Lib)和环境配置,完美适合新手! + +#### 步骤1:准备配置文件 +```bash +# 复制配置文件模板 +cp config.json.example config.json + +# 编辑并填入你的API密钥 +nano config.json # 或使用其他编辑器 +``` + +#### 步骤2:一键启动 +```bash +# 方式1:使用便捷脚本(推荐) +chmod +x start.sh +./start.sh start --build + +# 方式2:直接使用docker-compose +docker-compose up -d --build +``` + +#### 步骤3:访问控制台 +在浏览器中打开:**http://localhost:3000** + +**就是这么简单!🎉** 你的AI交易系统已经运行起来了! + +#### 管理你的系统 +```bash +./start.sh logs # 查看日志 +./start.sh status # 检查状态 +./start.sh stop # 停止服务 +./start.sh restart # 重启服务 +``` + +**📖 详细的Docker部署教程、故障排查和高级配置:** +- **中文**: 查看 [DOCKER_DEPLOY.md](DOCKER_DEPLOY.md) +- **English**: See [DOCKER_DEPLOY.en.md](DOCKER_DEPLOY.en.md) + +--- + +### 📦 方式B:手动安装(开发者) + +**注意**:如果你使用了上面的Docker部署,请跳过本节。手动安装仅在你需要修改代码或不想使用Docker时需要。 + ### 1. 环境要求 - **Go 1.21+** diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..0a64d72c --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,70 @@ +version: '3.8' + +services: + # 后端服务 + backend: + build: + context: . + dockerfile: Dockerfile + container_name: nofx-backend + restart: unless-stopped + ports: + - "8080:8080" + volumes: + # 挂载配置文件(必须) + - ./config.json:/app/config.json:ro + # 持久化决策日志 + - ./decision_logs:/app/decision_logs + # 持久化币种池缓存 + - ./coin_pool_cache:/app/coin_pool_cache + environment: + - TZ=Asia/Shanghai + networks: + - nofx-network + healthcheck: + test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 10s + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # 前端服务 + frontend: + build: + context: ./web + dockerfile: Dockerfile + container_name: nofx-frontend + restart: unless-stopped + ports: + - "3000:80" + depends_on: + backend: + condition: service_healthy + networks: + - nofx-network + environment: + - TZ=Asia/Shanghai + healthcheck: + test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 5s + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + +networks: + nofx-network: + driver: bridge + +volumes: + decision_logs: + coin_pool_cache: diff --git a/start.sh b/start.sh new file mode 100755 index 00000000..1a4971e5 --- /dev/null +++ b/start.sh @@ -0,0 +1,192 @@ +#!/bin/bash + +# NOFX AI Trading System - Docker Quick Start Script +# 使用方法: ./start.sh [command] + +set -e + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# 打印带颜色的消息 +print_info() { + echo -e "${BLUE}[INFO]${NC} $1" +} + +print_success() { + echo -e "${GREEN}[SUCCESS]${NC} $1" +} + +print_warning() { + echo -e "${YELLOW}[WARNING]${NC} $1" +} + +print_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +# 检查 Docker 是否安装 +check_docker() { + if ! command -v docker &> /dev/null; then + print_error "Docker 未安装!请先安装 Docker: https://docs.docker.com/get-docker/" + exit 1 + fi + + if ! command -v docker-compose &> /dev/null; then + print_error "Docker Compose 未安装!请先安装 Docker Compose" + exit 1 + fi + + print_success "Docker 和 Docker Compose 已安装" +} + +# 检查配置文件 +check_config() { + if [ ! -f "config.json" ]; then + print_warning "config.json 不存在,从模板复制..." + cp config.json.example config.json + print_info "请编辑 config.json 填入你的 API 密钥" + print_info "运行: nano config.json 或使用其他编辑器" + exit 1 + fi + print_success "配置文件存在" +} + +# 启动服务 +start() { + print_info "正在启动 NOFX AI Trading System..." + + if [ "$1" == "--build" ]; then + print_info "重新构建镜像..." + docker-compose up -d --build + else + docker-compose up -d + fi + + print_success "服务已启动!" + print_info "Web 界面: http://localhost:3000" + print_info "API 端点: http://localhost:8080" + print_info "" + print_info "查看日志: ./start.sh logs" + print_info "停止服务: ./start.sh stop" +} + +# 停止服务 +stop() { + print_info "正在停止服务..." + docker-compose stop + print_success "服务已停止" +} + +# 重启服务 +restart() { + print_info "正在重启服务..." + docker-compose restart + print_success "服务已重启" +} + +# 查看日志 +logs() { + if [ -z "$2" ]; then + docker-compose logs -f + else + docker-compose logs -f "$2" + fi +} + +# 查看状态 +status() { + print_info "服务状态:" + docker-compose ps + echo "" + print_info "健康检查:" + curl -s http://localhost:8080/health | jq '.' || echo "后端未响应" +} + +# 清理 +clean() { + print_warning "这将删除所有容器和数据!" + read -p "确认删除?(yes/no): " confirm + if [ "$confirm" == "yes" ]; then + print_info "正在清理..." + docker-compose down -v + print_success "清理完成" + else + print_info "已取消" + fi +} + +# 更新 +update() { + print_info "正在更新..." + git pull + docker-compose up -d --build + print_success "更新完成" +} + +# 显示帮助 +show_help() { + echo "NOFX AI Trading System - Docker 管理脚本" + echo "" + echo "用法: ./start.sh [command] [options]" + echo "" + echo "命令:" + echo " start [--build] 启动服务(可选:重新构建)" + echo " stop 停止服务" + echo " restart 重启服务" + echo " logs [service] 查看日志(可选:指定服务名 backend/frontend)" + echo " status 查看服务状态" + echo " clean 清理所有容器和数据" + echo " update 更新代码并重启" + echo " help 显示此帮助信息" + echo "" + echo "示例:" + echo " ./start.sh start --build # 构建并启动" + echo " ./start.sh logs backend # 查看后端日志" + echo " ./start.sh status # 查看状态" +} + +# 主函数 +main() { + check_docker + + case "${1:-start}" in + start) + check_config + start "$2" + ;; + stop) + stop + ;; + restart) + restart + ;; + logs) + logs "$@" + ;; + status) + status + ;; + clean) + clean + ;; + update) + update + ;; + help|--help|-h) + show_help + ;; + *) + print_error "未知命令: $1" + show_help + exit 1 + ;; + esac +} + +# 运行主函数 +main "$@" diff --git a/web/.dockerignore b/web/.dockerignore new file mode 100644 index 00000000..2d8c3534 --- /dev/null +++ b/web/.dockerignore @@ -0,0 +1,52 @@ +# Dependencies +node_modules/ +package-lock.json +yarn.lock +pnpm-lock.yaml + +# Build output (will be regenerated) +dist/ +build/ + +# Development files +.env.local +.env.development.local +.env.test.local +.env.production.local + +# Testing +coverage/ +.nyc_output/ + +# IDE +.idea +.vscode +*.swp +*.swo +*~ + +# Git +.git +.gitignore + +# Docker +Dockerfile +.dockerignore + +# Documentation +*.md +!README.md +CHANGELOG.md + +# Logs +logs/ +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Temporary files +.cache/ +.temp/ +.tmp/ +*.tmp diff --git a/web/Dockerfile b/web/Dockerfile new file mode 100644 index 00000000..f7614cad --- /dev/null +++ b/web/Dockerfile @@ -0,0 +1,72 @@ +# 构建阶段 +FROM node:20-alpine AS builder + +# 设置工作目录 +WORKDIR /app + +# 复制 package 文件 +COPY package*.json ./ + +# 安装依赖 +RUN npm ci --only=production=false + +# 复制源代码 +COPY . . + +# 构建应用 +RUN npm run build + +# 运行阶段 +FROM nginx:alpine + +# 复制自定义 nginx 配置 +COPY <