diff --git a/.memory/worklog.json b/.memory/worklog.json index eaf34df..91b4f85 100644 --- a/.memory/worklog.json +++ b/.memory/worklog.json @@ -616,6 +616,80 @@ "message": "docs: record upload generation safeguards", "hash": "1728808", "files_changed": 2 + }, + { + "ts": "2026-05-19T12:09:24+08:00", + "type": "commit", + "message": "chore: record Muse Mate generation run", + "hash": "7292bb2", + "files_changed": 1 + }, + { + "ts": "2026-05-19T04:10:01Z", + "type": "session-heartbeat", + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", + "files_changed": 1 + }, + { + "ts": "2026-05-19T04:20:01Z", + "type": "session-heartbeat", + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", + "files_changed": 1 + }, + { + "ts": "2026-05-19T04:30:01Z", + "type": "session-heartbeat", + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", + "files_changed": 1 + }, + { + "ts": "2026-05-19T04:40:01Z", + "type": "session-heartbeat", + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", + "files_changed": 1 + }, + { + "ts": "2026-05-19T04:50:01Z", + "type": "session-heartbeat", + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", + "files_changed": 1 + }, + { + "ts": "2026-05-19T05:00:01Z", + "type": "session-heartbeat", + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", + "files_changed": 1 + }, + { + "ts": "2026-05-19T05:10:02Z", + "type": "session-heartbeat", + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", + "files_changed": 1 + }, + { + "ts": "2026-05-19T05:20:02Z", + "type": "session-heartbeat", + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", + "files_changed": 1 + }, + { + "ts": "2026-05-19T05:30:02Z", + "type": "session-heartbeat", + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", + "files_changed": 1 + }, + { + "ts": "2026-05-19T05:40:02Z", + "type": "session-heartbeat", + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", + "files_changed": 1 + }, + { + "ts": "2026-05-19T13:40:25+08:00", + "type": "commit", + "message": "auto-save 2026-05-19 13:40 (+1, ~2)", + "hash": "f4ce3d4", + "files_changed": 3 } ] } diff --git a/.project.json b/.project.json index 3b00e1b..80c9170 100644 --- a/.project.json +++ b/.project.json @@ -6,7 +6,7 @@ "created": "2026-05-18", "urls": [ { "type": "app", "url": "https://ai-toy.kang-kang.com", "label": "VPS 生产" }, - { "type": "app", "url": "http://localhost:4560", "label": "本地 dev" } + { "type": "app", "url": "http://localhost:4560", "label": "本地 Docker" } ], "credentials": [ { "name": "OPENAI_API_KEY", "env": "OPENAI_API_KEY", "note": "GPT 文本/结构化/图片生成;没填则图片 mock" }, @@ -25,7 +25,8 @@ }, "stack": [ "Next.js + GPT + Seedance", - "Docker Compose + Coolify Traefik" + "Docker Compose local/prod parity", + "Coolify Traefik" ], "ownership": "personal" } diff --git a/RULES.md b/RULES.md index 9eafcb9..31556b8 100644 --- a/RULES.md +++ b/RULES.md @@ -1,8 +1,9 @@ # AI玩具专利生成工作流 ## 启动 -- `cd ~/Projects/code/20260518-ai-toy-patent-workflow && npm run dev` — 端口 4560 +- 推荐本地环境:`cd ~/Projects/code/20260518-ai-toy-patent-workflow && npm run docker:up` — Docker Compose,端口 4560 - 浏览器打开 http://localhost:4560 +- 备用非 Docker 开发:`npm run dev` — 端口 4560 - 首次依赖装好:`npm install --legacy-peer-deps`(next 15 + react 19 有 peer 警告) ## 部署事实 @@ -11,7 +12,7 @@ - 服务名 / 容器名:`ai-toy-patent-workflow` - 服务器路径:`/opt/ai-toy-patent-workflow` - 主站 / 前端:https://ai-toy.kang-kang.com -- 本地 dev:http://localhost:4560 +- 本地 Docker:http://localhost:4560 - API / 后端:内置 Next.js API Route(生产同域名) - 文档 / 解析:无 - 管理后台:无 @@ -22,6 +23,8 @@ ## 元数据回写清单 - 改公网域名或迁移部署时,更新 `.project.json.urls` + 本节 - 数据持久化在 `data/`(gitignored),不入库;上传原图在 `data/uploads/` +- 本地 Docker 使用 `docker-compose.yml`,挂载 `./data:/app/data`,读取 `.env.local`,并强制 `PUBLIC_APP_URL=http://localhost:4560` +- VPS 生产 Docker 使用 `docker-compose.prod.yml`,挂载 `./data:/app/data`,读取 `deploy/.env.production`,并强制 `PUBLIC_APP_URL=https://ai-toy.kang-kang.com` - VPS 数据持久化在 `/opt/ai-toy-patent-workflow/data` - VPS 生产环境变量在 `/opt/ai-toy-patent-workflow/deploy/.env.production`,不入库 @@ -35,6 +38,7 @@ - `SEEDANCE_API_BASE` — 默认 `https://ark.cn-beijing.volces.com/api/v3` - `PUBLIC_APP_URL` — 生产填公网入口,用于把 `/api/img/...` 补成 Seedance 可访问的绝对 URL - 配置位置:`.env.local`(gitignored),参考 `.env.local.example` +- 生产配置模板:`deploy/.env.production.example`;真实生产值只放 VPS 的 `/opt/ai-toy-patent-workflow/deploy/.env.production` - 图片生成未配置 GPT Key 时回退 mock(SVG 占位图),视频生成不 mock,必须配置 Seedance Key ## 规则 diff --git a/deploy/.env.production.example b/deploy/.env.production.example new file mode 100644 index 0000000..098ac10 --- /dev/null +++ b/deploy/.env.production.example @@ -0,0 +1,10 @@ +# GPT API. Keep the real value only on the VPS at deploy/.env.production. +OPENAI_API_KEY= +GPT_TEXT_MODEL=gpt-5.5 +GPT_IMAGE_MODEL=gpt-image-2 +GPT_API_BASE=https://api.openai.com/v1 + +# Seedance video generation. +SEEDANCE_API_KEY= +SEEDANCE_MODEL=doubao-seedance-2-0-260128 +SEEDANCE_API_BASE=https://ark.cn-beijing.volces.com/api/v3 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..6e2d68c --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,20 @@ +name: ai-toy-patent-workflow-local + +services: + web: + container_name: ai-toy-patent-workflow-local + build: + context: . + dockerfile: Dockerfile + image: ai-toy-patent-workflow:local + restart: unless-stopped + env_file: + - ./.env.local + environment: + NODE_ENV: production + PORT: "4560" + PUBLIC_APP_URL: http://localhost:4560 + ports: + - "4560:4560" + volumes: + - ./data:/app/data diff --git a/package.json b/package.json index 6cb98a8..b22301a 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,10 @@ "dev": "next dev -p 4560", "build": "next build", "start": "next start -p 4560", - "lint": "next lint" + "lint": "next lint", + "docker:up": "docker compose up -d --build", + "docker:down": "docker compose down", + "docker:logs": "docker compose logs -f web" }, "dependencies": { "next": "^15.5.18",