OpenWebsite 是一个 AI 原生的快速建站底座,基于 Next.js 16 App Router、TypeScript、Tailwind CSS、Prisma 和 SQLite。它不把价值放在固定前端模板上,而是提供稳定的内容、多语言、媒体、SEO、sitemap、robots 和 AI 运维 API 契约,让懂一点开发或使用 Codex 的用户可以把任意前端样式无缝接入。
- 多语言前台:
/[locale]路由,默认支持zh,en - 页面基础:首页、关于我们、产品 / 服务、文章列表、分类落地页、文章详情、联系我们
- SEO:动态 metadata、canonical、hreflang +
x-default、Open Graph、Twitter Card、自动化sitemap.xml、robots.txt、文章 JSON-LD、站点 / 分类 / 文章独立 SEO 字段 - 后台:管理员登录、分类 CRUD、文章多语言 CRUD、联系记录搜索与 CSV 导出、系统管理、AI 配置、SEO 一键矫正、AI 运维接口文档
- AI 运维:
/api/ai/*提供站点配置、分类、文章、媒体、SEO 诊断与自动矫正、Markdown 文档下载和 skill 打包下载接口 - 联系接口:服务端校验、基础频率限制、SQLite 入库、可选 SMTP 通知
- 发布:保存文章、分类或站点设置后触发
revalidatePath,sitemap.xml按内容和语言自动生成 - 部署:Docker 多阶段构建,
docker-compose up -d一键启动
nvm use v23
npm install如果本机没有 Node v23,请先安装:
nvm install v23
nvm use v23- 创建环境变量:
cp .env.example .env- 修改
.env中的管理员信息和站点信息,至少建议设置:
AUTH_SECRET="replace-with-a-long-random-secret"
AI_OPS_TOKEN="replace-with-a-long-random-token"
ADMIN_EMAIL="admin@example.com"
ADMIN_PASSWORD="ChangeMe123!"
SITE_URL="http://localhost:3000"
NEXT_PUBLIC_SITE_URL="http://localhost:3000"- 初始化数据库:
npm run db:migrate -- --name init
npm run db:seed- 启动开发服务:
npm run dev访问:
- 前台:
http://localhost:3000/zh - 后台:
http://localhost:3000/admin - AI 运维:
http://localhost:3000/admin/ai-ops
后台默认账号来自 seed:ADMIN_EMAIL / ADMIN_PASSWORD,示例值为 admin@example.com / ChangeMe123!。登录页还需要填写页面上的算术验证码。
如果 /admin/login 页面能打开,但提交正确账号、密码和验证码后报 500,优先检查 dev server 是否加载了 DATABASE_URL。登录 action 会调用 Prisma 查询 User;缺少 DATABASE_URL 时会在 loginWithEmail -> prisma.user.findUnique() 处抛 PrismaClientInitializationError: Environment variable not found: DATABASE_URL。本地常用值:
DATABASE_URL="file:../data/openwebsite.db"修改 .env 后需要重启 npm run dev,否则 Next 进程不会重新继承环境变量。
npm run lint
npm run build
npm run start
npm run db:migrate
npm run db:deploy
npm run db:seedcp .env.example .env
docker-compose up -d --build容器启动时会自动执行:
prisma migrate deploy
npm run db:seedSQLite 数据库默认保存在容器 /app/data/openwebsite.db,并通过 openwebsite_data volume 持久化。
| 变量 | 说明 |
|---|---|
DATABASE_URL |
SQLite 连接,默认 file:../data/openwebsite.db,相对 prisma/schema.prisma 解析 |
SITE_URL / NEXT_PUBLIC_SITE_URL |
站点 URL,用于 canonical、sitemap 和 OG |
HOST_PORT |
Docker 暴露到宿主机的端口 |
PORT |
容器内 Next.js 监听端口,默认 3000 |
AUTH_SECRET |
后台会话签名密钥 |
AI_OPS_TOKEN / ADMIN_API_TOKEN |
AI 运维 API 的 Bearer token |
AUTH_COOKIE_SECURE |
是否给后台 session cookie 加 Secure;HTTP 内网测试设为 false,HTTPS 设为 true |
ADMIN_EMAIL / ADMIN_PASSWORD |
seed 初始化管理员 |
DEFAULT_LOCALE |
默认语言 |
SUPPORTED_LOCALES |
逗号分隔语言列表 |
SITE_NAME / SITE_DESCRIPTION / SITE_KEYWORDS |
SEO 默认值 |
AI_PROVIDER_NAME / AI_BASE_URL / AI_MODEL |
SEO 自动矫正使用的 OpenAI 兼容接口配置 |
AI_API_KEY / AI_TEMPERATURE |
SEO 自动矫正使用的服务端 AI 密钥与生成温度 |
SMTP_* |
可选邮件通知配置 |
Category+CategoryTranslation:分类与多语言名称 / 描述Article+ArticleTranslation:文章基础字段与多语言标题、摘要、正文和 SEO 字段ContactSubmission:联系表单提交记录User:后台管理员SiteSetting:站点基础配置、语言和全站 SEOScheduledTask:系统定时任务展示MediaAsset:后台 / AI API 上传的图片资源
- 后台入口:
/admin/ai-ops - Markdown 文档:
docs/AI_OPERATIONS.md - Agent 企业网站开发指南:
docs/AI_AGENT_ENTERPRISE_WEBSITE.md - 项目内 Codex skill:
skills/openwebsite-ai-ops - API 文档接口:
GET /api/ai/docs - Markdown 下载接口:
GET /api/ai/docs?download=1 - Skill 打包接口:
GET /api/ai/skills - 发现接口:
GET /api/ai/context - SEO 诊断与自动矫正:
GET|POST /api/ai/seo-audit
AI coding agent 应优先通过 /api/ai/* 修改内容和 SEO,而不是直接改数据库。前端模板由用户自己实现;模板只需要遵守多语言路由、文章 Markdown、SEO metadata 和媒体 URL 的契约。
GET /api/ai/skills 会动态生成 openwebsite-ai-ops.zip,包含 SKILL.md、references/api.md、agents/openai.yaml、docs/AI_OPERATIONS.md 和运行时 manifest.json。解压到 ~/.codex/skills/openwebsite-ai-ops 后,类似 Codex 的 agent 可通过站点 URL 与 AI_OPS_TOKEN 快速接入管理。
src/
app/
(site)/[locale]/ # 多语言前台
(admin)/admin/ # 后台管理
api/ai/ # AI 运维 API
api/contact/ # 联系接口
sitemap.ts
robots.ts
components/
i18n/
lib/
messages/
prisma/
public/images/
docs/
skills/openwebsite-ai-ops/
前台公开页面设置了 revalidate,并且数据库不可用时会使用内置示例内容回退,保证构建阶段不会因为 SQLite 尚未迁移而失败。实际运行时,后台保存内容后会按 locale 重新验证首页、服务、关于、文章列表、分类落地页、文章详情、联系页、sitemap.xml 和 robots.txt。
/sitemap.xml 由 src/lib/sitemap.ts 自动汇总多语言静态页面、分类落地页和已发布文章,输出 hreflang alternates 与 x-default,并按小时重新生成。后台「SEO 医生」和「定时任务」页面都可以手动刷新 sitemap,并记录上次刷新结果。