Files
claude_dev 4fccfad4ca
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 21s
CI/CD / nas-verify (push) Successful in 2s
fix(nas): 固化容器 --init 铁律(防后台回测被清复发)
- docker-compose.yml vnpy 服务加 init:true(供未来 compose 部署)
- three-env-code-promote.md 新增 §9:NAS 容器必须 --init 创建,
  手动重建命令+image(pre-init-rebuild勿用with-sqlite)+复发风险(手动rm+run)
根因:无init时docker exec nohup后台进程会话结束后被清(02 day0 4min被清)
ci-cd只restart不重建,--init保留;唯一丢--init路径=手动rm+run
2026-08-01 08:49:32 +08:00

264 lines
6.3 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
version: '3.8'
# Sanguo VeighNa Docker 编排配置
# 用于 NAS 部署和开发环境
# 支持环境变量配置和绑定挂载
# 加载环境变量
# 使用前请复制 .env.example 为 .env 并修改配置
services:
# ============================================
# VeighNa 核心服务
# ============================================
vnpy:
build:
context: ..
dockerfile: docker/Dockerfile
container_name: sanguo-vnpy
restart: unless-stopped
init: true # tini 作 PID1, 防 docker exec nohup 后台进程被清(见 docs/three-env-code-promote.md §9)
# 容器名称
hostname: vnpy-server
# 环境变量
environment:
# Python 配置
- PYTHONUNBUFFERED=1
- PYTHONDONTWRITEBYTECODE=1
- TZ=${TZ:-Asia/Shanghai}
# VeighNa 配置
- VNPY_LOG_LEVEL=${VNPY_LOG_LEVEL:-INFO}
- VNPY_LOG_FILE=${VNPY_LOG_FILE:-/app/logs/vnpy.log}
# 数据库配置
- DB_TYPE=${DB_TYPE:-sqlite}
- DB_PATH=${DB_PATH:-/app/data/vnpy.db}
# Web 服务配置
- WEB_HOST=${WEB_HOST:-0.0.0.0}
- WEB_PORT=${WEB_PORT:-8000}
- WEB_WORKERS=${WEB_WORKERS:-2}
# 安全配置
- JWT_SECRET_KEY=${JWT_SECRET_KEY:-change-this-to-a-random-secret-key}
- SESSION_TIMEOUT=${SESSION_TIMEOUT:-3600}
# Redis 配置
- REDIS_HOST=${REDIS_HOST:-redis}
- REDIS_PORT=${REDIS_PORT:-6379}
- REDIS_PASSWORD=${REDIS_PASSWORD:-}
# PostgreSQL 配置
- POSTGRES_DB=${POSTGRES_DB:-vnpy}
- POSTGRES_USER=${POSTGRES_USER:-vnpy}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-vnpy_password_change_me}
- POSTGRES_HOST=${POSTGRES_HOST:-postgres}
- POSTGRES_PORT=${POSTGRES_PORT:-5432}
# 开发选项
- SKIP_REDIS_CHECK=${SKIP_REDIS_CHECK:-0}
- USE_POSTGRES=${USE_POSTGRES:-0}
- DEBUG=${DEBUG:-0}
# 端口映射
ports:
- "${HTTP_PORT:-8000}:8000" # HTTP API
- "${WS_PORT:-8080}:8080" # WebSocket
# 数据卷 - 使用绑定挂载到 NAS stock 目录
volumes:
# 数据持久化目录 - 挂载到 NAS stock 目录
- ${DATA_DIR}/data:/app/data
- ${DATA_DIR}/logs:/app/logs
- ${DATA_DIR}/config:/app/config
- ${DATA_DIR}/temp:/app/temp
# 配置文件(只读)- 如果有外部配置
- ../config:/app/config:ro
# 网络
networks:
- vnpy-network
# 依赖项
depends_on:
- redis
# 资源限制
deploy:
resources:
limits:
cpus: '${VNPY_CPU_LIMIT:-2.0}'
memory: ${VNPY_MEMORY_LIMIT:-2G}
reservations:
cpus: '${VNPY_CPU_RESERVATION:-0.5}'
memory: ${VNPY_MEMORY_RESERVATION:-512M}
# ============================================
# Redis 服务(缓存和消息队列)
# ============================================
redis:
image: redis:7-alpine
container_name: sanguo-redis
restart: unless-stopped
# 命令参数
command: >
sh -c '
if [ -n "${REDIS_PASSWORD}" ]; then
redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}
else
redis-server --appendonly yes
fi
'
# 环境变量
environment:
- TZ=${TZ:-Asia/Shanghai}
# 数据卷 - 挂载到 NAS stock 目录
volumes:
- ${DATA_DIR}/redis:/data
# 网络
networks:
- vnpy-network
# 资源限制
deploy:
resources:
limits:
cpus: '${REDIS_CPU_LIMIT:-0.5}'
memory: ${REDIS_MEMORY_LIMIT:-256M}
# ============================================
# Nginx 反向代理(可选)
# ============================================
nginx:
image: nginx:alpine
container_name: sanguo-nginx
restart: unless-stopped
profiles:
- nginx
- ${ENABLE_NGINX:+nginx}
# 环境变量
environment:
- TZ=${TZ:-Asia/Shanghai}
# 端口映射
ports:
- "${NGINX_HTTP_PORT:-80}:80"
- "${NGINX_HTTPS_PORT:-443}:443"
# 配置文件
volumes:
- ../docker/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ${DATA_DIR}/nginx/ssl:/etc/nginx/ssl:ro
- ${DATA_DIR}/nginx/cache:/var/cache/nginx
- ${DATA_DIR}/logs/nginx:/var/log/nginx
# 依赖项
depends_on:
- vnpy
# 网络
networks:
- vnpy-network
# 资源限制
deploy:
resources:
limits:
cpus: '${NGINX_CPU_LIMIT:-0.5}'
memory: ${NGINX_MEMORY_LIMIT:-256M}
# ============================================
# PostgreSQL 数据库(可选,升级用)
# ============================================
postgres:
image: postgres:15-alpine
container_name: sanguo-postgres
restart: unless-stopped
profiles:
- postgres
- ${USE_POSTGRES:+postgres}
# 环境变量
environment:
- POSTGRES_DB=${POSTGRES_DB:-vnpy}
- POSTGRES_USER=${POSTGRES_USER:-vnpy}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-vnpy_password_change_me}
- TZ=${TZ:-Asia/Shanghai}
- PGDATA=/var/lib/postgresql/data/pgdata
# 数据卷 - 挂载到 NAS stock 目录
volumes:
- ${DATA_DIR}/postgres:/var/lib/postgresql/data
# 网络
networks:
- vnpy-network
# 资源限制
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
# ============================================
# 网络定义
# ============================================
networks:
vnpy-network:
name: sanguo_vnpy_network
driver: bridge
# ============================================
# 使用说明
# ============================================
#
# 基本使用:
#
# 1. 首次使用前,配置环境变量:
# cp .env.example .env
# vi .env # 修改 DATA_DIR 等配置
#
# 2. 创建数据目录:
# mkdir -p ${DATA_DIR}/{data,logs,config,temp,redis,nginx}
#
# 3. 启动核心服务:
# docker-compose up -d
#
# 4. 启动所有服务(含 Nginx):
# docker-compose --profile nginx up -d
#
# 5. 启动所有服务(含 PostgreSQL:
# docker-compose --profile postgres up -d
#
# 管理命令:
#
# 查看日志:
# docker-compose logs -f vnpy
#
# 停止服务:
# docker-compose down
#
# 重启服务:
# docker-compose restart vnpy
#
# 进入容器:
# docker-compose exec vnpy bash
#
# 更新并重启:
# docker-compose up -d --build
#
# 数据备份:
# tar czf vnpy_backup_$(date +%Y%m%d).tar.gz ${DATA_DIR}
#
# ============================================