ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

OpenSEO Docker 自托管实战:compose 配置、local_noauth 安全边界与容器启动流程全解析

OpenSEO Docker 自托管实战:compose 配置、local_noauth 安全边界与容器启动流程全解析 OpenSEO Docker 自托管实战compose 配置、local_noauth 安全边界与容器启动流程全解析【免费下载链接】open-seoOpen source alternative to Semrush and Ahrefs项目地址: https://gitcode.com/GitHub_Trending/op/open-seo本文以 docs/SELF_HOSTING_DOCKER.md 为主体讲解如何用 Docker 一键自托管 OpenSEO一个开源的 Semrush / Ahrefs 替代品从.env准备、compose.yaml参数逐项解析到镜像固定、本地构建、遥测关闭与容器健康排查并结合 compose.yaml、docker-entrypoint.sh 等仓库源码说明容器内部的 preflight 校验、数据库迁移与 Vite 构建缓存机制帮你把 OpenSEO 稳定跑在自己的服务器上。Docker 模式的核心前提local_noauth 与安全边界在 Docker 模式下OpenSEO 固定使用AUTH_MODElocal_noauth应用不做任何认证检查直接注入一个本地管理员用户adminlocalhost。这意味着容器本身不设登录门槛官方文档明确要求只能把它暴露在你自己的、带认证的反向代理、隧道或私有网络之后。这一约束在仓库中可以直接看到。compose.yaml 中environment列表写死了该模式environment: # Required for local Docker self-hosting: exposes Compose env vars to cloudflare:workers bindings. - CLOUDFLARE_INCLUDE_PROCESS_ENVtrue - PORT${PORT:-3001} - ALLOWED_HOST${ALLOWED_HOST:-} - AUTH_MODElocal_noauth - OPENSEO_TELEMETRY_DISABLED${OPENSEO_TELEMETRY_DISABLED:-} - DO_NOT_TRACK${DO_NOT_TRACK:-} - DATAFORSEO_API_KEY${DATAFORSEO_API_KEY} - OPENROUTER_API_KEY${OPENROUTER_API_KEY:-} - GOOGLE_CLIENT_ID${GOOGLE_CLIENT_ID:-} - GOOGLE_CLIENT_SECRET${GOOGLE_CLIENT_SECRET:-} - BETTER_AUTH_SECRET${BETTER_AUTH_SECRET:-} - OPENROUTER_MODEL${OPENROUTER_MODEL:-} - VITE_SHOW_DEVTOOLSfalseAUTH_MODE的合法取值在 src/lib/auth-mode.ts 中由 zod schema 限定为三种cloudflare_access、local_noauth、hosted。未设置时默认回落到cloudflare_accessfail-closed因此 Docker 场景必须像 compose 这样显式声明local_noauth否则容器会因缺少TEAM_DOMAIN/POLICY_AUD而启动失败。另外注意 compose 的端口映射是127.0.0.1:${PORT:-3001}:${PORT:-3001}——即使忘了加反向代理端口也默认只监听宿主机回环地址这是一个额外的安全兜底。前置条件按 docs/SELF_HOSTING_DOCKER.md 的说明Docker 自托管只需要两样东西Docker Desktop或 Docker Engine Docker Compose一个 DataForSEO API Key配置方法见 DATAFORSEO_API_KEY.md。其中DATAFORSEO_API_KEY的格式是账号邮箱与 API 密码拼接后的 base64 编码值即email:password的编码结果而不是后台展示的 dashboard API key。启动时的 preflight 会尝试验证它能否解码为login:password形态见下文preflight一节。快速开始在仓库根目录或你存放compose.yaml的目录执行cp .env.example .env然后按 DATAFORSEO_API_KEY.md 的指引在.env中填入DATAFORSEO_API_KEY启动docker compose up -d打开http://localhost:PORT默认3001。首次启动会在容器内构建应用可能耗时 1–2 分钟可以用docker compose logs -f跟踪进度。这里有一个容易踩的坑compose.yaml 中声明了env_file: .env且注释明确说明——如果.env文件不存在Compose 会直接报错。所以cp .env.example .env这一步不能省。.env.example的完整内容如下来自 .env.example可以对照了解每个可配置项# ----------------------------------------------------------------------------- # Core settings # ----------------------------------------------------------------------------- # Required for SEO data features. See docs/DATAFORSEO_API_KEY.md. # DATAFORSEO_API_KEY # Optional app port # PORT3001 # Optional reverse-proxy hosts for Docker self-hosting # ALLOWED_HOSTyourdomain.com # Optional image tag override for Docker self-hosting # OPEN_SEO_IMAGEghcr.io/every-app/open-seo:latest # ----------------------------------------------------------------------------- # Auth mode # ----------------------------------------------------------------------------- # - cloudflare_access: validate Cloudflare Access JWTs (recommended for deploys) # - local_noauth: local trusted mode with injected admin user (adminlocalhost) # - hosted: Better Auth email/password organization mode # # Defaults to cloudflare_access when unset. # AUTH_MODEcloudflare_access # ... # OPENROUTER_API_KEYreplace-with-your-openrouter-api-key # GOOGLE_CLIENT_IDreplace-with-your-google-oauth-client-id # GOOGLE_CLIENT_SECRETreplace-with-your-google-oauth-client-secret # BETTER_AUTH_SECRETreplace-with-a-long-random-secret-at-least-32-characters可选环境变量速查官方文档列出的可选 env 项结合 compose.yaml 与 .env.example 整理成下表变量默认值说明PORT3001应用端口同时决定 compose 的宿主机映射端口ALLOWED_HOST空允许 Vite preview 放行的单个反向代理主机名不设置时只有 localhost 访问可用走代理/隧道时不设置会收到 Vite 的 Blocked request 页面AUTH_MODElocal_noauthcompose 已固定Docker 模式下不建议改动OPEN_SEO_IMAGEghcr.io/every-app/open-seo:latest使用的镜像compose 的image:行通过${OPEN_SEO_IMAGE:-...}引用它DATAFORSEO_API_KEY无email:password的 base64 编码缺失时所有 SEO 数据功能不可用preflight 仅告警不阻断OPENROUTER_API_KEY无可选SAM应用内 SEO Agent等 AI 功能所需。缺少时应用内的 setup 门禁会提示你补填GOOGLE_CLIENT_ID/GOOGLE_CLIENT_SECRET无可选Google Search Console 集成所需另见 docs/SELF_HOSTING_GOOGLE_SEARCH_CONSOLE.mdBETTER_AUTH_SECRET无可选GSC 用它加密存储的 OAuth token长度不足时 GSC 保持 DISABLEDOPENSEO_TELEMETRY_DISABLED/DO_NOT_TRACK空任一置1即关闭遥测其中OPENROUTER_API_KEY值得单独说明compose 注释里指出没有这个变量转发即使你在应用里填了 key 也到不了后端——这正是 compose.yaml 里env_file: .env把.env里所有值都转发进容器与显式environment:列表并存的原因显式列表对同名键优先而env_file兜底了未列出的变量。反向代理 / 隧道场景如果 Docker 后面挂了反向代理或临时隧道切记 Docker 自托管是关闭了应用层认证的。务必只暴露在你自己的认证代理之后并在重启前加上公网主机名ALLOWED_HOSTyourdomain.com docker compose up -d也可以把ALLOWED_HOST持久化到.env中省去每次命令行注入。容器内部发生了什么preflight、迁移与条件构建文档提到启动检查会出现在构建之前的docker compose logs里这段流程的完整实现在 docker-entrypoint.sh 中按顺序执行四步环境预检preflight运行pnpm exec tsx scripts/selfhost-preflight.ts入口见 scripts/selfhost-preflight.ts在慢速步骤之前校验环境变量。遇到硬失败非法AUTH_MODE、所选模式缺少必要配置会以非零码退出秒级失败并给出精确的修复建议而不是等几分钟构建完才报模糊错误。数据库迁移pnpm run db:migrate:local。条件化构建Vite build 会把envPrefix前缀的客户端环境变量内联进 bundle所以构建必须在容器启动时运行。入口脚本对影响产物的环境变量VITE_*、AUTH_MODE、POSTHOG_*、TURNSTILE_SITE_KEY、POSTHOG_SOURCEMAPS做指纹SHA-256与上次构建的指纹一致就跳过构建直接复用镜像更新后容器没有构建产物则必然重建。这解释了首次启动 1–2 分钟、之后明显更快的现象。启动服务exec pnpm exec vite preview --host 0.0.0.0 --port ${PORT:-3001}。preflight 具体检查哪些项src/lib/selfhost-preflight.ts 定义了四级输出ok/info/warn/failAUTH_MODE非法值直接 faillocal_noauth时明确提示没有认证、单管理员用户不要在没有前置认证的情况下暴露公网DATAFORSEO_API_KEY未设置为 warnSEO 数据功能全部不可用设置了但无法解码为login:password的 base64 也是 warn并给出编码命令printf email:password | base64Google Search Console只配置了GOOGLE_CLIENT_ID/GOOGLE_CLIENT_SECRET其一为 warn两者齐了但BETTER_AUTH_SECRET长度不足时为 warnGSC 保持禁用OPENROUTER_API_KEY未设置仅 infoSAM 不可用ALLOWED_HOST未设置时 info 提醒只有 localhost 可访问走代理需设置该变量否则请求被 Vite 拦截Scheduled checks固定 info——Docker 模式下不会运行 rank-tracking 的定时任务需要从 Rank Tracking 页面手动触发检查。这套检查是启动日志与运行时健康端点共用的同一份实现/api/health通过 src/server/lib/setup-status.ts 复用runSelfhostChecks保证两处报告永不漂移。镜像管理固定版本与本地构建固定到特定镜像 taglatest适合尝鲜但生产环境建议锁版本。在.env中设置OPEN_SEO_IMAGE后重启即可OPEN_SEO_IMAGEghcr.io/every-app/open-seo:v1.2.3 docker compose up -d构建自己的镜像如果你正在测试本地代码改动用仓库自带的 Dockerfile.selfhost 打本地镜像docker build -f Dockerfile.selfhost -t open-seo:local . OPEN_SEO_IMAGEopen-seo:local docker compose up -d从 Dockerfile.selfhost 可以看出镜像的构建逻辑基于node:22注释说明完整 Node 镜像能为 workerd 提供可用的 CA 信任库以支持出站 HTTPS通过 corepack 固定pnpm10.30.1先拷贝 lockfile 系列做pnpm install --frozen-lockfile利用层缓存EXPOSE 3001并用HEALTHCHECK30s 间隔、10s 超时、300s 启动宽限期、3 次重试定期fetch本机的/api/health端点判断容器健康。注释还提到仓库的.npmrc通过node-options提高了 V8 堆上限避免约 7400 个模块的 SSR 构建在 Node 默认约 2GB 堆下 OOM——这也是镜像内构建能跑通的前提之一。常用运维命令来自 docs/SELF_HOSTING_DOCKER.md 的完整命令集修改 env 后重启服务让 Compose 重新应用.envdocker compose up -d open-seo拉取最新发布镜像并重启docker compose pull docker compose up -d停止docker compose down注意docker compose down不会删除命名卷见下文数据持久化数据库数据保留在open_seo_data卷中。数据持久化compose.yaml 声明了一个命名卷volumes: - open_seo_data:/app/.wranglerDocker 模式以 Cloudflare Workers 运行时workerd承载状态数据含本地数据库落在容器内.wrangler目录通过该卷挂载持久化。这也是为什么修改.env需要重建容器而不是仅restart环境变量在容器创建时固化docker restart不会重新读取.env。遥测Telemetry与关闭方式OpenSEO 会收集匿名化遥测仅覆盖核心使用事件绑定随机安装 ID 的心跳附带 installs、users、projects、功能使用等聚合计数安装后前 2 小时内每 5 分钟发送一次之后最多每天一次另外包含失败 setup 检查的名称与状态从不包含值或错误信息。不收集 URL、关键词、prompt、邮箱或 IP 推导的位置闲置安装不发送任何数据。这一行为在源码中可逐条印证src/server/lib/self-host-telemetry.ts 中ONBOARDING_WINDOW_MS为 2 小时、ONBOARDING_HEARTBEAT_INTERVAL_MS为 5 分钟、DAILY_HEARTBEAT_INTERVAL_MS为 24 小时心跳属性为计数型字段用户数、项目数、审计数、关键词数、GSC 是否连接、SAM 是否使用等。docker-entrypoint.sh 第一行也会主动打印提醒OpenSEO sends an anonymous usage heartbeat (counts only). Disable: OPENSEO_TELEMETRY_DISABLED1.关闭方法在.env中设置OPENSEO_TELEMETRY_DISABLED1或DO_NOT_TRACK1然后docker compose up -d --force-recreate open-seo健康检查与故障排查运行期健康端点容器起来后/api/health报告配置与数据库状态实现见 src/routes/api/health.ts。它在自托管模式下返回按功能分组的检查结果auth、dataforseo、gsc、ai、runtime加database只给状态与指引、从不回显密钥值某项为 error 时整体status为issues否则ok。docker compose ps报告的容器健康状态则来自 Dockerfile.selfhost 中对该端点的 HEALTHCHECK 探测。核对 Compose 实际注入的环境变量docker compose config确认其中AUTH_MODElocal_noauth且DATAFORSEO_API_KEY是email:password的 base64 编码值。改过.env后强制重建容器docker compose up -d --force-recreate open-seo一个值得记住的排障顺序看docker compose logs里 preflight 报告它先于构建输出→curl /api/health看运行期检查 →docker compose config核对变量注入。三者覆盖了配置错运行态错注入错三类问题。小结Docker 自托管 cp .env.example .env 填DATAFORSEO_API_KEYdocker compose up -d首次启动 1–2 分钟属正常容器内构建安全边界在应用之外local_noauth意味着必须自备认证代理ALLOWED_HOST决定代理主机名是否放行端口默认绑定127.0.0.1生产建议用OPEN_SEO_IMAGE锁定镜像 tag用OPENSEO_TELEMETRY_DISABLED1按需关闭遥测排障三板斧docker compose logspreflight 秒级报错、/api/health运行态配置 数据库状态、docker compose config变量注入核对改完.env记得--force-recreate。【免费下载链接】open-seoOpen source alternative to Semrush and Ahrefs项目地址: https://gitcode.com/GitHub_Trending/op/open-seo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表