diff --git a/README.md b/README.md index 7743ad2..9e1aa36 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,36 @@ ✅ **自動パスワード生成**: 管理者パスワードを指定しない場合は自動生成 ✅ **アップデート対応**: 既存のDBがある場合は初期化をスキップ ✅ **ads.txt対応**: values.yamlから ads.txt を配置可能 +✅ **セキュアな構成**: WordPress本体は使い捨て、wp-contentのみ永続化 ✅ **本番環境対応**: セキュアなSecret管理、HA構成 +## アーキテクチャとセキュリティ + +### ストレージ構成 + +``` +/var/www/html/ ← emptyDir(使い捨て、Pod再起動で消える) +├── index.php ← WordPress本体ファイル +├── wp-admin/ ← 管理画面(使い捨て) +├── wp-includes/ ← WordPressコア(使い捨て) +├── wp-config.php ← Secretから毎回生成 +├── ads.txt ← values.yamlから生成 +└── wp-content/ ← シンボリックリンク → PVC + +/var/www/html-persistent/ ← PVC(永続化) +└── wp-content/ ← テーマ、プラグイン、アップロード + ├── themes/ + ├── plugins/ + └── uploads/ +``` + +### セキュリティ上の利点 + +1. **WordPress本体の改ざん防止**: 毎回クリーンな状態から起動 +2. **脆弱性への迅速な対応**: イメージ更新のみでコアファイル更新 +3. **設定の一元管理**: wp-config.phpはvalues.yamlとSecretから生成 +4. **ユーザーデータの保護**: wp-contentのみ永続化で管理が容易 + ## アーキテクチャ - **Nginx**: リバースプロキシおよび静的ファイル配信 @@ -113,10 +141,12 @@ helm install my-wordpress ./wordpress-nginx -f custom-values.yaml | パラメータ | 説明 | デフォルト値 | |-----------|------|-------------| -| `persistence.enabled` | 永続化を有効化 | `true` | +| `persistence.enabled` | 永続化を有効化(wp-contentのみ) | `true` | | `persistence.storageClass` | StorageClass | `""` | | `persistence.accessMode` | アクセスモード | `ReadWriteOnce` | -| `persistence.size` | ストレージサイズ | `10Gi` | +| `persistence.size` | ストレージサイズ(wp-content用) | `10Gi` | + +**注意**: WordPress本体ファイル(wp-admin、wp-includesなど)はemptyDirに配置され、Pod再起動時に破棄されます。ユーザーデータ(wp-content)のみがPVCに永続化されます。 ## 使用例 @@ -195,23 +225,51 @@ helm install my-wordpress ./wordpress-nginx \ ## 初期化の動作 ### 新規インストール時 -1. WordPressファイルをコピー -2. wp-config.phpを生成(セキュアな Salt キー自動生成) -3. データベース接続を確認 -4. テーブルが存在しない場合: +1. WordPress本体ファイルをemptyDirにコピー(使い捨て領域) +2. wp-contentディレクトリをPVCに作成(永続化領域) +3. シンボリックリンクで wp-content を接続 +4. wp-config.phpをSecretから生成 +5. データベース接続を確認 +6. テーブルが存在しない場合: - WP-CLIを使用してWordPressをインストール - 管理者アカウントを作成 - パスワードが未指定の場合は16文字のランダム生成 -5. ads.txtが有効な場合は配置 +7. ads.txtが有効な場合は配置(使い捨て領域) ### アップデート/再起動時 -1. 既存のwp-config.phpを検出 -2. データベーステーブルの存在を確認 -3. テーブルが存在する場合: +1. WordPress本体ファイルを新しくコピー(常にクリーン) +2. 既存のwp-content(PVC)をシンボリックリンクで接続 +3. wp-config.phpを再生成 +4. データベーステーブルの存在を確認 +5. テーブルが存在する場合: - 初期化処理をスキップ - コアバージョンの更新確認 - 必要に応じてデータベーススキーマをアップデート -4. 既存データを保持したまま起動 +6. 既存データ(wp-content)を保持したまま起動 + +### セキュリティ更新の適用方法 + +```bash +# イメージタグを更新して再デプロイするだけ +helm upgrade my-wordpress ./wordpress-nginx \ + --set image.wordpress.tag=6.8.4-php8.4-fpm-alpine + +# Pod再起動で自動的にクリーンなWordPress本体に置き換わる +kubectl rollout restart deployment/my-wordpress-wordpress-nginx +``` + +### ファイル構成の確認 + +```bash +# WordPress本体(emptyDir - 使い捨て) +kubectl exec -it -c wordpress -- ls -la /var/www/html/ + +# wp-content(PVC - 永続化) +kubectl exec -it -c wordpress -- ls -la /var/www/html-persistent/wp-content/ + +# シンボリックリンクの確認 +kubectl exec -it -c wordpress -- ls -la /var/www/html/ | grep wp-content +``` ### 管理者パスワードの確認方法 @@ -271,12 +329,27 @@ kubectl exec -it -c wordpress -- wp db tables ### 再初期化が必要な場合 ```bash -# PVCを削除して再作成(注意:データが消えます) +# wp-contentのみを保持して再インストール +# (データベースをクリアすれば再初期化される) +kubectl exec -it -c wordpress -- wp db reset --yes + +# 完全なクリーンインストール(PVCごと削除) kubectl delete pvc helm uninstall my-wordpress helm install my-wordpress ./wordpress-nginx ``` +### ストレージの確認 + +```bash +# PVCの確認(wp-contentのみ) +kubectl get pvc +kubectl exec -it -c wordpress -- du -sh /var/www/html-persistent/wp-content/ + +# emptyDirの使用量確認 +kubectl exec -it -c wordpress -- du -sh /var/www/html/ +``` + ### ads.txt の確認 ```bash @@ -294,5 +367,21 @@ curl http://your-site.com/ads.txt 1. **データベースパスワードの保護**: Kubernetes Secretを使用 2. **HTTPS の有効化**: cert-manager等でTLS証明書を設定 3. **リソース制限の設定**: 適切なresources設定 -4. **定期的なバックアップ**: PVCのスナップショット等 -5. **セキュリティアップデート**: イメージの定期的な更新 +4. **定期的なバックアップ**: wp-content(PVC)とデータベースのバックアップ +5. **セキュリティアップデート**: + - WordPress本体: イメージタグ更新 → Pod再起動で自動適用 + - プラグイン/テーマ: WordPress管理画面から更新 +6. **wp-config.phpのセキュリティ**: Secretに保存され、Pod再起動時に再生成 +7. **読み取り専用ファイルシステム**: WordPress本体は毎回クリーン、改ざん不可 + +### この構成のセキュリティメリット + +- ✅ WordPress本体への不正な変更を防止(Pod再起動で復元) +- ✅ wp-config.phpへの直接アクセス不可(Secretから生成) +- ✅ 脆弱性対応が容易(イメージ更新のみ) +- ✅ ユーザーデータのみを管理(wp-contentのみバックアップ) +- ✅ 設定の一元管理(values.yaml + Secret) + +## ライセンス + +MIT License \ No newline at end of file