Установка
Docker
Необходимо установить docker на каждый сервер, который будет участвовать в docker swarm.
Ниже можно запустить только 3й пункт этой инструкции и на большинстве серверов все будет работать, но рекомендуется пройти шаги с 1 по 4 полностью.
1.0. Удаляем конфликтующие с docker программы (в т.ч. старые версии).
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt remove $pkg; done
2.0. Настраиваем docker пакетный репозиторий, устанавливаем необходимые пакеты для установки Docker Engine.
sudo apt update && sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
Добавляем репозиторий docker в источники apt.
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
3.0. Устанавливаем пакеты docker.
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
4.0. Проверяем успешную установку docker.
Смотрим информацию без проверки функций скачивания и развертывания
sudo docker info
и (или) скачиваем с официального репозитория образов docker тестовое приложение и запускаем его в контейнере.
sudo docker run hello-world
Nfs server
Необходимо установить nfs server на том сервере, где будет файловое хранилище.
1.0. Устанавливаем nfs server.
sudo apt update && sudo apt install -y nfs-kernel-server
2.0. Cоздаем папку (папки), которые будут доступны по сети.
sudo mkdir /var/notio/<directory>
Например:
sudo mkdir /var/notio/filestorage
sudo mkdir /var/notio/postgres
sudo mkdir /var/notio/rabbitmq
sudo mkdir /var/notio/elastic
sudo mkdir /var/notio/license
sudo mkdir /var/notio/webgate
sudo mkdir /var/notio/otel
3.0. Конфигурируем mount для сервиса nfs, для этого:
3.1. Переименовываем имеющийся дефолтный файл конфига nfs для будущей возможности его использования
sudo mv /etc/exports /etc/exports.origin
3.2. Создаем новый конфиг и прописываем в него mount, т.е. создаем файл и открываем его с помощью текстового редактора
sudo nano /etc/exports
и пишем в файле необходимые настройки, например:
/var/notio/<directory> 192.168.42.0/255.255.255.0(rw,no_subtree_check)
где /var/notio/<directory> это путь к хранилищу, для которого мы ранее создали папку (папки), а 192.168.42.0 это ip-address, которому мы разрешаем пользоваться ресурсами этой папки. Последняя цифра 0 обозначает, что она может быть любая.
При этом мы задаем дополнительные права в скобках (о них - можно почитать отдельно).
Таких строчек в файле /etc/exports можно делать столько сколько нужно.
Итоговая конфигурация может выглядеть так:
/var/notio/filestorage *(rw,no_subtree_check,no_root_squash)
/var/notio/postgres *(rw,no_subtree_check,no_root_squash)
/var/notio/rabbitmq *(rw,no_subtree_check,no_root_squash)
/var/notio/elastic *(rw,no_subtree_check,no_root_squash)
/var/notio/license *(rw,no_subtree_check,no_root_squash)
/var/notio/webgate *(rw,no_subtree_check,no_root_squash)
/var/notio/otel *(rw,no_subtree_check,no_root_squash)
3.3. Перезапускаем сервис и проверяем его состояние.
sudo systemctl restart nfs-kernel-server
sudo systemctl status nfs-kernel-server
Должны увидеть подсвеченную зеленым информацию Active: active (exited).

Конфигурацию сервиса можно перезапустить с помощью инструкции:
sudo exportfs -a
Перезапуск конфигурации необходимо делать после любого изменения структуры файлов (папок) nfs или прав доступа.
4.0. Копируем otel/collector/config.yaml на свой nfs сервер в директорию /var/notio/otel/collector.
5.0. Копируем assets/cover на свой nfs сервер в директорию /var/notio/filestorage/cover.
6.0. Заполняем документами nfs сервер - директорию /var/notio/filestorage/main.
Docker swarm
Далее по тексту нода - это один из серверов.
1.0. Инициализация режима swarm.
На управляющей ноде, инициируем docker swarm и указываем ip этого сервера.
sudo docker swarm init --advertise-addr=<ip-address>
Выйти из режима swarm можно следующим образом.
на нодах, с ролью worker:
sudo docker swarm leave
на нодах, с ролью manager:
sudo docker swarm leave --force
2.0. На ноде, где проинициализирован docker swarm получаем токен, для подключения к нему других нод.
для подключения ноды, с ролью manager:
sudo docker swarm join-token -q manager
для подключения ноды, с ролью worker:
sudo docker swarm join-token -q worker
Указанные выше инструкции вернут токен, который используется на подключаемой ноде.
Если убрать флаг -q тогда вернется не только токен, но и инструкция, которую можно скопировать и запустить на подключаемой ноде.
3.0. На подключаемой ноде.
Запускаем либо инструкцию (полученную в п. 2 командой без флага -q),
либо сами пишем инструкцию и вставляем в нее полученный в п. 2 токен и ip адрес c 2377 портом управляющей ноды.
sudo docker swarm join --token <join-token> <ip-address>:2377
4.0. Посмотреть список нод, входящих в swarm можно инструкцией на управляющей ноде:
sudo docker node ls
5.0. Посмотреть список развернутых стэков, входящих в swarm можно инструкцией на управляющей ноде:
sudo docker stack ls
6.0. Посмотреть список развернутых сервисов в стэках можно инструкцией на управляющей ноде:
sudo docker service ls
Portainer
portainer необходим для управления контейнерами.
Необходимо устанавливать portainer на управляющей ноде,
где проинициализирован docker swarm, если он используется.
1.0. Скачиваем конфиг файл.
curl -L https://downloads.portainer.io/ce2-21/portainer-agent-stack.yml -o portainer-agent-stack.yml
2.0. Разворачиваем stack с portainer.
sudo docker stack deploy -c portainer-agent-stack.yml portainer
3.0. Теперь веб-интерфейс portainer доступен по адресу:
https://<ip-address>:9443
где ip-address это адрес сервера, где развернут portainer.
После первого запуска portainer предложит создать пользователя и задать ему пароль. Это желательно сделать в течении 5 минут, иначе portainer попросит перезапустить его сервис в docker.
4.0. Необходимо добавить registry.

5.0. Для создания стэка:
- переходим в соответствующий подраздел, нажимаем
Add stack,
- именуем стэк
notio, вставляемdocker-stack.ymlв соответствующую областьWeb editor,
- загружаем
.env,
- нажимаем кнопку
Deploy the stack, - ждем, пока стэк развернется, контейнеры скачаются, создадуться volumes. Первый запуск будет длительным.
После успешного завершения - все сервисы должны иметь значения 1/1, 2/2 и т.д. в зависимости от количества реплик.
