概要 — 何をする画面か
プロジェクト は、チームが運用しているすべてのプロジェクトのメタ情報を1か所に集めて共有する レジストリです。プロジェクトごとに、ソースリポジトリ(GitHub など)、CI/CD パイプライン(Jenkins)、利用している Web サービスとデータベース、バックアップ対象、そして — もっとも重要な — 機密情報がどこにあるか を登録します。これにより、チームの誰もが「このプロジェクトは何でできていて、どこにデプロイされ、どの機密情報がどこにあるのか」を一目で把握できます。
この画面は デプロイツールではありません。 実際のビルドとデプロイは Jenkins で行われます。InfraGuard はここからパイプラインを起動しません。登録したデータは 共有ドキュメント です。保存する URL・Job 名・ブランチは参照用のリンクとラベルにすぎず、実行されることはありません。
中核となる設計原則:
- 機密情報の値をそのまま保存することはありません。 パスワード・トークン・鍵の 実際の値 はここには保持しません。代わりに、(1) インベントリの保管庫(
infr_vault_key)にある鍵を 参照 するか、(2)「どの機密情報がどこにあるか」だけを マスクされたチェックリスト に記録します。 - 編集はすべて 1つのタブ付きモーダル(概要・ソース・CI/CD・連携・バックアップ・機密情報)で行います。
- 作成・更新・削除と保管庫の値の表示は、すべて 監査ログ(
infr_audit_log)に記録されます。
こんなときに使う
- 新しく加わったメンバーに「このプロジェクトのリポジトリ・デプロイ先 URL・DB は何か」を素早く把握してもらうとき。
- プロジェクトごとの web/db の依存関係 を整理し、障害時に影響範囲をすぐ見積もれるようにするとき。
- プロジェクトが依存する 機密情報のマップ(どの鍵がどこにあるか、どの保管庫エントリがこのプロジェクトのものか)を文書化するとき。
- バックアップ対象と頻度をプロジェクトのメタ情報として、バックアップポリシーと結び付けて記録するとき。
画面構成
KPI ストリップ
| 項目 | 意味 |
|---|---|
| プロジェクト | 登録済みプロジェクトの総数 |
| 外部公開 | accessible=1 のプロジェクト(外部 URL を持つ) |
| 内部 | accessible=0 のプロジェクト(内部専用・公開しない) |
| アーカイブ済み | status=archived のプロジェクト |
プロジェクトカード
各カードには次が表示されます:
- アイコン+名称 — 外部からアクセス可能なプロジェクトは
mdi-web、内部専用はmdi-folder-lock-outlineを使います。 - URL リンク —
accessibleかつ URL がある場合は新しいタブで開くリンク、そうでなければinternalバッジ。 - 状態バッジ — active/paused/archived。
- 1行の概要。
- 構成チップ — 登録済みの要素だけが表示されます: ソース・Jenkins・環境 N・Web N・DB N・バックアップ N・機密情報 N。
- グループラベル(カテゴリ)+編集/削除ボタン(書き込み権限がある場合)。
編集モーダル(6タブ)
入力をタブごとに分割したワイドモーダル(.infr-modal__panel--wide)です。
| タブ | 入力項目 |
|---|---|
| 概要 | 名称(必須)・キー(スラッグ)・状態・グループ・外部アクセスのトグル・URL・概要・タグ |
| ソース | リポジトリ提供元(GitHub/GitLab/Gitea/Bitbucket/その他)・リポジトリ URL・既定ブランチ・公開範囲(public/private/internal) |
| CI/CD | Jenkins URL + 環境リピーター(dev/staging/prod ごとに: デプロイ URL・ブランチ・Jenkins Job・メモ) |
| 連携 | Web サービス のチェックボックス(登録済みの infr_web_service)+ DB(コレクター) のチェックボックス(access=database のコレクター) |
| バックアップ | バックアップ対象リピーター(種別・対象・スケジュール・メモ) |
| 機密情報 | 保管庫の鍵への参照(チェック+値の表示)+ 機密情報チェックリストのリピーター(項目・場所・参照・メモ) |
使い方
プロジェクトを登録する
- 右上の [プロジェクトを追加] をクリックします(書き込み権限が必要)。
- 概要 タブで名称(必須)を入力します。キー(スラッグ)は任意で、
^[a-z0-9_-]+$に一致する必要があります(例:coin-market)。 - サービスが外部から到達可能なら 外部からアクセス可能 のトグルをオンにして URL を入力します。内部専用ならオフのままにします。その場合 URL の入力欄は無効になります。
- 残りのタブ(ソース、CI/CD、連携、バックアップ、機密情報)を必要に応じて入力します — すべて任意です。
- [保存] — サーバーが検証し、
infr_projectに upsert してカードを更新します。
CI/CD の環境を登録する
CI/CD タブで Jenkins URL を入力し、[環境を追加] でデプロイ先を1行ずつ追加します:
{
"env": "prod",
"url": "https://coin.example.com",
"branch": "main",
"jenkins_job": "coin_market-deploy-prod",
"note": "blue/green"
}
envはホワイトリストdev/staging/prodのみを受け付けます(それ以外の値はサーバーがdevに強制します)。- 各文字列フィールドは長さで切り詰められます(URL 255・ブランチ 120・Job 191・メモ 255)。
- 環境は最大20件です。
web/db を連携する
連携 タブで、このプロジェクトが使用しているリソースにチェックを入れます。
- Web サービス — サービス ▸ Web に登録された
infr_web_serviceの一覧(名称・ドメイン)から選びます。web_service の id の配列 として保存されます。 - DB(コレクター) — access=database で登録されたコレクター(管理 ▸ コレクター / サービス ▸ データベース)の キーの配列 です。
いずれの連携も最大50件です。
バックアップ対象を宣言する
バックアップ タブのリピーターで、このプロジェクトのバックアップ方針(種別・対象・スケジュール・メモ)を記録します。これは 参照用のメタ情報 であり、実行されることはありません — 実際のバックアップジョブは スケジュールボード で管理します。
機密情報を管理する(中心機能)
機密情報は 2つの仕組みを併用 します。どちらも実際の機密情報の値を infr_project に保存しません。
1) 保管庫の鍵への参照(vault_key_ids)
- 機密情報 タブで、インベントリの保管庫(資産 ▸ インベントリ ▸ 鍵情報、
infr_vault_key)の鍵にチェックを入れて紐付けます。 - 一覧は マスクされた状態 で配信されます(id・カテゴリ・タイトル・ユーザー名のみ — 値は含みません)。
- 紐付けた鍵の [表示] を押すと
POST /service/projects/vault-revealが呼ばれ、その瞬間にだけ値を復号して返します。
保管庫の値の 表示は監査対象です。 表示するたびに
vault_key.reveal(target=vault_key、via=project)がinfr_audit_logに記録されます。値は短時間だけ表示され、クリックするとクリップボードにコピーされます — 必要なときだけ表示してください。保存されるプロジェクトのレコードが持つのは 鍵の id への参照だけ です。
2) 機密情報チェックリスト(secrets、マスク済み)
保管庫にない(または外部で保持している)機密情報については、場所だけ を記録します。値は決して保存されません。
| フィールド | 例 |
|---|---|
label |
STRIPE_SECRET_KEY |
location |
.env (prod server /var/www) |
ref |
1Password › Coin › prod |
note |
rotate quarterly |
サーバーの cleanList() は 許可されたキー(label/location/ref/note)だけ を残し、それぞれ255文字に切り詰めます。4つのフィールドがすべて空の行は破棄されます。
削除する
編集モーダルの左下、またはカードの [削除] から削除します。確認後、POST /service/projects/delete が infr_project の行を削除し、project.delete を記録します。
データソース
| データ | ソース |
|---|---|
| プロジェクトのレコード | infr_project(マイグレーション 000715) |
| グループ(カテゴリ) | infr_asset_group(group_id 経由) |
| Web サービスの選択肢 | infr_web_service(名称・ドメイン) |
| DB(コレクター)の選択肢 | access=database である infr_collector(key・title・host_alias) |
| 保管庫の鍵の選択肢 | infr_vault_key — マスク済み(id・カテゴリ・タイトル・ユーザー名。値は含まない) |
| 保管庫の値の表示 | infr_vault_key.revealSecret()(復号。表示したときだけ) |
| 監査ログ | infr_audit_log(project.create/update/delete、vault_key.reveal) |
ストレージスキーマ(infr_project 抜粋)
key varchar(60) unique nullable # スラッグ
group_id int -> infr_asset_group
name varchar(160) # 必須
status enum(active,paused,archived)
accessible boolean default 1
url varchar(255) # accessible=1 のとき公開
summary text
repo_provider enum(github,gitlab,gitea,bitbucket,other)
repo_url / default_branch / visibility(public,private,internal)
jenkins_url varchar(255)
environments json [{env,url,branch,jenkins_job,note}]
web_refs json -> infr_web_service id array
db_refs json -> infr_collector(database) key array
backup_targets json [{kind,target,schedule,note}]
vault_key_ids json -> infr_vault_key id array (values stay in the vault)
secrets json [{label,location,ref,note}] # チェックリスト。値は保存しない
tags / meta json
この画面は ライブポーリングを行いません。 保存・削除・更新ボタン(
GET /service/projects/list)のときにだけ一覧を再読み込みします。リアルタイムの状態は サービス ▸ カタログ と サービス ▸ Web が扱います。
アクセス権限
| 操作 | ルート | 最低レベル |
|---|---|---|
| 閲覧(index/list) | GET /service/projects、/list |
1(demo、infr.auth) |
| 保管庫の値の表示 | POST /service/projects/vault-reveal |
1(+監査) |
| 保存(作成/更新) | POST /service/projects/save |
2(staff) |
| 削除 | POST /service/projects/delete |
2(staff) |
- 書き込みのゲートはセッションの
infr_user_level >= 2を確認します(canWrite())。失敗すると403+project.err.forbiddenを返します。 - 保存時、
vault_key_idsは 実在する保管庫の鍵の id だけ に絞り込まれます(InfrVaultKey::whereIn(...)による存在チェック)。偽造された id は黙って破棄されます。 - レベルは demo=1・staff=5・admin=10 です。一部の領域は
infr.level:Nミドルウェアで個別にゲートされています。
トラブルシューティングと FAQ
Q. 保存を押すと 403 になります。 書き込みにはレベル2以上が必要です。閲覧者(レベル1)のアカウントは、閲覧と保管庫の値の表示しかできません。管理者にレベルを上げてもらってください。
Q. [表示] を押しても空で返ってきます。
その保管庫のエントリに機密情報が入っていない(hasSecret=false)か、復号に失敗しています(APP_KEY が変わった場合など)。インベントリ ▸ 鍵情報 で値を設定し直してください。revealSecret() は失敗時に null を返します。
Q. Web/DB の連携リストに何も表示されません。 Web サービスはまず サービス ▸ Web に存在している必要があり、DB の選択肢には access=database のコレクターが必要です。登録したうえでプロジェクトのモーダルを開き直すと、選択肢が表示されます。
Q. キー(スラッグ)を保存すると形式エラーになります。
キーに使えるのは小文字・数字・ハイフン・アンダースコアだけです(^[a-z0-9_-]+$、最大60文字)。空白・大文字・その他の記号は取り除いてください。キーは任意なので、空のままでもかまいません。
Q. ここからデプロイを実行できますか。 いいえ。デプロイは Jenkins で行われます。この画面が保持する Jenkins URL と Job 名は ドキュメントとしてのみ 扱われます。
Q. 機密情報のメモに、値をそのまま書いてもよいですか。
絶対にいけません。secrets は値を一切保存しない 場所のマップ です。実際の値は暗号化された インベントリ ▸ 鍵情報 の保管庫に入れ、vault_key_ids から参照してください。
関連項目
- サービス ▸ Web —
web_refsで連携する Web サービス。 - サービス ▸ データベース —
db_refsで連携する DB コレクター。 - サービス ▸ カタログ — インスタンスごとのデーモンの生存確認(ライブな状態はこちら)。
- スケジュールボード — 実際のバックアップジョブの定義と実行。
- 資産 ▸ インベントリ — 保管庫の鍵の元になる画面(
infr_vault_key)。 - 監査ログ — project.create/update/delete と vault_key.reveal の記録を確認できます。
