
# 分離

Rudelは、リクエストで選択するオーバーレイシステムです。選択されたリクエストはサンドボックスのデータベーステーブルとテーマファイルを使いながら、ホストのWordPressインストール上で実行されます。

## サンドボックスごとに分離されるもの

### WordPressテーブル

各サンドボックスには、ホストのプレフィックスにサンドボックスIDのMD5の先頭7桁の16進文字を加えたテーブルプレフィックスが割り当てられます。

```text
wp_b65338d_options
wp_b65338d_posts
wp_b65338d_users
```

Rudelは、WordPressの起動完了前にWordPressのテーブルプレフィックスを切り替えるため、サンドボックスへのリクエストではすべてのクエリがサンドボックス側の複製を読み書きします。

### ユーザー

`users`テーブルと`usermeta`テーブルも、ほかのテーブルと一緒に複製されます。サンドボックスの作成時にはホストのユーザーとパスワードが引き継がれます。その後、サンドボックスで作成、変更、削除したユーザーはホストに影響せず、ホスト側の変更もサンドボックスには反映されません。

### 有効なテーマファイル

選択したテーマはサンドボックスディレクトリにコピーされます。

```text
wp-content/rudel-environments/{environment_id}/themes/{theme_slug}
```

テーマが子テーマの場合、Rudelはテンプレートとの関係が保たれるよう親テーマもコピーします。サンドボックスでは作成時に記録されたテーマが常に配信されます。サンドボックス内でテーマを切り替えても反映されません。

## ホストと共有されるもの

- WordPressコア
- プラグインファイル
- アップロード済みメディアファイル

ホストにインストールまたは更新されたプラグインは、すべてのサンドボックスにも反映されます。有効なプラグインはオプションテーブルに保存されるため、有効化の状態はサンドボックスごとに異なります。サンドボックス内でアップロードしたファイルは、ホストのアップロードディレクトリに保存されます。これにより、サンドボックスの作成を高速化し、`WP_CONTENT_DIR`を全体的に置き換えずに済みます。

すべてのサンドボックス内でRudel自体を有効にしておいてください。このプラグインがメールのブロックとテーマのオーバーレイを実行します。また、サンドボックスを選択した状態で無効化すると、共有`wp-config.php`からブートストラップ行も削除され、インストール全体でサンドボックスを選択できなくなります（[issue #13](https://github.com/inline0/rudel/issues/13)）。

## サンドボックスの選択

HTTPリクエストでは、次の方法でサンドボックスを選択します。

- `X-Rudel-Environment`ヘッダー（旧エイリアス：`X-Rudel-Sandbox`）
- `rudel_environment`Cookie（旧エイリアス：`rudel_sandbox`）

RudelがCookieを設定または消去することはありません。ホストに戻るにはCookieを削除してください。管理バーの「Sandbox」項目はホストURLへのリンクですが、Cookieは残ります（[issue #10](https://github.com/inline0/rudel/issues/10)）。

WP-CLIコマンドでは、次の方法でサンドボックスを選択します。

- `RUDEL_ENVIRONMENT`環境変数
- ホスト名がサンドボックスIDで始まる`--url`（例：`--url=http://alpha-3be7.example.test`）

セレクターによる認証はありません。サイトに接続できるクライアントが有効なサンドボックスIDを送ると、そのサンドボックスにアクセスできます。また、サンドボックスID（名前と4桁の16進文字）は簡単に推測できます。サンドボックスの選択をアクセス制御の境界として扱わず、公開ホストはウェブサーバーまたはネットワークのレベルで保護してください。

## リクエストの既定動作

サンドボックスが選択されたリクエストでは、Rudelが次の処理を行います。

- `pre_wp_mail`フィルターで送信メールをブロックする
- `tmp`ディレクトリにサンドボックス`WP_TEMP_DIR`を設定する
- 永続オブジェクトキャッシュでサンドボックスごとのキーが分離されるよう、サンドボックス固有の値を`WP_CACHE_KEY_SALT`に設定する
- サンドボックスIDから導出した`debug.log`と認証キーおよびソルトを使って、`WP_DEBUG`ログを利用可能にする

ブートストラップでは、`wp-config.php`がまだ定義されていない場合に限り、各定数を定義します。標準の`wp-config.php`では`WP_DEBUG`とすべてのキーおよびソルトが定義されるため、そのようなインストールでは、サンドボックスのリクエストでホストのデバッグ設定、キー、ソルトが使われます（[issue #4](https://github.com/inline0/rudel/issues/4)）。ユーザーも複製されるため、ホストのログインCookieがサンドボックスで有効な場合があります。

## ランタイムのメタデータ

Rudelのランタイムメタデータは、ホストのWordPressMySQLテーブルに保持されます。

```text
wp_rudel_environments
wp_rudel_worktrees
```

これらのテーブルがRudelの信頼できる情報源です。環境ディレクトリには管理対象のファイルや成果物が格納されますが、ランタイムのレジストリ状態は保持されません。
