イメージのルートファイルシステムを読み取り専用にし、文書化された実行時状態に限って、範囲を絞った書き込み可能なマウントを許可します。
これは、現在、設定、キャッシュ、一時ファイル、アップロードを区別のないコンテナファイルシステム内に書き込んでいるセルフホスト型アプリでは重要です。運用上のリスクは、書き込みパスをマッピングせずに読み取り専用を有効にすると起動に失敗する可能性があり、一方で広範な書き込み可能マウントを1つ追加すると、封じ込めの目的が失われることです。保存したベースラインから始め、変更は一度に1つずつ、元に戻せる形で行い、観測された分岐が意図した設定経路と一致しなくなった時点で停止します。
読み取り専用コンテナのルートファイルシステムのベースラインを確立する
設定を変更する前に、書き込みの試行、必要なパス、所有権、tmpの使用状況、パッケージ更新の動作、再作成後の永続性を記録します。元の設定と本番に近い実行を1回保存し、その後の改善を記憶や合成的なアイドル状態ではなく、同じワークロードと比較できるようにします。
現在の読み取り専用のルートファイルシステムを使用して、サポートされている制御とそのセマンティクスを確認します。デフォルトは既知の出発点として扱い、このサーバー、クライアント構成、または復旧目標に設定が適合する証拠とはみなしません。
編集する前に、受け入れ条件と停止条件を定義します。受け入れのシグナルは、ログ、プロトコル状態、アプリケーション出力、または復元されたデータで確認できる必要があります。停止条件は、アクセス範囲の拡大、データ損失、リソース枯渇、または次の復旧可能時間を消費する障害を防ぐものでなければなりません。
読み取り専用コンテナのルートファイルシステムの変更を管理された段階で適用する
ステップ1: 代表的な起動と通常のワークフロー中の書き込みを追跡し、永続状態と一時状態を分離します。変更後は、想定した状態が直ちに現れるか確認します。現れない場合は、次のステップを適用する前にこのステップを元に戻します。
ステップ2: read_onlyを有効にし、一時パスにtmpfsを追加し、必要な永続ディレクトリにのみバインドマウントまたは名前付きボリュームを使用します。変更後は、想定した状態が直ちに現れるか確認します。現れない場合は、次のステップを適用する前にこのステップを元に戻します。
ステップ3: 使用していないケイパビリティを削除し、設定された非rootユーザーと同じイメージのエントリポイントをテストします。変更後は、想定した状態が直ちに現れるか確認します。現れない場合は、次のステップを適用する前にこのステップを元に戻します。
read_only: true
tmpfs:
- /tmp:size=256m,mode=1777
volumes:
- app-data:/var/lib/app
成功、失敗、例外の分岐を解釈する
成功とは、承認済みマウントの外部に書き込むことなく、アプリが通常の処理と再作成を完了することです。その結果を生んだワークロード、バージョン、タイミングを正確に記録します。より軽いテストは、元の問題が解決した証拠にはなりません。
失敗とは、起動スクリプトがイメージパスを変更しようとする、一時領域が枯渇する、またはアップグレードがコンテナ内のパッケージ変更を必要とすることです。隣接するすべての制御を弱めて補おうとしてはいけません。最後のクリーンなベースラインに戻し、不一致がID、ネットワーク、ストレージ、アプリケーションの準備状態、容量のどれに属するかを切り分けます。
例外またはあいまいな結果の場合は、診断目的に限ってread_onlyを解除し、不足しているパスを記録して、その例外をより狭いマウントに置き換えます。低リスクの識別手順を再現でき、より深いプラットフォームまたはハードウェアの変更が必要だと証拠で示されてから、初めてエスカレーションします。
元のホームサーバー負荷で永続性を検証する
ベースラインで使用したものと同じクライアント経路、ファイルサイズ、同時実行数、スリープまたは再起動イベント、競合するワークロードを繰り返します。少なくとも2サイクル実行し、キャッシュが温まった状態での成功、1回だけの幸運な再接続、または単一の正常な起動を永続性と取り違えないようにします。
成功と封じ込めの両方を確認します。つまり、アプリが承認済みマウントの外部に書き込むことなく通常の処理と再作成を完了し、同時に無関係なユーザー、サービス、共有、管理パスが元の動作を維持することを確認します。変更が隣接するストレージ、ネットワーク、または復旧境界に触れる場合は、関連するZimaSpaceワークフローを確認してください。
受け入れのシグナルが維持され、ロールバックが引き続き使用可能な場合にのみ、変更を完了します。起動スクリプトがイメージパスを変更しようとする、一時領域が枯渇する、またはアップグレードがコンテナ内のパッケージ変更を必要とする場合は、自動化を停止し、ログと保存した設定を保持して、変更を積み重ねるのではなく最後に検証済みの状態へ戻します。
クエリファンアウトFAQ、完了判断、最終テスト
これらのクエリファンアウト形式の質問は、メイン設定が機能した後にユーザーがよく検索する次の判断を扱います。テストされていない修復経路を導入せずに、境界を拡張するものです。
各回答は、測定した環境の条件が一致する場合にのみ適用します。バージョン、プロトコル、ファイルシステム、クライアント、信頼境界の違いによって、正しい分岐が変わる可能性があります。
回答はランブックとともに保管し、アップグレードやトポロジーの変更後に更新します。書き込みアクセス、ネットワーク到達性、削除権限を拡大する例外には、新たなロールバックテストと復旧テストが必要です。
読み取り専用はマウントされたボリュームを保護しますか?
いいえ。書き込み可能なバインドマウントとボリュームは引き続き書き込み可能なので、最小権限、バックアップ、パス分離が必要です。
すべてのイメージを読み取り専用で実行できますか?
調整なしでは実行できません。起動時にパッケージをインストールしたり設定を書き換えたりするイメージには、別のビルドまたは明示的な書き込み可能パスが必要です。
/tmpは常にtmpfsにすべきですか?
サイズ、実行フラグ、永続性の動作がアプリに適合する場合に限ります。大規模なインポートと更新をテストしてください。
結論: アプリが承認済みマウントの外部に書き込むことなく通常の処理と再作成を完了し、失敗分岐が理解され、文書化されたロールバックが変更対象のコンポーネントに依存しない場合に、設定は完了です。
最終テスト手順: 保存したベースラインを復元し、承認済みの変更を1回適用して、元の本番に近い負荷を繰り返します。成功シグナルと封じ込め境界を確認し、その後、使い捨てデータでロールバックを実行します。5つすべての観測結果が一致した場合にのみ、変更を維持します。
サポートとヒント
もっと読む

セルフホスト型ギャラリーでApple Live Photoのペアリングを保持できますか?
Apple Live Photoのペアリングに関する条件付きホームサーバー判断ガイド。管理されたテスト、結果の解釈、ロールバック、そして要点を絞ったFAQを含みます。

Google Takeoutとスマートフォンのバックアップを1つの写真ライブラリに取り込めますか?
写真の一括取り込みに関する条件付きホームサーバーの判断、管理されたテスト、結果の解釈、ロールバック、要点を絞ったFAQ。

Immichはファイルの所有権を取得せずに外部ライブラリを使用できますか?
Immichの外部ライブラリ所有権に関する条件付きホームサーバー判断ガイド。管理されたテスト、結果の解釈、ロールバック、要点を絞ったFAQを含みます。

