PolymarketClickHouse Workshops

การแก้ปัญหา Polymarket

ขั้นตอนกู้คืนที่แน่ชัดสำหรับความล้มเหลวของการตั้งค่า ต้นทางข้อมูล collector และ ClickHouse

Your computer
macOS terminal: Run workshop commands in Terminal using zsh or bash.

Windows และ WSL 2

ทุกหัวข้อในส่วนนี้ถือว่าคุณใช้สภาพแวดล้อม Windows ที่รองรับตาม 00 ตั้งค่า: Ubuntu บน WSL 2 พร้อม Docker Desktop WSL integration

คำสั่ง "not recognized" ใน PowerShell

อาการ: PowerShell ปฏิเสธ ./preflight.sh, source, export หรือคำสั่งอื่นของ เวิร์กช็อป

สาเหตุ: PowerShell ใช้เฉพาะกับขั้นตอน bootstrap ของ WSL ที่ระบุป้ายไว้ในโมดูล 00 เท่านั้น คำสั่ง ของเวิร์กช็อปทุกคำสั่งรันภายใน Ubuntu

เปิด Ubuntu จากเมนู Start กลับไปที่ไดเรกทอรีของแล็บ และ source ไฟล์สภาพแวดล้อม อีกครั้ง -- เชลล์ใหม่ไม่ได้รับค่าสืบทอดมา:

cd "$(git rev-parse --show-toplevel)/workshop_public/polymarket"
set -a; source ./.env.polymarket; set +a
./preflight.sh

repository อยู่ใต้ /mnt/c

อาการ: Docker bind mount ช้า ./preflight.sh รายงานข้อผิดพลาดเรื่องสิทธิ์ หรือ pwd เริ่มต้นด้วย /mnt/c/Users/

สาเหตุ: การ clone ลงไปอยู่บนไฟล์ระบบของ Windows แทนที่จะเป็นไฟล์ระบบ Linux ของ WSL

Clone สำเนาใหม่ที่สะอาดลงในไดเรกทอรี home ของ Linux และย้ายมาเพียงไฟล์ .env.polymarket ที่คุณกรอกไว้เท่านั้น:

cd ~
git config --global core.autocrlf input
git clone https://github.com/ClickHouse/ClickHouse_Demos.git
cd ClickHouse_Demos
git switch build-workshop-v1
cd "$(git rev-parse --show-toplevel)/workshop_public/polymarket"
cp .env.polymarket.example .env.polymarket

Ubuntu กำลังรันเป็น WSL 1

อาการ: wsl --list --verbose แสดง Ubuntu เป็น VERSION 1 หรือ Docker Desktop ทำ integration กับ distro ไม่ได้

ใน PowerShell แบบ Administrator:

wsl --set-version Ubuntu 2
wsl --set-default-version 2
wsl --list --verbose

docker ใช้ไม่ได้ภายใน Ubuntu

อาการ: Docker Desktop กำลังรัน แต่ Ubuntu รายงาน docker: command not found หรือ เข้าถึง daemon ไม่ได้

เปิด Docker Desktop -> Settings -> General -> Use the WSL 2 based engine และ Settings -> Resources -> WSL Integration -> Ubuntu บันทึกการเปลี่ยนแปลง รัน wsl --shutdown ใน PowerShell แล้วเปิด Ubuntu ใหม่ หลังจากนั้น docker version ต้องแสดงทั้งส่วน Client และ Server อย่าติดตั้ง Docker Engine ตัวที่สองด้วย apt

WSL หรือ Docker หน่วยความจำหมด

อาการ: คอนเทนเนอร์ของ collector ถูก kill หรือรีสตาร์ตวนซ้ำ docker compose ... up --build ล้มเหลวกลางทาง หรือ docker info --format '{{.MemTotal}}' รายงานค่าต่ำกว่า 4 GB อยู่มาก

สาเหตุ: แบ็กเอนด์ WSL 2 ของ Docker Desktop ถูกจำกัดด้วยเครื่องเสมือน WSL ซึ่งขีดจำกัด ค่าเริ่มต้นเป็นเพียงเศษส่วนของ RAM ของโฮสต์ และอาจน้อยมากบนเครื่องที่มี distro อื่นรันอยู่

ปิด Docker Desktop เปิด PowerShell และตั้งขีดจำกัดอย่างชัดเจน:

@('[wsl2]', 'memory=4GB', 'processors=2') |
  Set-Content -Encoding ascii "$env:USERPROFILE\.wslconfig"
wsl --shutdown

เริ่ม Docker Desktop เปิด Ubuntu ใหม่ source .env.polymarket อีกครั้ง แล้วรัน ./preflight.sh อีกรอบ

สคริปต์รายงาน /usr/bin/env: 'bash\r': No such file or directory

อาการ: ./preflight.sh ล้มเหลวทันทีและข้อผิดพลาดมีคำว่า bash\r หรือ ^M

สาเหตุ: ตัวจบบรรทัดแบบ CRLF ของ Windows เข้าไปแทนตัวจบบรรทัดแบบ LF ที่ repository ต้องการ มักเพราะ core.autocrlf เป็น true ตอนที่คุณ clone

git config --global core.autocrlf input
git status --short
git add --renormalize .

ตรวจ git status ก่อนจะทิ้งอะไรก็ตาม หาก checkout นั้นไม่มีงานที่คุณต้องใช้ การ clone ใหม่ ที่สะอาดไว้ใต้ ~/ClickHouse_Demos เป็นวิธีกู้คืนที่ปลอดภัยที่สุด

ไฟล์สภาพแวดล้อมมีตัวจบบรรทัดแบบ Windows

อาการ: printf แสดงชื่อโฮสต์ที่ดูสมเหตุสมผล แต่ ./preflight.sh หรือ clickhouse client resolve มันไม่ได้ หรือ TLS handshake ล้มเหลวโดยไม่มีสาเหตุที่มองเห็น

สาเหตุ: .env.polymarket ถูกบันทึกด้วยโปรแกรมแก้ไขของ Windows ทำให้ทุกค่าลงท้ายด้วย carriage return ตัว set -a; source เก็บมันไว้ และ CLICKHOUSE_HOST กลายเป็น host\r

sed -i 's/\r$//' .env.polymarket
set -a; source ./.env.polymarket; set +a
printf 'host=[%s]\n' "$CLICKHOUSE_HOST"
./preflight.sh

ผลที่ควรได้: วงเล็บปิดอยู่ติดกับชื่อโฮสต์ทันที บนบรรทัดเดียวกัน จากนี้ไปให้แก้ ไฟล์ภายใน Ubuntu

health endpoint ไม่เปิดในเบราว์เซอร์ Windows

อาการ: curl http://localhost:8090/health ใช้ได้ใน Ubuntu แต่ URL เดียวกันล้มเหลวใน เบราว์เซอร์ของ Windows

สาเหตุ: การฟอร์เวิร์ด localhost ของ WSL ถูกตั้งขึ้นต่อการบูตหนึ่งครั้ง และอาจหลุดไปหลังเครื่อง sleep หรือหลัง wsl --shutdown

ยืนยันพอร์ตจาก Ubuntu ก่อน หากเบราว์เซอร์ยังเข้าไม่ได้ ให้รัน wsl --shutdown ใน PowerShell แล้วเปิด Ubuntu ใหม่:

curl --fail --silent http://localhost:8090/health | python3 -m json.tool

terminal เป็นตัวชี้ขาดของทุกขั้นตอนการตรวจสอบในเวิร์กช็อปนี้ เบราว์เซอร์เป็นแค่ ความสะดวก

เครือข่ายในห้องเรียนบล็อก Polymarket

อาการ: preflight เข้าถึง Gamma ไม่ได้ หรือ health ค้างอยู่ที่ degraded พร้อมข้อผิดพลาดของต้นทาง

sed -i.bak 's/^POLYMARKET_MODE=.*/POLYMARKET_MODE=fixture/' .env.polymarket
set -a; source ./.env.polymarket; set +a
docker compose --env-file .env.polymarket up -d --build --force-recreate collector
curl --fail --silent http://localhost:8090/health | python3 -m json.tool

ผลที่ควรได้: status เป็น fixture ข้อมูลเพิ่มขึ้นทุกห้าวินาที

health แจ้งว่า websocket_stale_rest_active

กรณีนี้กู้คืนได้เมื่อ last_trade_reconcile_at และ last_book_fallback_at ยัง เดินหน้าต่อ ตัว collector จะเชื่อมต่อใหม่แบบ backoff อย่ารีสตาร์ตมันซ้ำ ๆ

docker compose --env-file .env.polymarket logs --tail=50 collector
sleep 35
curl --fail --silent http://localhost:8090/health | python3 -m json.tool

ใช้โหมด fixture เฉพาะเมื่อ timestamp ของ REST ทั้งสองค่ายังเป็น null หรือค้างเก่า

health แจ้งว่า clickhouse_write_retrying หรือ clickhouse_write_stalled

ขณะที่โปรเซสยังทำงาน แบตช์นั้น ๆ ยังอยู่ในหน่วยความจำและจะลองใหม่ด้วย token การตัดข้อมูลซ้ำ ตัวเดิม แก้ค่าของ Cloud ให้ถูก source ไฟล์ แล้วสร้าง collector ขึ้นใหม่:

${EDITOR:-vi} .env.polymarket
set -a; source ./.env.polymarket; set +a
./preflight.sh
docker compose --env-file .env.polymarket up -d --force-recreate collector

อย่า drop ตาราง การลองใหม่นั้นปลอดภัย

การบังคับสร้างใหม่จะทิ้ง quote tick ที่ยังอยู่แค่ในหน่วยความจำไป ตัว collector ที่รีสตาร์ตแล้วจะ เติมข้อมูล book ปัจจุบันกลับมาผ่าน REST และกระทบยอดการเทรดสาธารณะจาก checkpoint ที่ได้รับการยืนยันล่าสุด เวิร์กช็อปนี้ไม่ได้อ้างว่ามีคิวบนเครื่องที่ทนทาน

ปรากฏข้อความ missing ClickHouse tables

โมดูล 02 ถูกข้ามไป หรือรันกับบริการอื่น source ไฟล์ปัจจุบันแล้วตรวจสอบ:

set -a; source ./.env.polymarket; set +a
clickhouse client \
  --host "$CLICKHOUSE_HOST" \
  --port "$CLICKHOUSE_PORT" \
  --user "$CLICKHOUSE_USER" \
  --password "$CLICKHOUSE_PASSWORD" \
  --secure \
  --query "SHOW TABLES FROM polymarket"

กลับไปทำโมดูล 02 หากมีออบเจ็กต์ใดขาดไป

คิวรีตัวที่ขยับแรงให้ผลว่างเปล่า

มันต้องมีข้อมูลการสังเกตอยู่ทั้งสองฝั่งของขอบเขตห้านาที รอจนกว่า collector รันมาแล้วอย่างน้อยหกนาที หรือใช้โหมด fixture หากคลาสมีเวลาจำกัด

พอร์ต 8090 ถูกใช้อยู่แล้ว

เปลี่ยน POLYMARKET_HEALTH_PORT ใน .env.polymarket source มัน แล้วสร้างใหม่:

sed -i.bak 's/^POLYMARKET_HEALTH_PORT=.*/POLYMARKET_HEALTH_PORT=8091/' .env.polymarket
set -a; source ./.env.polymarket; set +a
docker compose --env-file .env.polymarket up -d --force-recreate collector
curl --fail --silent http://localhost:8091/health | python3 -m json.tool

ในหน้านี้

Track your progress?

Optional. We email a link to confirm your address; progress records once you open it.

Please use your work email address, not a personal one.

Progress tracking also requires accepting the current Terms of Service in Privacy settings.

TH