
# Izolácia

Rudel je systém prekrytia vyberaného podľa požiadavky. Vybraná požiadavka používa databázové tabuľky a súbory témy sandboxu, no naďalej beží v hostiteľskej inštalácii WordPress.

## Izolované pre každý sandbox

### Tabuľky WordPress

Každý sandbox dostane vygenerovaný prefix tabuliek: prefix hostiteľského prostredia a prvých sedem hexadecimálnych znakov MD5 ID sandboxu.

```text
wp_b65338d_options
wp_b65338d_posts
wp_b65338d_users
```

Rudel prepne prefix tabuliek WordPress ešte pred dokončením inicializácie WordPress, takže každý databázový dotaz v požiadavke sandboxu číta kópie sandboxu a zapisuje do nich.

### Používatelia

Tabuľky `users` a `usermeta` sa klonujú spolu s ostatnými. Sandbox pri vytvorení obsahuje používateľov a heslá hostiteľského prostredia; neskoršie vytvorenie, zmena alebo odstránenie používateľov v sandboxe neovplyvní hostiteľské prostredie a zmeny v hostiteľskom prostredí sa do sandboxu neprenesú.

### Súbory aktívnej témy

Vybraná téma sa skopíruje do adresára sandboxu:

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

Ak je téma podriadená, Rudel skopíruje aj nadradenú tému, aby vzťah medzi šablónami zostal platný. Sandbox vždy poskytuje tému zaznamenanú pri vytvorení; zmena témy v sandboxe nemá žiadny účinok.

## Zdieľané s hostiteľským prostredím

- jadro WordPress
- súbory pluginov
- nahrané médiá

Plugin nainštalovaný alebo aktualizovaný v hostiteľskom prostredí sa nainštaluje alebo aktualizuje vo všetkých sandboxoch. Aktívne pluginy sú uložené v tabuľke možností, takže ich aktivácia sa spravuje osobitne pre každý sandbox. Nahrané súbory pridané v sandboxe sa ukladajú do adresára nahraných súborov hostiteľského prostredia. Vďaka tomu sa sandboxy vytvárajú rýchlo a netreba globálne nahrádzať `WP_CONTENT_DIR`.

Rudel musí zostať aktívny v každom sandboxe. Blokovanie pošty a prekrytie témy zabezpečuje plugin; jeho deaktivácia pri vybranom sandboxe zároveň odstráni inicializačný riadok zo zdieľaného `wp-config.php`, čím sa vypne výber sandboxov pre celú inštaláciu ([vydanie č. 13](https://github.com/inline0/rudel/issues/13)).

## Výber sandboxu

Požiadavky HTTP vyberajú sandbox cez:

- hlavičku `X-Rudel-Environment` (starší alias `X-Rudel-Sandbox`)
- súbor cookie `rudel_environment` (starší alias `rudel_sandbox`)

Rudel nikdy nenastavuje ani nemaže súbor cookie. Ak sa chcete vrátiť do hostiteľského prostredia, vymažte ho; položka Sandbox na paneli správcu odkazuje na hostiteľské URL, ale súbor cookie ponechá ([vydanie č. 10](https://github.com/inline0/rudel/issues/10)).

Príkazy WP-CLI vyberajú sandbox cez:

- premennú prostredia `RUDEL_ENVIRONMENT`
- `--url`, ktorej hostiteľská časť začína ID sandboxu, napríklad `--url=http://alpha-3be7.example.test`

Výber nie je overovaný. Každý klient, ktorý sa môže pripojiť k webu a odošle platné ID sandboxu, získa prístup k danému sandboxu; ID sandboxov (názov a štyri hexadecimálne znaky) sa dajú ľahko uhádnuť. Výber sandboxu nepovažujte za hranicu riadenia prístupu; verejné hostiteľské prostredie chráňte na úrovni webového servera alebo siete.

## Predvolené nastavenia požiadavky

Pre vybranú požiadavku Rudel:

- blokuje odchádzajúcu poštu pomocou filtra `pre_wp_mail`
- nastaví `WP_TEMP_DIR` na adresár `tmp` sandboxu
- nastaví `WP_CACHE_KEY_SALT` na hodnotu špecifickú pre sandbox, aby trvalé vyrovnávacie pamäte objektov uchovávali kľúče sandboxov oddelene
- sprístupní protokolovanie `WP_DEBUG` do `debug.log` sandboxu a autentifikačné kľúče a soli odvodené z ID sandboxu

Inicializačný kód definuje každú z týchto konštánt, iba ak ju `wp-config.php` ešte nedefinoval. Štandardná inštalácia `wp-config.php` definuje `WP_DEBUG` a všetky kľúče a soli, takže požiadavky sandboxu v takejto inštalácii používajú nastavenie ladenia hostiteľského prostredia, ako aj jeho kľúče a soli ([vydanie č. 4](https://github.com/inline0/rudel/issues/4)). Keďže sa klonujú aj používatelia, prihlasovací súbor cookie hostiteľského prostredia môže byť platný aj v sandboxe.

## Metadáta za behu

Metadáta prostredí Rudel za behu zostávajú v tabuľkách hostiteľského prostredia WordPress MySQL:

```text
wp_rudel_environments
wp_rudel_worktrees
```

Tieto tabuľky sú jediným zdrojom pravdy pre Rudel. Adresáre prostredí obsahujú spravované súbory a artefakty, nie stav registra za behu.
