
python-okx 容器化部署把 OKX 交易接口跑上服务器的 5 步 Docker 实践【免费下载链接】python-okx项目地址: https://gitcode.com/GitHub_Trending/py/python-okxpython-okx 是 OKX 交易所 v5 接口的非官方 Python SDK覆盖了行情、交易、账户等全部 REST 端点并提供带重连支持的公共/私有 WebSocket 客户端。本文以把一个基于 python-okx 的策略脚本第一次部署到 Linux 服务器并长期无人值守运行为主线走完安装验证、编写 Dockerfile、用 docker-compose 编排到进程级自愈的完整流程最终得到一个版本锁定、资源受限、崩溃自动恢复、日志自动轮转的容器化策略服务。整个流程分五步先裸环境验证 SDK 能连通 REST 与 WebSocket再写 Dockerfile 构建镜像然后编写策略脚本并接入 compose 编排最后补上 systemd 兜底与监控手段。文中所有 API 调用参数均可在 okx/MarketData.py、okx/Trade.py、okx/websocket/WsPublicAsync.py 等源码中核对。部署前置清单动手前逐项确认任一缺失都会让后续步骤卡住项要求说明服务器Linux x86_64 / arm642GB 可用内存以上参考值容器仅运行单策略时资源占用很低Python3.7裸环境验证推荐 3.11setup.py 中python_requires3.7DockerEngine 20.10Compose v2docker compose version检查网络服务器可直连www.okx.com与ws.okx.com443/8443 出站被防火墙拦截时需配置 HTTP(S) 代理环境变量账户OKX API Key Secret Passphrase仅拉行情可不配下单一律先开 IP 白名单仓库需要对照源码时使用git clone https://gitcode.com/GitHub_Trending/py/python-okx本文所有路径均相对仓库根目录第一步安装 python-okx 并验证连通性先不用 Docker在裸环境里把 SDK 装好并验证两条链路REST WebSocket都通。这样后面容器里再出问题就能区分是环境问题还是镜像问题。安装当前正式版并锁定版本okx/init.py 中__version__为 0.4.4依赖httpx、websockets、loguru等会一并装上pip install python-okx0.4.4然后执行一段内联脚本拉取 BTC-USDT 实时行情——公开行情端点无需任何密钥构造MarketAPI时凭据保持默认值即可# verify_rest.py验证 REST 链路 from okx.MarketData import MarketAPI api MarketAPI() # 公开端点无需密钥 r api.get_ticker(BTC-USDT) # 拉取 BTC-USDT 最新行情 print(r[0][code], r[0][data][0][last]) # code 为 0 表示接口成功预期输出0 64123.5这样的形式第一列是业务码 0后面是最新成交价。若code不是 0先看msg字段多半是网络或 IP 白名单问题。再验证 WebSocket 公共行情链路。下面脚本连接的是 OKX 生产环境公共端点连上后等待服务端消息 3 秒即退出# verify_ws.py验证 WebSocket 链路 import asyncio, json, websockets URL wss://ws.okx.com:8443/ws/v5/public # 生产环境公共频道端点 async def main(): async with websockets.connect(URL) as ws: print(connected) msg await asyncio.wait_for(ws.recv(), timeout3) print(json.loads(msg).get(event, data)) # 首次连接通常先收到 ping 类事件 asyncio.run(main())预期先打印connected再收到一条消息说明 8443 端口出站正常。两条链路都通之后再谈容器化才有意义。如果你要参与开发 SDK 本身或跑仓库自带测试参考 test/config.py 的约定在项目根目录放一个不提交版本库的.env键名为OKX_API_KEY/OKX_API_SECRET/OKX_PASSPHRASE/OKX_FLAG然后pip install -r dev_requirements.txt pip install -e . pytest test/unit/ -v # 运行 test/unit 下的单元测试第二步编写 Dockerfile 并构建镜像这一步只固化运行环境解释器版本、时区、SDK 版本。策略代码稍后通过挂载目录注入改策略不用重建镜像。Dockerfile 放在读者自己的项目目录下称部署目录内容如下FROM python:3.11-slim # 基础镜像体积小的 slim 变体 # 固定时区避免日志时间与策略本地时间对不上 ENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime echo $TZ /etc/timezone # tini 作为 PID 1 正确转发 SIGTERM保证 docker stop 能优雅退出 RUN apt-get update apt-get install -y --no-install-recommends tini \ rm -rf /var/lib/apt/lists/* WORKDIR /app RUN mkdir -p /app/strategies # 策略代码挂载点 # 只装 SDK 及密钥加载依赖版本锁定防止行为漂移 RUN pip install --no-cache-dir python-okx0.4.4 python-dotenv ENTRYPOINT [/usr/bin/tini, --] EXPOSE 8000 # 策略内置健康检查端口 CMD [python, /app/strategies/strategy.py]在部署目录构建并检查产物docker build -t quant-python-okx:1.0 . docker images | grep quant-python-okx预期看到quant-python-okx镜像标签1.0。构建失败几乎都是网络拉取python:3.11-slim超时可配置镜像源后重试。第三步编写策略脚本与 compose 编排3.1 策略脚本健康检查 REST WebSocket 三合一容器要长期无人值守就得有一个能被探测的存活信号。下面这份strategy.py做三件事后台线程起一个 8000 端口的/health服务启动时通过 REST 确认账户接口可达订阅公共tickers频道持续消费行情。放入部署目录的strategies/下import asyncio, json, os, signal, threading from http.server import BaseHTTPRequestHandler, HTTPServer from dotenv import load_dotenv # 从 .env 读取密钥不落代码 from okx.MarketData import MarketAPI from okx.websocket.WsPublicAsync import WsPublicAsync load_dotenv() URL wss://ws.okx.com:8443/ws/v5/public # 生产环境公共端点 # 极简健康检查容器 HEALTHCHECK 与外部监控都打这个端点 class Health(BaseHTTPRequestHandler): def do_GET(self): if self.path /health: self.send_response(200) self.end_headers() self.wfile.write(bok) else: self.send_response(404) self.end_headers() def log_message(self, *args): pass # 静默默认访问日志 def on_message(raw): # WsPublicAsync 收到的原始消息是 JSON 字符串 data json.loads(raw) if data in data: # 行情推送 tick data[data][0][last] print(tick:, tick, flushTrue) threading.Thread( targetlambda: HTTPServer((0.0.0.0, 8000), Health).serve_forever(), daemonTrue, ).start() async def main(): market MarketAPI( # REST 客户端用于启动自检 api_keyos.getenv(OKX_API_KEY), api_secret_keyos.getenv(OKX_API_SECRET), passphraseos.getenv(OKX_PASSPHRASE), use_server_timeTrue, # 用服务器时间戳签名规避容器时钟漂移 ) print(market.get_ticker(BTC-USDT)[0][code], flushTrue) # 0 表示连通 ws WsPublicAsync(urlURL, debugFalse) await ws.start() args [{channel: tickers, instId: BTC-USDT}] await ws.subscribe(args, on_message, idsub001) # 订阅行情 await asyncio.get_running_loop().in_forever() signal.signal(signal.SIGTERM, signal.default_int_handler) if __name__ __main__: try: asyncio.run(main()) except (KeyboardInterrupt, SystemExit): pass预期脚本启动后先打印 REST 自检的code随后行情每有更新就打印一行tick: ...CtrlC 可正常退出。回调里不要做耗时操作否则阻塞 asyncio 事件循环行情消费会整体变慢。3.2 密钥用环境变量注入绝不写死在镜像里在部署目录创建.env不要提交到任何版本库OKX_FLAG的语义与 SDK 一致0实盘、1模拟盘OKX_API_KEY你的api_key OKX_API_SECRET你的api_secret OKX_PASSPHRASE你的passphrase OKX_FLAG1再创建docker-compose.yml关键点是restart: unless-stopped崩溃自启、mem_limit内存封顶、json-file 日志轮转、healthcheck打策略脚本自带的/health端点slim 镜像没有 curl用 Python 标准库探测services: strategy: build: . image: quant-python-okx:1.0 container_name: okx-strategy restart: unless-stopped # 崩溃或宿主机重启后自动拉起 env_file: .env # 注入 API 密钥 environment: - OKX_FLAG${OKX_FLAG} volumes: - ./strategies:/app/strategies # 策略代码热更新改文件无需重建镜像 logging: driver: json-file options: max-size: 10m max-file: 3 # 日志最多 30MB防磁盘写满 mem_limit: 512m # 单策略内存封顶参考值 cpus: 1.0 healthcheck: test: [CMD, python, -c, import urllib.request;urllib.request.urlopen(http://localhost:8000/health,timeout5)] interval: 30s timeout: 10s retries: 3 start_period: 20s启动并验证docker compose up -d sleep 10 curl -s http://localhost:8000/health # 应返回 ok docker compose logs -f strategy # 跟踪策略日志 docker inspect --format{{.State.Health.Status}} okx-strategy # 应为 healthy预期curl返回ok日志里出现code 0自检结果与持续的tick推送健康状态为healthy。修改strategies/strategy.py后docker restart okx-strategy即可加载新版本不需要重新 build。第四步自愈、监控与日常操作容器层的restart只能兜住进程崩溃。如果 docker 守护进程本身挂了容器不会自己起来这时需要 systemd 再加一层# /etc/systemd/system/okx-quant.service [Unit] DescriptionOKX quant strategy (docker compose) Afterdocker.service Requiresdocker.service [Service] WorkingDirectory/opt/quant # 部署目录 ExecStart/usr/bin/docker compose up Restartalways RestartSec10 [Install] WantedBymulti-user.target执行systemctl enable --now okx-quant后compose 层挂掉也会被 systemd 在 10 秒内拉回。日常运维只需记住三组命令docker stats okx-strategy --no-stream # 看容器实时 CPU/内存占用 docker compose logs --tail 100 strategy # 回看最近 100 行日志 docker compose restart strategy # 手动重启策略再往上的监控方向是引入 cAdvisor 或 node-exporter 对接 Prometheus Grafana把healthy状态与 tick 推送频率做成告警这一步取决于你的运维栈不展开。第五步高频报错速查表现象常见原因处理日志出现ConnectionClosed/ 连接 code1006出站网络抖动、防火墙拦截 8443、长时间空闲被对端断开先确认容器能出外网防火墙环境给 compose 增加HTTP_PROXY/HTTPS_PROXY环境变量README 对 1006 有专门说明okx/websocket/ 下的客户端断线后需自行重连REST 签名报错时间戳类错误码容器系统时钟漂移签名用的本地时间戳与服务器偏差过大宿主启用 NTP 校时REST 客户端构造时传use_server_timeTrue以交易所返回时间为准行情正常但账户/交易接口 401API Key 配了 IP 白名单而服务器 IP 变化或flag与 Key 所属环境不匹配核对服务器出口 IP 是否在白名单确认OKX_FLAG0 实盘 / 1 模拟盘与 Key 环境一致模拟盘 Key 却提示请传入有效 flag或误连实盘flag参数默认值是1模拟盘各 API 构造函数签名里可查到生产环境显式传flag0不要依赖默认值建议用环境变量OKX_FLAG单点控制行情停推、容器健康但 tick 不更新回调函数里做了同步耗时操作阻塞了 asyncio 事件循环把重活丢到线程池或独立进程回调只解析与转发写在最后 这套部署的核心思路可以概括为三句话版本锁定python-okx0.4.4python:3.11-slim消除环境差异容器化加资源限制让策略长期无人值守systemd 加健康检查提供双层自动恢复。下一步比较实际的方向有三个按 OKX 版本日志定期升级 SDK 并跑一遍 test/unit/ 回归给策略加上 tick 静默告警多策略时用多个 compose 服务做资源隔离每个服务独立限 CPU 与内存。你的策略脚本里有没有踩过比上表更刁钻的坑评论区见。【免费下载链接】python-okx项目地址: https://gitcode.com/GitHub_Trending/py/python-okx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考