
# Isolamento

Rudel é um sistema de sobreposição selecionado por solicitação. Uma solicitação selecionada usa tabelas do banco de dados e arquivos de tema do ambiente isolado, mas continua sendo executada na instalação WordPress do host.

## Isolado por ambiente

### Tabelas de WordPress

Cada ambiente isolado recebe um prefixo de tabela gerado: o prefixo do host seguido pelos primeiros sete caracteres hexadecimais do MD5 do ID do ambiente.

```text
wp_b65338d_options
wp_b65338d_posts
wp_b65338d_users
```

Rudel altera o prefixo das tabelas de WordPress antes que WordPress termine de iniciar, para que todas as consultas em uma solicitação do ambiente leiam e gravem nas cópias isoladas.

### Usuários

As tabelas `users` e `usermeta` são clonadas junto com o restante. Um ambiente isolado começa com os usuários e senhas do host existentes no momento da criação; depois disso, usuários criados, alterados ou excluídos no ambiente não afetam o host, e as alterações no host não chegam ao ambiente.

### Arquivos do tema ativo

O tema selecionado é copiado para o diretório do ambiente isolado:

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

Se o tema for um tema filho, Rudel também copia o tema pai para manter válida a relação com o modelo. Um ambiente isolado sempre serve o tema registrado no momento da criação; trocar de tema dentro do ambiente não tem efeito.

## Compartilhado com o host

- núcleo de WordPress
- arquivos de plugins
- arquivos de mídia enviados

Um plugin instalado ou atualizado no host também é instalado ou atualizado em todos os ambientes isolados. Os plugins ativos são registrados na tabela de opções, então o estado de ativação é específico de cada ambiente. Os arquivos enviados dentro de um ambiente isolado são gravados no diretório de uploads do host. Isso mantém rápida a criação de ambientes isolados e evita substituir `WP_CONTENT_DIR` globalmente.

Mantenha Rudel ativo em cada ambiente isolado. O bloqueio de e-mails e a sobreposição do tema são executados pelo plugin, e desativá-lo enquanto um ambiente está selecionado também remove a linha de inicialização do `wp-config.php` compartilhado, desativando a seleção de ambientes isolados em toda a instalação ([problema #13](https://github.com/inline0/rudel/issues/13)).

## Selecionar um ambiente isolado

As solicitações HTTP selecionam um ambiente isolado por meio de:

- o cabeçalho `X-Rudel-Environment` (alias legado `X-Rudel-Sandbox`)
- o cookie `rudel_environment` (alias legado `rudel_sandbox`)

Rudel nunca define nem limpa o cookie. Exclua-o para voltar ao host; o item Sandbox na barra de administração leva ao URL do host, mas mantém o cookie ([problema #10](https://github.com/inline0/rudel/issues/10)).

Os comandos WP-CLI selecionam um ambiente isolado por meio de:

- a variável de ambiente `RUDEL_ENVIRONMENT`
- um `--url` cujo host começa com o ID do ambiente isolado, como `--url=http://alpha-3be7.example.test`

O seletor não é autenticado. Qualquer cliente que consiga acessar o site e envie um ID válido de ambiente isolado terá acesso a esse ambiente, e os IDs (nome mais quatro caracteres hexadecimais) são fáceis de adivinhar. Não trate a seleção de ambientes isolados como uma barreira de controle de acesso; proteja um host público no servidor Web ou no nível da rede.

## Padrões das solicitações

Para uma solicitação com um ambiente isolado selecionado, Rudel:

- bloqueia e-mails de saída por meio de um filtro `pre_wp_mail`
- define `WP_TEMP_DIR` como o diretório `tmp` do ambiente isolado
- define `WP_CACHE_KEY_SALT` com um valor específico do ambiente, para que caches persistentes de objetos mantenham separadas as chaves do ambiente
- oferece registro `WP_DEBUG` em `debug.log` do ambiente, além de chaves de autenticação e salts derivados do ID do ambiente

A inicialização define cada uma dessas constantes somente se `wp-config.php` ainda não a tiver definido. Uma instalação padrão de `wp-config.php` define `WP_DEBUG` e todas as chaves e salts; nesse tipo de instalação, as solicitações do ambiente usam a configuração de depuração e as chaves e salts do host ([problema #4](https://github.com/inline0/rudel/issues/4)). Como os usuários também são clonados, um cookie de login do host pode ser válido em um ambiente isolado.

## Metadados de execução

Os metadados de execução de Rudel permanecem nas tabelas WordPress MySQL do host:

```text
wp_rudel_environments
wp_rudel_worktrees
```

Essas tabelas são a fonte de verdade de Rudel. Os diretórios de ambiente contêm arquivos e artefatos gerenciados, não o estado do registro de execução.
