vercel-no-workers-sia.md
# Vercel でワーカーを動かさない — SIA(Layer 2) > 作成: 2026-01-29 > 目的: BullMQ ワーカー・常駐プロセスを Vercel 上で動かさないことを、SIA Layer 2(デプロイによる不可能性)として文書化し、mirror サイト・GitHub で実現する。 --- ## 1. ルール(構造的不可能性) **Vercel にデプロイするアプリでは、BullMQ ワーカーや常駐プロセスを起動してはいけない。** - **理由**: Vercel はリクエストごとにプロセスが起動・終了するモデル。常駐ワーカーが動くと Fluid Provisioned Memory / Fluid Active CPU が枯渇し、チーム全体が Paused になる(VERCEL_TEAM_PAUSED_RESOLUTION.md および one-portal の `docs/RENEW_VERCEL_RISK_ANALYSIS.md` 参照)。 - **SIA の位置づけ**: **Layer 2(デプロイによる不可能性)** — CI で「エントリポイントからワーカー起動を呼ばない」ことを検証し、違反するとデプロイを止める。 --- ## 2. 禁止パターン | 禁止 | 説明 | | -------------------------------------------------------------------------- | -------------------------------------------- | | `createAllWorkers()` を API ルート・instrumentation・Next エントリから呼ぶ | 常駐ワーカーが Vercel 上で動く | | API ルート・instrumentation で BullMQ の `Worker` を new して起動する | 同上 | | 「Vercel のときだけワーカーをスキップする」分岐に頼る | 漏れが起きる。**そもそも呼ばない**設計にする | --- ## 3. 許可パターン | 許可 | 説明 | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------- | | ワーカーは **定義・export のみ**。アプリのエントリからは **一切呼ばない** | one-portal の現状。ワーカーは別プロセス(Container PaaS)で起動する | | パイプライン実行は **RENEW_API_URL 経由の外部 API 呼び出し**に限定する | Harvest/Capture API はプロキシまたはデモデータ返却のみ | | ワーカーを動かす場合は **Vercel 外**(Railway / Render / Fly.io 等)で別サービスとして稼働させる | ATLAS 推奨環境に準拠 | --- ## 4. mirror サイトでの実現 - **文書化**: 本ガイド(`docs/guides/vercel-no-workers-sia.md`)でルールと理由を明示。 - **参照**: SIAQuality Standards から「Vercel 制約」として参照。 VERCEL_TEAM_PAUSED_RESOLUTION.md から本ガイドへリンク。 - **運用**: 実装フェーズでは CLAUDE.md / レビューで「Vercel にデプロイするコードパスで createAllWorkers を呼んでいないか」を確認する。CI は対象リポジトリ(one-portal 等)で実行する。 --- ## 5. GitHub での実現(CI) Vercel にデプロイするリポジトリ(例: one-portal)で、**CI ジョブ**を追加する。 ### 5.1 チェック内容 次のいずれかのファイルに `createAllWorkers(` または `createWorker(` の**呼び出し**が含まれていたら **失敗**とする。 - `src/app/**/*.ts` - `src/app/**/*.tsx` - `instrumentation.ts` - `middleware.ts` - `next.config.js` / `next.config.ts` / `next.config.mjs` (定義のみが書かれている `src/lib/portal/queue/**` は対象外。) ### 5.2 実装 - **スクリプト**: 対象リポジトリに `scripts/check-vercel-no-workers.sh` を置き、上記パターンで grep し、マッチしたら exit 1 する。 - **ワークフロー**: `.github/workflows/ci.yml`(または `vercel-no-workers.yml`)で、PR / push 時にこのスクリプトを実行する。失敗したらデプロイ前にブロックする。 これにより、**「Vercel に載るコードパスからワーカーを起動しない」**が Layer 2(デプロイによる不可能性)として保証される。 --- ## 6. 参照 - **mirror**: Vercel 課金制御の体系 — 最大公約数 — 「気づいたら課金される」を防ぐ防止・検知・上限の共通枠組み。 - **mirror**: STRUCTURAL_IMPOSSIBILITY_ARCHITECTURE.md — SIA 5 層、Layer 2 の説明。 - **mirror**: SIA_MANAGEMENT_CAPABILITIES.md — SIA の管理機能(本ルールは Layer 2 の例として追加可能)。 - **mirror**: VERCEL_TEAM_PAUSED_RESOLUTION.md — Paused の原因と解消・再発防止。 - **one-portal**: `CLAUDE.md` — 制約(Vercel・ワーカー)。 - **one-portal**: `docs/RENEW_VERCEL_RISK_ANALYSIS.md` — 設計制約・禁止事項 C-1〜C-4。