======================================================================== Pixel Paint War - 管理者用環境構築手順 (Admin Setup Guide) ======================================================================== 1. はじめに (Introduction) ------------------------------------------------------------------------ 本ドキュメントは,プロジェクトを「ゼロから新規作成・再構築する管理者」向けの Monorepo構成およびDocker環境の構築ログである. ※ 一般の開発メンバー(Git Cloneして参加する人)は本ドキュメントを実施不要である. 2. 管理者用事前準備 (Prerequisites for Admin) ------------------------------------------------------------------------ 2-1. プロジェクト作成用ツールのインストール 1. Node.js (v20.x LTS) ・Nodesource リポジトリを使用してインストールする. # リポジトリのセットアップとインストール $ curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - $ sudo apt-get install -y nodejs ・確認コマンド: $ node -v # v20.x.x と表示されること 2. pnpm (Package Manager) ・Node.js 標準の npm ではなく pnpm を使用する. ・Corepack (Node.js同梱) を有効化してインストールする. $ sudo corepack enable $ corepack prepare pnpm@latest --activate ・確認コマンド: $ pnpm -v 3. 新規プロジェクト構築 (Project Initialization) ------------------------------------------------------------------------ 3-1. プロジェクト初期化 1. ディレクトリ作成 $ mkdir SkillSemiWebGame $ cd SkillSemiWebGame 2. Git/pnpm 初期化 $ git init $ pnpm init 3-2. Monorepo構成設定 1. pnpm-workspace.yaml 作成 ルート直下に作成し、以下を記述する. packages: - 'apps/*' - 'packages/*' 2. .npmrc 作成 ルート直下に作成し、以下を記述する. shamefully-hoist=true 3-3. ディレクトリ構造の構築 以下の構成になるようにディレクトリを作成する. root/ ├── apps/ │ ├── client/ # フロントエンド (Browser) │ └── server/ # バックエンド (Node.js) └── packages/ └── shared/ # 共通ロジック (Shared Library) ・作成コマンド例: $ mkdir -p apps/client apps/server packages/shared 3-4. Git除外設定 (.gitignore) ルート直下に `.gitignore` を作成し、以下を記述する. node_modules/ .pnpm-store/ dist/ build/ .env .DS_Store .vscode/* !.vscode/extensions.json !.vscode/launch.json coverage/ !packages/ 4. アプリケーション雛形の作成 (Scaffolding) ------------------------------------------------------------------------ 4-1. 共通ライブラリ (packages/shared) 1. 初期化とビルドツール導入 $ cd packages/shared $ pnpm init $ pnpm add -D typescript tsup 2. 設定ファイルの調整 (package.json) ・name: "@repo/shared" と命名する(推奨). ・main: "./dist/index.js", types: "./dist/index.d.ts" を指定する. ・scripts: "build": "tsup src/index.ts --format cjs,esm --dts" を追加する. 3. エントリーポイントの作成 $ mkdir src $ touch src/index.ts ※ (例: export * from './constants';) 4. TypeScript設定ファイルの作成 (tsconfig.json) ・ファイル: packages/shared/tsconfig.json ・内容: { "compilerOptions": { "target": "ES2020", "module": "ESNext", "moduleResolution": "Bundler", "lib": ["ES2020", "DOM", "DOM.Iterable"], "declaration": true, "declarationMap": true, "sourceMap": true, "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true }, "include": ["src/**/*"], "exclude": ["node_modules", "dist"] } 4-2. フロントエンド (apps/client) 1. プロジェクト作成 $ cd ../../apps/client $ pnpm create vite . --template preact-ts ※ Use rolldown-vite? » No ※ Install with pnpm and start now? » No 2. 依存ライブラリのインストール $ pnpm add pixi.js $ pnpm add @repo/shared --workspace 4-3. バックエンド (apps/server) 1. 初期化 $ cd ../../apps/server $ pnpm init 2. 依存ライブラリのインストール $ pnpm add ws $ pnpm add -D tsx typescript @types/node @types/ws $ pnpm add @repo/shared --workspace 3. サーバー用ディレクトリとファイルの作成 $ mkdir src $ touch src/index.ts 4. 実行スクリプトの定義 (package.json) "scripts": { "dev": "tsx watch src/index.ts" } 5. TypeScript設定ファイルの作成 (tsconfig.json) ・ファイル: apps/server/tsconfig.json ・内容: { "compilerOptions": { "target": "ES2022", "module": "NodeNext", "moduleResolution": "NodeNext", "lib": ["ES2022"], "strict": true, "noEmit": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "baseUrl": ".", "paths": { "@repo/shared": ["../../packages/shared/src/index.ts"] } }, "include": ["src/**/*"], "exclude": ["node_modules"] } 4-4. 初回コミット (Initial Commit) 1. ルートに戻る $ cd ../.. 2. ステータスの確認 (node_modulesが含まれていないこと) $ git status 3. Gitへ保存 $ git add . $ git commit -m "chore: Initialize project structure and dependencies" 5. Docker環境定義ファイルの作成 (Configuration) ------------------------------------------------------------------------ 5-1. Dockerfile の作成 プロジェクトルートに `Dockerfile` を作成する. ※ Node.js v20 をベースとし,pnpm を有効化した開発用イメージ定義. FROM node:20-slim # pnpmの準備 ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" RUN corepack enable # 作業ディレクトリ設定 WORKDIR /workspace # 依存関係のコピーとインストール (キャッシュ活用) COPY . . RUN pnpm install # ポート公開 (Vite:5173, Server:3000) EXPOSE 5173 3000 # デフォルトコマンド (docker-composeで上書きするため待機) CMD ["sleep", "infinity"] 5-2. docker-compose.yml の作成 (開発用) プロジェクトルートに `docker-compose.yml` を作成する. ※ ローカルのソースコードをコンテナにマウントする設定. version: "3.8" services: app: container_name: pixel-paint-war-dev # 開発用イメージ: Node.js v20 (定義書準拠) image: mcr.microsoft.com/devcontainers/typescript-node:20 # 永続化とボリュームマウント volumes: # カレントディレクトリをコンテナ内の /workspace にマウント - .:/workspace:cached # 【重要】node_modules をホスト側と切り離して高速化・安定化させる設定 - node_modules:/workspace/node_modules # コマンドの上書き (コンテナを常時起動させる) command: sleep infinity # ネットワーク設定 # Client(5173) と Server(3000) のポートを開放 ports: - "5173:5173" - "3000:3000" # 環境変数 environment: - NODE_ENV=development # ユーザー権限 (Nodeイメージ推奨のユーザー) user: node volumes: node_modules: 5-3. .devcontainer 設定の作成 1. ディレクトリ作成 $ mkdir .devcontainer 2. .devcontainer/devcontainer.json 作成 VS Codeがコンテナを認識するための設定. { "name": "Pixel Paint War Dev", "dockerComposeFile": "../docker-compose.yml", "service": "app", "workspaceFolder": "/workspace", "features": { "ghcr.io/devcontainers/features/node:1": { "version": "20", "pnpm": "latest" } }, "customizations": { "vscode": { "extensions": [ "dbaeumer.vscode-eslint", "esbenp.prettier-vscode", "editorconfig.editorconfig", "ms-vscode.hexeditor", "github.copilot", "github.copilot-chat" ], "settings": { "editor.formatOnSave": true, "editor.defaultFormatter": "esbenp.prettier-vscode" } } }, // コンテナ起動後の初期化コマンド // 1. sudo chown ... : node_modules の所有権を node ユーザーに強制変更 // 2. pnpm install : その後,安全にインストールを実行 // 3. build : 最後に共通パッケージをビルド "postCreateCommand": "sudo chown -R node:node /workspace/node_modules && pnpm install && pnpm --filter @repo/shared build", // コンテナ内のユーザー "remoteUser": "node" } 5-4. docker-compose.prod.yml の作成 (本番確認用) プロジェクトルートに `docker-compose.prod.yml` を作成する. ※ 本番ビルド確認用にポートをずらし、ビルドコマンドを実行する設定. services: app: build: . ports: - "3001:3000" environment: - NODE_ENV=production command: pnpm start 6. 本番デプロイ構成の補足 (Deployment Config) ------------------------------------------------------------------------ 本番環境へデプロイする際は,上記 `Dockerfile` をマルチステージビルドに修正し, 軽量化を図ることが推奨される. 6-1. Dockerfile (本番用最適化例) ※ 必要に応じて `Dockerfile.prod` として作成する. FROM node:20-slim AS base ENV PNPM_HOME="/pnpm" ENV PATH="$PNPM_HOME:$PATH" RUN corepack enable COPY . /app WORKDIR /app FROM base AS prod-deps RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-lockfile FROM base AS build RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile RUN pnpm run build FROM base COPY --from=prod-deps /app/node_modules /app/node_modules COPY --from=build /app/apps/server/dist /app/apps/server/dist COPY --from=build /app/apps/client/dist /app/apps/client/dist EXPOSE 3000 CMD [ "pnpm", "start" ]