メインコンテンツまでスキップ

Docusaurus ドキュメントサイト仕様書

1. 概要

docs.soshosai.com は蒼翔祭システムの技術ドキュメントサイトである。 Docusaurusで構築し、スタッフ認証でアクセス制限を行う。

1.1 アーキテクチャ


2. 技術スタック

レイヤー技術
SSGDocusaurus 3.x
HostingCloudflare Pages
認証Cloudflare Pages Functions
言語TypeScript

3. 認証

3.1 認証フロー

  1. ユーザーが docs.soshosai.com にアクセス
  2. _middleware.ts が Cookie (soshosai_staff_jwt) を確認
  3. 分岐:
    • 未認証: loginapi.soshosai.com/discord-login?redirect=... へリダイレクト
    • 認証済み: Service Binding経由でJWT検証
    • 検証失敗: ログインページへリダイレクト
  4. 静的アセット(JS/CSS/画像/フォント)は認証をスキップ

3.2 Service Binding設定

wrangler.jsonc:

{
"name": "soshosai-docs",
"pages_build_output_dir": "./build",
"compatibility_date": "2025-02-01",
"services": [
{ "binding": "AUTH_SERVICE", "service": "unified-auth-worker" },
],
"vars": {
"LOGIN_API_URL": "https://loginapi.soshosai.com",
},
}

3.3 ミドルウェア実装

functions/_middleware.ts:

interface Env {
AUTH_SERVICE: Fetcher;
LOGIN_API_URL: string;
}

// 認証を除外するパス
const EXCLUDED_EXTENSIONS = [
'.js',
'.css',
'.png',
'.jpg',
'.svg',
'.ico',
'.woff',
'.woff2',
];

export const onRequest: PagesFunction<Env> = async (context) => {
const { request, env, next } = context;
const url = new URL(request.url);

// 静的アセットはスキップ
if (EXCLUDED_EXTENSIONS.some((ext) => url.pathname.endsWith(ext))) {
return next();
}

// CookieからJWTを取得
const cookies = request.headers.get('Cookie') || '';
const staffJwt = cookies.match(/soshosai_staff_jwt=([^;]+)/)?.[1];

if (!staffJwt) {
const loginUrl = `${env.LOGIN_API_URL}/discord-login?redirect=${encodeURIComponent(request.url)}`;
return Response.redirect(loginUrl, 302);
}

// Service Binding経由でJWT検証
const verifyResponse = await env.AUTH_SERVICE.fetch(
'https://auth/token/verify',
{
method: 'POST',
headers: {
Authorization: `Bearer ${staffJwt}`,
'Content-Type': 'application/json',
},
},
);

if (!verifyResponse.ok) {
const loginUrl = `${env.LOGIN_API_URL}/discord-login?redirect=${encodeURIComponent(request.url)}`;
return Response.redirect(loginUrl, 302);
}

return next();
};

4. デプロイ

# ビルド
cd docs && pnpm build

# ローカルプレビュー(認証あり)
pnpm preview

# 本番デプロイ
pnpm run deploy

5. コンテンツ構成

パス内容
/specifications/システム仕様書
/guides/開発ガイド
/references/androidAndroid JavaDoc参照