Index
Общий алгоритм создания пользователя Октопус:
- Создание пользователя Октопус.
- Выполнение базовой настройки операционной системы.
- Выполнение настройки сетевого экрана.
- Выполнение настройки сетевого форвардинга.
- Выполнение установки и настройки Docker CE.
- Выполнение настройки SELinux для работы Docker.
- Выполнение настройки прав доступа к Docker для пользователя Октопус.
- Проведение проверки автозапуска.
- Проведение подготовки к установке Октопус.
- Выполнение импорта Docker-образов.
- Проведение запуска Октопус.
- Выполнение настройки автозагрузки.
Подробное описание каждого этапа алгоритма приведено ниже.
Создание пользователя Октопус
Создание пользователя Октопус выполняется один раз от пользователя root.
В случае установки новой ОС, на этапе установки необходимо создать пользователя octopus/octopus.
![]() |
Пользователь Октопус обязательно должен быть с фиксированным 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.
![]() |
Не удалять и не переименовывать группу вслепую. |
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 свободен"
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&quot;\\ \\ if \\\̲[̲ &quot;&lt;/span&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.
![]() |
Значение 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 для пользователя Октопус
![]() |
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
