========================================================================
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` を作成する.
※ ローカルのソースコードをコンテナにマウントする設定.
services:
app:
build: .
volumes:
- .:/workspace
- node_modules:/workspace/node_modules
ports:
- "5173:5173"
- "3000:3000"
command: sleep infinity
tty: true
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",
"customizations": {
"vscode": {
"extensions": [
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode",
"editorconfig.editorconfig",
"ms-vscode.hexeditor",
"github.copilot",
"github.copilot-chat"
]
}
}
}
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" ]