README.md

    Переустановка после истечения оценочного периода WebStorm

    $ ./uninstall.sh
    $ env UID=$UID HOST_IP=192.168.1.10 HOST_USER_PASS=<user_pass> ./install.sh
    $ ./start.sh
    # в терминале открывшегося WebStorm
    $ doas apk add nodejs yarn
    # далее через меню Settings отключить плагины GitHub, GitLab
    

    Инструкция по запуску GUI приложений в докер-контейнере, используя SSH-доступ к хосту

    Дано:

    • локальная машина пользователя user_host (10.31.228.137), например, домашний ноутбук;
    • удаленная машина с установленным Docker, docker_host (192.168.1.10), c рабочим аккаунтом user;
    • на удаленной машине docker_host не запущен X-сервер;
    • JetBrains WebStorm, который нужно запустить в контейнере, чтоб можно было каждый месяц продлевать trial.


    1. Подготовка

    ВАЖНО: В разных дистрибутивах Linux политика доступа к сокету ‘/tmp/.X11-unix/X0’ разнится, если приложение внутри docker-контейнера выдает ошибку, что не может подключиться к дисплею ‘:0’, то перед запуском контейнера на машине пользователя нужно выполнять команду:

    $ sudo xhost +si:localuser:<user>
    

    Где - имя пользователя docker-хоста, от имени которого будет запускаться контейнер. Эта настройка работает только до следующей перезагрузки системы.

    Также, если в контейнере предполагается использование VPN-соединений хоста, то нужно подымать эти соединения то того, как стартует контейнер, так как docker прокидывает с хоста файл /etc/resolv.conf и кэширует его.

    2. Подключаемся к docker_host

    Таким способом подключения (используя обратный туннель, опция R) мы одновременно прокидываем unix сокет X-сервера локальной машины user_host на удаленную машину docker_host, где установлен Docker

    $ ssh -CR localhost:6000:/tmp/.X11-unix/X0 user@192.168.1.10
    # проверить работоспособность прокидки unix-сокета можно сразу
    $ DISPLAY=:0 xeyes
    # на экране пользователя должны появится "следящие глаза", маленькая тестовая програмка
    

    Полезные опции:

    • -C запросить сжатие данных
    • -g использовать внешние интерфейсы (на удаленном хосте должна быть включена опция GatewayPorts clientspecified в /etc/ssh/sshd_config),
    • -R создавать обратный туннель (т.е. порт локальной машины становится доступным на сервере)
    • -N не входить в оболочку (туннель просто будет “висеть” в консоли, пока не нажмешь CTRL+C)


    3. Подготовка к установке

    Полагаем, что WebStorm будет установлен по пути ~/programs/webstorm, а проекты пользователя находятся по пути ~/projects.
    Клонируем данный репозиторий:

    $ cd ~/programs
    $ git clone git@gitlab.lpr.jet.msk.su:bn.nazar/docker-gui-app-via-ssh.git
    $ mv docker-gui-app-via-ssh webstorm
    $ cd webstorm
    

    Загружаем из интернета свежую версию WebStorm
    https://www.jetbrains.com/webstorm/download/#section=linux

    $ wget https://download.jetbrains.com/webstorm/WebStorm-2024.1.3.tar.gz
    $ tar -xf WebStorm-2024.1.3.tar.gz
    $ ln -s WebStorm-241.17011.90 webstorm
    

    Строго говоря исходники WebStorm можно скачать в любую директорию, главное потом правильно создать ссылку на них командой ln:

    $ ln -s /absolute/path/to/WebStorm-241.17011.90 webstorm
    $ ln -s ../../relative/path/to/WebStorm-241.17011.90 webstorm
    

    Также создаем ссылку на директорию с проектами:

    $ ln -s ~/projects projects
    

    4. Установка

    Под установкой понимается сборка docker-образа и последующий его запуск, собственно 3 команды:

    $ ip a
    $ env UID=$UID HOST_IP=192.168.1.10 HOST_USER_PASS=<user_pass> ./install.sh
    # где:
    #  - HOST_IP - IP адрес внешнего интерфейса машины docker_host, можно посмотреть командой ip a
    #  - HOST_USER_PASS - пароль пользователя, с которым прокидывался туннель на docker_host
    $ ./start.sh
    

    Полностью удалить контейнер из системы можно командой:

    $ ./uninstall.sh
    

    Скрипт для остановки контейнера не нужен, так как после закрытия GUI контейнер остановится автоматически. Если же по каким-то причинам нужно принудительно остановить контейнер, то можно выполнить:

    $ docker compose -f docker/webstorm.yml stop
    

    5. Пояснения

    Образ alpine был выбран потому, что он минималистический и не имеет предустановленного пользователя UID=1000. В то время как, например, образ Ubuntu, имеет предустановленного пользователя [ubuntu:uid:1000].

    В контейнере намеренно создается пользователь с тем же именем и uid, от имени которого работает пользователь хоста. Это делается с той целью, чтобы не было проблем доступа из контейнера к файловой системе хоста.

    При сборке параметр env UID=$UID задается явно (в отличие, например, от $USER) потому, что он отсутствует в переменных среды. Но он присутствует в переменных оболочки, echo $UID выведет имя пользователя.

    Переменные среды UID, HOST_IP, HOST_USER_PASS нужны только для сборки образа. А переменная среды DISPLAY нужна только для старта, она захардкоджена в скрипте start.sh.

    Прокидка X-сервера пользователя через unix-сокет /tmp/.X11-unix/X0 делается потому, что подключения к нему не требуют аутентификации (xauth). Иначе бы пришлось выполнять многочисленные танцы с бубном вокруг ~/Xauthority, коих множество описано в интернете. Мне так и не удалось найти рабочий способ из всех описанных, не иначе как создают эти описания гуру, и исключительно для других гуру.

    Изнутри докера для GUI приложений прокидывается прямой туннель на хост localhost:6000. На этом порту обычно принимает соединения X-сервер, но в нашем случае он выключен, и мы используем этот порт для дальнейшей прокидки на машину пользователя (обратный туннель).

    Если требуется пробросить соединение к X-серверу пользователя на машину user_host в то время, когда на удаленной машине docker_host запущен свой X-сервер или возможны параллельные “ssh X”-соединения, которые используют порты начиная с 6010, - в данной ситуации порт 6000 лучше заменить на, скажем, 6100. Т.е. при смене порта мы должны переподключиться к удаленной машине с новым портом (см. выше, п. “**1. Подключаемся к docker_host”**):

    $ ssh -CR localhost:6100:/tmp/.X11-unix/X0 user@192.168.1.10
    

    а также мы должны поправить порт хоста в прямом туннеле контейнера (см. docker/run.sh этого репозитория, второе значение):

    $ sshpass -p $ENV_HOST_USER_PASS ssh -o StrictHostKeyChecking=no -CNL 6000:localhost:6100 $ENV_HOST_USER@$ENV_HOST_IP
    

    При этом значение DISPLAY в start.sh, менять не нужно, так как оно используется внутри контейнера и не меняется при прокидке (порт 6000 прямого туннеля).

    Описание

    Запуск GUI приложения из docker-контейнера при подключении к docker-хосту по SSH

    Конвейеры
    0 успешных
    0 с ошибкой