本文面向生产/准生产环境,使用云服务器 + Docker Compose 部署 QuantDinger,并补充域名、HTTPS、反向代理与前后端分离说明。
推荐使用“同域名 + Nginx 反向代理”:
- 用户访问:
https://app.example.com - 宿主机 Nginx:监听
80/443 - Docker
frontend:绑定到127.0.0.1:8888 - Docker
backend:绑定到127.0.0.1:5000 - Docker
postgres:绑定到127.0.0.1:5432
这样做的好处:
- 外网只暴露
80/443 - 前端和 API 走同域名,最省心
- 数据库与后端管理端口不直接暴露到公网
建议配置:
- Ubuntu 22.04 / Debian 12
- 2C4G 及以上
- 已开放安全组端口:
22、80、443 - 已准备域名,例如
app.example.com
域名解析:
- 在 DNS 服务商后台添加一条
A记录 - 主机记录填
app - 记录值填云服务器公网 IP
- 等待解析生效
验证:
ping app.example.comUbuntu / Debian 示例:
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
newgrp docker
docker --version
docker compose version如果你的网络拉取 Docker Hub 较慢,可稍后通过项目根 .env 的 IMAGE_PREFIX 切换镜像源。
git clone https://github.com/brokermr810/QuantDinger.git
cd QuantDinger复制模板:
cp backend_api_python/env.example backend_api_python/.env生成并写入 SECRET_KEY:
./scripts/generate-secret-key.sh至少检查并修改这些配置:
ADMIN_USER=quantdinger
ADMIN_PASSWORD=your_strong_password
SECRET_KEY=your_generated_secret如果你需要 AI 功能,再补充至少一个模型提供商密钥,例如:
OPENROUTER_API_KEY=your_key项目根 .env 用于 Docker Compose 的端口和镜像源控制。
推荐生产配置:
cp .env.example .env编辑为:
FRONTEND_PORT=127.0.0.1:8888
BACKEND_PORT=127.0.0.1:5000
DB_PORT=127.0.0.1:5432
IMAGE_PREFIX=说明:
FRONTEND_PORT=127.0.0.1:8888:只允许宿主机本地访问,由外层 Nginx 转发BACKEND_PORT=127.0.0.1:5000:避免后端 API 直接暴露公网DB_PORT=127.0.0.1:5432:避免数据库端口暴露公网IMAGE_PREFIX=:空值表示官方 Docker Hub
如果拉镜像失败,可改成:
IMAGE_PREFIX=docker.m.daocloud.io/library/或:
IMAGE_PREFIX=docker.xuanyuan.me/library/docker-compose up -d --build
docker-compose ps查看日志:
docker-compose logs -f backend
docker-compose logs -f frontend此时服务通常已在本机监听:
127.0.0.1:8888127.0.0.1:5000127.0.0.1:5432
安装:
sudo apt update
sudo apt install -y nginx推荐站点配置 /etc/nginx/sites-available/quantdinger.conf:
server {
listen 80;
server_name app.example.com;
client_max_body_size 20m;
location / {
proxy_pass http://127.0.0.1:8888;
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;
}
}启用站点:
sudo ln -s /etc/nginx/sites-available/quantdinger.conf /etc/nginx/sites-enabled/quantdinger.conf
sudo nginx -t
sudo systemctl reload nginx如果启用了防火墙:
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable安装 Certbot:
sudo apt install -y certbot python3-certbot-nginx申请证书:
sudo certbot --nginx -d app.example.com自动续期测试:
sudo certbot renew --dry-run完成后访问:
https://app.example.com
这是开源版最推荐的方式。
原因:
- 当前开源前端为预编译
frontend/dist - 前端容器内部已把
/api/*代理到 Docker 网络中的backend:5000 - 用户只需要维护一个域名和一套 HTTPS
拓扑如下:
Browser
-> https://app.example.com
-> Host Nginx :443
-> 127.0.0.1:8888 (frontend container)
-> /api/* 再由 frontend 容器代理到 backend:5000
如果你希望:
- 前端域名:
app.example.com - API 域名:
api.example.com
可以使用双域名方案,但请注意:
- 需要前端能够把 API 指向
api.example.com - 后端需要正确处理跨域
- 这种方式更适合有前端源码控制权或二次开发的部署场景
宿主机 Nginx 可拆成两个站点:
app.example.com->127.0.0.1:8888api.example.com->127.0.0.1:5000
api.example.com 示例:
server {
listen 80;
server_name api.example.com;
client_max_body_size 20m;
location / {
proxy_pass http://127.0.0.1:5000;
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;
}
}如果你只是想“前后端逻辑分离”,但不想处理跨域,建议仍使用同域名:
https://app.example.com/https://app.example.com/api/
查看状态:
docker-compose ps查看日志:
docker-compose logs -f backend
docker-compose logs -f frontend
docker-compose logs -f postgres更新版本:
git pull
docker-compose up -d --build重启:
docker-compose restart backend
docker-compose restart frontend停止:
docker-compose down现象:
failed to resolve source metadataregistry-1.docker.ioDocker Desktop has no HTTPS proxy
处理:
IMAGE_PREFIX=docker.m.daocloud.io/library/然后重新:
docker-compose up -d --build处理:
docker-compose build --no-cache backend
docker-compose up -d backend通常表示后端没先起来。
处理:
docker-compose ps
docker-compose logs backend --tail=100
docker-compose restart frontend原因通常是 .dockerignore 把 frontend/dist 排除了,而当前开源版前端正是直接复制这个预编译目录。
检查:
cat .dockerignore
ls frontend/dist确认 .dockerignore 中不要包含:
frontend/dist
原因是 backend_api_python/.env 被只读挂载到容器内。
请检查 docker-compose.yml,确保不要使用:
- ./backend_api_python/.env:/app/.env:ro而应改为可写挂载:
- ./backend_api_python/.env:/app/.env然后执行:
docker-compose up -d backend如果宿主机代理监听在本机 127.0.0.1:10808,容器内不能直接写 127.0.0.1,因为那会指向容器自己。
Docker 部署请改为:
PROXY_URL=socks5h://host.docker.internal:10808如果你已经确认代理和外网访问正常,但日志仍出现某些币对不存在,例如:
Symbol 'MATIC/USDT' not found on okx
这通常是交易所的符号映射/代币更名问题,不一定是网络故障。
检查:
docker-compose ps
curl http://127.0.0.1:8888/health
curl http://127.0.0.1:5000/api/health
sudo nginx -t生产环境建议:
DB_PORT=127.0.0.1:5432不要开放:
54325000
公网只开放:
80443