━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
インターネット側
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[AIクローラー] [顧客ブラウザ] [Regalis管理者]
GPTBot/ClaudeBot等 (ダッシュボード利用) (システム管理)
| | |
↓ ↓ ↓
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Cloudflare(CDN・WAF・DDoS保護)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
├──[gw.hackii.jp]───────────────────────────────────────┐
│ Cloudflare Workers(APIゲートウェイ) │
│ ・User-Agent識別(Tsukull) │
│ ・課金イベント記録(Pay per Crawl) │
│ ・コンテンツプロキシ │
│ ↓ │
├──[api.hackii.jp]───────────────────────────────────────┤
│ メインAPIサーバー(AWS ECS / Fargate) │
│ ・Hackall API(ログ収集・ダッシュボード) │
│ ・Misell API(パッチ生成・配布) │
│ ・認証・課金管理 │
│ │ │
│ ┌────────────┼────────────┐ │
│ ↓ ↓ ↓ │
│ [PostgreSQL] [Redis] [S3/R2] │
│ メインDB キャッシュ パッチファイル │
│ ログ・課金・ユーザー レートリミット ストレージ │
│ │ │
│ ┌────────────┘ │
│ ↓ │
│ [SQS / Cloudflare Queue] │
│ 非同期ジョブキュー │
│ ・課金イベント処理 │
│ ・パッチ生成ジョブ │
│ │
└──[cdn.hackii.jp]────────────────────────────────────┘
パッチファイルCDN配信
llms.txt / ai-patch.json 等
① クローラーアクセスフロー(Hackall + Tsukull)
─────────────────────────────────────────
AIクローラー → gw.hackii.jp(Workers)
→ User-Agent識別
→ Tsukullポリシー照合(Redis)
↓(allow/allow_optimized)
→ 顧客オリジンサーバーへプロキシ
→ クロールイベントをキューへ非同期送信
→ キュー処理 → PostgreSQL + ダッシュボード反映
② ユーザー流入計測フロー(Hackall タグ)
─────────────────────────────────────────
人間ユーザー(AIアプリから来訪)
→ 顧客サイト(hackall.min.js が埋め込まれている)
→ タグがリファラー/行動シグナルを解析
→ api.hackii.jp/v1/events へ送信
→ PostgreSQL記録 → ダッシュボード反映
③ パッチ生成フロー(Misell)
─────────────────────────────────────────
コンテンツ更新(GitHub push / WordPress Webhook)
→ api.hackii.jp/v1/patches/generate
→ SQSジョブキューへ投入
→ Misellワーカー(ECS)がジョブを取得
→ コンテンツパース → AICS™スコアリング
→ パッチJSON / llms.txt生成
→ S3/R2へアップロード
→ CDNキャッシュをパージ
→ IndexNow API → Bing通知
→ 顧客へWebhook送信
④ 課金フロー(Pay per Crawl)
─────────────────────────────────────────
AIクローラー(X-HackII-API-Key付き)
→ gw.hackii.jp(Workers)
→ APIキー認証(Redis)
→ 無料枠チェック(Redis counter)
→ 課金イベントをキューへ送信
→ 月次バッチで集計 → 請求書生成
┌─────────────────┐ ┌─────────────────┐
│ accounts │ │ sites │
│─────────────────│ │─────────────────│
│ id (PK) │──1:N──│ id (PK) │
│ email │ │ account_id (FK) │
│ plan │ │ domain │
│ created_at │ │ site_name │
└─────────────────┘ │ gateway_cname │
│ plan │
│ created_at │
└────────┬────────┘
│
┌────────────────────┼────────────────────┐
│ │ │
↓ ↓ ↓
┌─────────────────┐ ┌─────────────────┐ ┌──────────────────┐
│ crawl_events │ │ user_events │ │ ai_patch_jobs │
│─────────────────│ │─────────────────│ │──────────────────│
│ id (PK) │ │ id (PK) │ │ id (PK) │
│ site_id (FK) │ │ site_id (FK) │ │ site_id (FK) │
│ timestamp │ │ session_id │ │ article_slug │
│ crawler_model │ │ event_type │ │ status │
│ crawler_type │ │ url │ │ aics_score │
│ url_path │ │ ai_source │ │ grade │
│ status_code │ │ ai_confidence │ │ patch_url │
│ response_bytes │ │ scroll_depth │ │ generated_at │
│ ip_hash │ │ timestamp │ │ created_at │
│ charge_type │ └─────────────────┘ └──────────────────┘
│ charge_jpy │
└─────────────────┘
│
│ N:1
↓
┌─────────────────┐ ┌─────────────────┐
│ api_keys │ │ billing_items │
│─────────────────│ │─────────────────│
│ id (PK) │──1:N──│ id (PK) │
│ company_name │ │ api_key_id (FK) │
│ contact_email │ │ site_id (FK) │
│ key_hash │ │ crawl_event_id │
│ status │ │ billed_at │
│ free_tier_limit │ │ charge_jpy │
│ monthly_usage │ │ month_key │
│ created_at │ └─────────────────┘
└─────────────────┘
┌─────────────────┐ ┌─────────────────┐
│ tsukull_policies│ │ alert_rules │
│─────────────────│ │─────────────────│
│ id (PK) │ │ id (PK) │
│ site_id (FK) │ │ site_id (FK) │
│ crawler_model │ │ alert_type │
│ action │ │ notify_via │
│ rate_limit │ │ notify_target │
│ optimized_file │ │ is_active │
│ updated_at │ │ created_at │
└─────────────────┘ └─────────────────┘
CREATE TABLE accounts (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email VARCHAR(256) UNIQUE NOT NULL,
name VARCHAR(256) NOT NULL,
plan VARCHAR(32) NOT NULL DEFAULT 'starter',
-- plan: 'starter' / 'standard' / 'enterprise'
stripe_customer_id VARCHAR(64),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE sites (
id VARCHAR(32) PRIMARY KEY, -- site_abc123 形式
account_id UUID NOT NULL REFERENCES accounts(id),
domain VARCHAR(256) NOT NULL UNIQUE,
display_name VARCHAR(256),
gateway_cname VARCHAR(256) UNIQUE,
default_policy VARCHAR(16) NOT NULL DEFAULT 'allow',
hackall_tag_active BOOLEAN DEFAULT FALSE,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE crawl_events (
id BIGSERIAL PRIMARY KEY,
site_id VARCHAR(32) NOT NULL REFERENCES sites(id),
timestamp TIMESTAMPTZ NOT NULL,
crawler_ua_raw TEXT, -- 30日後にNULL化
crawler_ua_pattern VARCHAR(64),
crawler_model VARCHAR(32),
crawler_type VARCHAR(16), -- 'learning'/'inference'/'search'
url_path TEXT NOT NULL,
query_params JSONB,
status_code SMALLINT,
response_bytes INTEGER,
ip_hash CHAR(64),
api_key_id UUID REFERENCES api_keys(id),
charge_type VARCHAR(16), -- 'free'/'billable'/NULL
charge_jpy NUMERIC(10,2),
request_id VARCHAR(64) UNIQUE -- 冪等性保証
) PARTITION BY RANGE (timestamp); -- 月次パーティション
CREATE INDEX ON crawl_events(site_id, timestamp DESC);
CREATE INDEX ON crawl_events(crawler_model, timestamp DESC);
CREATE INDEX ON crawl_events(api_key_id) WHERE api_key_id IS NOT NULL;
hackii-platform/
├── apps/
│ ├── gateway/ # Cloudflare Workers(Tsukull + Pay per Crawl)
│ │ ├── src/
│ │ │ ├── identify.ts # User-Agent識別エンジン
│ │ │ ├── policy.ts # ポリシー判定ロジック
│ │ │ ├── billing.ts # 課金イベント記録
│ │ │ └── proxy.ts # オリジンへのプロキシ
│ │ └── wrangler.toml
│ │
│ ├── api/ # メインAPIサーバー(Node.js / Fastify)
│ │ ├── src/
│ │ │ ├── routes/
│ │ │ │ ├── events.ts # Hackall イベント収集
│ │ │ │ ├── dashboard.ts # ダッシュボードデータ取得
│ │ │ │ ├── patches.ts # Misell パッチ生成トリガー
│ │ │ │ ├── billing.ts # Pay per Crawl 課金API
│ │ │ │ └── sites.ts # サイト・ポリシー管理
│ │ │ ├── workers/
│ │ │ │ └── patch-generator.ts # Misellワーカー
│ │ │ └── lib/
│ │ │ ├── aics-scorer.ts # AICS™スコアリング
│ │ │ ├── citation-extractor.ts # 引用トリガー抽出
│ │ │ └── llms-generator.ts # llms.txt生成
│ │ └── Dockerfile
│ │
│ └── dashboard/ # フロントエンド(Next.js / React)
│ ├── src/
│ │ ├── pages/
│ │ │ ├── overview.tsx # サマリーダッシュボード
│ │ │ ├── crawlers.tsx # クローラー詳細
│ │ │ ├── patches.tsx # AIパッチ管理
│ │ │ ├── control.tsx # Tsukull制御設定
│ │ │ └── billing.tsx # 収益・課金
│ │ └── components/
│ └── package.json
│
├── packages/
│ ├── crawler-ids/ # User-Agent識別テーブル(共有パッケージ)
│ ├── aics-core/ # AICS™スコアリングコア(共有パッケージ)
│ └── hackall-tag/ # 計測タグ(顧客サイト埋め込み用JS)
│
└── infra/
├── terraform/ # AWS インフラ定義
└── github-actions/ # CI/CDワークフロー