@einja/dev-cli 0.1.10 → 0.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/file-system.js +1 -1
- package/dist/lib/file-system.js.map +1 -1
- package/package.json +1 -2
- package/scaffolds/cli/preset.yaml +110 -0
- package/scaffolds/example/README.md +35 -0
- package/scaffolds/example/specs/issues/issue999-example-task/design.md +879 -0
- package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/README.md +150 -0
- package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/1-1.md +268 -0
- package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/1-2.md +179 -0
- package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/1-3.md +392 -0
- package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/evidence/.gitkeep +0 -0
- package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase2/2-1.md +459 -0
- package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase2/evidence/.gitkeep +0 -0
- package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/scenarios.md +125 -0
- package/scaffolds/example/specs/issues/issue999-example-task/requirements.md +494 -0
- package/scaffolds/example/specs/issues/issue999-example-task/tasks.md +212 -0
- package/scaffolds/instructions/deployment-setup.md +458 -0
- package/scaffolds/instructions/environment-setup.md +509 -0
- package/scaffolds/instructions/local-server-environment-and-worktree.md +539 -0
- package/scaffolds/instructions/task-execute.md +649 -0
- package/scaffolds/instructions/task-vibe-kanban-loop.md +495 -0
- package/scaffolds/memory/archive/.gitkeep +0 -0
- package/scaffolds/memory/decisions.md +26 -0
- package/scaffolds/memory/patterns.md +28 -0
- package/scaffolds/CLAUDE.md.template +0 -386
- /package/{templates → scaffolds/templates}/README.md +0 -0
- /package/{templates → scaffolds/templates}/design-simple.md.template +0 -0
- /package/{templates → scaffolds/templates}/design.md.template +0 -0
- /package/{templates → scaffolds/templates}/qa-test.md.template +0 -0
- /package/{templates → scaffolds/templates}/requirements.md.template +0 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
# 実装計画サンプル
|
|
2
|
+
|
|
3
|
+
このファイルは、タスク一覧の標準構造、フェーズ構成、タスク記述形式を示すサンプルです。
|
|
4
|
+
|
|
5
|
+
**📖 タスク階層の詳細は [タスク管理ガイドライン](../../../../steering/task-management.md) を参照**
|
|
6
|
+
|
|
7
|
+
## 概要
|
|
8
|
+
|
|
9
|
+
本ドキュメントは、サンプル機能の実装タスク一覧です。以下のユーザーストーリーを実装します:
|
|
10
|
+
|
|
11
|
+
- **Story 1**: ユーザー認証機能の実装(AC1.1-AC1.4)
|
|
12
|
+
- **Story 2**: プロフィール管理機能の実装(AC2.1-AC2.3)
|
|
13
|
+
|
|
14
|
+
**タスク階層構造:**
|
|
15
|
+
- Phase(フェーズ): 1, 2...(単一の数字)
|
|
16
|
+
- タスクグループ: 1.1, 1.2...(チェックボックス付き、1-4時間)
|
|
17
|
+
- タスク: 1.1.1, 1.1.2...(チェックボックスなし、15-60分)
|
|
18
|
+
- サブタスク: タスクの下に箇条書き
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Phase 1: 認証・プロフィール管理基盤構築
|
|
23
|
+
|
|
24
|
+
- [ ] 1.1 ユーザー認証機能実装
|
|
25
|
+
|
|
26
|
+
- 1.1.1 データベーススキーマ設計と実装
|
|
27
|
+
- Prisma schema.prismaにUserモデルを定義(id、email、name、createdAt、updatedAt)
|
|
28
|
+
- Sessionモデルを定義(id、userId、token、expiresAt)
|
|
29
|
+
- Accountモデルを定義(OAuth用、provider、providerAccountId)
|
|
30
|
+
- 適切なインデックスとリレーションを設定
|
|
31
|
+
- マイグレーションを作成(pnpm db:migrate:dev --name init)
|
|
32
|
+
- マイグレーションを実行し、データベースにテーブルを作成
|
|
33
|
+
- **要件**: Story 1
|
|
34
|
+
- **依存関係**: なし
|
|
35
|
+
- **完了条件**: Prismaスキーマが定義され、マイグレーションが実行され、データベースにテーブルが作成されていること(AC1.1を満たす)
|
|
36
|
+
- **対応設計**: design.md「データベース設計」セクション(L100-L150)
|
|
37
|
+
- **シナリオテスト**: なし(DB設計のみ、UIフロー未実装のため)
|
|
38
|
+
|
|
39
|
+
- 1.1.2 認証ロジック実装
|
|
40
|
+
- src/auth/magic-link.tsを作成
|
|
41
|
+
- generateMagicLink関数を実装(トークン生成、有効期限設定)
|
|
42
|
+
- verifyMagicLink関数を実装(トークン検証、セッション作成)
|
|
43
|
+
- メール送信サービスと連携
|
|
44
|
+
- エラーハンドリング実装(無効なトークン、期限切れ等)
|
|
45
|
+
- **要件**: Story 1
|
|
46
|
+
- **依存関係**: 1.1.1
|
|
47
|
+
- **完了条件**: Magic Link認証ロジックが実装され、トークン生成・検証が正常に動作すること(AC1.2を満たす)
|
|
48
|
+
- **対応設計**: design.md「認証ロジック」セクション(L200-L250)
|
|
49
|
+
- **シナリオテスト**: なし(認証ロジックのみ、UIフロー未実装のため)
|
|
50
|
+
|
|
51
|
+
- 1.1.3 API Routes実装とテスト
|
|
52
|
+
- app/api/auth/magic-link/route.tsを作成
|
|
53
|
+
- POST /api/auth/magic-linkハンドラーを実装(メールアドレス受付、Magic Link送信)
|
|
54
|
+
- app/api/auth/verify/route.tsを作成
|
|
55
|
+
- GET /api/auth/verifyハンドラーを実装(トークン検証、セッション作成、リダイレクト)
|
|
56
|
+
- zodバリデーションを適用
|
|
57
|
+
- エラーレスポンスを適切に返却
|
|
58
|
+
- E2Eテストファイルを作成(tests/e2e/auth.spec.ts)
|
|
59
|
+
- Magic Link送信テストケースを作成(有効なメールアドレス、無効なメールアドレス)
|
|
60
|
+
- トークン検証テストケースを作成(有効なトークン、無効なトークン、期限切れトークン)
|
|
61
|
+
- セッション作成テストケースを作成
|
|
62
|
+
- 全テストケースを実行
|
|
63
|
+
- **要件**: Story 1
|
|
64
|
+
- **依存関係**: 1.1.2
|
|
65
|
+
- **完了条件**: 認証APIが実装され、Magic Link送信とトークン検証が正常に動作すること。Story 1の受け入れ基準AC1.1-AC1.3を満たすE2Eテストが通ること
|
|
66
|
+
- **対応設計**: design.md「API設計」セクション(L300-L350)、「テスト戦略」E2Eテストセクション(L500-L550)
|
|
67
|
+
- **シナリオテスト**: なし(API実装のみ、UIフロー未実装のため)
|
|
68
|
+
|
|
69
|
+
- [ ] 1.2 プロフィール管理機能実装
|
|
70
|
+
|
|
71
|
+
- 1.2.1 プロフィール用データベーススキーマ拡張
|
|
72
|
+
- Prisma schema.prismaのUserモデルにbio、avatar、locationフィールドを追加
|
|
73
|
+
- マイグレーションを作成(pnpm db:migrate:dev --name add_profile_fields)
|
|
74
|
+
- マイグレーションを実行
|
|
75
|
+
- **要件**: Story 2
|
|
76
|
+
- **依存関係**: 1.1.1
|
|
77
|
+
- **完了条件**: Userモデルにプロフィールフィールドが追加され、マイグレーションが完了していること(AC2.1を満たす)
|
|
78
|
+
- **対応設計**: design.md「データベース設計」セクション(L160-L180)
|
|
79
|
+
- **シナリオテスト**: なし(DBスキーマ拡張のみ、UIフロー未実装のため)
|
|
80
|
+
|
|
81
|
+
- 1.2.2 プロフィール更新API実装とテスト
|
|
82
|
+
- app/api/users/me/route.tsを作成
|
|
83
|
+
- GET /api/users/meハンドラーを実装(認証確認、プロフィール取得)
|
|
84
|
+
- app/api/users/profile/route.tsを作成
|
|
85
|
+
- PUT /api/users/profileハンドラーを実装(認証確認、プロフィール更新)
|
|
86
|
+
- zodバリデーションを適用(bio最大500文字、location最大100文字等)
|
|
87
|
+
- エラーハンドリング実装
|
|
88
|
+
- E2Eテストファイルを作成(tests/e2e/profile.spec.ts)
|
|
89
|
+
- プロフィール取得テストケースを作成(認証済み、未認証)
|
|
90
|
+
- プロフィール更新テストケースを作成(有効なデータ、無効なデータ、認証なし)
|
|
91
|
+
- バリデーションテストケースを作成(bio文字数制限、location文字数制限)
|
|
92
|
+
- 全テストケースを実行
|
|
93
|
+
- **要件**: Story 2
|
|
94
|
+
- **依存関係**: 1.2.1
|
|
95
|
+
- **完了条件**: プロフィールAPIが実装され、取得・更新が正常に動作すること。Story 2の受け入れ基準AC2.1-AC2.2を満たすE2Eテストが通ること
|
|
96
|
+
- **対応設計**: design.md「API設計」セクション(L360-L400)、「テスト戦略」E2Eテストセクション(L560-L600)
|
|
97
|
+
- **シナリオテスト**: シナリオ1 Step 1-3(部分実行:API認証まで)
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Phase 1完了確認
|
|
102
|
+
|
|
103
|
+
- [ ] 1.X フェーズ1完了条件確認
|
|
104
|
+
|
|
105
|
+
- 1.X.1 フェーズ1全タスク完了確認
|
|
106
|
+
- タスクグループ1.1: ユーザー認証機能実装の全タスク完了確認(1.1.1-1.1.3)
|
|
107
|
+
- タスクグループ1.2: プロフィール管理機能実装の全タスク完了確認(1.2.1-1.2.2)
|
|
108
|
+
- 全シナリオテストの成功確認
|
|
109
|
+
- コードレビュー完了確認
|
|
110
|
+
- デプロイ可能な状態であることを確認
|
|
111
|
+
- **要件**: Story 1, Story 2
|
|
112
|
+
- **依存関係**: 1.1.3, 1.2.2
|
|
113
|
+
- **完了条件**: フェーズ1の全タスクグループが完了し、受け入れ基準**AC1.1-AC1.3、AC2.1-AC2.2**を満たすこと。認証機能・プロフィール管理機能が正常動作し、全E2Eテストが成功、Biomeエラー0件を維持していること
|
|
114
|
+
- **対応設計**: design.md 全セクション
|
|
115
|
+
- **シナリオテスト**: シナリオ1 全Step(リグレッション確認)
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Phase 2: UI実装
|
|
120
|
+
|
|
121
|
+
- [ ] 2.1 認証UI実装
|
|
122
|
+
|
|
123
|
+
- 2.1.1 ログインページ実装とテスト
|
|
124
|
+
- app/(auth)/login/page.tsxを作成
|
|
125
|
+
- メールアドレス入力フォームを実装(React Hook Form + zod)
|
|
126
|
+
- POST /api/auth/magic-link呼び出し処理を実装
|
|
127
|
+
- ローディング状態表示を実装
|
|
128
|
+
- エラーメッセージ表示を実装
|
|
129
|
+
- 成功メッセージ表示を実装(「メールを確認してください」等)
|
|
130
|
+
- E2Eテストでログインフロー検証
|
|
131
|
+
- アクセシビリティチェック
|
|
132
|
+
- **要件**: Story 1
|
|
133
|
+
- **依存関係**: Phase 1完了
|
|
134
|
+
- **完了条件**: ログインページが実装され、Magic Link送信フォームが正常に動作すること(AC1.4を満たす)
|
|
135
|
+
- **対応設計**: design.md「UI設計」セクション(L700-L750)
|
|
136
|
+
- **シナリオテスト**: シナリオ1 全Step(フル実行)
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Phase 2完了確認
|
|
141
|
+
|
|
142
|
+
- [ ] 2.X フェーズ2完了条件確認
|
|
143
|
+
|
|
144
|
+
- 2.X.1 フェーズ2全タスク完了確認
|
|
145
|
+
- タスクグループ2.1: 認証UI実装の全タスク完了確認(2.1.1)
|
|
146
|
+
- 全シナリオテストの成功確認
|
|
147
|
+
- UIコンポーネントのアクセシビリティ確認
|
|
148
|
+
- レスポンシブデザイン確認
|
|
149
|
+
- **要件**: Story 1
|
|
150
|
+
- **依存関係**: 2.1.1
|
|
151
|
+
- **完了条件**: フェーズ2の全タスクグループが完了し、受け入れ基準**AC1.4**を満たすこと。認証UIが正常動作し、レスポンシブデザイン・アクセシビリティ基準を満たしていること
|
|
152
|
+
- **対応設計**: design.md「UI設計」セクション
|
|
153
|
+
- **シナリオテスト**: シナリオ1 全Step(リグレッション確認)
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## 記述ルールのまとめ
|
|
158
|
+
|
|
159
|
+
### タスク階層(4階層)
|
|
160
|
+
- **Phase(フェーズ)**: 最上位単位(1, 2, 3...)
|
|
161
|
+
- **タスクグループ**: Vibe-KanbanタスクとPRの作成単位(1.1, 1.2...)、**チェックボックス付き**(`- [ ]`)、1-4時間
|
|
162
|
+
- **タスク**: 作業単位・コミット単位(1.1.1, 1.1.2...)、**チェックボックスなし**、15-60分
|
|
163
|
+
- **サブタスク**: タスク内の詳細作業項目、**箇条書き**(`-`)
|
|
164
|
+
|
|
165
|
+
### タスクグループの粒度
|
|
166
|
+
- 1つの受け入れ条件を満たす/1つの機能が動作する状態
|
|
167
|
+
- 1PR・1デプロイ・1QAテスト対象として適切な単位
|
|
168
|
+
- 実装工数の目安: 1-4時間
|
|
169
|
+
|
|
170
|
+
### タスクの粒度
|
|
171
|
+
- 具体的な作業項目
|
|
172
|
+
- 個別コミット単位
|
|
173
|
+
- 実装工数の目安: 15-60分
|
|
174
|
+
|
|
175
|
+
### フォーマット規則
|
|
176
|
+
|
|
177
|
+
**タスクグループ**:
|
|
178
|
+
```markdown
|
|
179
|
+
- [ ] 1.1 タスクグループ名
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
**タスク**(2スペースインデント):
|
|
183
|
+
```markdown
|
|
184
|
+
- 1.1.1 タスク名
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
**サブタスク・メタデータ**(4スペースインデント):
|
|
188
|
+
```markdown
|
|
189
|
+
- サブタスク内容
|
|
190
|
+
- **要件**: Story X
|
|
191
|
+
- **依存関係**: なし または 依存先タスク番号
|
|
192
|
+
- **完了条件**: 完了条件(AC番号を含める)
|
|
193
|
+
- **対応設計**: design.md「セクション名」
|
|
194
|
+
- **シナリオテスト**: 該当シナリオまたは「なし(理由)」
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### メタデータ形式
|
|
198
|
+
- **要件**: `**要件**:` で始まる(例: `**要件**: Story 1`)
|
|
199
|
+
- **依存関係**: `**依存関係**:` で始まる(例: `**依存関係**: 1.1.1` または `**依存関係**: Phase 1完了`)
|
|
200
|
+
- **完了条件**: `**完了条件**:` で始まる。必ず受け入れ基準番号(AC形式)を含める(例: `**完了条件**: AC1.1を満たす`)
|
|
201
|
+
- **対応設計**: `**対応設計**:` で始まる(例: `**対応設計**: design.md「セクション名」`)
|
|
202
|
+
- **シナリオテスト**: `**シナリオテスト**:` で始まる(**全タスクに必須**、該当なければ「なし」と理由を明記)
|
|
203
|
+
- 該当なし: `**シナリオテスト**: なし(DB設計のみ、UIフロー未実装のため)`
|
|
204
|
+
- 部分実行: `**シナリオテスト**: シナリオ1 Step 1-3(部分実行:説明)`
|
|
205
|
+
- フル実行: `**シナリオテスト**: シナリオ1 全Step(フル実行)`
|
|
206
|
+
- リグレッション: `**シナリオテスト**: シナリオ1 全Step(リグレッション:説明)`
|
|
207
|
+
|
|
208
|
+
### フェーズ完了確認
|
|
209
|
+
- 各フェーズの最後に必ず配置
|
|
210
|
+
- 全タスクグループの完了を確認
|
|
211
|
+
- 完了条件に対応する全ての受け入れ基準番号(AC形式)を列挙
|
|
212
|
+
- 次フェーズ移行基準は完了条件に含めて記載
|
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
<!-- @einja:managed:start -->
|
|
2
|
+
# デプロイセットアップ手順
|
|
3
|
+
|
|
4
|
+
本番環境へのデプロイに必要な設定手順をまとめたドキュメントです。
|
|
5
|
+
|
|
6
|
+
設計方針については以下を参照してください:
|
|
7
|
+
- [デプロイメント・CI/CD設計方針](../steering/infrastructure/deployment.md)
|
|
8
|
+
- [環境変数設計方針](../steering/infrastructure/environment-variables.md)
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 目次
|
|
13
|
+
|
|
14
|
+
1. [必要なSecrets一覧](#1-必要なsecrets一覧)
|
|
15
|
+
2. [データベース設定](#2-データベース設定)
|
|
16
|
+
3. [Vercel設定](#3-vercel設定)
|
|
17
|
+
4. [Turborepo Remote Cache設定](#4-turborepo-remote-cache設定)
|
|
18
|
+
5. [Railway設定](#5-railway設定)
|
|
19
|
+
6. [GitHub Secrets登録](#6-github-secrets登録)
|
|
20
|
+
7. [Docker設定](#7-docker設定)
|
|
21
|
+
8. [動作確認](#8-動作確認)
|
|
22
|
+
9. [トラブルシューティング](#9-トラブルシューティング)
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 1. 必要なSecrets一覧
|
|
27
|
+
|
|
28
|
+
### 必須Secrets
|
|
29
|
+
|
|
30
|
+
| 変数名 | 説明 | 用途 | GitHub Actions | Vercel |
|
|
31
|
+
|--------|------|------|:--------------:|:------:|
|
|
32
|
+
| `DOTENV_PRIVATE_KEY_CI` | CI環境用復号鍵 | CI/CD | ◯ | - |
|
|
33
|
+
| `DOTENV_PRIVATE_KEY_PRODUCTION` | 本番環境用復号鍵 | ビルド | ◯ | ◯ |
|
|
34
|
+
| `TURBO_TOKEN` | Turborepo Remote Cacheトークン | ビルド高速化 | ◯ | - |
|
|
35
|
+
| `TURBO_TEAM` | VercelチームID | ビルド高速化 | ◯ | - |
|
|
36
|
+
|
|
37
|
+
### オプション(手動デプロイ・拡張用)
|
|
38
|
+
|
|
39
|
+
| 変数名 | 説明 | 用途 | GitHub Actions | Vercel |
|
|
40
|
+
|--------|------|------|:--------------:|:------:|
|
|
41
|
+
| `VERCEL_TOKEN` | Vercelデプロイトークン | 手動デプロイ | ◯ | - |
|
|
42
|
+
| `VERCEL_ORG_ID` | Vercel組織ID | 手動デプロイ | ◯ | - |
|
|
43
|
+
| `VERCEL_WEB_PROJECT_ID` | webプロジェクトID | 手動デプロイ | ◯ | - |
|
|
44
|
+
| `RAILWAY_TOKEN` | Railway APIトークン | Railwayデプロイ | ◯ | - |
|
|
45
|
+
| `RAILWAY_SERVICE_ID` | RailwayサービスID | Railwayデプロイ | ◯ | - |
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 2. データベース設定
|
|
50
|
+
|
|
51
|
+
### Supabase(推奨)
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# 1. https://supabase.com でアカウント作成
|
|
55
|
+
|
|
56
|
+
# 2. 「New Project」でプロジェクト作成
|
|
57
|
+
# - Region: Northeast Asia (Tokyo)
|
|
58
|
+
# - Database Password: 設定してメモ
|
|
59
|
+
|
|
60
|
+
# 3. Settings > Database > Connection string > URI をコピー
|
|
61
|
+
|
|
62
|
+
# 4. [YOUR-PASSWORD] を設定したパスワードに置換
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Neon
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# 1. https://neon.tech でアカウント作成
|
|
69
|
+
# 2. 「Create a project」でプロジェクト作成
|
|
70
|
+
# 3. Connection Details > Connection string をコピー
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Vercel Postgres
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
# 1. Vercel Dashboard > Storage > Create Database > Postgres
|
|
77
|
+
# 2. 作成後、Connect タブから接続文字列を取得
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 3. Vercel設定
|
|
83
|
+
|
|
84
|
+
### プロジェクト作成
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# 1. https://vercel.com でGitHubアカウントでログイン
|
|
88
|
+
|
|
89
|
+
# 2. 「Add New...」>「Project」でGitHubリポジトリを選択
|
|
90
|
+
|
|
91
|
+
# 3. 設定:
|
|
92
|
+
# - Project Name: 任意(例: einja-web)
|
|
93
|
+
# - Root Directory: apps/web
|
|
94
|
+
# - Framework Preset: Next.js
|
|
95
|
+
# - Build Command: cd ../.. && npx turbo run build --filter=web
|
|
96
|
+
# - Output Directory: .next
|
|
97
|
+
# - Install Command: pnpm install
|
|
98
|
+
|
|
99
|
+
# 4. 「Deploy」をクリック
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 環境変数設定
|
|
103
|
+
|
|
104
|
+
Vercel Dashboard > 対象プロジェクト > Settings > Environment Variables
|
|
105
|
+
|
|
106
|
+
| Key | Value | Environment |
|
|
107
|
+
|-----|-------|-------------|
|
|
108
|
+
| `DOTENV_PRIVATE_KEY_PRODUCTION` | `.env.keys`から取得 | Production |
|
|
109
|
+
| `DATABASE_URL` | 暗号化ファイルに含まれる | - |
|
|
110
|
+
| `NEXTAUTH_SECRET` | 暗号化ファイルに含まれる | - |
|
|
111
|
+
|
|
112
|
+
### ローカルからのVercel CLI操作
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
# Vercel CLIインストール
|
|
116
|
+
npm i -g vercel
|
|
117
|
+
|
|
118
|
+
# プロジェクトリンク
|
|
119
|
+
cd apps/web
|
|
120
|
+
vercel link
|
|
121
|
+
|
|
122
|
+
# プレビューデプロイ
|
|
123
|
+
vercel
|
|
124
|
+
|
|
125
|
+
# 本番デプロイ
|
|
126
|
+
vercel --prod
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 4. Turborepo Remote Cache設定
|
|
132
|
+
|
|
133
|
+
### Step 1: Turboアカウントログイン
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
npx turbo login
|
|
137
|
+
# ブラウザが開き、Vercelにログインを求められます
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Step 2: プロジェクトをリンク
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
npx turbo link
|
|
144
|
+
# プロンプトでVercelの組織/チームを選択
|
|
145
|
+
# リンク完了すると .turbo/config.json が生成されます
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Step 3: トークン取得
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
# TURBO_TOKEN: Vercel Dashboard > Account Settings > Tokens > Create Token
|
|
152
|
+
# トークン名: einja-ci-turbo-token
|
|
153
|
+
# Scope: Full Access(またはプロジェクト限定)
|
|
154
|
+
|
|
155
|
+
# TURBO_TEAM: .turbo/config.json から取得
|
|
156
|
+
cat .turbo/config.json
|
|
157
|
+
# {"teamId": "team_xxxxxxxxx", "apiUrl": "https://vercel.com/api"}
|
|
158
|
+
# teamId の値が TURBO_TEAM
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Step 4: GitHub Secretsに登録
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
gh secret set TURBO_TOKEN --body "取得したトークン"
|
|
165
|
+
gh secret set TURBO_TEAM --body "team_xxxxxxxxx"
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## 5. Railway設定
|
|
171
|
+
|
|
172
|
+
### プロジェクト作成
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
# 1. https://railway.app でGitHubアカウントでログイン
|
|
176
|
+
# 2. 「New Project」>「Deploy from GitHub repo」
|
|
177
|
+
# 3. リポジトリを選択
|
|
178
|
+
# 4. Root Directory: apps/cron-worker
|
|
179
|
+
# 5. Variables タブで環境変数を設定
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### railway.toml設定
|
|
183
|
+
|
|
184
|
+
**配置場所**: `apps/cron-worker/railway.toml`
|
|
185
|
+
|
|
186
|
+
```toml
|
|
187
|
+
[build]
|
|
188
|
+
builder = "DOCKERFILE"
|
|
189
|
+
dockerfilePath = "apps/cron-worker/Dockerfile"
|
|
190
|
+
|
|
191
|
+
[deploy]
|
|
192
|
+
startCommand = "echo 'Cron worker deployed'"
|
|
193
|
+
|
|
194
|
+
# Cronジョブ定義
|
|
195
|
+
[[crons]]
|
|
196
|
+
command = "pnpm job:cleanup"
|
|
197
|
+
schedule = "0 0 * * *" # 毎日午前0時
|
|
198
|
+
|
|
199
|
+
[[crons]]
|
|
200
|
+
command = "pnpm job:email-digest"
|
|
201
|
+
schedule = "0 9 * * *" # 毎日午前9時
|
|
202
|
+
|
|
203
|
+
[[crons]]
|
|
204
|
+
command = "pnpm job:health-check"
|
|
205
|
+
schedule = "*/5 * * * *" # 5分ごと
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Railway CLI操作
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
# Railway CLIインストール
|
|
212
|
+
npm i -g @railway/cli
|
|
213
|
+
|
|
214
|
+
# ログイン
|
|
215
|
+
railway login
|
|
216
|
+
|
|
217
|
+
# プロジェクトリンク
|
|
218
|
+
cd apps/cron-worker
|
|
219
|
+
railway link
|
|
220
|
+
|
|
221
|
+
# デプロイ
|
|
222
|
+
railway up
|
|
223
|
+
|
|
224
|
+
# 環境変数確認
|
|
225
|
+
railway variables
|
|
226
|
+
|
|
227
|
+
# 環境変数追加
|
|
228
|
+
railway variables set DATABASE_URL=postgresql://...
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### GitHub Actionsからの自動デプロイ(オプション)
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
# Railway Dashboard > Account Settings > Tokens > Create Token
|
|
235
|
+
gh secret set RAILWAY_TOKEN --body "取得したトークン"
|
|
236
|
+
|
|
237
|
+
# Service > Settings > Service ID
|
|
238
|
+
gh secret set RAILWAY_SERVICE_ID --body "サービスID"
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## 6. GitHub Secrets登録
|
|
244
|
+
|
|
245
|
+
### 登録手順
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
# 1. GitHub リポジトリ > Settings > Secrets and variables > Actions
|
|
249
|
+
# 2. 「New repository secret」で以下を追加
|
|
250
|
+
|
|
251
|
+
# 必須
|
|
252
|
+
gh secret set DOTENV_PRIVATE_KEY_CI --body "$(grep DOTENV_PRIVATE_KEY_CI .env.keys | cut -d= -f2)"
|
|
253
|
+
gh secret set TURBO_TOKEN --body "取得したトークン"
|
|
254
|
+
gh secret set TURBO_TEAM --body "team_xxxxxxxxx"
|
|
255
|
+
|
|
256
|
+
# オプション(手動デプロイ用)
|
|
257
|
+
gh secret set VERCEL_TOKEN --body "取得したトークン"
|
|
258
|
+
gh secret set VERCEL_ORG_ID --body "team_xxxxxxxxx"
|
|
259
|
+
gh secret set VERCEL_WEB_PROJECT_ID --body "prj_xxxxxxxxx"
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### 登録確認
|
|
263
|
+
|
|
264
|
+
```bash
|
|
265
|
+
gh secret list
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## 7. Docker設定
|
|
271
|
+
|
|
272
|
+
### Dockerfile(Cron Worker用)
|
|
273
|
+
|
|
274
|
+
**配置場所**: `apps/cron-worker/Dockerfile`
|
|
275
|
+
|
|
276
|
+
```dockerfile
|
|
277
|
+
FROM node:20-alpine AS base
|
|
278
|
+
|
|
279
|
+
# pnpmインストール
|
|
280
|
+
RUN npm install -g pnpm@8
|
|
281
|
+
|
|
282
|
+
# 依存関係インストール
|
|
283
|
+
FROM base AS dependencies
|
|
284
|
+
WORKDIR /app
|
|
285
|
+
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
|
|
286
|
+
COPY apps/cron-worker/package.json ./apps/cron-worker/
|
|
287
|
+
COPY packages/*/package.json ./packages/
|
|
288
|
+
RUN pnpm install --frozen-lockfile
|
|
289
|
+
|
|
290
|
+
# ビルド
|
|
291
|
+
FROM base AS build
|
|
292
|
+
WORKDIR /app
|
|
293
|
+
COPY . .
|
|
294
|
+
COPY --from=dependencies /app/node_modules ./node_modules
|
|
295
|
+
RUN pnpm turbo run build --filter=cron-worker
|
|
296
|
+
|
|
297
|
+
# 実行環境
|
|
298
|
+
FROM base AS runner
|
|
299
|
+
WORKDIR /app
|
|
300
|
+
COPY --from=build /app/apps/cron-worker/dist ./dist
|
|
301
|
+
COPY --from=build /app/node_modules ./node_modules
|
|
302
|
+
COPY --from=build /app/package.json ./
|
|
303
|
+
|
|
304
|
+
ENV NODE_ENV=production
|
|
305
|
+
|
|
306
|
+
CMD ["echo", "Cron worker ready"]
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### Docker Compose(ローカル開発用)
|
|
310
|
+
|
|
311
|
+
**配置場所**: `docker-compose.yml`
|
|
312
|
+
|
|
313
|
+
```yaml
|
|
314
|
+
version: '3.8'
|
|
315
|
+
|
|
316
|
+
services:
|
|
317
|
+
postgres:
|
|
318
|
+
image: postgres:16-alpine
|
|
319
|
+
ports:
|
|
320
|
+
- "${POSTGRES_PORT:-35432}:5432"
|
|
321
|
+
environment:
|
|
322
|
+
POSTGRES_USER: postgres
|
|
323
|
+
POSTGRES_PASSWORD: postgres
|
|
324
|
+
POSTGRES_DB: einja
|
|
325
|
+
volumes:
|
|
326
|
+
- postgres_data:/var/lib/postgresql/data
|
|
327
|
+
|
|
328
|
+
volumes:
|
|
329
|
+
postgres_data:
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
---
|
|
333
|
+
|
|
334
|
+
## 8. 動作確認
|
|
335
|
+
|
|
336
|
+
### Vercel
|
|
337
|
+
|
|
338
|
+
```bash
|
|
339
|
+
# デプロイ完了後、生成されたURLにアクセス
|
|
340
|
+
# ログイン機能が動作することを確認
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
### GitHub Actions
|
|
344
|
+
|
|
345
|
+
```bash
|
|
346
|
+
# PRを作成してCIが実行されることを確認
|
|
347
|
+
# Remote Cacheが有効な場合、ログに以下が表示される
|
|
348
|
+
# >>> TURBO Turborepo Remote Cache enabled
|
|
349
|
+
# web:build: cache hit, replaying logs
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
### Railway
|
|
353
|
+
|
|
354
|
+
```bash
|
|
355
|
+
# Dashboard > Deployments でデプロイ状況を確認
|
|
356
|
+
# Logs タブでアプリケーションログを確認
|
|
357
|
+
|
|
358
|
+
# 手動実行でテスト
|
|
359
|
+
railway run pnpm job:health-check
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
## 9. トラブルシューティング
|
|
365
|
+
|
|
366
|
+
### キャッシュが効かない
|
|
367
|
+
|
|
368
|
+
**原因**: `TURBO_TOKEN`または`TURBO_TEAM`が未設定
|
|
369
|
+
|
|
370
|
+
```bash
|
|
371
|
+
# GitHub Secretsを確認
|
|
372
|
+
gh secret list
|
|
373
|
+
|
|
374
|
+
# トークンを再設定
|
|
375
|
+
turbo login
|
|
376
|
+
turbo token
|
|
377
|
+
gh secret set TURBO_TOKEN --body "new-token"
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
### デプロイが失敗する
|
|
381
|
+
|
|
382
|
+
**原因**: 環境変数が未設定またはdotenvx復号エラー
|
|
383
|
+
|
|
384
|
+
```bash
|
|
385
|
+
# Vercel環境変数を確認
|
|
386
|
+
vercel env ls
|
|
387
|
+
|
|
388
|
+
# 秘密鍵が正しいか確認
|
|
389
|
+
dotenvx run -f .env.production -- echo "OK"
|
|
390
|
+
|
|
391
|
+
# 環境変数追加
|
|
392
|
+
vercel env add DOTENV_PRIVATE_KEY_PRODUCTION production
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
### ビルドが失敗する
|
|
396
|
+
|
|
397
|
+
**原因**: 型エラーまたは依存関係の不整合
|
|
398
|
+
|
|
399
|
+
```bash
|
|
400
|
+
# ローカルで再現
|
|
401
|
+
pnpm install
|
|
402
|
+
pnpm turbo run typecheck
|
|
403
|
+
pnpm turbo run build
|
|
404
|
+
|
|
405
|
+
# 依存関係をリセット
|
|
406
|
+
rm -rf node_modules
|
|
407
|
+
rm pnpm-lock.yaml
|
|
408
|
+
pnpm install
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
### Remote Caching is not enabled
|
|
412
|
+
|
|
413
|
+
**原因**: TURBO_TOKENまたはTURBO_TEAMが正しくない
|
|
414
|
+
|
|
415
|
+
```bash
|
|
416
|
+
# .turbo/config.jsonのteamIdとGitHub SecretsのTURBO_TEAMが一致するか確認
|
|
417
|
+
cat .turbo/config.json
|
|
418
|
+
|
|
419
|
+
# Vercelトークンの有効期限を確認
|
|
420
|
+
# Vercel Dashboard > Account Settings > Tokens
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
### Authorization failed
|
|
424
|
+
|
|
425
|
+
**原因**: TURBO_TOKENが無効または権限不足
|
|
426
|
+
|
|
427
|
+
```bash
|
|
428
|
+
# Vercel Dashboardで新しいトークンを生成
|
|
429
|
+
# トークンのScopeが適切か確認(Full AccessまたはRead/Write権限)
|
|
430
|
+
# GitHub Secretsを更新
|
|
431
|
+
gh secret set TURBO_TOKEN --body "new-token"
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
---
|
|
435
|
+
|
|
436
|
+
## 関連ドキュメント
|
|
437
|
+
|
|
438
|
+
- [環境変数セットアップ手順](./environment-setup.md)
|
|
439
|
+
- [デプロイメント・CI/CD設計方針](../steering/infrastructure/deployment.md)
|
|
440
|
+
- [環境変数設計方針](../steering/infrastructure/environment-variables.md)
|
|
441
|
+
|
|
442
|
+
## 参考リンク
|
|
443
|
+
|
|
444
|
+
- [Turborepo Remote Caching Documentation](https://turbo.build/repo/docs/core-concepts/remote-caching)
|
|
445
|
+
- [Vercel Dashboard - Tokens](https://vercel.com/account/tokens)
|
|
446
|
+
- [Vercel CLI Documentation](https://vercel.com/docs/cli)
|
|
447
|
+
- [Railway Documentation](https://docs.railway.app/)
|
|
448
|
+
- [GitHub Actions - Encrypted secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets)
|
|
449
|
+
<!-- @einja:managed:end -->
|
|
450
|
+
|
|
451
|
+
---
|
|
452
|
+
|
|
453
|
+
<!-- @einja:seed:start id="deployment-setup-project" -->
|
|
454
|
+
## プロジェクト固有の設定
|
|
455
|
+
|
|
456
|
+
<!-- このセクションはプロジェクト固有の内容を追記する場所です -->
|
|
457
|
+
<!-- einja syncで上書きされません -->
|
|
458
|
+
<!-- @einja:seed:end -->
|