内容
# 端口后端作品集
一个面向生产的后端工程作品集,使用Next.js 16、Payload CMS 3、Tailwind CSS和libSQL构建。它包括一个Payload Admin工作区、支持草稿的项目和博客帖子、搜索和主题过滤、匿名星级计数器、Resend联系方式发送、Cloudflare Turnstile保护、可选的R2媒体存储,以及一个只读的Payload MCP端点。
## 本地开发
要求:Node.js 20.9+ 和 pnpm 11。
```bash
cp .env.example .env
pnpm install
pnpm payload migrate
pnpm seed
pnpm dev
```
在浏览器中打开 `http://localhost:3000` 访问作品集,`http://localhost:3000/admin` 访问Payload Admin。种子命令是幂等的:它更新作品集设置并创建缺少的示例内容,而不会复制现有的记录。
## 环境
```text
# 本地SQLite
DATABASE_URL=file:./portfolio.db
DATABASE_AUTH_TOKEN=
# 生产环境中托管的libSQL
# DATABASE_URL=libsql://您的数据库主机
# DATABASE_AUTH_TOKEN=您的数据库令牌
PAYLOAD_SECRET=替换为一个长随机密钥
NEXT_PUBLIC_SITE_URL=http://localhost:3000
RESEND_API_KEY=...
EMAIL_FROM_ADDRESS=contact@您的域名.com
EMAIL_FROM_NAME=soumajit.dev
CONTACT_TO_EMAIL=soumojitghosh02@gmail.com
NEXT_PUBLIC_TURNSTILE_SITE_KEY=...
TURNSTILE_SECRET_KEY=...
TURNSTILE_ALLOWED_HOSTNAMES=您的域名.com
R2_BUCKET=portfolio-media
R2_ACCESS_KEY_ID=...
R2_SECRET_ACCESS_KEY=...
R2_ENDPOINT=https://ACCOUNT_ID.r2.cloudflarestorage.com
R2_PUBLIC_URL=https://media.您的域名.com
```
`DATABASE_AUTH_TOKEN` 可以为空以适应本地文件数据库。联系邮件通过Resend发送;`CONTACT_TO_EMAIL` 覆盖Payload中配置的公共联系地址。Turnstile保护联系提交和星级变更。`TURNSTILE_ALLOWED_HOSTNAMES` 是一个可选的逗号分隔的允许列表。
只有当所有五个 `R2_*` 值都存在时,Cloudflare R2才会被启用。否则,Payload使用本地上传,这适合开发但不适合短暂的生产容器。
## Payload MCP
MCP端点是 `POST /api/mcp`。它提供对以下内容的只读访问:
- `blog-posts`:查找
- `projects`:查找
- `portfolio-settings`:查找
在数据库迁移完成后创建API密钥:
1. 登录到 `/admin`。
2. 打开 **MCP → API 密钥** 并创建一个与管理员用户关联的密钥。
3. 启用允许的 `find` 功能并复制生成的密钥。
4. 使用生产环境端点和Bearer令牌配置MCP客户端:
```json
{
"mcpServers": {
"Portfolio": {
"type": "http",
"url": "https://您的域名.com/api/mcp",
"headers": {
"Authorization": "Bearer MCP-USER-API-KEY"
}
}
}
}
```
插件配置和API密钥开关都已启用,同时现有的Payload集合访问规则也已启用。在代码中,创建、更新和删除操作均被禁用。
## 内容模型
- `projects`:支持草稿的项目内容、主题、媒体、链接和显示元数据
- `blog-posts`:支持草稿的工程文章,带有标签和问题编号
- `media`:优化上传,带有alt文本、标题、焦点和可选的R2存储
- `project-stars` 和 `blog-stars`:私有的匿名星级记录
- `portfolio-settings`:英雄、联系、社会、简历和首页显示设置
- `payload-mcp-api-keys`:身份验证的MCP客户端密钥和按功能划分的权限
公共查询强制执行发布状态。草稿内容被排除在页面、相关内容、提要和站点地图之外。
## 命令
```bash
pnpm dev # 启动开发服务器
pnpm build # 创建独立的生产构建
pnpm start # 运行本地生产构建
pnpm lint # 运行ESLint
pnpm test:int # 运行集成测试
pnpm test:e2e # 运行Playwright测试
pnpm generate:types # 重新生成Payload类型
pnpm generate:importmap # 重新生成Payload Admin导入
pnpm payload migrate # 应用待处理的数据库迁移
pnpm seed # 播种开发内容
```
模式推送已禁用。检查到的迁移在Payload在生产环境中初始化时自动应用;本地开发应在拉取模式更改后运行 `pnpm payload migrate`。
## Docker 和 Dokploy
Dockerfile构建一个Next.js独立镜像作为非根用户 `nextjs`。它在预渲染构建时页面时仅使用一个可丢弃的SQLite数据库。运行应用程序通过环境变量提供的托管libSQL实例。
使用以下方法从此仓库创建一个Dokploy应用程序:
- 构建类型:`Dockerfile`
- Dockerfile路径:`Dockerfile`
- 容器端口:`3000`
- 健康检查路径:`/`
- HTTPS域名:您的公共作品集域名
- 持久卷:使用托管的libSQL和R2时不需要
设置这些构建参数,因为Next.js在镜像构建过程中嵌入公共值和图像主机配置:
```text
NEXT_PUBLIC_SITE_URL=https://您的域名.com
NEXT_PUBLIC_TURNSTILE_SITE_KEY=...
R2_PUBLIC_URL=https://media.您的域名.com
```
将环境列表中的完整环境变量设置为运行时变量,特别是:
```text
DATABASE_URL=libsql://您的数据库主机
DATABASE_AUTH_TOKEN=您的数据库令牌
PAYLOAD_SECRET=您的长随机密钥
NEXT_PUBLIC_SITE_URL=https://您的域名.com
```
在自动生产迁移启用时部署单个应用程序实例。如果应用程序稍后水平扩展,请将迁移移动到一次部署作业,以便只有一个运行器迁移数据库。
## 许可证
MIT