การแก้ปัญหา Polymarket
ขั้นตอนกู้คืนที่แน่ชัดสำหรับความล้มเหลวของการตั้งค่า ต้นทางข้อมูล collector และ ClickHouse
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.shrepository อยู่ใต้ /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.polymarketUbuntu กำลังรันเป็น 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 --verbosedocker ใช้ไม่ได้ภายใน 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.toolterminal เป็นตัวชี้ขาดของทุกขั้นตอนการตรวจสอบในเวิร์กช็อปนี้ เบราว์เซอร์เป็นแค่ ความสะดวก
เครือข่ายในห้องเรียนบล็อก 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