Каждая песочница состоит из нескольких контейнеров:
- nginx
- httpd + cron + ssh-сервер
- mysql
- mailhog
- deploy_manager
На сервере (example, <домен>.ru, ...) на входе стоит traefik, который обеспечивает поддержку https через Let’s Encrypt и проксирует запросы в nginx-контейнеры песочниц.
У каждой песочницы свой контейнер с mailhog - фейковым smtp сервером. Web-панель доступна по адресу mail.<песочница>.<домен>.ru
Структура системы показана на схеме:
Везде где требуется HTTP-авторизация (в основном для mailhog и <домен>.ru) доступы одинаковые.
- Логин: sandbox
- Пароль: sandbox
Внутри каждого контейнера с httpd запущен ssh-сервер. На сервере стоит sshpiper, который проксирует все ssh подключения к 2222 порту прямо в контейнер песочницы. Для того чтобы попасть в нужную песочницу в качестве логина нужно указать ее домен. Таким образом получается подключение в изолированную среду
Пароль для подключения указывается в переменной окружения SSH_PASSWORD
Например, есть песочница dev2.<домен>.ru. Для подключения по ssh к ней нужно указать следующие данные:
- Хост: <домен>.ru
- Порт: 2222
- Логин: dev2
- Пароль: значение из переменной SSH_PASSWORD
Так же при создании песочницы через главную страницу <домен>.ru все доступы приходят письмом на почту.
Из-за использования sshpiper добавить свой ssh-ключ на сервер через утилиту ssh-copy-id не получится. Но свой ключ можно добавить на странице с редактированием настроек песочницы (на нее можно попасть из списка песочниц https://example.ru/sites/ нажав на ссылку "Настройки песочницы" рядом с нужной песочницей).
У каждой песочницы свой контейнер с БД. Для подключения нужно использовать следующие доступы:
- Хост: mysql
- БД: bitrix
- Логин: bitrix
- Пароль: password
При восстановлении сайта из резервной копии через deploy_manager эти доступы подставятся автоматически в файлы .settings.php и dbconn.php
На сервере присутствует Adminer, инструмент позволяющий легко администрировать базами данных MySQL.
Web-панель доступна по адресу https://adminer.example.ru
У каждой песочницы свой crontab, запущенный в контейнере с httpd. Для изменения списка задач нужно подключиться по ssh (см предыдущий пункт) и отрекдактировать как обычно с помощью команды
crontab -e
Для каждой из песочниц есть страница с настройкой ее параметров. Там пока можно изменить версию PHP, включить/выключить XDebug и установить свой ssh-ключ. Попасть на страницу можно из списка песочниц https://example.ru/sites/ нажав на ссылку "Настройки песочницы" рядом с нужной песочницей.
Для удаленной отладки через XDebug нужно следующее:
- Пробросить себе порт с песочницы с помощью команды
ssh -R <удаленный_порт>:127.0.0.1:<локальный_порт> <песочница>@<домен>.ru -p 2222
, где<удаленный_порт>
- это порт из настроек XDebug в файле htaccess куда будет стучаться сам XDebug;<локальный_порт>
- порт, который будет доступен у вас локально;<песочница>
- часть домена песочницы до .<домен>.ru - Задать настройки в файле .htaccess для вашей песочницы:
- Если версия PHP < 8.1 (XDebug 2), то настройки такие:
php_value xdebug.remote_enable 1 php_value xdebug.remote_host 127.0.0.1 php_value xdebug.remote_connect_back 0 php_value xdebug.extended_info 1 php_value xdebug.remote_port <удаленный_порт>
- Если версия PHP >= 8.1 (XDebug 3), то настройки такие:
php_value xdebug.mode debug php_value xdebug.client_host 127.0.0.1 php_value xdebug.discover_client_host 0 php_value xdebug.extended_info 1 php_value xdebug.client_port <удаленный_порт>
- Если версия PHP < 8.1 (XDebug 2), то настройки такие:
- В PHPStorm включить прослушивание соединений отладки в меню Run->Start Listening for PHP Debug Connections
- В браузере в плагине Xdebug helper включить режим "Debug".
Для каждой песочницы есть возможность посмотреть логи каждого из ее сервисов. Сделать это можно из списка песочниц, нажав на название нужного сервиса (nginx, httpd, mysql, ...). Есть возможность смотреть логи за 1, 3 и 7 последних дней.
Чтобы не нагружать сервер работой неиспользуемых песочниц работа каждой из них автоматически приостанавливается, если за последние 7 дней на неё ни кто не заходил.
После того как вы обнаружили, что ваша песочница остановлена, её можно запустить заново вручную со страницы со всеми песочницами.
Контейнер deploy_manager служит для подготовки проекта перед стартом. Чтобы он запускался нужно поставить переменную окружения NEED_EXEC_MANAGER равной 1 в файле .env.
В переменной MODE могут быть указаны следующие варианты:
- backup_restore - будет скачан и распакован бэкап сайта. Для этого нужно указать ссылку на него в переменной BACKUP_LINK (идеальный вариант - ссылка для переноса из админки сайта). Если есть файл с БД, то он будет размещен в docker-entrypoint-initdb.d у контейнера с mysql и импортнется при первом старте. ВАЖНО если контейнер уже запускался до распаковки бэкапа, то нужно удалить volum'ы с названиями *_mysql_data и *_mysql_db_entrypoint для вашей песочницы.
- repo_deploy - будет склонирован репозиторий, указанный в переменной REPO. Для работы данного функционала в корне проекта нужно будет разместить свой ssh-ключ с названием docker_deploy_manager_id_rsa
- install_bx - установка Битрикса. В переменной BX_REDACTION нужно указать редакцию (start, standard, small_business, business), и в переменной BX_ADMIN_PASSWORD указать пароль к админке. Логин - admin.
Для простоты управления окружением есть скрипт sandbox. Подробное описание всех команд можно получить выполнив команду ./sandbox -help.
Перед запуском нужно переименовать файл .env.example в .env, и заполнить значения переменных.
Сначала нужно запустить traefik:
./sandbox start_main_proxy
Для каждой из песочниц в отдельной папке должен быть свой docker-compose.yml файл. Перед стартом нужно заполнить переменные окружения в файле
Для старта песочницы нужно выполнить:
./sandbox start
Единственное отличие локального запуска - контейнеры используют только свою внутреннюю сеть и nginx открывает наружу 8080 порт вместо 80.
Для запуска нужно выполнить команду:
./sandbox start_local
Руками в файле .env установить NEED_EXEC_MANAGER=0
И открыть в браузере http://localhost:8080
Mailhog будет доступен по адресу http://localhost:8025
Для возможности использовать несколько песочниц локально и не прописывать каждую из них в файл hosts можно воспользоваться сервисом local.gd (он перенаправляет все поддомены на 127.0.0.1). Для этого в переменную окружения MAIN_DOMAIN нужно прописать <домен>.local.gd и запустить main_proxy. Тогда все песочницы будут создаваться с доменом .<домен>.local.gd