← 回 blog 列表 · 2026-05-10

Yieldsforge 技術建構記錄 — Architecture、deploy 坑、設計決策

Yieldsforge 完整技術記錄。Tech stack、為什麼 Bitfinex region 限制是 Railway 用戶獨有的坑、付費系統選 NOWPayments 不選 Stripe 的原因、多用戶 isolation 怎麼做。透明度即信任。

上一篇整理了 Coinlend 流失的結構性原因。這篇是 Yieldsforge 的技術建構記錄 — 架構決定、踩過的坑、tech stack 選擇。

寫給兩種人:

  1. 想知道 Yieldsforge「裡面長怎樣」的潛在用戶 — 透明度即信任
  2. 考慮自己寫類似 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 才看到三個盲點:

  1. 單壓 30d 看起來最賺,實際扣 prepayment 後輸給多桶分散(detail)
  2. Floor 不該全 symbol 一樣 — fUSD spike 多、fUST 沒,要 per-symbol 調校
  3. 「candle.low 就能成交」是嚴重 over-optimistic — 真實 queue 競爭比這嚴

每跑一次 backtest 都暴露一個假設錯。最終策略跟初版面目全非。

完整 backtest 結果 在這篇

架構決定 3: ARQ + Redis 處理多用戶 tick

最初想法: 單一 worker process 每分鐘跑所有用戶的 tick。簡單但有問題:

  1. 100 個用戶 × 60s tick = 1.7 calls/sec to Bitfinex(rate limit 風險)
  2. 一個用戶 tick 卡住會 block 全部
  3. 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 永遠有跨用戶資料外洩風險。

設計:

  1. API key 加密: Fernet 對稱加密 + 全域 master key、只在 worker tick 時短暫解密
  2. DB 所有 query 強制 user_id: 從 ORM 層面強制(SQLAlchemy 預設 query 都帶 user_id where)
  3. 驗證 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 之後的事:

  1. Per-symbol floor 升級 — fUST 從 7.6% APY 升到 17.6%
  2. Cancel_misaligned floor-aware — 配合 floor 改動自動重新定價
  3. Adaptive floor Phase 1 — MarketStats 表開始累積資料、Phase 2 自動調 floor
  4. Dashboard 大改版 — depth chart、donut、pressure bars
  5. 20 篇 blog post 內容生產(就是你現在看的這批)

Roadmap (2026 H2):

  • USDC funding pair
  • Adaptive floor 開放 user opt-in
  • Source code 部分開源
  • Mobile-friendly dashboard

給想自己寫 funding bot SaaS 的人

幾個你不會在 startup 文章看到的真實建議:

  1. Bitfinex region 限制是 deal-breaker — 動手前確認你能在 asia 區 deploy
  2. 多用戶 SaaS 比 personal script 複雜 10x — auth + billing + 跨用戶 isolation + 監控,每個都要做對
  3. 付費系統別試 Stripe — 加密相關業務 ban 機率高、直接 NOWPayments
  4. Backtest 不寫,你不知道自己策略爛 — 直覺策略往往比測過的策略差 2-5pp
  5. Open source 部分模組是行銷力 — 透明度比廣告有效

如果只想自己用 / 跟朋友共享、別寫 SaaS、寫 personal script + 邀請朋友 ssh 進來。SaaS 的法律 + 維運成本不適合 < 10 用戶。

延伸閱讀

Yieldsforge 7 天免費試用 →


揭露: 本文作者是 Yieldsforge 開發者。技術細節基於 repo 實際 code,roadmap 為當前計畫。本文非投資或開發建議。

想試試自動化你的 USDT?

7 天免費試用、不需信用卡。

免費開始