← 回 blog 列表 · 2026-05-10
Yieldsforge 技術建構記錄 — Architecture、deploy 坑、設計決策
Yieldsforge 完整技術記錄。Tech stack、為什麼 Bitfinex region 限制是 Railway 用戶獨有的坑、付費系統選 NOWPayments 不選 Stripe 的原因、多用戶 isolation 怎麼做。透明度即信任。
上一篇整理了 Coinlend 流失的結構性原因。這篇是 Yieldsforge 的技術建構記錄 — 架構決定、踩過的坑、tech stack 選擇。
寫給兩種人:
- 想知道 Yieldsforge「裡面長怎樣」的潛在用戶 — 透明度即信任
- 考慮自己寫類似 SaaS 的開發者 — 我的失敗可以省你時間
TL;DR Tech Stack
- 核心策略: Python + numpy/pandas (
lending_bot/) - Web: FastAPI + fastapi-users (
saas/web/) - Worker: ARQ + Redis (
saas/worker/) - DB: PostgreSQL (multi-tenant)
- Frontend: Astro + Tailwind (
marketing/) + plain HTML+JS (saas dashboard) - Deploy: Railway(3 services + Postgres + Redis)
- Billing: NOWPayments(USDT 加密貨幣)
- Auth: Google OAuth + email/password fallback
- Monitoring: Sentry
- Backtest: 自己寫的 walk-forward + fill model + prepayment model
架構決定 1: 把策略抽成獨立模組
設計目標: lending_bot/ 模組可以獨立用(個人 CLI 跑),也可以被 SaaS 包成多用戶版本。
模組:
- collector.py: 從 Bitfinex 抓 funding book + funding stats
- decision_tree.py: 多桶配置 + floor + ladder 邏輯
- order_manager/: 下單 + 取消 + 重新下單
- strategy_engine.py: 把上面三個串起來,跑 60 秒 tick
好處: 策略邏輯可以單獨 backtest、不用啟動整個 web stack。
架構決定 2: Backtest 引擎決定了策略品質
寫 walk-forward backtest 之前,我們(跟大多數 funding bot 開發者一樣)的策略基於直覺。寫完 backtest 才看到三個盲點:
- 單壓 30d 看起來最賺,實際扣 prepayment 後輸給多桶分散(detail)
- Floor 不該全 symbol 一樣 — fUSD spike 多、fUST 沒,要 per-symbol 調校
- 「candle.low 就能成交」是嚴重 over-optimistic — 真實 queue 競爭比這嚴
每跑一次 backtest 都暴露一個假設錯。最終策略跟初版面目全非。
完整 backtest 結果 在這篇。
架構決定 3: ARQ + Redis 處理多用戶 tick
最初想法: 單一 worker process 每分鐘跑所有用戶的 tick。簡單但有問題:
- 100 個用戶 × 60s tick = 1.7 calls/sec to Bitfinex(rate limit 風險)
- 一個用戶 tick 卡住會 block 全部
- Bitfinex API 偶爾 timeout 需要 retry
換成 ARQ + Redis、每個 (user, symbol) tick 是獨立 job:
- Scheduler 每分鐘 enqueue 所有 jobs
- Worker pool 並發跑(目前 max 20 並發)
- ARQ job_id dedup 避免一分鐘內重複 enqueue
部署坑 1: Bitfinex 對美國 IP 回 HTTP 451
技術上最痛的踩坑。
Railway 預設在 us-west2 開 worker、結果第一個用戶 tick 直接被 Bitfinex 拒絕。原因: Bitfinex 不服務美國管轄區、用 IP 判斷。
這是 Yieldsforge 在 Railway 預設 region 才會踩的坑 — Coinlend / Cryptolend 等老牌 funding bot 都在德國 / 歐洲營運、infrastructure 在 EU,從第一天就沒中。
解法: Worker 必須跑在 asia-southeast1。Railway 多區 deploy 配置 + 確認所有 outbound Bitfinex 流量都從 SG 出去。Web service 仍可在 us-west2(沒 Bitfinex calls)。
這個決策後來變成 CLAUDE.md 的硬規定。任何時候都不能把 worker 移回 US region。
部署坑 2: 多用戶資料 isolation
這是「會爆炸的東西」最多的部分。多租戶 SaaS 永遠有跨用戶資料外洩風險。
設計:
- API key 加密: Fernet 對稱加密 + 全域 master key、只在 worker tick 時短暫解密
- DB 所有 query 強制 user_id: 從 ORM 層面強制(SQLAlchemy 預設 query 都帶 user_id where)
- 驗證 funding-only: 用戶提交 key 後 自動測試 permission、有 withdraw 直接 reject
每個 API endpoint 都做 cross-user fuzz test:「如果用戶 A 帶用戶 B 的 cookie 來、能拿到 B 的資料嗎?」答案永遠要是 No。
設計決定: NOWPayments 不選 Stripe
Stripe 開發體驗最好、但對「crypto-related services」很敏感、可能被 ban。Crypto-adjacent 的業務在 Stripe 上要嘛被拒絕、要嘛之後被 freeze account。
NOWPayments:
- 收 USDT / USDC / BTC / ETH 等加密貨幣
- 轉帳費 0.5%(vs Stripe 2.9% + $0.30)
- 用戶不需信用卡、跟 crypto-native 客群匹配
代價: 開發比 Stripe 痛(API 文件較少、IPN webhook 簽章驗證複雜)。
設計決定: Astro 前端 + plain HTML dashboard
Marketing 站(/, /blog, /privacy):用 Astro + Tailwind。原因: SSG、SEO 友善、build 快、TypeScript 友善。
Dashboard(/dashboard/*):用 plain HTML + vanilla JS、不用 React。原因:
- 資料已經是 server-rendered + 60s polling、不需要 reactive framework
- 無 build step、deploy 快
- bundle size 小
- 所有 chart 都用 inline SVG、不引入 chart library
可能會引發 React 信徒的不滿,但對 dashboard 等級複雜度,Vanilla JS 完全夠用。
i18n: 中英完全對照
所有字串走 translation table、不能 hardcode。中英文版面 100% 平行 — 因為:
- SEO 雙語 indexing
- 維護一致性(中英漂移會讓 brand 不專業)
- 可隨時新增語言(西班牙文、日文等下一階段考慮)
實作: i18n.py 一個 dict、t(key, lang) 查表、無 i18n framework。簡單但有效。
Ship 後持續迭代(2026-05 至今)
Ship 之後的事:
- Per-symbol floor 升級 — fUST 從 7.6% APY 升到 17.6%
- Cancel_misaligned floor-aware — 配合 floor 改動自動重新定價
- Adaptive floor Phase 1 — MarketStats 表開始累積資料、Phase 2 自動調 floor
- Dashboard 大改版 — depth chart、donut、pressure bars
- 20 篇 blog post 內容生產(就是你現在看的這批)
Roadmap (2026 H2):
- USDC funding pair
- Adaptive floor 開放 user opt-in
- Source code 部分開源
- Mobile-friendly dashboard
給想自己寫 funding bot SaaS 的人
幾個你不會在 startup 文章看到的真實建議:
- Bitfinex region 限制是 deal-breaker — 動手前確認你能在 asia 區 deploy
- 多用戶 SaaS 比 personal script 複雜 10x — auth + billing + 跨用戶 isolation + 監控,每個都要做對
- 付費系統別試 Stripe — 加密相關業務 ban 機率高、直接 NOWPayments
- Backtest 不寫,你不知道自己策略爛 — 直覺策略往往比測過的策略差 2-5pp
- Open source 部分模組是行銷力 — 透明度比廣告有效
如果只想自己用 / 跟朋友共享、別寫 SaaS、寫 personal script + 邀請朋友 ssh 進來。SaaS 的法律 + 維運成本不適合 < 10 用戶。
延伸閱讀
- 為什麼長期 Coinlend 用戶會流失
- 5.5 年 walk-forward backtest 結果
- Yieldsforge vs Coinlend 詳細對比
- Funding bot 完整比較
- 為什麼 Bitfinex Funding 是最好的 USDT 收益
揭露: 本文作者是 Yieldsforge 開發者。技術細節基於 repo 實際 code,roadmap 為當前計畫。本文非投資或開發建議。