营销增长
需要搭建开源 GEO/SEO 内容自动生产流水线时,用…
适用于用 PHP/PostgreSQL/Docker 部署 GEOFlow,并通过 Admin、CLI、REST API 或 PHP 代码自动化生成、审核和发布 GEO/SEO 文章的场景。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
需要搭建开源 GEO/SEO 内容自动生特定
解决思路
- Docker 安装:执行 `git clone https://github.com/yaojingang/GEOFlow.git`,然后 `cd GEOFlow`,再 `cp .env.example .env`,编辑 `.env` 设置 `APP_SECRET_KEY`、`SITE_URL` 和数据库凭据,最后执行 `docker compose --profile scheduler up -d --build` 启动 web、postgres、scheduler、worker。
- Docker 安装后访问:前端打开 `http://localhost:18080`,管理后台打开 `http://localhost:18080/geo_admin/`。
- 本地 PHP Server 安装:执行 `git clone https://github.com/yaojingang/GEOFlow.git` 和 `cd GEOFlow`,导出环境变量 `DB_DRIVER=pgsql`、`DB_HOST=127.0.0.1`、`DB_PORT=5432`、`DB_NAME=geo_system`、`DB_USER=geo_user`、`DB_PASSWORD=geo_password`、`APP_SECRET_KEY=$(openssl rand -hex 32)`、`SITE_URL=http://localhost:8080`,然后执行 `php -S localhost:8080 router.php`,打开 `http://localhost:8080/geo_admin/`。
- 安装要求:确保 PHP 7.4+,启用 `pdo_pgsql` 和 `curl` 扩展,并准备 PostgreSQL 实例。
- 环境变量配置:复制 `.env.example` 为 `.env`,设置 `HOST_PORT=18080`、`SITE_URL=http://localhost:18080`、`APP_SECRET_KEY=$APP_SECRET_KEY`(32+ 字符随机字符串,绝不硬编码)、`CRON_INTERVAL=60`、`TZ=Asia/Shanghai`、`DB_DRIVER=pgsql`、`DB_HOST=postgres`、`DB_PORT=5432`、`DB_NAME=geo_system`、`DB_USER=geo_user`、`DB_PASSWORD=$DB_PASSWORD`(通过环境设置,不硬编码)。
- 生成安全密钥:执行 `openssl rand -hex 32` 或 `php -r "echo bin2hex(random_bytes(32));"`。
- 默认凭证处理:首次启动后登录 `/geo_admin/` 使用用户名 `admin` 和密码 `admin888`,立即更改两者,并在任何公开部署前轮换 `APP_SECRET_KEY`。
- Docker 服务理解:`web` 提供前端 + 管理 HTTP,`postgres` 提供 PostgreSQL 数据库,二者 always;`scheduler` 扫描任务并写入 job queue,`worker` 调用 AI API 生成内容,二者使用 profile `scheduler`。
- Docker 常用操作:仅启动 Web 用 `docker compose up -d`;启动完整栈用 `docker compose --profile scheduler up -d`;查看日志用 `docker compose logs -f worker` 或 `docker compose logs -f scheduler`;重启单个服务用 `docker compose restart worker`;停止全部用 `docker compose --profile scheduler down`。
- 内容生成流水线操作:在 Admin 配置模型、提示词和素材;创建任务(标题库、模型、提示词、图片库、发布规则);由 `bin/cron.php` 调度器写入 `job_queue` 表;由 `bin/worker.php` 调用 AI API 生成文章正文;可选插入图片并构建 SEO meta;文章进入 draft → review → publish 状态;前端渲染文章和 SEO/OG 标签。
- 在 Admin 添加 AI 模型:进入 AI配置中心 → AI模型管理,填写 API Base URL(如 `https://api.openai.com/v1`)、Model ID(如 `gpt-4o`)、API Key(加密存储;在 env 中引用 `$AI_API_KEY`)。
- 在 Admin 创建素材:创建标题库作为任务抽取的标题池;创建图片库作为文章插图池;创建知识库作为注入提示词的参考知识;创建提示词模板并包含占位符。
- 在 Admin 创建任务:进入任务管理 → 新建任务,选择 Title Library(选择文章标题)、Model(调用哪个 AI 模型)、Prompt(使用哪个提示词模板)、Image Library(可选插图集)、Publish Mode(draft 或 auto-publish)、Schedule(immediate 或 cron-based)。
- 在 Admin 监控执行:在任务管理查看任务状态和重试控制;在文章管理查看 draft/review/published 状态;在审核中心处理人工审核队列。
- CLI 查看帮助:执行 `php bin/geoflow help` 列出可用命令。
- CLI 检查任务状态:执行 `php bin/geoflow task:status --task-id=<id>`。
- CLI 创建任务:执行 `php bin/geoflow task:create --title-library=<id> --model=<id> --prompt=<id> --publish-mode=draft`。
- CLI 上传文章草稿:执行 `php bin/geoflow article:create --title="Article Title" --body="<markdown content>" --status=draft`。
- CLI 审核并发布文章:执行 `php bin/geoflow article:review --article-id=<id> --action=approve`,再执行 `php bin/geoflow article:publish --article-id=<id>`。
- CLI 手动运行调度器:执行 `php bin/cron.php` 运行一个周期。
- CLI 手动运行 worker:执行 `php bin/worker.php --once` 处理一个 job 后退出。
- REST API 生成 token:执行 `php bin/api/create_token.php --name="my-integration"`,输出 token 后存到 `$GEOFLOW_API_TOKEN`。
- REST API 设置基础变量:设置 `BASE=http://localhost:18080/api/v1` 和 `TOKEN=$GEOFLOW_API_TOKEN`;所有 endpoints 需要 Bearer token 认证。
- REST API 列出任务:执行 `curl -H "Authorization: Bearer $TOKEN" "$BASE/tasks"`。
- REST API 获取任务详情:执行 `curl -H "Authorization: Bearer $TOKEN" "$BASE/tasks/<id>"`。
- REST API 创建任务:执行 `curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"title_library_id": 1, "model_id": 2, "prompt_id": 3, "publish_mode": "draft"}' "$BASE/tasks"`。
- REST API 列出文章:执行 `curl -H "Authorization: Bearer $TOKEN" "$BASE/articles"`。
- REST API 发布文章:执行 `curl -X POST -H "Authorization: Bearer $TOKEN" "$BASE/articles/<id>/publish"`。
- REST API 检查 job queue:执行 `curl -H "Authorization: Bearer $TOKEN" "$BASE/jobs?status=pending"`。
- PHP 连接数据库:在代码中 `require_once __DIR__ . '/includes/db_support.php';`,调用 `$pdo = get_db_connection();` 获取 PDO 实例,并始终使用 prepared statements,例如 `$stmt = $pdo->prepare("SELECT * FROM articles WHERE status = :status ORDER BY created_at DESC LIMIT 10"); $stmt->execute([':status' => 'published']); $articles = $stmt->fetchAll(PDO::FETCH_ASSOC);`。
- PHP 调用 Article Service:`require_once __DIR__ . '/includes/article_service.php';`,调用 `create_article([...])` 创建草稿,传入 `title`、`body`、`status`、`task_id`、`seo_title`、`seo_desc`,然后调用 `approve_article($articleId); publish_article($articleId);`。
- PHP 直接触发 AI Engine:`require_once __DIR__ . '/includes/ai_engine.php';`,调用 `$result = run_task_job(taskId: 5, jobId: 101);`,检查 `$result['success']` 后输出 `$result['article_id']` 或 `$result['error']`。
- PHP 手动排队 Job:`require_once __DIR__ . '/includes/job_queue_service.php';`,调用 `$job = claim_next_job();` 领取下一个可用 job;若存在,在 try 中处理并调用 `complete_job($job['id']);`,在 catch 中调用 `fail_job($job['id'], $e->getMessage());`,符合条件的 job 会被 scheduler 重试;也可调用 `enqueue_task_jobs(taskId: 5);` 手动入队任务。
- PHP 自定义 Prompt Template:定义模板如 `"You are an SEO writer. Write a 600-word article about: {{title}}\n\nBackground knowledge:\n{{knowledge}}"`,用 `str_replace(['{{title}}', '{{knowledge}}'], [$articleTitle, $knowledgeBaseContent], $template)` 替换占位符;`require_once __DIR__ . '/includes/ai_service.php';` 后调用 `$response = call_ai_model(modelId: 2, prompt: $prompt);` 并输出 `$response['content']`。
- 按目录定位实现:`index.php` 是前端文章列表;`article.php` 是文章详情页(SEO + OG);`router.php` 是本地开发路由,供 `php -S` 使用;`admin/` 存放所有管理 UI 页面;`api/v1/index.php` 是 REST API 单一入口;`bin/geoflow` 是 CLI 入口;`bin/cron.php` 是调度器(每 `CRON_INTERVAL` 秒运行);`bin/worker.php` 是 AI 生成 worker(长运行);`includes/config.php` 是全局配置和常量;`includes/database.php` 是前端数据访问;`includes/ai_engine.php` 是核心生成编排;`includes/ai_service.php` 是 OpenAI-compatible HTTP 客户端;`includes/job_queue_service.php` 处理 claim/complete/fail/retry;`includes/task_service.php` 处理 Task CRUD;`includes/article_service.php` 处理 Article 生命周期;`includes/api_auth.php` 处理 Bearer token 认证;`docs/` 存放部署、API、FAQ 文档。
- 常见模式:自动发布无需审核。创建 task 时设置 `publish_mode = auto`,worker 生成后立即调用 `publish_article()`,跳过审核队列。
- 常见模式:批量重试失败 jobs。通过 CLI 执行 `php bin/geoflow job:retry-failed --task-id=<id>`;紧急时通过数据库执行 `psql $DATABASE_URL -c "UPDATE job_queue SET status='pending', attempts=0 WHERE status='failed' AND task_id=5;"`。
- 常见模式:在 Docker 外运行 scheduler。加入 crontab 每分钟执行 `* * * * * cd /path/to/GEOFlow && php bin/cron.php >> /var/log/geoflow-cron.log 2>&1`;或手动循环 `while true; do php bin/cron.php; sleep 60; done`。
- 数据库维护:执行 `php bin/db_maintenance.php --vacuum`;执行 `php bin/db_maintenance.php --clean-old-jobs --days=30`。
- 故障排除:Worker 不生成内容,可能是 Scheduler 未运行,使用 `--profile scheduler` 启动或运行 `cron.php`。
- 故障排除:报错 `pdo_pgsql` not found,可能是扩展缺失,在 `php.ini` 添加 `extension=pdo_pgsql` 或安装 `php-pgsql`。
- 故障排除:Admin 页面 500,可能是数据库未初始化,让 web 容器在首次启动时完成 entrypoint migration。
- 故障排除:AI 调用返回 401,可能是 API key 错误,在 AI模型管理重新输入 key,并检查 key 没有前导/尾随空格。
- 故障排除:文章卡在 draft,可能是 Auto-publish 关闭,在 task 上设置 `publish_mode=auto`,或在审核中心手动批准。
- 故障排除:Jobs 在队列中堆积,可能是 Worker 崩溃,执行 `docker compose restart worker`,并检查 `docker compose logs worker`。
- 故障排除:CSRF token mismatch,可能是会话过期,重新登录 admin;确保 `APP_SECRET_KEY` 在重启间稳定。
- 日志命令:查看所有服务 `docker compose logs -f`;仅看错误 `docker compose logs worker 2>&1 | grep -i error`;查看 scheduler 活动 `docker compose logs scheduler | tail -50`;检查数据库 pending jobs:`docker compose exec postgres psql -U geo_user -d geo_system -c "SELECT status, COUNT(*) FROM job_queue GROUP BY status;"`。
- 安全清单:立即更改默认 `admin` / `admin888` 凭证。
- 安全清单:通过环境变量将 `APP_SECRET_KEY` 设置为 32+ 字符随机字符串。
- 安全清单:绝不提交 `.env`,它默认在 `.gitignore` 中。
- 安全清单:生产环境使用 HTTPS,并将 `SITE_URL` 设为 `https://` 域名。
- 安全清单:生产环境用网络级防火墙限制 `/geo_admin/` 和 `/api/v1/`。
- 安全清单:通过 `php bin/api/create_token.php` 定期轮换 API tokens。
适用边界 · 注意事项
- 不愿部署或维护 PHP/PostgreSQL/Docker/cron/worker,或不能运行 GEOFlow 特定代码的场景,不适用。
- 需要非 OpenAI-compatible 模型、或不需要 GEO/SEO 内容生产流水线、审核与发布管理的场景,不适用。
- 无法接受使用开源 GEOFlow 作为内容系统,或不能修改/配置其 Admin、CLI、REST API 的场景,不适用。