alphax/README_DOCKER.md
2026-05-14 10:32:57 +08:00

5.9 KiB
Raw Blame History

AlphaX Docker 化副本

这是从当前运行中的 /home/ubuntu/quant_monitor/altcoin 复制出来的独立 Docker 化副本,目录:

/home/ubuntu/quant_monitor/alphax-docker

重要原则

  • 这个目录是副本,不影响当前正在运行的 AlphaX。
  • 默认 docker-compose.yml 将 Web 暴露到宿主机 8191,避免占用当前线上 8190
  • 调度器默认 ALPHAX_SCHEDULER_DRY_RUN=1,第一次启动不会真的跑筛选/确认/跟踪任务。
  • SQLite 数据挂载在 ./data/altcoin_monitor.db,容器内路径为 /app/data/altcoin_monitor.db
  • 镜像构建上下文通过 .dockerignore 排除了 data/archive/、真实 .env 和所有 DB 文件,避免把数据库/密钥打进镜像。

快速启动

cd /home/ubuntu/quant_monitor/alphax-docker
cp .env.example .env
# 如需推送,编辑 .env 填 ALTCOIN_FEISHU_WEBHOOK

docker compose build
docker compose up -d alphax-web
curl -s http://127.0.0.1:8191/api/stats

首次使用空库启动时Web 会自动创建一个默认管理员账号:

邮箱admin@alphax.local
密码AlphaXAdmin123

建议首次登录后立刻在账号设置中修改密码。也可以在 .env 中覆盖默认值:

ALPHAX_BOOTSTRAP_ADMIN=1
ALPHAX_DEFAULT_ADMIN_EMAIL=your-admin@example.com
ALPHAX_DEFAULT_ADMIN_PASSWORD=change-me-to-a-strong-password

该初始化只会在 app_user 表完全为空时执行;如果你迁移了旧数据库或已经有用户,不会覆盖任何账号。

确认 Web 正常后,如果要启动调度器:

docker compose up -d alphax-scheduler

调度器默认 dry-run只打印计划不写库。确认日志无误后.env 或 compose 里的:

ALPHAX_SCHEDULER_DRY_RUN=0

再重启:

docker compose up -d alphax-scheduler

服务说明

  • alphax-webFastAPI + 静态页面,容器内 8190宿主机 8191。
  • alphax-scheduler:轻量 Python 调度器,串行执行任务,避免 SQLite 并发锁。

调度任务与当前线上大致对齐:

任务 脚本 间隔
事件舆情 python -m app.services.event_driven_screener --once 60s
价格跟踪 python -m app.services.price_tracker 180s
爆发确认 python -m app.services.altcoin_confirm 600s
粗筛/细筛 python -m app.services.altcoin_screener 900s
舆情采集 python -m app.services.sentiment_monitor --collect 1800s
复盘 python -m app.services.review_engine 24h

验证命令

cd /home/ubuntu/quant_monitor/alphax-docker
python3 -m py_compile app/db/altcoin_db.py app/db/auth_db.py app/core/opportunity_lifecycle.py app/services/altcoin_screener.py app/services/altcoin_confirm.py app/services/price_tracker.py app/services/event_driven_screener.py app/services/sentiment_monitor.py app/services/review_engine.py app/web/web_server.py docker/scheduler.py scripts/validate_docker_layout.py
python3 scripts/validate_docker_layout.py
python3 scripts/validate_state_machine.py
python3 scripts/validate_push_state_flow.py
python3 scripts/validate_signal_recency.py

Docker 配置验证:

docker compose config

当前机器如果没有 Docker只能做离线文件/语法/DB 校验;到有 Docker 的机器上再执行 build/up。

数据迁移

当前副本是从线上目录复制来的,包含复制时刻的 altcoin_monitor.db。为了避免误影响线上,容器读写的是副本目录下的:

./data/altcoin_monitor.db

容器内路径通过环境变量配置:

ALPHAX_DB_PATH=/app/data/altcoin_monitor.db

如需重新以线上最新数据初始化副本,应停掉副本容器后手动复制 DB

cd /home/ubuntu/quant_monitor/alphax-docker
docker compose down
cp /home/ubuntu/quant_monitor/altcoin/altcoin_monitor.db ./data/altcoin_monitor.db

不要反向覆盖线上 DB。

如果旧部署的数据库还在容器内部、尚未挂载到 ./data,可以使用迁移脚本把容器内 DB 迁移到 compose volume

cd /home/ubuntu/quant_monitor/alphax-docker
bash scripts/migrate_container_db_to_volume.sh

脚本会:

  • 用容器内 SQLite backup API 导出一致性快照,包含 WAL 中的数据。
  • 备份已有 ./data/altcoin_monitor.db./data/backups/
  • 把容器内 DB 安装到 ./data/altcoin_monitor.db
  • 重建 alphax-web / alphax-scheduler,让容器使用 volume 中的数据库。

常用参数:

# 指定旧容器名
SOURCE_CONTAINER=old-alphax-web bash scripts/migrate_container_db_to_volume.sh

# 旧容器已经停止也可以复制主 DB如果仍在运行脚本会用更安全的 SQLite backup
ALLOW_STOPPED=1 SOURCE_CONTAINER=old-alphax-web bash scripts/migrate_container_db_to_volume.sh

# 只复制,不自动重启 compose 服务
RECREATE=0 bash scripts/migrate_container_db_to_volume.sh

# 如果脚本检测到 /app/data 已经是挂载卷但仍想强制复制
FORCE=1 bash scripts/migrate_container_db_to_volume.sh

如果脚本提示找不到 alphax-web,先查看服务器上的真实容器名:

docker compose ps
docker ps -a --format 'table {{.Names}}\t{{.Status}}\t{{.Image}}'

然后用真实容器名执行:

SOURCE_CONTAINER=<真实容器名> bash scripts/migrate_container_db_to_volume.sh

打包迁移到新服务器

建议只打包代码和配置骨架,不把 DB 直接打进镜像。可以用 tar 打包整个副本目录,排除本地缓存和归档备份:

cd /home/ubuntu/quant_monitor
tar --exclude='alphax-docker/.git' \
    --exclude='alphax-docker/__pycache__' \
    --exclude='alphax-docker/.pytest_cache' \
    --exclude='alphax-docker/archive' \
    -czf alphax-docker.tar.gz alphax-docker

如果新服务器要带初始 DB可以保留 alphax-docker/data/altcoin_monitor.db;如果希望空库启动,则删除该文件,容器首次启动会创建空 DB 并由 init_db() 补表。