Docusaurus ドキュメントサイト仕様書
1. 概要
docs.soshosai.com は蒼翔祭システムの技術ドキュメントサイトである。
Docusaurusで構築し、スタッフ認証でアクセス制限を行う。
1.1 アーキテクチャ
2. 技術スタック
| レイヤー | 技術 |
|---|---|
| SSG | Docusaurus 3.x |
| Hosting | Cloudflare Pages |
| 認証 | Cloudflare Pages Functions |
| 言語 | TypeScript |
3. 認証
3.1 認証フロー
- ユーザーが
docs.soshosai.comにアクセス _middleware.tsが Cookie (soshosai_staff_jwt) を確認- 分岐:
- 未認証:
loginapi.soshosai.com/discord-login?redirect=...へリダイレクト - 認証済み: Service Binding経由でJWT検証
- 検証失敗: ログインページへリダイレクト
- 未認証:
- 静的アセット(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/android | Android JavaDoc参照 |