Перейти к содержанию

Index

Общий алгоритм создания пользователя Октопус:

  1. Создание пользователя Октопус.
  2. Выполнение базовой настройки операционной системы.
  3. Выполнение настройки сетевого экрана.
  4. Выполнение настройки сетевого форвардинга.
  5. Выполнение установки и настройки Docker CE.
  6. Выполнение настройки SELinux для работы Docker.
  7. Выполнение настройки прав доступа к Docker для пользователя Октопус.
  8. Проведение проверки автозапуска.
  9. Проведение подготовки к установке Октопус.
  10. Выполнение импорта Docker-образов.
  11. Проведение запуска Октопус.
  12. Выполнение настройки автозагрузки.

Подробное описание каждого этапа алгоритма приведено ниже.

Создание пользователя Октопус

Создание пользователя Октопус выполняется один раз от пользователя root.

В случае установки новой ОС, на этапе установки необходимо создать пользователя octopus/octopus.

Supportet_env_01.png Пользователь Октопус обязательно должен быть с фиксированным UID 1000.

Для создания пользователя Октопус необходимо выполнить следующую последовательность действий:

1. Проверить, не занят ли UID 1000, командой:

getent passwd 1000

2.1. Если UID 1000 свободен - создать пользователя командой:

useradd -m -u 1000 -s /bin/bash octopus
echo "octopus:octopus" | chpasswd
usermod -aG wheel octopus

2.2. Если UID 1000 занят - удалить пользователя с UID 1000 и создать нового пользователя (выполнить шаг 2.1). Команда для удаления существующего пользователя:

userdel -r <существующий_пользователь>

Базовая настройка операционной системы

Для выполнения базовой настройки операционной системы необходимо выполнить следующую последовательность действий:

1. Выполнить команду для настройки хоста и времени:

sudo hostnamectl set-hostname red-octopus
sudo timedatectl set-timezone Europe/Moscow # или свою таймзону
sudo dnf -y update

2. Проверить настройки:

hostnamectl
timedatectl

В результате проверки должны быть получены установленное время и название хоста, заданное на шаге 1, (см. команду sudo hostnamectl set-hostname).

3. Установить базовые инструменты:

sudo dnf install -y curl vim unzip tar net-tools git lsof firewalld

Настройка сетевого экрана

Для выполнения настройки сетевого экрана необходимо выполнить следующую последовательность действий:

1. Запустить Firewalld командами:

sudo systemctl enable --now firewalld
sudo firewall-cmd --state

2. Открыть сервисы Октопус:

sudo firewall-cmd --permanent --add-port=80/tcp     # UI
sudo firewall-cmd --permanent --add-port=443/tcp    # UI
sudo firewall-cmd --permanent --add-port=8081/tcp   # Keycloak

3. Открыть служебные сервисы:

sudo firewall-cmd --permanent --add-port=22/tcp      # SSH

4. Настроить маскарадинг (для NAT/форвардинга):

sudo firewall-cmd --permanent --add-masquerade
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

Настройка сетевого форвардинга

В Red OS по умолчанию активирована строгая сетевая политика, которая блокирует пересылку пакетов между сетевыми пространствами имен (network namespaces). Такое поведение обусловлено принципом безопасной конфигурации (secure-by-default), однако оно препятствует взаимодействию контейнеров Октопус, даже если они находятся в пределах одной Docker-сети. При запуске Docker создаёт правила межсетевого экрана (iptables), разрешающие прохождение трафика между контейнерами, включая правило ACCEPT all -- anywhere anywhere ctstate RELATED, ESTABLISHED. Однако, поскольку форвардинг изначально заблокирован в ядре системы, установка этого правила оказывается невозможной, что приводит к изоляции сети контейнеров друг от друга.

Для обеспечения нормальной работы контейнеров Октопус необходимо активировать IP-форвардинг на уровне ядра операционной системы:

1. Включить IP forward командой:

echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/99-octopus.conf
sudo sysctl --system

2. Проверить успешность включения IP forward, выполнив команду:

sysctl net.ipv4.ip_forward

Ожидаемый ответ: net.ipv4.ip_forward = 1

3. Сбросить правила FORWARD для Docker:

sudo iptables -P FORWARD ACCEPT
sudo iptables -F FORWARD

Установка и настройка Docker CE (ветка CentOS 8)

Для выполнения установки Docker CE необходимо выполнить следующую последовательность действий:

1. Проверить текущее состояние GID 102 и группы docker командой:

getent group 102 || echo "GID 102 свободен"

echo
getent group docker || echo "Группа docker отсутствует"

Ожидаемый ответ: docker:x:102:

2. Освободить GID 102, если он занят другой группой

В случае, если ответ от команды getent group 102 не соответствует ожидаемому и выводится другая группа, то необходимо выполнить проверку возможности её безопасного переноса на свободный GID.

Supportet_env_01.png Не удалять и не переименовывать группу вслепую.

2.1. Проверить явных участников группы и файлы с GID 102, командой:

getent group 102 sudo find / -xdev -gid 102 -print 2>/dev/null | head -50

2.2. Найти свободный GID, например в диапазоне 900 - 999, командой:

for gid in (seq 900 999); do\     getent group "gid" >/dev/null || { echo "free GID: $gid"; break; } done 2.3. Дополнительно проверить выбранный GID:

FREE_GID=900 sudo find / -xdev -gid "$FREE_GID" -print 2>/dev/null | head -50 2.4. Если проверкой не выявлено конфликтов, перенести существующую группу с GID 102 на выбранный свободный GID. Имя группы в примере нужно заменить на фактическое:

sudo groupmod -g "$FREE_GID" <имя_группы_с_GID_102> getent group 102 || echo "GID 102 свободен"

Supportet_env_01.png Если у группы есть GID 102 пользователи, файлы или она используется системными сервисами, перенос нужно разбирать отдельно, с привлечением сотрудников техничской поддержки Октопус. Автоматически продолжать нельзя.

3. Привести группу docker к GID 102:

3.1. Если группа docker отсутствует и GID 102 свободен:

sudo groupadd -g 102 docker 3.2. Если группа docker уже существует с другим GID, изменить GID существующей группы:

sudo groupmod -g 102 docker

4. Выполнить проверку GID группы docker:

getent group docker
DOCKER_GID="(getent group docker | cut -d: -f3)"\ \ if \[ "DOCKER_GID" = "102" ]; then
    echo "OK: docker GID = 102"
else
    echo "ERROR: docker GID = ${DOCKER_GID:-not found}"
    exit 1
fi

Ожидаемый ответ: docker:x:102:

5. Перезапустить Docker и проверить текущее состояние Docker-сокета командой:

sudo systemctl enable --now docker
sudo systemctl restart docker
sudo systemctl --no-pager --full status docker

6. Проверить владельца и GID сокета:

ls -ln /var/run/docker.sock
DOCKER_GROUP_GID="(getent group docker | cut -d: -f3)"\ DOCKER_SOCKET_GID="(stat -c '%g' /var/run/docker.sock)"

echo "GID группы docker: There was an error rendering this math block. KaTeX parse error: Undefined control sequence: \[ at position 91: …GID&amp;quot;\\ \\ if \\\̲[̲ &amp;quot;&amp;lt;/span&amp;gt;DOCKER…DOCKER_SOCKET_GID" = "102" ]; then
    echo "OK: docker group и docker.sock используют GID 102"
else
    echo "ERROR: ожидается GID 102 у docker group и docker.sock"
    exit 1
fi

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

GID группы docker: 102
GID файла docker.sock: 102
OK: docker group и docker.sock используют GID 102

7. Добавить пользователя Octopus в группу docker:

sudo usermod -aG docker octopus
getent group docker

8. После изменения групп выйти из SSH-сессии и подключаться заново под пользователем octopus:

id
docker ps

Ожидаемый ответ: в выводе id должна присутствовать группа 102(docker), а docker ps должен выполняться без sudo и без ошибки Permission denied.

9. Настроить group_add у сервиса api:

cd /home/octopus/octopus || exit 1

10. Открыть docker-compose.yml и в сервисе api проверить наличие group_add:

services:
  api:
    image: registry.usetech.ru/octopus/octopus/octopus.api:${OCTOPUS_VERSION}
    group_add:
      - "102"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

Ожидаемый ответ: group_add должен находиться внутри сервиса api на одном уровне с image, volumes и environment. Если group_add уже существует, второй блок добавлять нельзя. В volumes должен присутствовать /var/run/docker.sock.

Supportet_env_01.png Значение group_add для этой поставки фиксировано: "102". Подставлять результат stat как произвольный GID не нужно.

11. Запустить Октопус

docker compose up -d

Настройка SELinux для работы Docker

Red OS по умолчанию использует SELinux в режиме enforcing, что обеспечивает повышенный уровень безопасности, но может блокировать операции Docker с локальными томами. Это связано с политиками безопасности, которые ограничивают монтирование файловых систем контейнерами.

Для нормальной работы Октопус необходимо перевести систему в режим permissive, при котором нарушения логируются, но не блокируются. Это безопасный вариант для стендов и внутренних серверов. Для проведения такой настройки необходимо выполнить следующую последовательность действий:

1. Выполнить перевод SELinux в permissive режим командой:

sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
getenforce 

2. Установть Docker в условия ограничений Red OS:

Ключ --nobest необходим для обхода конфликтов версий в репозиториях Red OS 8

sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin --nobest

3. Запустить Docker:

sudo systemctl enable --now docker
docker --version
docker compose version

Настройка прав доступа к Docker для пользователя Октопус

Supportet_env_01.png Docker группа должна быть создана с ID 102.

Для выполнения настройки прав доступа пользователя Октопус к Docker необходимо выполнить следующую последовательность действий:

1. Добавить пользователя Octopus в группу docker:

sudo usermod -aG docker octopus

2. Проверить id:

id octopus

Ожидаемый ответ: в списке появилась группа docker: groups=...,102(docker).

3. Выйти из SSH-сессии:

exit

4. Подключиться к серверу под пользователем octopus и проверить доступ к Docker без sudo:

docker ps

Ожидаемый ответ: Permission denied (команда выполняется без возникновения ошибок).

5. Вполнить вывод GID Docker-сокета

DOCKER_GID="$(stat -c '%g' /var/run/docker.sock)" echo "Для docker-compose.yml нужно использовать GID: $DOCKER_GID"

Ожидаемый ответ: Для docker-compose.yml нужно использовать GID: 102

6. Запомнить GID Docker-сокета - 102.

7. Добавить GID в docker-compose.yml

7.1. Перейти в каталог установки Октопус:

cd /home/octopus/octopus || exit 1

7.2. Повторно вывести нужный GID:

stat -c '%g' /var/run/docker.sock

7.3. Открыть yml файл:

vi docker-compose.yml

7.4. Найти сервис api:

... services:api: ...

Пример команды: services:api: image: registry.usetech.ru/octopus/octopus/octopus.api:${OCTOPUS_VERSION} group_add: -"102" volumes: -/var/run/docker.sock:/var/run/docker.sock

Правила по формированию команды поиска сервиса api:

  • group_add должен находиться внутри сервиса api;
  • group_add размещается на одном уровне с image, volumes и environment;
  • если group_add уже существует, второй блок добавлять нельзя;
  • в volumes должен присутствовать /var/run/docker.sock.

8. Проверить docker-compose.yml

docker compose config >/dev/null

Ожидаемый ответ: команда ничего не вывела и вернула управление в терминал, синтаксис корректен.

9. Проверить значение Compose, передаваемое сервису api:

docker compose config 
| sed -n '/^  api:/,/^  [a-zA-Z0-9_.-]*:/p' 
| grep -A3 group_add

Ожидаемый ответ: отображается нужное значение group_add- "102"/

10. Запустить Октопус

docker compose up -d

11. Проверить группу внутри контейнера API

11.1. Получить идентификатор контейнера:

API_ID="$(docker compose ps -q api)" echo "API container: $API_ID"

11.2. Проверить переданные группы:

docker inspect "$API_ID" --format 'Дополнительные группы API: {{json .HostConfig.GroupAdd}}'

Ожидаемый ответ: Дополнительные группы API: ["102"], значение должно совпадать с командой: stat -c '%g' /var/run/docker.sock

11.3. Дополнительно проаерить переданные группы из контейнера:

docker compose exec -T api sh -c ' echo "=== API USER AND GROUPS ===" id echo echo "=== DOCKER SOCKET ===" ls -ln /var/run/docker.sock echo if [ -r /var/run/docker.sock ] && [ -w /var/run/docker.sock ]; then echo "OK: api имеет доступ к Docker socket" else echo "ERROR: api не имеет доступа к Docker socket" exit 1 fi '

Ожидаемый результат: OK: api имеет доступ к Docker socket

Проверка автозапуска

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

1. Проверить, что после перезагрузки сервера сервисы автоматически стартуют самостоятельно:

sudo systemctl enable docker
sudo firewall-cmd --runtime-to-permanent >/dev/null 2>&1
sudo reboot

2. Выполить перезагрузку:

systemctl status --no-pager docker
docker ps
sudo firewall-cmd --list-ports
getenforce

Подготовка к установке Октопус

Для проведения подготовки к установке Октопус необходимо выполнить следующую последовательность действий:

1. Создать рабочую директорию:

sudo mkdir -p /home/octopus/octopus
sudo chown -R octopus:octopus /home/octopus
cd /home/octopus

2. Распаковать дистрибутив:

unzip octopus-update-1.30.35.zip

В результате разархивирования получена следующая структура каталогов: octopus.deployment, octopus.images

3. Выполнить переименование каталога octopus.deployment в Октопус:

mv octopus.deployment octopus

Ожидаемый ответ: получена следующая структура каталогов:

/home/octopus/
     ├── octopus/
     │    ├── docker-compose.yml
     │    ├── .env
     │    ├── scripts/
     │    ├── configs/
     │    └── ...
     └── octopus.images/

Импорт Docker-образов

Каталог octopus.images содержит предсобранные Docker-образы (*.tar), которые следует импортировать, до запуска docker-compose. Для выполнения импорта необходимо выполнить следующую последовательность действий:

1. Перейти в рабочую папку:

cd /home/octopus/octopus

2. Перейти в папку с техническими скриптами:

cd /home/octopus/octopus/scripts

3. Импортировать оффлайн образы:

./import-images.sh /home/octopus/octopus.images

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

[octopus@red-octopus scripts]$ ./import-images.sh /home/octopus/octopus.images
Importing image from /home/octopus/octopus.images/clickhouse_clickhouse-server_23.9.3.12-alpine.tar
Loaded image: clickhouse/clickhouse-server:23.9.3.12-alpine
Importing image from /home/octopus/octopus.images/grafana_grafana.tar
Loaded image: grafana/grafana:latest

4. Проверить загруженные образы:

docker images | grep -E 'octopus|keycloak|clickhouse|zookeeper|kafka' || true

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

octopus$ docker images | grep -E 'octopus|keycloak|clickhouse|zookeeper|kafka' || true
registry.usetech.ru/octopus/octopus/octopus.agent.veil                1.79.17            3ae526f51fa8   5 weeks ago     159MB
registry.usetech.ru/octopus/octopus/octopus.agent.redvirt             1.79.17            ecf689648913   5 weeks ago     159MB
registry.usetech.ru/octopus/octopus/octopus.agent.yandex.cloud.cost   1.79.17            98fd5a407e7e   5 weeks ago     172MB
registry.usetech.ru/octopus/octopus/octopus.agent.yandex.cloud        1.79.17            256b7b6ae797   5 weeks ago     172MB
registry.usetech.ru/octopus/octopus/octopus.agent.brest               1.79.17            bec4c7a8b51d   5 weeks ago     160MB
registry.usetech.ru/octopus/octopus/octopus.agent.zvirt               1.79.17            1af3f772864a   5 weeks ago     159MB
registry.usetech.ru/octopus/octopus/octopus.agent.zabbix              1.79.17            6a992d2d998d   5 weeks ago     158MB
registry.usetech.ru/octopus/octopus/octopus.agent.basis               1.79.17            f9985d91495c   5 weeks ago     159MB
registry.usetech.ru/octopus/octopus/octopus.analysis                  1.79.17            7dff80f7e3de   5 weeks ago     994MB
registry.usetech.ru/octopus/octopus/octopus.topology.worker           1.79.17            2680c561021c   5 weeks ago     190MB
registry.usetech.ru/octopus/octopus/octopus.api                       1.79.17            600ba0e49782   5 weeks ago     243MB
registry.usetech.ru/octopus/octopus/octopus.agent.dump                1.79.17            798e31c77039   5 weeks ago     158MB
registry.usetech.ru/octopus/octopus/octopus.agent.vmware.datastore    1.79.17            a7aea4a2c394   5 weeks ago     176MB
registry.usetech.ru/octopus/octopus/octopus.agent.vmware.vc           1.79.17            6ebba9d93239   5 weeks ago     176MB
registry.usetech.ru/octopus/octopus/octopus.agent.rosplatforma        1.79.17            88947b0a0b31   5 weeks ago     158MB
registry.usetech.ru/octopus/octopus/octopus.agent.hyperv              1.79.17            100fdb33301e   5 weeks ago     171MB
registry.usetech.ru/octopus/octopus/octopus.orchestrator              1.79.17            b6ba1690e5df   5 weeks ago     191MB
registry.usetech.ru/octopus/octopus/octopus.repository                1.79.17            c5315896b7f3   5 weeks ago     190MB
registry.usetech.ru/octopus/ui/octopus.ui                             1.134.16           0119a6b59c10   5 weeks ago     71.1MB
registry.usetech.ru/octopus/octopus/octopus-rsyslog                   1.1.2              06e56f42dbb8   3 months ago    9.9MB
registry.usetech.ru/octopus/octopus/octopus-keycloak                  1.1.0              96b54eb1d577   8 months ago    655MB
zookeeper                                                             3.9.3-jre-17       4af4d73f300f   21 months ago   313MB
clickhouse/clickhouse-server                                          23.9.3.12-alpine   25ff33be9c7f   2 years ago     960MB
octopus$

Запуск Октопус

Для выполнения запуска Октопус необходимо выполнить следующую последовательность действий:

1. Перейти в рабочую папку:

cd /home/octopus/octopus

2. Запустить стек:

docker compose down -v || true
docker compose up -d --pull never
docker compose ps

3. Приблизительно через 10 минут от старта запуска стека проверить успешность запуска стека командой:

docker ps -a --format 'table {{.Names}}\t{{.Status}}'

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

NAMES                     STATUS
agent.dump                Up 33 minutes
ui                        Up 45 minutes
agent.veil                Up 45 minutes
agent.brest               Up 45 minutes
agent.redvirt             Up 45 minutes
agent.zvirt               Up 45 minutes
agent.hyperv              Up 45 minutes
agent.zabbix              Up 45 minutes
agent.rosplatforma        Up 45 minutes
agent.vcenter.ds          Up 45 minutes
agent.yandex.cloud.cost   Up 45 minutes
agent.yandex.cloud        Up 45 minutes
agent.vcenter             Up 45 minutes
agent.basis               Up 45 minutes
api                       Up 33 minutes
orchestrator              Up 33 minutes
analysis                  Up 33 minutes
repository                Up 33 minutes
keycloak                  Up 45 minutes (healthy)
octopus.postgres          Up 46 minutes (healthy)
grafana                   Up 46 minutes
prometheus                Up 46 minutes
topology.worker           Up 33 minutes
zookeeper                 Up 46 minutes
octopus.clickhouse        Up 46 minutes (healthy)
pushgateway               Up 46 minutes
rsyslog                   Up 46 minutes
octopus-kafka             Up 46 minutes (healthy)

Критерии успешности запуска стека:

  • все контейнеры в статусе Up;
  • у четырёх контейнеров статус healthy.

4. Проверить состояние стека:

docker ps --format '{{.Names}}\t{{.Status}}'
docker compose logs --tail=60 --no-log-prefix | sed -n '1,200p'

5. Прописать стек в автозагрузку, убедиться, что все корректно:

sudo systemctl is-active docker
sudo usermod -aG docker octopus

Настройка автозагрузки

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

1. Создать systemd-сервис:

sudo tee /etc/systemd/system/octopus-stack.service >/dev/null <<'EOF'
[Unit]
Description=Octopus stack (Docker Compose)
After=docker.service network-online.target NetworkManager-wait-online.service
Wants=docker.service network-online.target
ConditionPathExists=/home/octopus/octopus/docker-compose.yml
[Service]
Type=oneshot
User=octopus
Group=octopus
WorkingDirectory=/home/octopus/octopus
Environment=PWD=/home/octopus/octopus
Environment=COMPOSE_PROJECT_NAME=octopus
ExecStartPre=/bin/bash -lc 'test -S /var/run/docker.sock'
ExecStartPre=/usr/bin/docker --version
ExecStartPre=/usr/bin/docker info
ExecStartPre=/usr/bin/docker compose version
ExecStartPre=/bin/bash -lc '/usr/bin/docker compose -p octopus config >/dev/null'
ExecStart=/usr/bin/docker compose -p octopus up -d --pull never
ExecStop=/usr/bin/docker compose -p octopus down --remove-orphans
RemainAfterExit=yes
TimeoutStartSec=900
TimeoutStopSec=120
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOF

2. Активировать изменения:

sudo systemctl daemon-reload
sudo systemctl enable --now octopus-stack
systemctl status --no-pager octopus-stack

3. Выполить перезагрузку:

sudo reboot

4. Спустя 10 минут после перезагрузки преверить веб-интерфейс:

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

  • веб-интерфейс открывается;
  • отображается окно для ввода имени пользователя и пароля;
  • выполняется корректный вход в Октопус с дефолтным логином и паролем.

5. Выполнить проверку статуса и работу контейнеров:

systemctl status --no-pager octopus-stack
docker ps --format '{{.Names}}\t{{.Status}}' | sort

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

[octopus@red-octopus vmware-tools-distrib]$ systemctl status --no-pager octopus-stack
docker ps --format '{{.Names}}\t{{.Status}}' | sort
● octopus-stack.service - Octopus stack (Docker Compose)
     Loaded: loaded (/etc/systemd/system/octopus-stack.service; enabled; preset: disabled)
    Drop-In: /usr/lib/systemd/system/service.d
             └─10-timeout-abort.conf
     Active: active (exited) since Fri 2025-11-07 13:15:14 MSK; 14min ago
   Main PID: 1306 (code=exited, status=0/SUCCESS)
        CPU: 2.825s

ноя 07 13:14:31 red-octopus docker[1322]:  Container agent.hyperv  Started
ноя 07 13:14:32 red-octopus docker[1322]:  Container agent.basis  Started
ноя 07 13:14:33 red-octopus docker[1322]:  Container agent.zabbix  Started
ноя 07 13:14:42 red-octopus docker[1322]:  Container agent.brest  Started
ноя 07 13:14:44 red-octopus docker[1322]:  Container agent.zvirt  Started
ноя 07 13:14:46 red-octopus docker[1322]:  Container agent.vcenter  Started
ноя 07 13:14:46 red-octopus docker[1322]:  Container api  Started
ноя 07 13:14:46 red-octopus docker[1322]:  Container ui  Starting
ноя 07 13:15:14 red-octopus docker[1322]:  Container ui  Started
ноя 07 13:15:14 red-octopus systemd[1]: Finished octopus-stack.service - Octopus stack (Docker Compose).
agent.basis    Up 15 minutes
agent.brest    Up 15 minutes
agent.hyperv    Up 15 minutes
agent.rosplatforma    Up 15 minutes
agent.vcenter    Up 15 minutes
agent.zabbix    Up 15 minutes
agent.zvirt    Up 15 minutes
analysis    Up 16 minutes
api    Up 15 minutes
grafana    Up 16 minutes
keycloak    Up 16 minutes
octopus.clickhouse    Up 16 minutes
octopus-kafka    Up 17 minutes
octopus.postgres    Up 16 minutes
orchestrator    Up 16 minutes
prometheus    Up 16 minutes
pushgateway    Up 16 minutes
repository    Up 16 minutes
rsyslog    Up 17 minutes
topology.worker    Up 16 minutes
ui    Up 14 minutes
zookeeper    Up 16 minutes