# 導入・更新・復旧

## 必要なもの

- Node.js 22.16以上（Node.js 22 LTSを推奨）、npm。
- 運用する場合は、自分が管理するCloudflareアカウント。
- Cloudflare WorkersとD1を利用できる権限。利用量に応じた料金と制限は契約先の最新条件を確認してください。

GitHubから取得したフォルダで `npm ci` を実行します。秘密値をGitへ登録しないでください。

## デモを試す

`npm run demo` → http://127.0.0.1:8793 → 「デモを試す」。クラウドなしで画面を試せます。ポートが使用中なら `PORT=8794 npm run demo` で変更できます。Windows PowerShellでは `$env:PORT=8794; npm run demo` を使います。

デモはループバックにのみ接続し、Hostヘッダも検査します。架空データを一時DBへ登録し、終了すると破棄します。業務データは入力しないでください。

## Cloudflareへ導入する

1. `npm run setup -- --cloud` を実行する。
2. 環境名を入力する。英小文字から始まる3〜46文字の英数字・ハイフン。例：`my-launch-workspace`。
3. 対象を確認して `deploy` と入力する。
4. Wranglerの公式ログインを完了し、利用するCloudflareアカウントの番号を選ぶ。
5. ウィザードが専用D1、テーブル、Worker、秘密情報を作成する。
6. 最後に表示されるURLへアクセスし、管理者を登録する。セットアップコードはローカルの `.dev.vars` の `BOOTSTRAP_TOKEN`。
7. 管理者登録後にログインし、「はじめ方」からローンチを作る。

`.dev.vars` は自分の端末でのみ開き、値をチャット・ログ・リポジトリへ貼らないでください。初回登録コードを公開しないでください。管理者は1回だけ登録できます。

生成ファイル：

| ファイル               | 用途                                                |
| ---------------------- | --------------------------------------------------- |
| `.dev.vars`            | 初期登録コードと秘密情報。権限600で生成             |
| `.setup-state.json`    | アカウント、作成済みリソース、処理中の状態。権限600 |
| `wrangler.local.jsonc` | ご自身のアカウントと専用DBを固定した配置設定        |

既存ファイルを無断で上書きしません。同名の既存Workerがある場合、D1作成・秘密登録より先に停止します。

## ローカルで自分のデータを試す

```sh
npm run setup -- --local
npm run dev
```

初期登録コードは `.dev.vars` にあります。こちらはWranglerのローカルD1へ保存され、通常は再起動後も残ります。デモの一時DBとは別です。公開運用にはCloudflareへの導入を使ってください。

## 中断した場合

「結果が未確認」と出た処理は、自動では再実行しません。`.setup-state.json` の `pending` を確認し、Cloudflareの管理画面とWranglerで実状態を照合します。

- D1作成：同名DBが存在するか確認し、作成済みなら正しい `databaseId` を状態ファイルへ記録する。
- DB初期化：`npx wrangler d1 migrations list DB --remote --config wrangler.local.jsonc` で適用済みを確認する。すべて適用済みなら `migrated: true` を記録する。
- Worker初回デプロイ：対象アカウント、Worker名、配置されたコード、URLを照合する。正しい環境なら `workerCreated: true` と `origin` を記録する。
- 秘密情報登録：対象Workerへ登録されたキー名を確認する。値は表示・出力しない。確認したキー名を `secretKeys` に記録する。値が不明なら、安全な端末の元ファイルから公式の秘密登録手順で再設定する。
- 最終デプロイ：`PUBLIC_ORIGIN` と配置バージョンを確認する。

結果を照合した処理についてのみ `pending` を取り除き、同じフォルダで `npm run setup -- --cloud` を再開します。別アカウントへ切り替えて続行しないでください。状態ファイルだけを削除して初めからやり直すことは、重複作成の原因になります。

## 更新

1. D1のバックアップと現在のWorkerバージョンを記録する。
2. 新しい配布物を別フォルダに展開し、`npm ci && npm test && npm run lint && npm run check:build` を実行する。
3. 自分の `wrangler.local.jsonc` を安全に引き継ぐ。`.dev.vars` を配布元へ送らない。
4. 変更内容とマイグレーションを確認して `npx wrangler d1 migrations apply DB --remote --config wrangler.local.jsonc` を実行する。
5. `npm run deploy` を実行し、ログイン・一覧・タスク編集を確認する。

毎回のGit pushで自動デプロイはしません。CIは検査のみです。

## バックアップ・復元

管理画面のJSON書き出しは計画・原稿・実績の持ち出し用で、認証情報は含みません。JSONからの一括復元UIはありません。

環境全体はD1をバックアップします。

```sh
npx wrangler d1 export DB --remote --config wrangler.local.jsonc --output ./backup.sql
```

`backup.sql` はメンバー情報・パスワードハッシュ等を含む機密データです。暗号化した保管先へ移し、Gitに登録しないでください。D1のTime Travelまたは新しいDBへのSQL復元を使います。復元は先に隔離環境で試し、対象DBと時点を確認してください。

コードだけを戻す場合はCloudflareのWorkerバージョンから直前の正常版へロールバックします。DB変更がある場合は互換性を先に確認し、コードのロールバックだけで復旧済みと判断しないでください。

## 管理者のパスワードを失った場合

パスワード再設定メールはありません。Cloudflareアカウントの管理者が、DBバックアップを確保した上で `scripts/reset-password.mjs` を使います。秘密値をコマンド引数に渡さず、対話入力してください。

```sh
node scripts/reset-password.mjs --email owner@example.com --remote
```

対象設定・メール・アカウントを確認し、完了後は新しいパスワードでログインします。既存セッションとトークンは失効します。
