OpenStock — 开源免费的美股 / 加密行情平台

对标付费行情终端(TradingView / Bloomberg 那类)的开源替代品,Next.js 15 + MongoDB 自托管,TradingView 图表 + Finnhub 报价,含自选股、价格提醒邮件、AI 周报摘要,20.5k star、AGPL-3.0。

「Markets, minus the paywall.」一个开源的行情平台,可以白嫖官方托管站 openstock-ods.vercel.app,也可以整份拉到自己的服务器上跑,功能不打折。20.5k star、2.5k fork,社区型项目。

为什么收藏它

  • 不是玩具级 demo。Next.js 15 App Router + React 19 + Tailwind v4 + shadcn/ui,Better Auth 账号体系、MongoDB 存自选股和提醒、Inngest 跑后台任务、Nodemailer 发邮件,是一套完整的生产形态。想抄「开源 SaaS 骨架」的话,这份代码结构(app/ 分层 + lib/actions/ + database/)比大多数模板都值得读。
  • 数据源思路值得借鉴:图表全部走 TradingView 嵌入(免费、实时、还带画线工具和指标),报价走 Finnhub 免费 key。把贵的部分外包给嵌入组件,自己只做聚合与体验——这是低成本做行情产品的关键取舍。
  • 免费 Finnhub key 可以池化。FINNHUB_API_KEYS 支持逗号分隔塞多个 key 轮换,每个 key 加 60 请求/分钟,等于白嫖额度叠加。
  • 两档数据新鲜度可选:cached(默认,每小时更新)和 realtime(15 秒一次 + 价格提醒邮件),靠 NEXT_PUBLIC_OPENSTOCK_DATA_MODE 切,编译期固定。
  • 部署路径齐全:Docker Compose(自带 MongoDB,不对外暴露端口)、ghcr.io/open-dev-society/openstock 预构建镜像(amd64/arm64)、Railway / Vercel / RepoCloud / ZopDay 一键部署,还有 railway.json 和 vercel.json 现成配置。
  • 许可证要留意:AGPL-3.0——自己改完部署成 Web 服务,也必须开源自己的改动。想拿它做闭源商业产品,此路不通。

技术栈与依赖

层用什么
前端Next.js 15、React 19、TypeScript、Tailwind v4、shadcn/ui + Radix
账号 / 数据Better Auth、MongoDB + Mongoose
行情Finnhub(报价、搜索、财报、新闻)、TradingView widgets(图表、热力图、技术面)、Adanos(情绪,可选)
后台任务Inngest(欢迎邮件、价格提醒、周一 AI 周报)
邮件Nodemailer(Gmail 应用密码)、Kit(订阅周报)
AIGemini / MiniMax / Siray(写欢迎邮件和新闻摘要)
部署Vercel(vercel.json 锁孟买 bom1)、Docker、Railway

上手成本

最少三个必填项:MONGODB_URI(Atlas 免费档够用)、BETTER_AUTH_SECRET(openssl rand -hex 32)、FINNHUB_API_KEY(免费注册)。然后 npm ci → 填 .env → node scripts/check-env.mjs 自检 → npm run test:db 验库 → npm run dev。要跑邮件和提醒,本地还得并起 npx inngest-cli@latest dev。

市场覆盖(有坑)

  • 🇺🇸 美股:图表实时、报价和提醒都支持
  • 加密(Binance 交易对):图表实时、报价支持
  • 外汇:只有图表,没有报价
  • 🇨🇦 加拿大 / 🇦🇺 澳洲:图表延迟;🇮🇳 印度 / 🇩🇪 德国:日终
  • 伦敦、东京、港股、韩国等:K 线被 TradingView 屏蔽,只剩财报 / 技术面 / 公司资料

也就是说:A 股和港股不在支持范围里,别指望拿它盯 A 股。详细原因在仓库的 MARKET_SUPPORT.md。

要注意的

  • 官方明确写了「不是券商、数据可能延迟、不构成投资建议」。
  • 免费 Finnhub 的报价是每小时一次(社区版),想 15 秒一次得自备 key 并开 realtime 模式;官方托管的 Cloud 版($5/月,未上线)才有实时报价。
  • 自托管 Docker 的 MongoDB 密码只在卷首次创建时生效,之后改 .env 不会改库密码,重置得删 mongo-data 卷。

以后想拿它做什么

两件事:① 拿它当「开源 SaaS 骨架」的参考实现,看 Better Auth + Inngest + 多数据源聚合是怎么串起来的;② 如果后面真要看美股,直接在甲骨文节点上 Docker 起一份,用自己的 Finnhub key 开 realtime 模式跑价格提醒。

打开原文