Как подключиться по SSH в Docker-окружение Битрикс для разработки

Как подключиться по SSH в Docker-окружение Битрикс для разработки — статья Василия Киреева
Как настроить Docker-окружение Битрикс для удобной разработки: хранение сайта в домашней папке bitrix и работа по SSH с возможностью редактировать проект так же, как на VMBitrix.

Эта статья для серверов под управлением Linux. Я выполнял настройку на Raspberry Pi OS, которая основана на Debian. На других дистрибутивах Linux команды будут такими же или очень похожими.

Задача: настроить окружение Bitrix на базе env-docker так, чтобы:

  • на сервере был пользователь bitrix;
  • файлы сайта располагались в /home/bitrix/www;
  • контейнеры работали с этим каталогом;
  • мы подключались по SSH как bitrix и редактировали файлы сайта напрямую.

Все действия ниже предполагается выполнить до первого запуска:

docker compose up -d

Так мы избегаем конфликтов с уже созданным томом env-docker_www_data и вопросов вида:

Volume "env-docker_www_data" exists but doesn't match configuration in compose file. Recreate (data will be lost)? (y/N)

В конце есть раздел о том, как поступить, если окружение уже запускалось.

Исходные условия

Предполагаем, что:

  • репозиторий окружения env-docker размещён в каталоге:

    /opt/env-docker
  • все команды для работы с контейнерами выполняем из этого каталога:

    cd /opt/env-docker
  • у нас есть доступ по SSH и права суперпользователя sudo.

Создаём пользователя bitrix на сервере

В официальных контейнерах Bitrix пользователь bitrix имеет uid и gid 979. Чтобы права на файлы совпадали внутри контейнеров и на самом сервере, создаём такого же пользователя на хосте.

Выполняем:

sudo useradd -u 979 -U -m -s /bin/bash bitrix

Команда:

  • создаёт пользователя bitrix с идентификатором 979;
  • создаёт группу bitrix с идентификатором 979;
  • создаёт домашний каталог /home/bitrix;
  • задаёт оболочку /bin/bash.

Задаём пароль пользователю bitrix, чтобы можно было подключаться по SSH:

sudo passwd bitrix

Система запросит ввод пароля дважды.

Проверяем результат:

id bitrix

Ожидаем вывод вида:

uid=979(bitrix) gid=979(bitrix) groups=979(bitrix)

Подготавливаем каталог для сайта /home/bitrix/www

Создаём каталог, в котором будут храниться файлы сайта:

sudo mkdir -p /home/bitrix/www
sudo chown bitrix:bitrix /home/bitrix/www

Пока это пустой каталог. Далее в него можно:

  • установить продукт через bitrixsetup.php;
  • восстановить сайт из резервной копии через restore.php;
  • либо развернуть заранее подготовленный архив сайта.

Важно, что именно /home/bitrix/www мы будем привязывать к Docker-окружению.

Привязываем том www_data к /home/bitrix/www

Следующий шаг — настроить том www_data так, чтобы он использовал каталог /home/bitrix/www на сервере, а не внутреннее хранилище Docker.

Открываем файл /opt/env-docker/docker-compose.yml и находим блок volumes:. Он может выглядеть примерно так:

volumes:
...
  www_data:
    driver: local
...

Нас интересует только www_data. Остальное можно свернуть через ..., а само изменение оформить так: старую конфигурацию www_data комментируем, новую добавляем ниже.

В итоге блок должен выглядеть, например, так:

volumes:
  ...
  # www_data:
  #   driver: local
  www_data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /home/bitrix/www
  ...

Здесь:

  • имя тома www_data остаётся тем же;
  • device: /home/bitrix/www — путь к каталогу сайта на сервере;
  • type: none и o: bind настраивают привязку этого тома к существующей директории.

В сервисах (php, nginx, cron) в docker-compose.yml уже присутствуют строки вида:

- www_data:/opt/www/

Их изменять не требуется. После правки блока volumes том www_data начнёт ссылаться на /home/bitrix/www, а контейнеры продолжат видеть его как /opt/www.

Первый запуск окружения

После того как:

  • создан пользователь bitrix;
  • подготовлен каталог /home/bitrix/www;
  • том www_data привязан к этому каталогу,

можно запускать окружение:

cd /opt/env-docker
docker compose up -d
docker compose ps

Docker:

  • создаст том www_data как привязку к /home/bitrix/www;
  • поднимет контейнеры;
  • предоставит им каталог /opt/www внутри контейнера, который фактически соответствует /home/bitrix/www на сервере.

Далее мы можем:

  • зайти в контейнер php;
  • выполнить bitrixsetup.php для установки продукта;
  • либо использовать restore.php для восстановления сайта из резервной копии.

Все операции будут работать с каталогом /home/bitrix/www.

Подключение по SSH под пользователем bitrix

После настройки логично использовать для работы по SSH пользователя bitrix.

Подключаемся:

ssh bitrix@IP_сервера

После входа переходим в каталог сайта:

cd /home/bitrix/www

Далее можем:

  • редактировать файлы сайта;
  • запускать служебные скрипты;
  • использовать IDE (например, Visual Studio Code по SSH), открывая /home/bitrix/www как корень проекта.

Контейнеры продолжают использовать том www_data:/opt/www/, поэтому все изменения в файлах сразу попадают в работающий сайт.

При необходимости можно настроить вход по SSH-ключам для пользователя bitrix (создать ключ на рабочей машине и добавить его в /home/bitrix/.ssh/authorized_keys), но для базовой работы это не обязательно.

Если окружение уже запускалось раньше

Выше мы исходили из того, что docker compose up -d ещё не выполнялся. Если окружение уже запускалось, Docker создал том env-docker_www_data с прежней конфигурацией. В этом случае при изменении настроек тома в docker-compose.yml возможна ошибка:

Volume "env-docker_www_data" exists but doesn't match configuration in compose file.
Recreate (data will be lost)? (y/N)

В такой ситуации можно действовать так:

  1. Создаём пользователя bitrix и каталог /home/bitrix/www, как описано выше.

  2. Останавливаем окружение:

    cd /opt/env-docker
    docker compose stop
  3. Определяем путь к текущему тому с сайтом:

    docker volume inspect env-docker_www_data

    В выводе находим строку Mountpoint, например:

    "Mountpoint": "/var/lib/docker/volumes/env-docker_www_data/_data"
  4. Копируем содержимое тома в /home/bitrix/www с помощью rsync:

    sudo rsync -a /var/lib/docker/volumes/env-docker_www_data/_data/ /home/bitrix/www/

    Таким образом мы переносим все файлы сайта из существующего тома в новый каталог.

    Если сайт до этого работал в контейнере, права на файлы, как правило, уже принадлежат пользователю bitrix с uid 979. На хосте пользователь bitrix имеет тот же uid, поэтому дополнительно менять владельца чаще всего не требуется.

  5. Удаляем старый том:

    docker volume rm env-docker_www_data
  6. В docker-compose.yml правим блок volumes по описанному выше шаблону:

    volumes:
     ...
     # www_data:
     #   driver: local
     www_data:
       driver: local
       driver_opts:
         type: none
         o: bind
         device: /home/bitrix/www
     ...
  7. Запускаем окружение снова:

    cd /opt/env-docker
    docker compose up -d

В результате существующие данные из тома перенесены в /home/bitrix/www, а дальше схема работы становится такой же, как при настройке с нуля.

Результат

После выполнения этих шагов мы получаем:

  • пользователя bitrix на сервере с uid/gid 979;
  • каталог /home/bitrix/www с файлами сайта;
  • том www_data в docker-compose.yml, привязанный к /home/bitrix/www через driver_opts;
  • контейнеры, которые используют www_data:/opt/www/ и фактически работают с файлами в домашней директории bitrix;
  • возможность подключаться по SSH под пользователем bitrix, работать в /home/bitrix/www и управлять сайтом так же удобно, как в классической VMBitrix.

Такое выравнивание пользователя и томов упрощает разработку и эксплуатацию Docker-окружения Битрикс и минимизирует проблемы с правами доступа к файлам.