コンテンツにスキップ

家族削除機能:配備記録(2026-09-21)

状態:2026-09-21 08:29:03 JST、修正版r2で本番反映完了。完了報告と、本番のcommit・image・Compose・deployment.jsonを別途照合済み。実データの削除は0件。

ユーザーは確認用モック試用後に「実装してみよう」と指示し、実装後に「では実機っで確認しよう」と実機確認を依頼した。

配備済みの版

  • 本番基準:66471bffb6eb3bba0b1783a498b84dad7fbaade6。実機のdeployment.json・Composeのハッシュを照合済み。
  • 配備済み:4b7f9be3069b5d46330824d5a4270c8a6a2028b4。
  • push済みブランチ:codex/family-delete-20260921-production。
  • ソース:.local-dev/truenas-family-delete-20260921/source。
  • 開発ブランチ全体の配備は行わず、既存のバックアップ形式1・gateway・復元ワーカー・設定メニューを保持する。

機能と検査

家族一覧の「削除」から内容・家族番号・関連記録を確認する。園児台帳管理権限が必要。関連園児、保護者アカウント、請求、回答、写真、初回入力依頼などがあれば削除を拒否する。削除前に確認チェック・CSRF・署名情報・最新の権限と関連記録を検査する。DBスキーマ変更なし。

実装テストは重複を除く81件が成功。架空データでブラウザー操作・モックとの照合を完了。実機確認用の読み取り専用検査も架空データで実行し、削除可能な家族と関連記録で保護される家族を正しく区別した。

配備手順の4テストで、設定保持、意図しないアクセス追加の拒否、復元・バックアップ中の切替拒否、正常切替、起動失敗・検証失敗・部分停止からの旧アプリと両ワーカーの再開を検証した。実機のLinuxでも実行済み。転送ファイルの全ハッシュとPython構文を照合済み。

実機で実行する内容

固定commitのイメージをビルドし、ネットワークを無効にしたコンテナで関連81テストと復元・切り戻しを検証する。現行DBコピーで既存機能・スキーマ保持を検査し、保存済みバックアップの互換性も検査する。

成功後に公開接続を短時間止め、バックアップ完了を待ち、復元キューロック下でジョブがないことを確認してアプリと両ワーカーを停止する。ZFS snapshot・主DB・施設文例DB・設定を退避し、新版を起動する。既存のCompose内容は変えず、イメージ情報と復元可能commitの追記だけを許可する。復元用署名鍵・既存サービス・設定値は保持する。

切替後は既存機能に加え、実機の全家族について一覧・削除確認画面・関連記録による拒否・閲覧権限の拒否を読み取り専用で検査する。出力は件数だけで、家族名・連絡先・トークンは出力しない。72テーブル、添付、定期バックアップ設定の保持を検査して公開接続を再開する。

失敗時は旧イメージと設定、既存のbackup-worker・restore-workerを再開する。実データの削除や過去バックアップからの復元は、この配備・検証では行わない。

実行記録の場所

  • 実機の修正版ディレクトリ:/home/truenas_admin/family-delete-20260921-4b7f9be-r2。
  • 実行済み:同ディレクトリの start-systemd.py。再実行しない。
  • Unit:hoikuict-family-delete-20260921-4b7f9be-r2。
  • 同ディレクトリの status.json は complete。再起動コマンドを重ねて実行しない。
  • 修正版ヘルパー・manifest・転送記録:.local-dev/truenas-family-delete-20260921/retry1。初回は bundle に保持。

ユーザーが対話sudoを実行した後、完了状態・本番の版・家族画面の検査結果を照合した。パスワードやsudo設定の変更は行っていない。

初回停止と修正版

2026-09-21 08:08:59 JSTに初回サービスを開始。固定版のビルドと隔離環境での復元通し検証を通過し、個別テストに進んだが、08:18:03 JSTにテストコンテナの終了コード1で停止した。本番切替前で、旧版commit・image・Compose・deployment.jsonのハッシュに変化がないことを別途確認済み。

配備手順に unittest でpytest形式の写真テストを起動する不備を確認した。写真8件はunittestでは収集できず、本番用requirementsにもpytestは含まれていない。修正版の実行時にroot専用ログから失敗テスト名・不足モジュール名・件数だけを抽出し、pytest不足による test_profile_photos の読込失敗のみと確認した。前回は読込失敗1件を含む74件を379.851秒で実行していた。

修正版はローカルと同じpytest 8.4.2と依存wheelをハッシュ付きで同梱し、ネットワーク無効・本番データ未接続の使い捨てコンテナにだけ導入する。全81件の成功と失敗・スキップ・収集エラー0件を必須にした。テストDBと復元演習はコンテナ内の一時メモリ領域に置く。アプリcommit・ソースarchive・Composeは初回と同一で、テスト用依存物を本番アプリへ追加しない。

修正版でも配備手順の正常系・切り戻し4テスト、全転送ファイルのハッシュ、Python構文を実機のLinuxで確認済み。実ブラウザーは本番の職員ログイン画面まで確認できた。管理権限のある職員でのログイン待ちのため、本番の家族確認画面のブラウザー検査はまだ実施していない。

同梱wheelと修正版の実行スクリプトを使うローカル検証は、81 passed / failed 0 / skipped 0 / collection errors 0(86.15秒)で成功した。r2起動後、実機コンテナでも同じ81件が成功した。

本番反映の結果

修正版r2を08:26:21 JSTに開始し、08:29:03 JSTに完了した。実機の隔離コンテナで全81件が成功、失敗・スキップ・収集エラー0件。実プロセスを使う復元・再ログイン・WebSocket等の通し検証、現行DBコピーの起動検証、保存済みバックアップ5件の互換性検査も成功した。

  • 実機イメージ:sha256:2f825c4fed342eb43d8d88f67c3503e643a9d213ef4f4112463fc007b73c37e9。
  • Compose:a15583b8d1edf8b23827986068b6e95af2eba17992ef91c6ab212cf128a2db3b(変更なし)。
  • deployment.json:86ec87138b0be41b88c0f55af0f32e3a7745f602286d75885fd6a9db1bfc6c84。
  • 本番ソース:/mnt/main/open-hoikuict-pilot/releases/4b7f9be3069b-20260920T232621Z。
  • アプリ・gateway・backup-worker・restore-workerが正常で、公開用tunnelの再開も確認済み。
  • 既存DBの72テーブル、添付8ファイルを保持。家族211件、園児99件、保護者アカウント7件を維持。
  • 実機の一覧・削除確認画面を読み取り専用で全211家族分生成して検査。削除可能107家族、関連記録で保護104家族。そのうち園児0人・保護者0人でも関連記録で保護される家族は99件。閲覧専用職員の拒否も確認した。実データの削除0件。
  • 定期バックアップ設定は今回の更新直前と同じ 無効・毎日02:00 JST。schedule.jsonのバイト一致を検査しており、今回の配備で無効にしたものではない。前回の配備記録にある有効設定とは異なるため、次回作業では今回の実測を基準にする。
  • 直前退避:before-family-delete-20260920T232621Z。同時点のruntime ZFS snapshot・主DB・施設文例DB・設定を保持。

完了記録は .local-dev/truenas-family-delete-20260921/retry1/completed-status.json、live-after.json、verified-completion.json に保存した。初回停止記録も保持する。

本番ブラウザーでは更新後も職員ログイン画面の表示までを確認済み。認証後の画面操作は職員ログイン待ちで未実施。上記の家族画面検査は実機アプリ内の読み取り専用描画検査であり、ブラウザーで本番家族を削除した検証ではない。利用者は家族一覧を更新し、各家族の「削除」から内容確認へ進む。