Ізоляція
Rudel — це система накладних шарів, що вибираються для кожного запиту. Вибраний запит використовує таблиці бази даних і файли теми ізольованого середовища, водночас виконуючись у встановленні хоста WordPress.
Ізольовано для кожного середовища
Таблиці WordPress
Кожне ізольоване середовище отримує згенерований префікс таблиць: префікс хоста плюс перші сім шістнадцяткових символів MD5 ID середовища.
wp_b65338d_options
wp_b65338d_posts
wp_b65338d_users
Rudel перемикає префікс таблиць WordPress до завершення завантаження WordPress, тож кожен запит у запиті ізольованого середовища читає копії середовища й записує в них.
Користувачі
Таблиці users і usermeta клонуються разом з іншими. Під час створення ізольоване середовище отримує користувачів і паролі хоста; після цього створення, зміни чи видалення користувачів у середовищі не впливають на хост, а зміни на хості не переходять до середовища.
Файли активної теми
Вибрана тема копіюється до каталогу ізольованого середовища:
wp-content/rudel-environments/{environment_id}/themes/{theme_slug}
Якщо тема дочірня, Rudel також копіює батьківську тему, щоб зв’язок шаблонів залишався чинним. Ізольоване середовище завжди обслуговує тему, зафіксовану під час створення; перемикання теми всередині середовища ні на що не впливає.
Спільне з хостом
- ядро WordPress
- файли плагінів
- завантажені медіафайли
Плагін, встановлений або оновлений на хості, встановлюється або оновлюється для кожного ізольованого середовища. Активні плагіни зберігаються в таблиці параметрів, тому стан активації окремий для кожного середовища. Завантажені файли з середовища потрапляють до каталогу завантажень хоста. Так створення середовища пришвидшується і немає потреби глобально замінювати WP_CONTENT_DIR.
Залишайте сам Rudel активним у кожному ізольованому середовищі. Блокування пошти й накладний шар теми працюють із плагіна, а його деактивація, коли вибрано середовище, також видаляє рядок початкового налаштування зі спільного wp-config.php, вимикаючи вибір ізольованого середовища для всього встановлення (проблема № 13).
Вибір ізольованого середовища
Запити HTTP вибирають ізольоване середовище через:
- заголовок
X-Rudel-Environment(застарілий псевдонімX-Rudel-Sandbox) - cookie
rudel_environment(застарілий псевдонімrudel_sandbox)
Rudel ніколи не встановлює і не видаляє cookie. Видаліть його, щоб повернутися до хоста; пункт Sandbox на панелі адміністратора веде на хост URL, але залишає cookie (проблема № 10).
Команди WP-CLI вибирають ізольоване середовище через:
- змінну середовища
RUDEL_ENVIRONMENT --url, ім’я хоста якого починається з ID ізольованого середовища, наприклад--url=http://alpha-3be7.example.test
Селектор не автентифікується. Будь-який клієнт, що має доступ до сайту й надсилає дійсний ID ізольованого середовища, потрапляє в це середовище, а ID (назва та чотири шістнадцяткові символи) легко вгадати. Не вважайте вибір середовища межею контролю доступу; захищайте публічний хост на рівні вебсервера або мережі.
Типові параметри запиту
Для вибраного запиту Rudel:
- блокує вихідну пошту фільтром
pre_wp_mail - задає
WP_TEMP_DIRяк каталогtmpізольованого середовища - задає
WP_CACHE_KEY_SALTокреме для середовища значення, щоб ключі в постійному кеші об’єктів не перетиналися - увімкне журналювання
WP_DEBUGдляdebug.logсередовища, а також ключі та солі автентифікації, похідні від ID середовища
Початкове налаштування визначає кожну з цих констант, лише якщо wp-config.php її ще не визначив. Стандартне встановлення wp-config.php визначає WP_DEBUG, а також усі ключі та солі, тож у такому встановленні запити ізольованого середовища використовують налагоджувальне налаштування хоста й ключі та солі хоста (проблема № 4). Оскільки користувачів також клоновано, cookie входу хоста може бути дійсним в ізольованому середовищі.
Метадані середовища виконання
Метадані середовища виконання Rudel зберігаються в таблицях хоста WordPress MySQL:
wp_rudel_environments
wp_rudel_worktrees
Ці таблиці є єдиним достовірним джерелом даних для Rudel. Каталоги середовищ містять керовані файли й артефакти, а не стан реєстру середовища виконання.