“
“如果知识注定被锁进付费墙,那就让我们用开源把墙拆掉。”
—— 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|全景鸟瞰:一张图看懂数据流向
↑ 真实截图,深色模式默认开启,对夜猫子极度友好。
-
浏览器 → Next.js 15(App Router) -
服务端 Server Action → Finnhub / TradingView 拿数据 -
用户事件 → Inngest 事件流 → Gemini 生成文案 → Nodemailer 发信 -
全链路 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
-
把 repo 推到 GitHub 私有仓(公开也行) -
Vercel Dashboard → Add New → Git → 选中仓库 -
Environment Variables 逐条粘贴上文 .env
-
Build Command 填 pnpm build
-
Deploy,45 秒后得到 HTTPS 域名 -
进入 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 吧。
行动清单:
-
给仓库点个 Star,让作者继续拆付费墙的砖; -
把第一封 AI 写的欢迎信截图发 Twitter,@ 我,我请咖啡; -
在 Issues 里留下你的脑洞:日内量化?加密货?还是大宗商品?
“
未来的金融工具,属于今晚就把它跑起来的人。
华尔街不欢迎迟到者,但 GitHub 永远 24 小时敞开。