Kernel's Blog 的内容管理后端,基于 Strapi v5 构建,为 Vue 3 前端 提供文章、作者等 RESTful API。
| 层级 | 技术栈 | 部署平台 | 说明 |
|---|---|---|---|
| 前端展示 | Vue 3 + Material Web | Cloudflare Pages | myprofile 仓库 |
| 内容管理 | Strapi v5 | Render (免费 Web Service) | 本仓库 |
| 数据持久化 | PostgreSQL | Neon (免费 Hobby) | 连接池模式 |
前端通过 Strapi Public API 读取已发布文章,内容管理通过 Strapi Admin 面板或 Admin API 操作,所有数据存储在 Neon PostgreSQL 中。
myprofile-cms/
├── config/
│ ├── database.ts # 数据库连接配置(支持 PostgreSQL / SQLite)
│ ├── server.ts # 服务配置(端口、CORS、Webhook)
│ └── admin.ts # Admin 面板配置
├── src/
│ ├── api/
│ │ ├── article/ # Article 内容类型(标题、slug、正文、标签等)
│ │ └── author/ # Author 内容类型(姓名、角色、头像)
│ ├── extensions/ # 插件扩展
│ └── admin/ # Admin 面板自定义
├── public/ # 静态资源
├── .env.example # 环境变量模板
├── package.json
└── tsconfig.json
Article — 文章
| 字段 | 类型 | 说明 |
|---|---|---|
| title | Text (Short) | 文章标题 |
| slug | UID | URL 友好标识(基于 title 自动生成) |
| description | Text (Short) | 文章摘要 |
| content | Rich Text (Markdown) | 文章正文 |
| tags | JSON | 标签数组,如 ["m3", "deployment"] |
| coverImage | Media (Single) | 封面图片 |
| author | Relation | 关联 Author(Article has one Author) |
Author — 作者
| 字段 | 类型 | 说明 |
|---|---|---|
| name | Text (Short) | 作者姓名 |
| role | Text (Short) | 作者角色 |
| avatar | Media (Single) | 作者头像 |
- Node.js >= 20(推荐 20.x LTS)
- npm >= 6
- Git >= 2.30
-
克隆仓库
git clone https://github.com/BJY-STUDIO/myprofile-cms.git cd myprofile-cms -
安装依赖
npm install
-
配置环境变量
复制模板并填入实际值:
cp .env.example .env
.env关键变量说明:变量名 必填 说明 HOST是 监听地址,默认 0.0.0.0PORT是 监听端口,默认 1337APP_KEYS是 加密 session 的密钥对,逗号分隔 API_TOKEN_SALT是 API Token 加密盐 ADMIN_JWT_SECRET是 Admin JWT 签名密钥 TRANSFER_TOKEN_SALT是 数据传输加密盐 JWT_SECRET是 JWT 签名密钥 ENCRYPTION_KEY是 加密密钥 DATABASE_CLIENT否 数据库客户端,默认 postgresDATABASE_HOST否 数据库主机,默认 127.0.0.1DATABASE_PORT否 数据库端口,默认 5432DATABASE_NAME否 数据库名,默认 strapiDATABASE_USERNAME否 数据库用户名,默认 strapiDATABASE_PASSWORD否 数据库密码 DATABASE_SSL否 是否启用 SSL,Neon 需设为 trueEXTRA_CORS_ORIGINS否 额外的 CORS 允许域名,逗号分隔 生成随机密钥:
node -e "console.log(require('crypto').randomBytes(32).toString('base64'))" -
启动开发服务器
npm run develop
首次启动会自动创建数据库表结构。打开 http://localhost:1337/admin 创建管理员账号。
如果本地不想安装 PostgreSQL,可修改 .env:
DATABASE_CLIENT=sqlite
Strapi 会在项目根目录创建 SQLite 数据库文件。适合快速体验和本地调试。
如果不想本地运行 Strapi,前端可以直接访问部署在 Render 上的 Strapi 实例。在前端项目 .env 中配置:
VITE_API_BASE_URL=https://myprofile-cms.onrender.com/api
注意 Render 免费实例有 30-50 秒冷启动延迟。
- 已创建 Neon PostgreSQL 数据库,获取连接字符串
- 已注册 Render 账号
-
创建 Web Service
- 进入 Render Dashboard → New → Web Service
- 选择 "Build and deploy from a Git repository"
- 连接
myprofile-cms仓库
-
配置构建命令
配置项 值 Build Command npm install && npm run buildStart Command npm run startNode.js 版本 20 -
设置环境变量
在 Render 的 Environment 界面逐一添加:
变量名 值 NODE_ENVproductionHOST0.0.0.0PORT10000DATABASE_CLIENTpostgresDATABASE_HOSTNeon 主机地址(如 ep-xxx.us-east-1.aws.neon.tech)DATABASE_PORT5432DATABASE_NAMEneondbDATABASE_USERNAMENeon 用户名 DATABASE_PASSWORDNeon 密码 DATABASE_SSLtrueAPP_KEYS两组随机 base64 字符串,逗号分隔 API_TOKEN_SALT随机 base64 字符串 ADMIN_JWT_SECRET随机 base64 字符串 TRANSFER_TOKEN_SALT随机 base64 字符串 JWT_SECRET随机 base64 字符串 ENCRYPTION_KEY随机 base64 字符串 -
等待部署完成
首次部署约 3-5 分钟。部署成功后访问
https://your-app.onrender.com/admin创建管理员账号。
项目已在 config/server.ts 中预配置了以下 CORS 允许源:
http://localhost:5179(本地开发)http://localhost:1337(本地 Strapi)https://myprofile-2qp.pages.dev(Cloudflare Pages 生产环境)
如需添加其他域名,设置 EXTRA_CORS_ORIGINS 环境变量(逗号分隔)。
# 获取所有已发布文章(包含关联数据)
curl https://myprofile-cms.onrender.com/api/articles?populate=*-
登录获取 Token
curl -X POST https://myprofile-cms.onrender.com/admin/login \ -H "Content-Type: application/json" \ -d '{"email":"your-email","password":"your-password"}'
-
创建文章
curl -X POST https://myprofile-cms.onrender.com/content-manager/collection-types/api::article.article \ -H "Authorization: Bearer YOUR_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "title": "文章标题", "slug": "article-slug", "description": "文章摘要", "content": "## Markdown 正文", "tags": ["tag1", "tag2"], "author": { "connect": ["AUTHOR_DOCUMENT_ID"] } }'
-
发布文章
创建后文章为草稿状态,需单独发布:
curl -X POST https://myprofile-cms.onrender.com/content-manager/collection-types/api::article.article/DOCUMENT_ID/actions/publish \ -H "Authorization: Bearer YOUR_TOKEN"
注意:
author字段必须使用{ "connect": ["documentId"] }格式,直接传字符串或数字会导致 500 错误。这是 Strapi v5 Admin API 的关联字段格式要求。
| 命令 | 说明 |
|---|---|
npm run develop |
启动开发服务器(热重载) |
npm run build |
构建 Admin 面板 |
npm run start |
启动生产服务器 |
npm run upgrade |
升级 Strapi 到最新版本 |
npm run upgrade:dry |
预览升级变更(不实际执行) |
| 服务 | 月费用 | 说明 |
|---|---|---|
| Render Web Service | 免费 | 750 小时/月,512MB RAM,冷启动 |
| Neon PostgreSQL | 免费 | 0.5GB 存储,基础计算 |
| Cloudflare Pages | 免费 | 500 次构建/月,不限带宽 |
总计:0 元/月。 唯一的使用代价是 Render 冷启动延迟(30-50 秒),前端通过降级策略自动处理。
- BJY-STUDIO/myprofile — Vue 3 + Material Web 前端
- Strapi 官方文档
- Material Design 3