“如果知识注定被锁进付费墙,那就让我们用开源把墙拆掉。”
—— Open Dev Society


01|故事开场:一个「打工人」的凌晨 2 点

凌晨 2 点,@Leo 还在刷手机。
他刚把年终奖塞进美股,结果一觉醒来账户绿了。
“要是能有个仪表盘,把我在 Notion 里的自选股票、实时价格和 AI 简报一次性看完,而且**不!要!钱!**就好了。”

Leo 不是金融大鳄,只是一名普通前端。
但他懂开源,也懂 Next.js。
于是,他花了 30 分钟——真的只有 30 分钟——把 OpenStock 克隆到本地,让 MongoDB 跑在 Docker,让 AI 写欢迎信,让 Vercel 自动部署。
第二天,他把链接甩到群里,30 分钟后收获了 52 个 Star。

下面,就是 Leo 的可复现笔记
你不需要金融背景,也不需要买服务器;一台能跑 Node 20 的笔记本 + 免费 Mongo Atlas 足矣。


02|全景鸟瞰:一张图看懂数据流向

架构
↑ 真实截图,深色模式默认开启,对夜猫子极度友好。

  1. 浏览器 → Next.js 15(App Router)
  2. 服务端 Server Action → Finnhub / TradingView 拿数据
  3. 用户事件 → Inngest 事件流 → Gemini 生成文案 → Nodemailer 发信
  4. 全链路 TypeScript,93.4% 类型覆盖,把 any 按在地上摩擦。

03|30 分钟跑通本地:把命令行敲成鼓点

步骤 命令 & 说明 预计耗时
① 克隆 git clone https://github.com/Open-Dev-Society/OpenStock.git && cd OpenStock 30 s
② 装包 pnpm i (npm 亦可) 60 s
③ 起数据库 docker run -d -p 27017:27017 --name mongo mongo:7 45 s
④ 环境变量 cp .env.example .env 然后照下表填 90 s
⑤ 跑开发 pnpm dev 同时另开终端 npx inngest-cli@latest dev 30 s

.env 最少只需要 4 组钥匙:

MONGODB_URI=mongodb://localhost:27017/openstock
BETTER_AUTH_SECRET=任意 32 位随机串
FINNHUB_API_KEY=去 https://finnhub.io 免费领
GEMINI_API_KEY=Google AI Studio 一键开通

浏览器打开 http://localhost:3000,看到深色 K 线图,恭喜,你已拥有本地版 Bloomberg。


04|把 AI 塞进邮件:让 Gemini 替你写“投资心语”

Inngest 的函数放在 lib/inngest/functions.ts,核心 12 行:

export const sendWelcomeEmail = inngest.createFunction(
  { id: 'ai-welcome' },
  { event: 'app/user.created' },
  async ({ event, step }) => {
    const { email, name, risk } = event.data;
    const prompt = `用 50 字为${risk}型投资者${name}写一句美股寄语`;
    const copy = await step.ai.infer('gemini', prompt); // 自动重试
    await step.run('nodemailer', () => transporter.sendMail({
      from: NODEMAILER_EMAIL,
      to: email,
      subject: '欢迎来到 OpenStock',
      html: `<h1>${copy}</h1>`
    }));
  }
);
  • Token 成本:1000 用户 × 30 字 ≈ 0.18 美元 / 月
  • 失败重试:指数退避 1 s → 2 s → 4 s,第 5 次推送到你的 Discord 频道。

05「How-To」把项目免费部署到 Vercel

  1. 把 repo 推到 GitHub 私有仓(公开也行)
  2. Vercel Dashboard → Add New → Git → 选中仓库
  3. Environment Variables 逐条粘贴上文 .env
  4. Build Command 填 pnpm build
  5. Deploy,45 秒后得到 HTTPS 域名
  6. 进入 Settings → Cron,加一条 0 12 * * * 指向 /api/inngest,每日午时自动聚合新闻并推邮件。

提示:免费额度 100 GB·h,实测 1k 日活仍远未耗尽。


06|常见疑问 FAQ

Q1:Finnhub 免费 Key 延迟多久?
A:美股 15 分钟,加密货实时;日内策略党请升级付费。

Q2:我不想用 Gmail,能换企业邮箱吗?
A:把 lib/nodemailer/transporter.ts 里的 createTransport 换成任意 SMTP 字符串即可,SendGrid、Mailgun 同理。

Q3:可以把 AI 模型换成本地 Llama-3 吗?
A:把 step.ai.infer 改成调用 http://localhost:11434/api/generate,Inngest 依旧负责重试与调度,零业务代码改动

Q4:WebSocket 实时盘口什么时候上?
A:官方 Roadmap 已开 Issue,预计 2025 Q4 引入 Next.js 15 + Server-Sent Events,欢迎 PR。


07|尾声:开源不是口号,是 Ctrl+C、Ctrl+V 之后的再创造

Leo 把项目丢给同事,他们顺手加了「人民币计价」和「碳排放行业」板块——代码公开,创意无限。
如果你也曾因为“昂贵的 API”或“复杂的 Auth”而止步,那就让 OpenStock 成为你的下一个 side project 吧。

行动清单

  1. 给仓库点个 Star,让作者继续拆付费墙的砖;
  2. 把第一封 AI 写的欢迎信截图发 Twitter,@ 我,我请咖啡;
  3. 在 Issues 里留下你的脑洞:日内量化?加密货?还是大宗商品?

未来的金融工具,属于今晚就把它跑起来的人。
华尔街不欢迎迟到者,但 GitHub 永远 24 小时敞开。