Docker & Portainer & Linux-SWAG & Jitsi

Ubuntu 20.04
Ubuntu 20.04 server

Всё делаю на ВМ и в процессе установки добавляю еще один диск для больших объёмов данных и точку монтирования /portainer-data

cat /etc/fstab
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
# / was on /dev/ubuntu-vg/ubuntu-lv during curtin installation
/dev/disk/by-id/dm-uuid-LVM-kmVAQlOe219swsa9PbKu4nlQyx9zOdBMfH11L3dkdBMhlaxXB953wbr9uLx617aG / ext4 defaults 0 0
# /portainer-data was on /dev/vg01/lv-01 during curtin installation
/dev/disk/by-id/dm-uuid-LVM-NV3K1uWII2O5hpfkyfQdvJpw7yu35WnY8vuAa1jIqwCrrhRY7Aw72v8vif3mmF0Y /portainer-data ext4 defaults 0 0
# /boot was on /dev/sda2 during curtin installation
/dev/disk/by-uuid/53737001-32a8-4698-8797-050d7c243610 /boot ext4 defaults 0 0
/swap.img       none    swap    sw      0       0
sudo su && apt update && apt dist-upgrade -y && reboot now
Docker-CE
sudo apt install  -y linux-image-extra-virtual apt-transport-https ca-certificates curl software-properties-common && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - 
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable" && sudo apt update

Убедитесь, что установка будет выполняться из репозитория Docker, а не из репозитория Ubuntu по умолчанию:

apt-cache policy docker-ce

Вы должны получить следующий вывод, хотя номер версии Docker может отличаться:

docker-ce:
Installed: (none)
Candidate: 5:20.10.2~3-0~ubuntu-focal
Version table:
5:20.10.2~3-0~ubuntu-focal 500
500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages

Ставим docker community edition

sudo apt install docker-ce -y

Docker должен быть установлен, демон-процесс запущен, а для процесса активирован запуск при загрузке. Проверьте, что он запущен:

sudo systemctl status docker

Если вы не хотите каждый раз вводить sudo при запуске команды docker, добавьте свое имя пользователя в группу docker:

sudo usermod -aG docker ${USER} && su - ${USER}

Проверьте, что ваш пользователь добавлен в группу docker, введя следующее:

id -nG

Затем я укажу где хранить образы докера: открываю файл на редактирование и добавляю следующее

sudo vi /etc/docker/daemon.json
{
          "data-root": "/portainer-data/docker-images"
}	

где /portainer-data/docker-images - точка монтирования и созданная папка docker-images

sudo systemctl daemon-reload && sudo systemctl restart docker
Docker Compose
curl -L "https://github.com/docker/compose/releases/download/v2.14.0/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose

Проверяем версию

docker-compose --version
Portainer
docker volume create portainer_data && docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

Проверяем, что portainer запущен

docker ps -a

Идем в браузер по http://ip-address:9000 и создаем пользователя
Затем выберите метод подключения: для начала можно подключиться к локальному сервису Docker, для чего выбираем Local
Нажимаем Connect - вы в панели управления докерами )
Например, в разделе Containers можно посмотреть все доступные контейнеры:
А в разделе Stacks - все доступные приложения.

Nginx Linux-SWAG

создаем сеть proxynet

docker network create proxynet

Запускаем контейнер, но не забываем сменить:
MYDOMAIN.ru на свой домен
поддомены doc,it, на свои
почтовый адрес Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. для уведомлений Let`s Encrypt

docker run -i -t -d --name=swag \
 --cap-add=NET_ADMIN \
 -e PUID=1000 \
 -e PGID=1000 \
 -e TZ=Europe/Moscow \
 -e URL=MYDOMAIN.ru \
 -e SUBDOMAINS=doc,it, \
 -e VALIDATION=http \
 -e EMAIL=Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. \
 -e ONLY_SUBDOMAINS=true \
 -e STAGING=false \
 -p 443:443 \
 -p 80:80 \
 -v /home/grif/swag_data/config:/config \
 --restart unless-stopped \
 --network="proxynet" \
 ghcr.io/linuxserver/swag

Для принудительного досрочного перевыпуска сертификатов заходим в контейнер SWAG и запускаем скрипт перевыпуска:

docker exec -it ID-контейнера /bin/bash
/app/le-renew.sh
Jitsi
sudo su
mkdir -p /portainer-data/grif/appdata/jitsi/jitsi-meet-cfg/{web/letsencrypt,transcripts,prosody,jicofo,jvb,jigasi,jibri}
mkdir -p /portainer-data/grif/appdata/jitsi/github && cd /portainer-data/grif/appdata/jitsi/github
git clone https://github.com/jitsi/docker-jitsi-meet && cd docker-jitsi-meet

Открываем на редактирование env.example и последовательно меняем строки

vi env.example

CONFIG=~/.jitsi-meet-cfg
CONFIG=/portainer-data/grif/appdata/jitsi/jitsi-meet-cfg/

TZ=UTC
TZ=Europe/Moscow

#PUBLIC_URL=https://meet.example.com
PUBLIC_URL=https://telemed.mydomain.ru

#DOCKER_HOST_ADDRESS=192.168.1.1
DOCKER_HOST_ADDRESS=192.168.88.200

#ENABLE_AUTH=1
ENABLE_AUTH=1

#ENABLE_GUESTS=1
ENABLE_GUESTS=1

#AUTH_TYPE=internal
AUTH_TYPE=internal

В терминале

cp env.example .env
./gen-passwords.sh
docker-compose up -d

Далее в web-интерфейсе portainer заходим в 4 контейнера:
docker-jitsi-meet_jicofo_1
docker-jitsi-meet_jvb_1
docker-jitsi-meet_prosody_1
docker-jitsi-meet_web_1
и присоединяем их к заранее созданной сети proxynet, из сети бриджа выходим и переименовываем контейнеры по схеме:

docker-jitsi-meet_jvb_1		->	video.meet.jitsi
docker-jitsi-meet_jicofo_1	->	focus.meet.jitsi
docker-jitsi-meet_prosody_1	->	xmpp.meet.jitsi
docker-jitsi-meet_web_1		->	meet.jitsi

Кладем файл jitsimeet.subdomain.conf следующего содержания в папку /home/grif/swag_data/config/nginx/proxy-confs/

cat /home/grif/swag_data/config/nginx/proxy-confs/jitsimeet.subdomain.conf
server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name telemed.*;
    include /config/nginx/ssl.conf;

        location / {
        # enable the next two lines for http auth
        # auth_basic "Ask for password from your organisation";
        # auth_basic_user_file /config/nginx/.htpasswd;

                ssi on;
                proxy_pass http://meet.jitsi;
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_set_header Host $http_host;
        }
        # BOSH
        location /http-bind {
                proxy_pass http://xmpp.meet.jitsi:5280/http-bind;
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_set_header Host $http_host;
        }

        # xmpp websockets
        location /xmpp-websocket {
                proxy_pass              http://xmpp.meet.jitsi:5280/xmpp-websocket;
                proxy_http_version      1.1;
                proxy_set_header        Upgrade $http_upgrade;
                proxy_set_header        Connection "upgrade";
                proxy_set_header        Host $host;
                tcp_nodelay             on;
        }
}

Перезапускаем контейнер SWAG и ГОТОВО!
Заходим по адресу https://telemed.mydomain.ru

Управление пользователями: заходим в контейнер:

docker exec -it xmpp.meet.jitsi bash

Зарегистрировать пользователя grif с паролем VeryStrongPa$$word

prosodyctl --config /config/prosody.cfg.lua register grif meet.jitsi VeryStrongPa$$word

Отменить регистрацию пользователя grif

prosodyctl --config /config/prosody.cfg.lua unregister grif meet.jitsi

Если нужно поменять логотип, картинку или надписи на стартовом экране, то:
Копируем из докера папку с сайтом

docker cp  meet.jitsi:/usr/share/jitsi-meet/ /home/grif/jitsi-meet

Правим содержимое сайта и картинки как нам угодно и заливаем обратно )

docker cp /home/grif/jitsi-meet/ meet.jitsi:/usr/share/

Перезапускаем контейнер

docker restart meet.jitsi

Не забываем пробросить на тачку с докерами порты:

TCP - 80,443
UDP - 10000

Fuse

Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.