

我们生活在一个知识被隐藏在付费墙后面的世界。工具被锁定在订阅服务中。今天给大家介绍的OpenStock 是一个开源替代方案,用于替代昂贵的市场平台。它可以跟踪实时价格,设置个性化提醒,并探索详细的公司信息 —— 这个平台完全开放,面向所有人,永久免费使用。
OpenStock 是一款现代化的股票市场应用,采用了 Next.js(App Router)、shadcn/ui 和 Tailwind CSS 技术栈。其认证功能使用 Better Auth,数据持久化使用 MongoDB,市场数据来自 Finnhub,图表和市场视图则通过 TradingView 小部件展示。
注意:OpenStock 是社区共同构建的,不是一个经纪平台。市场数据可能会受到供应商规则和您的配置影响而延迟。这里的内容不构成财务建议。

下面就这个平台进行一些介绍和说明。
•使用 Better Auth + MongoDB 适配器 实现电子邮件/密码认证。•通过 Next.js 中间件强制保护路由。•全局搜索和 Command + K 快捷面板。•快速股票搜索,数据由 Finnhub 支持。•在空闲时显示热门股票;查询进行去抖处理。
•每个用户的自选股保存在 MongoDB 中(每个用户拥有唯一的股票符号)。
•TradingView 股票符号信息、K线图/高级图表、基准线和技术分析。•公司资料和财务小部件。
•Heatmap(热力图)、报价和热门新闻(使用 TradingView 小部件)。
•收集国家、投资目标、风险承受能力、偏好的行业信息。
•AI 个性化欢迎邮件(通过 Gemini 与 Inngest)。•每日新闻摘要邮件(通过定时任务 cron),根据用户的自选股进行个性化定制。
•使用 shadcn/ui 组件、Radix 原生组件、Tailwind v4 设计令牌。•默认启用暗黑主题。
•快捷操作/搜索:Cmd/Ctrl + K。
•Node.js 20+ 和 pnpm 或 npm。•MongoDB 连接字符串(可使用 MongoDB Atlas 或通过 Docker Compose 本地连接)。•Finnhub API 密钥(支持免费层;实时数据可能需要付费)。•Gmail 账户用于邮件(或更新 Nodemailer 传输设置)。•可选:Google Gemini API 密钥(用于 AI 生成的欢迎介绍)。
git clone https://github.com/Open-Dev-Society/OpenStock.git
cd OpenStock
# 选择一个安装方式:
pnpm install
# 或
npm install1.创建一个 .env 文件(请参见环境变量部分)。2.验证数据库连接性:
pnpm test:db# 或者npm run test:dbNext.js 开发模式(Turbopack)
pnpm dev
# 或者
npm run devnpx inngest-cli@latest devpnpm build && pnpm start
# 或者
npm run build && npm start打开 http://localhost:3000 查看应用。
您可以使用 Docker Compose 简单地运行 OpenStock 和 MongoDB。
1.确保已安装 Docker 和 Docker Compose。2.docker-compose.yml 文件包含两个服务:
•openstock(本应用)•mongodb(带有持久化卷的 MongoDB 数据库)
3.创建您的 .env 文件(请参见下面的示例)。对于 Docker 设置,使用本地连接字符串,例如:
MONGODB_URI=mongodb://root:example@mongodb:27017/openstock?authSource=admin4.启动服务栈:
# 在仓库根目录下执行
docker compose up -d mongodb && docker compose up -d --build5.访问应用
•应用地址: http://localhost:3000•MongoDB 可以通过 Docker 网络内的主机 mongodb:27017 访问。
•应用服务依赖于 MongoDB 服务 (depends_on)。•在 Compose 中定义了 MongoDB 根用户的凭证;连接字符串中必须包含 authSource=admin 以进行 root 用户认证。•数据通过 Docker 卷在重启时保持持久化。
services:
mongodb:
image: mongo:7
container_name: mongodb
restart:unless-stopped
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: example
ports:
-"27017:27017"
volumes:
- mongo-data:/data/db
healthcheck:
test:["CMD","mongosh","--eval","db.adminCommand('ping')"]
interval:10s
timeout:5s
retries:5
volumes:
mongo-data:在项目根目录创建 .env 文件。根据需要选择使用托管的 MongoDB(如 Atlas)URI 或本地 Docker URI。
# 核心设置
NODE_ENV=development
# 数据库(Atlas)
MONGODB_URI=mongodb+srv://<user>:<pass>@<cluster>/<db>?retryWrites=true&w=majority
# Better Auth
BETTER_AUTH_SECRET=your_better_auth_secret
BETTER_AUTH_URL=http://localhost:3000
# Finnhub
FINNHUB_API_KEY=your_finnhub_key
# 如果客户端代码需要,可以使用客户端暴露的变量:
NEXT_PUBLIC_FINNHUB_API_KEY=
FINNHUB_BASE_URL=https://finnhub.io/api/v1
# Inngest AI(Gemini)
GEMINI_API_KEY=your_gemini_api_key
# 邮件(通过 Nodemailer 使用 Gmail;如果启用了 2FA,请考虑使用应用密码)
NODEMAILER_EMAIL=youraddress@gmail.com
NODEMAILER_PASSWORD=your_gmail_app_password# 核心设置
NODE_ENV=development
# 数据库(Docker)
MONGODB_URI=mongodb://root:example@mongodb:27017/openstock?authSource=admin
# Better Auth
BETTER_AUTH_SECRET=your_better_auth_secret
BETTER_AUTH_URL=http://localhost:3000
# Finnhub
FINNHUB_API_KEY=your_finnhub_key
NEXT_PUBLIC_FINNHUB_API_KEY=
FINNHUB_BASE_URL=https://finnhub.io/api/v1
# Inngest AI(Gemini)
GEMINI_API_KEY=your_gemini_api_key
# 邮件(通过 Nodemailer 使用 Gmail;如果启用了 2FA,请考虑使用应用密码)
NODEMAILER_EMAIL=youraddress@gmail.com
NODEMAILER_PASSWORD=your_gmail_app_password•尽可能将私密密钥保留在服务器端。•如果使用了 NEXT_PUBLIC_ 变量,请记住这些变量会暴露给浏览器。•在生产环境中,建议使用专用的 SMTP 提供商,而不是个人 Gmail 账户。•不要在 Dockerfile 中硬编码密钥;请使用.env 文件和 Docker Compose 进行管理。
•提供股票搜索、公司资料和市场新闻。•设置 FINNHUB_API_KEY 和 FINNHUB_BASE_URL(默认值: https://finnhub.io/api/v1)。•免费层可能会返回延迟的报价;请遵守速率限制和相关条款。
•用于图表、热力图、报价和时间线的嵌入式小部件。•从 i.ibb.co 加载的外部图片已在 next.config.ts 中被列入白名单。
•使用 MongoDB 适配器的电子邮件/密码认证。•会话验证通过中间件完成;大多数路由都受到保护,只有注册、登录、资源和 Next.js 内部页面是公开的。
•工作流:•app/user.created → AI 个性化欢迎邮件。•Cron 0 12 * * * → 每日新闻摘要邮件(基于用户的自选股)。•本地开发:npx inngest-cli@latest dev。
•使用 Gmail 传输。更新凭证或切换到您的 SMTP 提供商。•欢迎邮件和新闻摘要邮件的模板。
•dev: 启动 Next.js 开发服务器(使用 Turbopack)。•build: 生产环境构建(使用 Turbopack)。•start: 运行生产环境服务器。•lint: 使用 ESLint 检查代码。•test:db: 验证数据库连接。
•启用 TypeScript 严格模式。•使用 Tailwind CSS v4(无需单独配置 tailwind.config)。•使用 shadcn/ui 组件和 Radix 原生组件。•支持 cmdk 命令面板、next-themes、lucide-react 图标。
🤗好了,今天的分享就到这里了,我们下期见~~~
https://github.com/Open-Dev-Society/OpenStock?tab=readme-ov-file