#!/usr/bin/env bash # 影子采集器的机器初始化。幂等,可重复跑。 # # 用途:在另一台机器(如 AWS)上部署一套完全相同的采集,用来看不同地理位置 # 的数据采集有无差异。要比的主要是延迟——「本地接收 − K线收盘」这个量直接 # 取决于机器到交易所的网络距离。 # # 时钟同步是硬前置条件,不是可选项。所有延迟数字都是本地时钟减交易所时间戳, # 时钟偏 50ms 就等于所有延迟凭空多(或少)50ms,而且不会有任何报错。所以这里 # 装并启用 NTP,start.sh 里还会再校验一次、不合格拒绝启动。 # # bash research/live/deploy/setup.sh set -euo pipefail IMAGE="${SHADOW_IMAGE:-hummingbot/hummingbot:latest}" say() { printf '\n\033[1m==> %s\033[0m\n' "$*"; } say "系统信息" uname -a echo "内存:$(free -g | awk '/^Mem:/{print $2"GB 总 / "$7"GB 可用"}')" echo "CPU:$(nproc) 核" say "安装 docker" if command -v docker >/dev/null 2>&1; then echo "已有 docker $(docker --version)" else if command -v apt-get >/dev/null 2>&1; then sudo apt-get update -qq sudo apt-get install -y -qq ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg \ | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg . /etc/os-release echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \ https://download.docker.com/linux/ubuntu ${VERSION_CODENAME} stable" \ | sudo tee /etc/apt/sources.list.d/docker.list >/dev/null sudo apt-get update -qq sudo apt-get install -y -qq docker-ce docker-ce-cli containerd.io elif command -v dnf >/dev/null 2>&1; then # Amazon Linux 2023 sudo dnf install -y -q docker sudo systemctl enable --now docker else echo "不认识的包管理器,请手动装 docker" >&2 exit 1 fi sudo usermod -aG docker "$USER" || true echo "已装 docker。若本次 shell 无权限,重新登录后再跑 start.sh" fi say "启用时钟同步(延迟测量的前置条件)" if command -v chronyc >/dev/null 2>&1; then echo "已有 chrony" elif command -v apt-get >/dev/null 2>&1; then sudo apt-get install -y -qq chrony elif command -v dnf >/dev/null 2>&1; then sudo dnf install -y -q chrony fi sudo systemctl enable --now chrony 2>/dev/null \ || sudo systemctl enable --now chronyd 2>/dev/null || true sleep 3 if command -v chronyc >/dev/null 2>&1; then chronyc tracking | grep -E 'Reference ID|System time|Last offset' || true else timedatectl 2>/dev/null | grep -i synchron || true fi say "拉镜像 $IMAGE" docker pull "$IMAGE" docker image inspect "$IMAGE" --format '摘要 {{index .RepoDigests 0}}' 2>/dev/null || true say "准备输出目录" REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)" mkdir -p "$REPO_ROOT/research/out" echo "$REPO_ROOT/research/out" say "完成" cat <<'EOF' 下一步: SHADOW_SITE=aws-tokyo bash research/live/deploy/start.sh SHADOW_SITE 必须显式给且两台机器不能相同——它会写进每一行数据, 是之后区分数据来源的唯一依据。 EOF