快速开始
从零开始搭建 01MVP 本地开发环境
前置要求
开始之前,先把本地开发会用到的东西备齐。这里先不要求你买域名、配置 Cloudflare 或接支付;那些是上线前的准备。
本地开发必需
node --version # 需要 v24.x
vp --version # 需要 Vite Plus CLI
git --version # 任意版本即可| 工具 | 最低版本 | 安装方式 |
|---|---|---|
| Node.js | 24.x | 官网下载 或 nvm install 24 |
| Vite Plus CLI | 0.1.22+ | curl -fsSL https://vite.plus | bash 或 npm install -g vite-plus |
| Git | 任意 | macOS 自带;Windows 用 Git for Windows |
| PostgreSQL | 14+ | 本机 Homebrew、项目 Docker 开发库,或 Neon / Zeabur 等远程 PostgreSQL |
真实上线前再准备
| 项目 | 什么时候需要 | 用来做什么 |
|---|---|---|
| 自己的域名 | 上线前 | 生产站点、OAuth 回调、支付回调、邮件发信域名和用户信任 |
| Cloudflare 账号 | 上线前 | DNS、HTTPS、WAF、DDoS 防护、Web Analytics、R2 等基础设施 |
| Zeabur 或其他部署平台账号 | 上线前 | 部署 TanStack Start 服务、生产数据库和后台任务 |
| 本地 AI coding agent | 开发和部署时 | 例如 Codex、Claude Code,用来读代码、改文件、跑命令、排错和操作部署工具 |
| GitHub 或私有 Git 仓库 | 协作和部署前 | 保存代码、触发部署、做版本回滚 |
AI agent 不参与线上运行。它的作用更像一个会执行命令的本地开发助手:帮你修改代码、检查错误、生成部署配置、根据日志修问题。你也可以手动完成这些事,只是会慢很多。
项目的 packageManager 声明为 [email protected],日常命令通过 vp install、vp run 和 vp check 执行,Vite Plus 会按声明的包管理器处理安装。
第一次接触 Vite Plus 的话,可以先看 Vite Plus 工具链。那里解释了 vp、vpr、vpx 的区别,以及它们和传统 pnpm、vitest、eslint 命令的对应关系。
获取代码
模板正在小范围内测,完整代码以会员开放后的私有仓库或下载包为准。拿到访问权限后,用下面两种方式之一进入项目。
git clone <你的 01MVP 模板仓库地址>
cd 01mvp从会员页提供的下载入口或私有 GitHub 仓库点击 Code > Download ZIP,解压后进入项目目录。
然后安装依赖:
vp installvp install 会自动处理 monorepo 中所有 package 的依赖关系。如果遇到网络问题,可以试试 vp install --registry https://registry.npmmirror.com 使用国内镜像。
准备 PostgreSQL
本地开发需要一个 PostgreSQL 数据库。你可以装在本机,也可以用远程开发库;只要最后拿到一个 DATABASE_URL,后面的迁移和启动命令都一样。
macOS 上可以用 Homebrew 安装 PostgreSQL 18:
brew update
brew install postgresql@18Apple Silicon Mac 的 Homebrew 默认装在 /opt/homebrew。如果你的 Homebrew 在 /usr/local,把下面路径里的 /opt/homebrew 换成 /usr/local。
echo 'export PATH="/opt/homebrew/opt/postgresql@18/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc启动 PostgreSQL 服务并创建开发库:
brew services start postgresql@18
createdb myapp_dev
psql myapp_dev能进入 psql 就说明数据库已经可用。退出 psql:
\qHomebrew 初始化的本机 PostgreSQL 会默认使用你的 macOS 当前用户名作为 PostgreSQL 用户。这里不需要单独 createuser,也不需要设置密码,products/01mvp/packages/config/.env 里直接写:
DATABASE_URL="postgresql://localhost:5432/myapp_dev"如果你不想在本机维护 PostgreSQL,可以用 Neon、Zeabur 或其他 PostgreSQL 服务商创建一个远程开发库。创建完成后复制服务商给出的连接字符串,写入 products/01mvp/packages/config/.env:
DATABASE_URL="postgresql://user:password@host:5432/dbname"有些服务商要求 SSL,例如 Neon 的连接串通常会带上 ?sslmode=require。复制时保留完整参数。
DATABASE_URL="postgresql://user:password@host:5432/dbname?sslmode=require"模板也带了一个 Docker 版开发库,适合已经在本机使用 Docker 的场景:
vpr @01mvp/product#db:dev:start对应的连接字符串:
DATABASE_URL="postgresql://postgres:changeme@localhost:5432/01mvp-start"如果 5432 端口已经被 Homebrew PostgreSQL 占用,就不要同时启动 Docker 版 PostgreSQL。二选一即可。
配置环境变量
01MVP 本地开发优先使用产品级 env。先复制产品自己的示例文件:
cp products/01mvp/packages/config/.env.example products/01mvp/packages/config/.env然后用编辑器打开 products/01mvp/packages/config/.env,按需填入下面的变量。products/01mvp/apps/web 的 dev、build、start 脚本都会通过 dotenvx 读取这个文件。
如果多个产品需要共享同一批默认值,可以再复制根目录的 shared env:
cp packages/config/.env.example packages/config/.env脚本会先读取产品级 .env,再读取 packages/config/.env 作为共享兜底。VITE_WEB_URL、VITE_SERVER_URL、AUTH_COOKIE_PREFIX、EMAIL_FROM 这类同名变量通常放在产品级 env,避免多个产品互相影响。
这四个变量不填项目跑不起来。
| 变量 | 说明 | 示例值 |
|---|---|---|
DATABASE_URL | PostgreSQL 连接字符串 | postgresql://localhost:5432/myapp_dev |
BETTER_AUTH_SECRET | 认证签名密钥 | 用 openssl rand -base64 32 生成 |
VITE_WEB_URL | 站点地址 | http://localhost:7001 |
VITE_SERVER_URL | API 地址 | http://localhost:7001/api |
本机 Homebrew PostgreSQL 可以使用 postgresql://localhost:5432/myapp_dev 这种无用户名、无密码的连接串;客户端会默认使用当前 macOS 用户。远程 PostgreSQL 通常需要服务商提供的完整连接串。
接入第三方登录需要去各平台申请 OAuth App,获取 Client ID 和 Secret。
| 变量 | 说明 |
|---|---|
GOOGLE_CLIENT_ID | Google OAuth Client ID |
GOOGLE_CLIENT_SECRET | Google OAuth Client Secret |
GITHUB_CLIENT_ID | GitHub OAuth Client ID |
GITHUB_CLIENT_SECRET | GitHub OAuth Client Secret |
AUTH_ENABLE_WECHAT | 是否启用微信登录,默认 false |
WECHAT_WEBSITE_APP_ID | 微信网页应用 AppID |
WECHAT_WEBSITE_APP_SECRET | 微信网页应用 AppSecret |
WECHAT_SERVICE_ACCOUNT_APP_ID | 微信公众号 AppID(用于扫码登录) |
WECHAT_SERVICE_ACCOUNT_APP_SECRET | 微信公众号 AppSecret |
OAuth 凭据不填则对应的登录方式不会出现。微信登录还需要设置 AUTH_ENABLE_WECHAT=true。留空不影响项目启动。
当前 TanStack Start 模板已经接入数字商品和 ZPAY 回调;Stripe 等渠道保留为扩展方向,按需配置。
ZPAY
| 变量 | 说明 |
|---|---|
ZPAY_PID | ZPAY 商户 ID |
ZPAY_KEY | ZPAY 密钥 |
ZPAY_SUBMIT_URL | ZPAY 收银台地址 |
ZPAY_DEFAULT_TYPE | 默认支付方式,如 alipay |
配置 AI 模型后即可使用项目内置的 AI 对话功能。默认使用 DeepSeek。
| 变量 | 说明 | 默认值 |
|---|---|---|
OPENAI_API_KEY | API Key | (必填) |
OPENAI_BASE_URL | API 地址 | https://api.deepseek.com |
OPENAI_MODEL | 模型名 | deepseek-v4-flash |
支持所有 OpenAI 兼容的 API。比如要换成 OpenAI 官方,把 OPENAI_BASE_URL 改成 https://api.openai.com/v1,OPENAI_MODEL 改成 gpt-4o 即可。
Drop 页面存储(R2 示例)
| 变量 | 说明 |
|---|---|
PAGES_BASE_URL | Drop 公开页面基础地址 |
DROP_R2_BUCKET_NAME | R2 存储桶名称 |
DROP_R2_ACCOUNT_ID | Cloudflare Account ID |
DROP_R2_ENDPOINT | R2 S3 兼容 API 地址 |
DROP_R2_ACCESS_KEY_ID | 访问密钥 ID |
DROP_R2_SECRET_ACCESS_KEY | 访问密钥 Secret |
DROP_R2_REGION | 存储桶区域,R2 填 auto |
R2 场景里,DROP_R2_ENDPOINT 指向 r2.cloudflarestorage.com,给服务端上传和读取 Drop 页面使用。密钥只放在 DROP_R2_ACCESS_KEY_ID / DROP_R2_SECRET_ACCESS_KEY,不要暴露给前端。
邮件发送(Zeabur Email)
| 变量 | 说明 |
|---|---|
ZEABUR_EMAIL_API_KEY | Zeabur Email API 密钥 |
EMAIL_FROM | 发件人地址 |
FEEDBACK_EMAIL_TO | 反馈收件邮箱 |
环境变量与功能对照
不确定哪些变量必须填?看这张表:
| 功能模块 | 依赖的变量 | 不配置的后果 |
|---|---|---|
| 基本运行 | DATABASE_URL, BETTER_AUTH_SECRET, VITE_WEB_URL, VITE_SERVER_URL | 项目无法启动 |
| 用户登录注册 | BETTER_AUTH_SECRET + 各平台 OAuth 变量 | 只能用邮箱密码登录 |
| 多产品 Cookie 隔离 | AUTH_COOKIE_PREFIX,需要 SSO 时再设置 COOKIE_DOMAIN | 默认使用 01MVP 产品前缀和 host-only Cookie |
| 第三方登录 | 对应平台的 Client ID/Secret | 该登录方式不显示 |
| AI 对话 | OPENAI_API_KEY | AI 功能不可用 |
| Drop 页面发布 | DROP_R2_* 变量 | 生产环境无法写入 R2;本地开发会回退到本地目录 |
| 支付 | ZPAY 变量 | 无法创建生产支付链接 |
| 邮件 | ZEABUR_EMAIL_API_KEY, EMAIL_FROM | 反馈表单邮件发不出 |
初始化数据库
下面命令默认从仓库根目录运行,使用 Vite Plus 的 vpr <package>#<script> 短写:
vpr @01mvp/product#db:generate # 根据 Drizzle schema 生成迁移文件
vpr @01mvp/product#db:migrate # 执行迁移文件(在数据库中建表)成功后终端会显示 All migrations have been applied。如果看到连接错误,回去检查 DATABASE_URL。
db:generate 做了什么? 它读取 products/01mvp/packages/db/src/schema 下的 Drizzle schema,并在 products/01mvp/packages/db/migrations 下生成 SQL migration 文件。之后用 vpr @01mvp/product#db:migrate 把这些迁移执行到数据库。
创建本地测试管理员
本地开发和浏览器自动化验收经常需要一个固定管理员账号。迁移完成后可以运行:
vpr @01mvp/product#db:seed默认账号:
email: [email protected]
password: Admin123456这个命令会创建或更新一个 super_admin 用户,并为它写入 Better Auth 的邮箱密码登录凭据。默认只允许写入本地数据库;如果 DATABASE_URL 指向远程地址,命令会拒绝执行。
如果你明确使用的是可丢弃的远程开发库,可以手动放行:
vpr @01mvp/product#db:seed -- --allow-remote不要对生产数据库运行 db:seed。生产环境的管理员账号应通过正式注册、后台授权或平台 Secret 管理。
启动开发服务器
vpr @01mvp/product#dev看到 Ready 字样后,浏览器打开 http://localhost:7001。
开发服务器默认跑在 7001 端口,不是通常的 3000。如果 7001 被占用,TanStack Start 会自动尝试 7002,但最好确保 7001 可用。
开发常用命令
Vite Plus 支持两种日常写法:进入产品目录后运行产品脚本,或者在仓库根目录指定 package。根目录最推荐用 vpr <package>#<script> 短写;需要给 CI 或文档写完整命令时,用 vp run --filter <package> <script>。完整说明见 Vite Plus 工具链。
| 操作 | 进入 products/01mvp 后 | 仓库根目录 |
|---|---|---|
| 启动开发服务器 | vpr dev | vpr @01mvp/product#dev |
| 生产构建 | vpr build | vpr @01mvp/product#build |
| Lint 检查 | vpr lint | vpr @01mvp/product#lint |
| 类型检查 | vpr type-check | vpr @01mvp/product#type-check |
| 运行测试 | vpr test | vpr @01mvp/product#test |
| 打开 Drizzle Studio | vpr db:studio | vpr @01mvp/product#db:studio |
| 执行迁移 | vpr db:migrate | vpr @01mvp/product#db:migrate |
| 生成迁移 | vpr db:generate | vpr @01mvp/product#db:generate |
| 准备本地管理员 | vpr db:seed | vpr @01mvp/product#db:seed |
| 检查文档链接 | vpr docs:check-links | vpr @01mvp/product#docs:check-links |
只跑某个 app 或 package 时,直接指定对应 package:
vpr @01mvp/web#dev
vpr @01mvp/web#test
vpr @01mvp/web#type-check
vpr @01mvp/web#build
vpr @01mvp/i18n#build全仓格式化仍然在根目录运行:
vp check --fix常见问题
下一步
这篇文档有问题?