Skip to main content

Установка NetBox Docker на Ubuntu Server 24.04 VM в Proxmox VE

Итоговая инструкция с учетом проверенной установки, Docker 28.0.0, Portainer CE, backup, restart policy, первичного наполнения и лицензий.

1. Назначение документа

Документ описывает установку и первичную настройку NetBox на отдельной виртуальной машине Ubuntu Server 24.04, работающей на Proxmox VE. Установка выполняется в Docker, управление контейнерами может выполняться через Portainer CE.

Проверенная рабочая схема:

Ubuntu Server 24.04 Standard/Minimal на Proxmox VE
  ├── Docker Engine 28.0.0 из официального Docker APT repository
  ├── Docker Compose plugin
  ├── Portainer CE LTS → https://IP_VM:9443
  └── NetBox Docker   → http://IP_VM:8000

В ходе проверки было установлено:

Docker 27.5.1 — работает.
Docker 28.0.0 — работает.
Docker 28.1.1 и более новые версии в данной среде зависали на docker pull.
Docker 28.0.0 работает без /etc/docker/daemon.json.

Поэтому в инструкции фиксируется Docker Engine 28.0.0 из официального Docker APT repository. Это не сторонняя сборка и не неофициальная установка: Docker официально поддерживает установку конкретной версии пакета через version string.

Отдельный systemd unit для автозапуска NetBox-стека не создается. Для автоподъема контейнеров после перезагрузки VM используется restart: unless-stopped в Docker Compose.

2. Принятая IP-схема

2.1. Этап установки и обновления

IP VM:       192.168.1.70/24
Gateway:     192.168.1.1
NetBox:      http://192.168.1.70:8000
Portainer:   https://192.168.1.70:9443

2.2. Production-сеть

IP VM:       10.44.100.226/24
Gateway:     10.44.100.1
NetBox:      http://10.44.100.226:8000
Portainer:   https://10.44.100.226:9443

Reverse proxy / Nginx на первом этапе не используется, так как сервис работает в изолированной сети.

3. Параметры VM в Proxmox

Параметр Значение
OS Ubuntu Server 24.04
Вариант установки Standard или Minimal
CPU 2 vCPU минимум, лучше 4 vCPU
RAM 4 GB минимум, лучше 8 GB
Disk 60-100 GB
Disk controller VirtIO SCSI
Network VirtIO
QEMU Guest Agent Enabled
Backup VM включить в регламент Proxmox backup

NetBox ставится только в отдельную VM, не на сам Proxmox-хост.

4. QEMU Guest Agent

4.1. Включить агент в Proxmox

Сначала включить QEMU Guest Agent на уровне VM:

VM → Options → QEMU Guest Agent → Enabled

После включения лучше выполнить:

Shutdown VM → Start VM

а не просто Reboot, потому что virtio-канал агента часто появляется только после полного выключения и запуска VM.

4.2. Установить агент внутри Ubuntu

sudo apt update
sudo apt install -y qemu-guest-agent

Расшифровка:

sudo apt update

обновляет список доступных пакетов из репозиториев.

sudo apt install -y qemu-guest-agent

устанавливает гостевой агент QEMU. Ключ -y автоматически подтверждает установку.

4.3. Запустить и проверить агент

sudo systemctl start qemu-guest-agent

Проверить статус:

systemctl status qemu-guest-agent --no-pager

Проверить virtio-канал:

ls -l /dev/virtio-ports/ 2>/dev/null || true

Ожидаемый канал:

org.qemu.guest_agent.0

Пояснение команды:

ls -l /dev/virtio-ports/

показывает устройства virtio-каналов внутри VM.

2>/dev/null

скрывает сообщение об ошибке, если каталога еще нет.

|| true

не дает команде завершиться ошибкой, если каталог отсутствует.

Проверить тип unit:

systemctl is-enabled qemu-guest-agent

Если вывод:

static

это нормально. В этом случае unit не нужно обязательно включать через systemctl enable; достаточно, чтобы агент был установлен, VM имела включенный QEMU Guest Agent в Proxmox, а внутри Ubuntu существовал virtio-канал.

5. Проверка сетевого интерфейса

Обычно в Proxmox VM интерфейс называется:

ens18

Дальше в инструкции используется ens18. Если имя другое, в netplan нужно заменить ens18 на фактическое имя интерфейса.

Расшифровка:

ip

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

-br

brief, краткий вывод.

показывает сетевые интерфейсы канального уровня.

6. Настройка временного IP 192.168.1.70

Для универсальности используется tee, чтобы инструкция работала и на Minimal, где nano может отсутствовать.

6.1. Сделать резервную копию текущего netplan

sudo mkdir -p /root/netplan-backup
sudo cp /etc/netplan/*.yaml /root/netplan-backup/ 2>/dev/null || true
sudo ls -l /root/netplan-backup/

Расшифровка:

sudo mkdir -p /root/netplan-backup

создает каталог для резервной копии. Ключ -p не вызывает ошибку, если каталог уже существует.

sudo cp /etc/netplan/*.yaml /root/netplan-backup/ 2>/dev/null || true

копирует все YAML-файлы netplan. Если файлов нет, ошибка скрывается и команда не прерывает выполнение.

6.2. Удалить старые netplan-файлы

sudo rm -f /etc/netplan/*.yaml

Расшифровка:

rm -f

удаляет файлы без запроса подтверждения и не ругается, если файл не найден.

Это нужно, чтобы старые netplan-конфигурации не конфликтовали с новой.

6.3. Создать новый netplan-файл

sudo tee /etc/netplan/01-netbox-static.yaml > /dev/null <<'EOF'
network:
  version: 2
  renderer: networkd
  ethernets:
    ens18:
      dhcp4: false
      dhcp6: false
      accept-ra: false
      link-local: []
      optional: true
      addresses:
        - 192.168.1.70/24
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
        addresses:
          - 192.168.1.1
          - 8.8.8.8
EOF

Расшифровка конструкции:

sudo tee /etc/netplan/01-netbox-static.yaml

записывает текст в файл с правами root.

> /dev/null

не выводит записываемый текст на экран.

<<'EOF'
...
EOF

это heredoc - многострочная вставка текста в команду. Кавычки в <<'EOF' означают, что переменные внутри текста не будут подставляться оболочкой.

Расшифровка netplan:

dhcp4: false

отключает получение IPv4-адреса по DHCP.

dhcp6: false
accept-ra: false
link-local: []

отключают IPv6-автонастройку на интерфейсе.

optional: true

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

addresses:
  - 192.168.1.70/24

задает статический IP-адрес.

routes:
  - to: default
    via: 192.168.1.1

задает шлюз по умолчанию.

nameservers:
  addresses:
    - 192.168.1.1
    - 8.8.8.8

задает DNS-серверы.

6.4. Проверить и применить netplan

sudo chmod 600 /etc/netplan/01-netbox-static.yaml
sudo cat /etc/netplan/01-netbox-static.yaml
sudo netplan generate
sudo netplan try

Расшифровка:

chmod 600

разрешает читать и изменять файл только владельцу root.

netplan generate

проверяет синтаксис и генерирует конфигурацию для backend-сервиса.

netplan try

применяет конфигурацию временно. Если не подтвердить применение, netplan откатит изменения.

Если работа идет через консоль Proxmox, можно применить сразу:

sudo netplan apply

Проверить сеть:

ip -br addr
ip route
resolvectl status
ping -c 4 192.168.1.1
ping -c 4 8.8.8.8

Расшифровка:

ip -br addr

показывает IP-адреса интерфейсов.

ip route

показывает таблицу маршрутизации.

resolvectl status

показывает DNS-настройки.

ping -c 4

отправляет 4 ICMP-пакета.

Проверить IPv6:

ip -6 addr

На ens18 не должно быть inet6 fe80::.... Наличие ::1/128 на lo допустимо.

7. Базовые пакеты Ubuntu

Этот блок безопасен и для Standard, и для Minimal. Если часть пакетов уже установлена, apt просто пропустит их или обновит.

sudo apt update
sudo apt upgrade -y

sudo apt install -y \
  ca-certificates \
  curl \
  gnupg \
  git \
  nano \
  openssl \
  iputils-ping \
  tcpdump \
  arping \
  bash-completion \
  lsof \
  qemu-guest-agent \
  systemd-timesyncd \
  ufw

Расшифровка пакетов:

ca-certificates     — корневые сертификаты для HTTPS
curl                — загрузка файлов и HTTP-проверки
gnupg               — работа с GPG-ключами репозиториев
git                 — клонирование netbox-docker
nano                — текстовый редактор
openssl             — генерация паролей/ключей
iputils-ping        — ping
tcpdump             — анализ сетевого трафика
arping              — L2-проверка доступности устройств
bash-completion     — автодополнение команд по Tab
lsof                — просмотр открытых файлов/портов
qemu-guest-agent    — интеграция VM с Proxmox
systemd-timesyncd   — синхронизация времени
ufw                 — простой firewall

Расшифровка обратного слеша \:

\

в конце строки означает продолжение команды на следующей строке. Это делает длинную команду читаемой.

8. Hostname

sudo hostnamectl set-hostname netbox
hostnamectl

Расшифровка:

hostnamectl set-hostname netbox

задает имя сервера.

hostnamectl

показывает текущее имя и сведения о системе.

9. Bash completion

Открыть .bashrc:

nano ~/.bashrc

В конец файла добавить:

# Подключаем bash-completion, если он установлен
[[ $PS1 && ! ${BASH_COMPLETION_VERSINFO:-} && -f /usr/share/bash-completion/bash_completion ]] && \
    . /usr/share/bash-completion/bash_completion

Применить:

source ~/.bashrc

Расшифровка:

~/.bashrc

личный конфигурационный файл shell для текущего пользователя.

source ~/.bashrc

перечитывает .bashrc без выхода из текущей сессии.

10. Время, NTP и RTC

Проверить текущее состояние:

timedatectl status
date

Задать часовой пояс:

sudo timedatectl set-timezone Europe/Samara
timedatectl status
date

Для Linux-серверов аппаратные часы лучше хранить в UTC:

sudo timedatectl set-local-rtc 0
timedatectl status

Ожидаемо:

RTC in local TZ: no

Настроить NTP:

sudo nano /etc/systemd/timesyncd.conf

Для временной сети:

[Time]
NTP=192.168.1.1 0.pool.ntp.org 1.pool.ntp.org
FallbackNTP=2.pool.ntp.org 3.pool.ntp.org

Применить:

sudo systemctl restart systemd-timesyncd
sudo timedatectl set-ntp true

timedatectl status
systemctl status systemd-timesyncd --no-pager

После перехода в production можно заменить NTP на внутренний источник времени:

[Time]
NTP=10.44.100.1
FallbackNTP=

Только если 10.44.100.1 действительно является NTP-сервером.

11. Отключение IPv6

На уровне netplan IPv6 уже отключен параметрами:

dhcp6: false
accept-ra: false
link-local: []

Дополнительно можно отключить IPv6 на уровне ядра:

sudo tee /etc/sysctl.d/99-disable-ipv6.conf > /dev/null <<'EOF'
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
EOF

sudo sysctl --system

Расшифровка:

/etc/sysctl.d/99-disable-ipv6.conf

файл постоянных параметров ядра.

sysctl --system

перечитывает все sysctl-настройки из системных каталогов.

Проверить:

sysctl net.ipv6.conf.all.disable_ipv6
sysctl net.ipv6.conf.default.disable_ipv6
sysctl net.ipv6.conf.lo.disable_ipv6
ip -6 addr

12. Настройка vm.overcommit_memory для Valkey/Redis

NetBox Docker использует Valkey/Redis. При первом запуске Valkey может предупреждать:

WARNING Memory overcommit must be enabled!

Это предупреждение связано с тем, что Redis/Valkey при фоновых сохранениях может делать fork(), и без memory overcommit ядро Linux иногда может отказать в выделении памяти для такого процесса.

Добавить параметр:

sudo tee /etc/sysctl.d/99-netbox-valkey.conf > /dev/null <<'EOF'
vm.overcommit_memory = 1
EOF

sudo sysctl --system

Проверить:

sysctl vm.overcommit_memory

Ожидаемо:

vm.overcommit_memory = 1

13. Установка Docker Engine 28.0.0

Docker ставится из официального Docker APT-репозитория, но не последняя версия, а проверенная рабочая 28.0.0. NetBox Docker требует Docker не ниже 20.10.10, containerd не ниже 1.5.6 и docker-compose не ниже 1.28.0, поэтому Docker 28.0.0 подходит под требования проекта.

13.1. Удалить возможные конфликтующие пакеты

sudo apt remove -y \
  docker.io \
  docker-compose \
  docker-compose-v2 \
  docker-doc \
  podman-docker \
  containerd \
  runc || true

Расшифровка:

docker.io

пакет Docker из репозиториев Ubuntu, не из официального Docker-репозитория.

docker-compose / docker-compose-v2

старые или альтернативные compose-пакеты.

containerd / runc

низкоуровневые компоненты контейнерного runtime. Docker CE ставит совместимые версии через containerd.io.

|| true

не прерывает выполнение, если каких-то пакетов нет.

13.2. Добавить официальный Docker APT repository

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

sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update

Расшифровка:

install -m 0755 -d /etc/apt/keyrings

создает каталог /etc/apt/keyrings с правами 0755.

curl -fsSL ... -o /etc/apt/keyrings/docker.asc

скачивает GPG-ключ Docker.

Ключи curl:

-f  — завершиться ошибкой при HTTP-ошибке
-s  — тихий режим
-S  — показывать ошибку, если она есть
-L  — переходить по redirect
-o  — записать результат в файл
chmod a+r

разрешает всем пользователям читать ключ, чтобы APT мог его использовать.

$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")

подставляет кодовое имя Ubuntu, например noble.

$(dpkg --print-architecture)

подставляет архитектуру, например amd64.

13.3. Проверить наличие версии 28.0.0

apt-cache madison docker-ce | grep '5:28\.0\.0'
apt-cache madison docker-ce-cli | grep '5:28\.0\.0'

Расшифровка:

apt-cache madison

показывает доступные версии пакета из подключенных репозиториев.

grep '5:28\.0\.0'

оставляет только строки с версией 28.0.0.

Ожидаемо:

5:28.0.0-1~ubuntu.24.04~noble

13.4. Установить Docker 28.0.0

DOCKER_VERSION="5:28.0.0-1~ubuntu.24.04~noble"

sudo apt install -y --allow-downgrades \
  docker-ce="$DOCKER_VERSION" \
  docker-ce-cli="$DOCKER_VERSION" \
  containerd.io \
  docker-buildx-plugin \
  docker-compose-plugin

Расшифровка:

DOCKER_VERSION="..."

локальная переменная shell с выбранной версией Docker.

--allow-downgrades

разрешает установить более старую версию, если в репозитории доступна более новая.

docker-ce

Docker Engine.

docker-ce-cli

клиентская утилита docker.

containerd.io

контейнерный runtime, используемый Docker.

docker-buildx-plugin

плагин расширенной сборки образов.

docker-compose-plugin

плагин docker compose.

13.5. Docker daemon JSON не создаем

Файл:

/etc/docker/daemon.json

не создается. Docker 28.0.0 в данной конфигурации работает корректно со штатными параметрами.

Проверить:

cat /etc/docker/daemon.json 2>/dev/null || echo "daemon.json отсутствует — используется штатная конфигурация Docker"

13.6. Запустить Docker

sudo systemctl enable --now containerd
sudo systemctl enable --now docker.socket
sudo systemctl enable --now docker

Расшифровка:

systemctl enable

включает автозапуск сервиса при загрузке.

--now

сразу запускает сервис, не дожидаясь перезагрузки.

docker.socket

socket-активация Docker. Если сокет активен, Docker может стартовать при обращении к /run/docker.sock.

Проверить:

docker --version
docker compose version
docker info | grep -E "Server Version|Storage Driver"
systemctl show docker --property=Environment

Ожидаемо:

Docker version 28.0.0
Server Version: 28.0.0
Environment=

13.7. Проверить скачивание образов

docker pull hello-world:latest
docker run --rm hello-world:latest

docker pull alpine:latest
docker run --rm alpine:latest cat /etc/os-release

docker pull busybox:latest
docker run --rm busybox:latest echo "busybox works"

Расшифровка:

docker pull

скачивает образ.

docker run --rm

запускает контейнер и удаляет его после завершения.

cat /etc/os-release

показывает информацию об ОС внутри контейнера.

13.8. Зафиксировать Docker 28.0.0

sudo apt-mark hold docker-ce docker-ce-cli

Расшифровка:

apt-mark hold

запрещает автоматическое обновление выбранных пакетов при apt upgrade.

Проверить:

apt-mark showhold

Ожидаемо:

docker-ce
docker-ce-cli

14. Установка Portainer CE LTS

Portainer CE устанавливается как Docker-контейнер. UI-порт Portainer - 9443. Порт 8000 у Portainer - Edge tunnel port; он нужен только для Edge Agent / Edge Compute, поэтому в данной схеме он не публикуется.

14.1. Создать каталог Portainer

sudo mkdir -p /opt/portainer
sudo chown -R $USER:$USER /opt/portainer
cd /opt/portainer

Расшифровка:

/opt/portainer

каталог для compose-файла Portainer.

chown -R $USER:$USER

назначает текущего пользователя владельцем каталога, чтобы не редактировать compose-файлы через sudo.

14.2. Создать .env

cat > .env <<'EOF'
PORTAINER_BIND_IP=192.168.1.70
PORTAINER_HTTPS_PORT=9443
PORTAINER_IMAGE=portainer/portainer-ce:lts
EOF

Расшифровка:

.env

файл переменных Docker Compose.

PORTAINER_BIND_IP

IP, на котором будет опубликован Portainer.

PORTAINER_HTTPS_PORT

внешний HTTPS-порт Portainer.

PORTAINER_IMAGE

образ Portainer.

14.3. Создать docker-compose.yml

nano docker-compose.yml

Вставить:

services:
  portainer:
    container_name: portainer
    image: ${PORTAINER_IMAGE}
    restart: unless-stopped
    ports:
      - "${PORTAINER_BIND_IP}:${PORTAINER_HTTPS_PORT}:9443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - portainer_data:/data

volumes:
  portainer_data:
    name: portainer_data

networks:
  default:
    name: portainer_network

Расшифровка compose-файла:

services

список контейнеров, которые запускает Docker Compose.

container_name: portainer

фиксированное имя контейнера.

image: ${PORTAINER_IMAGE}

образ берется из .env.

restart: unless-stopped

контейнер автоматически поднимется после перезагрузки VM или Docker daemon, но не будет автоматически стартовать после ручной остановки администратором.

ports:
  - "192.168.1.70:9443:9443"

публикует порт контейнера наружу. Формат:

IP_ХОСТА:ПОРТ_ХОСТА:ПОРТ_КОНТЕЙНЕРА
/var/run/docker.sock:/var/run/docker.sock

дает Portainer доступ к Docker daemon хоста. Это высокий уровень доступа, фактически возможность управлять контейнерами на сервере.

portainer_data:/data

именованный volume для данных Portainer.

14.4. Запуск Portainer

docker compose up -d
docker ps

Проверить:

curl -k -I https://192.168.1.70:9443

Расшифровка:

-k

игнорирует предупреждение о самоподписанном сертификате.

-I

запрашивает только HTTP-заголовки.

Открыть:

https://192.168.1.70:9443

При первом входе создать администратора Portainer.

15. Установка NetBox Docker

NetBox Docker - community-maintained Docker-сборка NetBox. Для нее достаточно Docker и Docker Compose подходящих версий; Docker 28.0.0 подходит.

15.1. Клонировать репозиторий

cd /opt

sudo git clone -b release https://github.com/netbox-community/netbox-docker.git

sudo chown -R $USER:$USER /opt/netbox-docker

cd /opt/netbox-docker

Расшифровка:

git clone -b release

клонирует ветку release.

/opt/netbox-docker

рабочий каталог NetBox Docker.

15.2. Создать .env для Docker Compose

cat > .env <<'EOF'
NETBOX_BIND_IP=192.168.1.70
NETBOX_EXTERNAL_PORT=8000
EOF

Расшифровка:

NETBOX_BIND_IP

IP, на котором публикуется NetBox.

NETBOX_EXTERNAL_PORT

внешний порт NetBox.

15.3. Создать docker-compose.override.yml

cat > docker-compose.override.yml <<'EOF'
services:
  netbox:
    restart: unless-stopped
    ports:
      - "${NETBOX_BIND_IP}:${NETBOX_EXTERNAL_PORT}:8080"

  netbox-worker:
    restart: unless-stopped

  postgres:
    restart: unless-stopped

  redis:
    restart: unless-stopped

  redis-cache:
    restart: unless-stopped
EOF

Расшифровка:

docker-compose.override.yml

дополнительный compose-файл, который переопределяет или дополняет основной docker-compose.yml.

192.168.1.70:8000:8080

означает:

192.168.1.70:8000 → внешний адрес VM
8080               → внутренний порт NetBox-контейнера
restart: unless-stopped

обеспечивает автоматический подъем контейнеров после перезагрузки VM или Docker daemon. Если администратор специально остановил стек через docker compose stop, Docker не будет сам его поднимать до явной команды docker compose up -d.

Именно этот параметр был добавлен после проверки рестарта VM: логи показали штатное завершение NetBox, PostgreSQL и Valkey при выключении, но контейнеры не поднялись автоматически, потому что restart policy не была задана.

Проверить файлы:

cat .env
cat docker-compose.override.yml

16. Ручная настройка секретов NetBox

До первого запуска NetBox нужно задать пароли и SECRET_KEY.

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

A-Z a-z 0-9

SECRET_KEY обязательно должен быть не короче 50 символов.

16.1. PostgreSQL

cd /opt/netbox-docker
nano env/postgres.env

Задать:

POSTGRES_PASSWORD=MyVeryStrongPostgresPassword1234567890

Открыть основной env-файл NetBox:

nano env/netbox.env

Задать такой же пароль:

DB_PASSWORD=MyVeryStrongPostgresPassword1234567890

Важно:

POSTGRES_PASSWORD в env/postgres.env
должен совпадать с
DB_PASSWORD в env/netbox.env

После первого запуска менять пароль БД без пересоздания БД нельзя: PostgreSQL volume уже будет создан с первоначальным паролем.

16.2. Redis

nano env/redis.env

Задать:

REDIS_PASSWORD=MyVeryStrongRedisPassword1234567890

В env/netbox.env задать такой же пароль:

REDIS_PASSWORD=MyVeryStrongRedisPassword1234567890

16.3. Redis cache

nano env/redis-cache.env

Задать:

REDIS_PASSWORD=MyVeryStrongRedisCachePassword1234567890

В env/netbox.env задать такой же пароль cache Redis:

REDIS_CACHE_PASSWORD=MyVeryStrongRedisCachePassword1234567890

16.4. SECRET_KEY и базовые параметры NetBox

В env/netbox.env найти или добавить:

SECRET_KEY=MyVeryLongNetBoxSecretKey2026ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890
ALLOWED_HOSTS=192.168.1.70 localhost 127.0.0.1
CSRF_TRUSTED_ORIGINS=http://192.168.1.70:8000
TIME_ZONE=Europe/Samara
PREFER_IPV4=True

Расшифровка:

SECRET_KEY

секретный ключ Django/NetBox. Должен быть уникальным для установки и не короче 50 символов.

ALLOWED_HOSTS

список адресов/имен, через которые разрешено открывать NetBox.

CSRF_TRUSTED_ORIGINS

доверенные origin-адреса для защиты от CSRF.

TIME_ZONE

часовой пояс NetBox.

PREFER_IPV4=True

предпочитать IPv4.

Проверить:

grep -E "DB_PASSWORD|REDIS_PASSWORD|REDIS_CACHE_PASSWORD|SECRET_KEY|ALLOWED_HOSTS|CSRF_TRUSTED_ORIGINS|TIME_ZONE|PREFER_IPV4" env/netbox.env

grep -E "POSTGRES_PASSWORD" env/postgres.env

grep -E "REDIS_PASSWORD" env/redis.env

grep -E "REDIS_PASSWORD" env/redis-cache.env

Проверить длину SECRET_KEY:

grep '^SECRET_KEY=' env/netbox.env | cut -d= -f2- | wc -c

Должно быть больше 50.

Сохранить копию секретов:

sudo mkdir -p /root/netbox-secrets
sudo chmod 700 /root/netbox-secrets

sudo nano /root/netbox-secrets/netbox-secrets.txt

Внести реальные значения:

POSTGRES_PASSWORD=...
REDIS_PASSWORD=...
REDIS_CACHE_PASSWORD=...
SECRET_KEY=...

Ограничить права:

sudo chmod 600 /root/netbox-secrets/netbox-secrets.txt

Расшифровка:

chmod 700 /root/netbox-secrets

только root может читать, писать и заходить в каталог.

chmod 600 netbox-secrets.txt

только root может читать и писать файл.

17. Запуск NetBox

cd /opt/netbox-docker

docker compose pull

docker compose up -d

docker compose ps

Расшифровка:

docker compose pull

скачивает все образы, указанные в compose-файлах.

docker compose up -d

создает и запускает весь стек в фоновом режиме.

docker compose ps

показывает состояние контейнеров.

Первый запуск может занять несколько минут. Во время миграций контейнер netbox может временно быть unhealthy; это нормально, пока идут миграции.

Смотреть логи:

docker compose logs -f netbox

Расшифровка:

logs

показывает логи контейнера.

-f

follow, показывает новые строки в реальном времени.

Нормальные признаки успешной инициализации:

✅ Initialisation is done.
[INFO] Starting granian
[INFO] Listening at: http://:::8080
[INFO] Started worker-1

Поднять весь стек, если запускался только netbox:

docker compose up -d
docker compose ps

Ожидаемое состояние:

netbox          healthy
netbox-worker   healthy
postgres        healthy
redis           healthy
redis-cache     healthy

18. Проверка веб-интерфейса NetBox

curl -I http://192.168.1.70:8000

Открыть в браузере:

http://192.168.1.70:8000

19. Создание администратора NetBox

cd /opt/netbox-docker

docker compose exec netbox /opt/netbox/netbox/manage.py createsuperuser

Расшифровка:

docker compose exec netbox

выполняет команду внутри уже запущенного контейнера netbox.

/opt/netbox/netbox/manage.py createsuperuser

Django-команда создания администратора.

Ввести:

Username: admin
Email address: admin@example.local
Password: надежный пароль
Password again: повтор пароля

Проверить версию NetBox:

docker compose exec netbox /opt/netbox/netbox/manage.py version

Если ранее добавлялся диагностический параметр DB_WAIT_DEBUG=1, убрать его:

sed -i '/^DB_WAIT_DEBUG=/d' env/netbox.env

docker compose up -d
docker compose ps

Расшифровка:

sed -i

редактирует файл на месте.

/^DB_WAIT_DEBUG=/d

удаляет строку, начинающуюся с DB_WAIT_DEBUG=.

20. Первичное наполнение NetBox: готовые шаблоны устройств

После установки NetBox не нужно вручную создавать каждый тип коммутатора, точки доступа или промышленного устройства. Для типовых моделей оборудования можно использовать готовые шаблоны Device Type.

Основной источник - NetBox Community Device Type Library. Это публичная библиотека YAML-описаний моделей оборудования, сгруппированная по производителям. Каждый YAML-файл описывает конкретную модель устройства: производителя, модель, высоту, интерфейсы, console-порты, power-порты и другие аппаратные компоненты.

Важно различать:

Device Type  — шаблон модели оборудования.
Device       — конкретное физическое устройство.
Interface    — порт конкретного физического устройства.
IP Address   — IP-адрес, назначенный интерфейсу.
Cable        — физическая связь между портами.

Готовая библиотека помогает создать именно Device Type, но не создает реальные устройства предприятия. Например, YAML-шаблон для Cisco Catalyst может создать модель с набором портов GigabitEthernet, uplink-портами, console-port и power-port, но не создаст конкретный коммутатор SMR-SW-OT-01, его serial number, management IP и кабельные подключения.

20.1. Что импортировать для нашей инфраструктуры

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

Рекомендуемый подход:

1. Импортировать только нужных производителей.
2. Проверить наличие конкретных моделей.
3. Сверить шаблоны с фактическим оборудованием и datasheet.
4. Только после этого создавать реальные устройства.

В первую очередь интересны:

Cisco:
  Catalyst C3750
  Catalyst C3750v2
  Catalyst C3750-X
  Catalyst C9200
  WLC 2504
  точки доступа Cisco

Moxa:
  промышленные коммутаторы EDS / IKS
  NPort
  ioLogik
  другие фактические модели по месту

Дополнительно при необходимости:
  HPE / HP — серверы
  APC / Eaton / Schneider — ИБП и электропитание

20.2. Рекомендуемая последовательность первичного наполнения

Перед импортом реальных устройств желательно создать базовые справочники:

1. Sites — площадки / филиалы / заводы.
2. Locations — зоны, здания, этажи, помещения.
3. Racks — шкафы / стойки.
4. Manufacturers — производители.
5. Device Roles — роли устройств.
6. Platforms — платформы, например Cisco IOS, Cisco IOS-XE, Moxa.
7. Device Types — модели оборудования.
8. Devices — конкретные устройства.
9. Interfaces / IP / VLAN / Cables — порты, адресация, VLAN и физические связи.

Рекомендуемые роли устройств для начала:

Core Switch
Distribution Switch
Access Switch
Industrial Switch
Wireless Controller
Wireless AP
Firewall
Server
UPS
PLC / Controller
Media Converter

20.3. Импорт Device Types вручную через Web UI

Этот вариант удобен для пилота и проверки 1-5 моделей.

Порядок действий:

1. Открыть библиотеку:
   https://github.com/netbox-community/devicetype-library

2. Найти нужного производителя:
   device-types/Cisco/
   device-types/Moxa/

3. Найти YAML-файл нужной модели.

4. В NetBox открыть:
   Devices → Device Types → Import

5. Вставить содержимое YAML-файла или загрузить файл.

6. Выполнить импорт.

7. Проверить созданный Device Type:
   Devices → Device Types → нужная модель.

8. Проверить, что у модели появились interface templates,
   console port templates, power port templates и другие компоненты.

20.4. Массовый импорт через Device-Type-Library-Import

Для массового импорта есть community-скрипт Device-Type-Library-Import. Использовать его нужно аккуратно и не импортировать всех производителей сразу.

Создать API token в NetBox:

Профиль пользователя → API Tokens → Add a token

Для импорта нужен токен пользователя с правами на создание:

Manufacturers
Device Types
Interface Templates
Console Port Templates
Power Port Templates

Для пилота можно временно использовать token администратора, но в production лучше создать отдельного service-user, например:

svc-netbox-import

Подготовка окружения:

sudo apt install -y python3-venv python3-pip git

cd /opt
sudo git clone https://github.com/netbox-community/Device-Type-Library-Import.git
sudo chown -R $USER:$USER /opt/Device-Type-Library-Import
cd /opt/Device-Type-Library-Import

python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt

Расшифровка:

python3 -m venv venv

создает изолированное Python-окружение в каталоге venv.

source venv/bin/activate

активирует это окружение. После активации pip ставит пакеты внутрь venv, а не глобально в систему.

pip install -r requirements.txt

устанавливает зависимости импортера.

Настройка импортера:

cp .env.example .env
nano .env

Пример параметров:

NETBOX_URL=http://192.168.1.70:8000
NETBOX_TOKEN=<API_TOKEN>

Если в .env.example используются другие имена переменных, оставить именно те имена, которые ожидает текущая версия импортера. Перед запуском обязательно посмотреть README импортера, так как параметры могут меняться.

Посмотреть справку:

python3 ./nb-dt-import.py --help

Или проверить фактическое имя основного скрипта:

ls -l

Пример импорта только нужных производителей:

python3 ./nb-dt-import.py --vendors Cisco,Moxa

Если скрипт в текущей версии называется иначе, использовать фактическое имя из каталога проекта и пример из README.

Принципиально важно:

Не импортировать всю библиотеку без необходимости.
Сначала импортировать Cisco и Moxa.
Затем проверить качество шаблонов.
Только после этого расширять список производителей.

20.5. Нюанс по Cisco Stack

Для стеков Cisco Catalyst лучше не создавать один абстрактный “коммутатор-стек” без детализации. Правильнее использовать механизм Virtual Chassis.

Рекомендуемая модель:

Virtual Chassis:
  SMR-SW-OT-STACK-01

Members:
  SMR-SW-OT-STACK-01-1
  SMR-SW-OT-STACK-01-2
  SMR-SW-OT-STACK-01-3

Преимущества:

1. У каждого физического члена стека свой serial number.
2. Можно учитывать состояние каждого члена.
3. Можно корректно вести порты.
4. Можно документировать кабельные подключения.
5. Удобнее расследовать аварии и планировать замену оборудования.

20.6. Нюанс по Cisco AP

Для точек доступа обычно достаточно:

Device Role: Wireless AP
Manufacturer: Cisco
Device Type: конкретная модель AP
Site / Location
Management IP
Interface: Ethernet0 / GigabitEthernet0
Cable: подключение к switch port

Если AP питается по PoE, отдельную цепь питания можно не моделировать на первом этапе. Достаточно физической связи:

Switch interface → Cable → AP Ethernet interface

20.7. Нюанс по Moxa

У Moxa часто важна точная аппаратная модификация:

количество медных портов;
наличие SFP;
SC / ST / LC оптика;
одно или два питания;
индекс модели;
температурное исполнение;
PoE / non-PoE.

Поэтому для Moxa готовый Device Type обязательно сверять с:

1. маркировкой на корпусе;
2. datasheet;
3. фактическим количеством портов;
4. типом оптических интерфейсов;
5. схемой питания.

Если точной модели нет в библиотеке, лучше создать собственный YAML-шаблон по datasheet, чем использовать “похожий” шаблон.

20.8. Чего готовые шаблоны не заполняют

Device Type Library не создаст:

имена устройств;
серийные номера;
инвентарные номера;
management IP;
VLAN;
VRF;
описания портов;
фактические MAC-адреса;
кабельные соединения;
расположение в шкафах;
CDP/LLDP-соседства;
связи коммутатор-порт-клиент.

Это нужно вносить отдельно:

вручную через Web UI;
через CSV import;
через REST API;
через скрипты;
через интеграции и инвентаризацию.

20.9. Рекомендуемый пилот

Перед массовым наполнением NetBox выполнить пилот:

1. Импортировать Device Type для Cisco C9200.
2. Создать один реальный коммутатор Cisco C9200.
3. Проверить созданные интерфейсы.
4. Создать один Cisco AP.
5. Подключить AP кабелем к порту коммутатора.
6. Импортировать или создать один Moxa.
7. Проверить, удобно ли отображается промышленный коммутатор.
8. Создать один VLAN и один management IP.
9. Проверить отображение связей.
10. Только после этого масштабировать подход на остальные устройства.

21. Проверка Portainer и NetBox

ss -tulpn | grep -E ':8000|:9443'

Расшифровка:

ss

показывает сетевые соединения и слушающие порты.

-tulpn

t TCP, u UDP, l listening, p process, n numeric.

grep -E ':8000|:9443'

фильтрует вывод по портам 8000 и 9443.

Ожидаемо:

192.168.1.70:8000  → NetBox
192.168.1.70:9443  → Portainer

Проверить Docker:

docker ps

Проверить сервисы:

curl -I http://192.168.1.70:8000
curl -k -I https://192.168.1.70:9443

22. Проверка restart policy после рестарта VM

После перезагрузки VM контейнеры NetBox должны подняться автоматически за счет restart: unless-stopped.

Проверить restart policy:

cd /opt/netbox-docker

docker inspect -f '{{.Name}}  restart={{.HostConfig.RestartPolicy.Name}}' $(docker compose ps -q)

Ожидаемо:

/netbox-docker-netbox-1          restart=unless-stopped
/netbox-docker-netbox-worker-1   restart=unless-stopped
/netbox-docker-postgres-1        restart=unless-stopped
/netbox-docker-redis-1           restart=unless-stopped
/netbox-docker-redis-cache-1     restart=unless-stopped

Контрольный тест:

sudo reboot

После загрузки VM:

cd /opt/netbox-docker
docker compose ps
curl -I http://192.168.1.70:8000

cd /opt/portainer
docker compose ps
curl -k -I https://192.168.1.70:9443

Ожидаемо контейнеры должны быть Up / healthy без ручного docker compose up -d.

23. Firewall на этапе установки

Docker-публикация портов может обходить обычные правила ufw, поэтому основная защита - изолированная сеть, ACL/маршрутизация и привязка портов к конкретному IP. ufw оставляем как дополнительный уровень.

sudo ufw default deny incoming
sudo ufw default allow outgoing

sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp
sudo ufw allow from 192.168.1.0/24 to any port 8000 proto tcp
sudo ufw allow from 192.168.1.0/24 to any port 9443 proto tcp

sudo ufw enable

sudo ufw status verbose

Расшифровка:

ufw default deny incoming

запрещает входящие соединения по умолчанию.

ufw default allow outgoing

разрешает исходящие соединения.

ufw allow from 192.168.1.0/24 to any port 22 proto tcp

разрешает SSH из указанной подсети.

ufw status verbose

показывает активные правила подробно.

24. Backup NetBox

Нужно бэкапить:

1. PostgreSQL-базу NetBox
2. media/reports/scripts
3. /opt/netbox-docker
4. /root/netbox-secrets

24.1. Создать каталог backup

sudo mkdir -p /var/backups/netbox
sudo chmod 700 /var/backups/netbox

Расшифровка:

/var/backups/netbox

каталог для backup-файлов.

chmod 700

доступ только для root.

24.2. Создать backup-скрипт

sudo tee /usr/local/sbin/netbox-backup.sh > /dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

BACKUP_DIR="/var/backups/netbox"
NETBOX_DIR="/opt/netbox-docker"
DATE="$(date +%F_%H-%M-%S)"
KEEP_DAYS=30

mkdir -p "$BACKUP_DIR"
chmod 700 "$BACKUP_DIR"

cd "$NETBOX_DIR"

echo "[$(date)] Starting NetBox backup..."

# Backup PostgreSQL database
docker compose exec -T postgres pg_dump -U netbox -d netbox | gzip > "${BACKUP_DIR}/netbox_db_${DATE}.sql.gz"

# Backup NetBox media/reports/scripts
docker compose exec -T netbox tar -czf - -C /opt/netbox/netbox media reports scripts > "${BACKUP_DIR}/netbox_files_${DATE}.tar.gz"

# Backup configuration and secrets
tar -czf "${BACKUP_DIR}/netbox_config_${DATE}.tar.gz" \
  /opt/netbox-docker \
  /root/netbox-secrets 2>/dev/null || true

# Delete old backups
find "$BACKUP_DIR" -type f -name "netbox_*" -mtime +"$KEEP_DAYS" -delete

echo "[$(date)] NetBox backup completed."
EOF

sudo chmod +x /usr/local/sbin/netbox-backup.sh

24.3. Расшифровка backup-скрипта

#!/usr/bin/env bash

указывает, что скрипт должен выполняться через bash.

set -euo pipefail

строгий режим выполнения:

-e  — завершить скрипт при ошибке команды
-u  — завершить скрипт при обращении к несуществующей переменной
-o pipefail — считать pipeline ошибочным, если упала любая команда внутри pipeline
BACKUP_DIR="/var/backups/netbox"
NETBOX_DIR="/opt/netbox-docker"
DATE="$(date +%F_%H-%M-%S)"
KEEP_DAYS=30

переменные скрипта:

BACKUP_DIR — куда складывать backup
NETBOX_DIR — где находится docker-compose NetBox
DATE       — дата и время в имени backup-файла
KEEP_DAYS  — сколько дней хранить backup
mkdir -p "$BACKUP_DIR"
chmod 700 "$BACKUP_DIR"

создает backup-каталог и закрывает доступ к нему всем, кроме root.

cd "$NETBOX_DIR"

переходит в каталог NetBox Docker. Это важно, потому что docker compose использует compose-файлы из текущего каталога.

docker compose exec -T postgres pg_dump -U netbox -d netbox | gzip > "${BACKUP_DIR}/netbox_db_${DATE}.sql.gz"

главная строка backup базы.

Расшифровка:

docker compose exec

выполняет команду внутри контейнера.

-T

отключает pseudo-TTY. Это важно для скриптов и cron/systemd, чтобы backup не зависал и корректно писал поток данных.

postgres

имя сервиса PostgreSQL в compose.

pg_dump

штатная утилита PostgreSQL для создания логического dump базы.

-U netbox

пользователь БД.

-d netbox

имя базы данных.

| gzip

сжимает SQL-dump.

> netbox_db_DATE.sql.gz

записывает сжатый dump в файл.

docker compose exec -T netbox tar -czf - -C /opt/netbox/netbox media reports scripts > "${BACKUP_DIR}/netbox_files_${DATE}.tar.gz"

backup пользовательских файлов NetBox.

Расшифровка:

tar -czf -

создает gzip-архив и выводит его в stdout.

-C /opt/netbox/netbox

переходит в каталог внутри контейнера перед упаковкой.

media reports scripts

каталоги NetBox, которые архивируются.

tar -czf "${BACKUP_DIR}/netbox_config_${DATE}.tar.gz" \
  /opt/netbox-docker \
  /root/netbox-secrets 2>/dev/null || true

backup конфигурации и секретов.

Расшифровка:

/opt/netbox-docker

compose-файлы, env-файлы, настройки NetBox Docker.

/root/netbox-secrets

отдельно сохраненные пароли и SECRET_KEY.

2>/dev/null || true

скрывает несущественные предупреждения tar и не роняет скрипт, если часть необязательных файлов отсутствует.

find "$BACKUP_DIR" -type f -name "netbox_*" -mtime +"$KEEP_DAYS" -delete

удаляет старые backup-файлы.

Расшифровка:

find

поиск файлов.

-type f

только файлы.

-name "netbox_*"

только файлы, начинающиеся с netbox_.

-mtime +"$KEEP_DAYS"

старше указанного количества дней.

-delete

удалить найденные файлы.

24.4. Тестовый запуск backup

sudo /usr/local/sbin/netbox-backup.sh

sudo ls -lh /var/backups/netbox

Расшифровка:

ls -lh

показывает файлы с размерами в читаемом виде.

25. Systemd service и timer для backup

Для автозапуска NetBox отдельный systemd unit не создается. Но для расписания backup используется systemd timer: это не усложняет запуск NetBox и позволяет выполнять резервное копирование по расписанию.

25.1. Создать systemd service

sudo tee /etc/systemd/system/netbox-backup.service > /dev/null <<'EOF'
[Unit]
Description=NetBox Docker Backup
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/netbox-backup.sh
EOF

25.2. Расшифровка netbox-backup.service

[Unit]

общая секция описания unit.

Description=NetBox Docker Backup

человекочитаемое описание сервиса.

Requires=docker.service

указывает, что для работы backup нужен Docker. Если Docker не запущен, systemd попробует его поднять.

After=docker.service

запускает backup только после Docker.

[Service]

секция параметров сервиса.

Type=oneshot

сервис выполняет одну задачу и завершается. Это правильный тип для backup-скриптов.

ExecStart=/usr/local/sbin/netbox-backup.sh

команда, которую systemd запускает.

25.3. Создать systemd timer

sudo tee /etc/systemd/system/netbox-backup.timer > /dev/null <<'EOF'
[Unit]
Description=Run NetBox backup daily

[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true

[Install]
WantedBy=timers.target
EOF

25.4. Расшифровка netbox-backup.timer

[Unit]
Description=Run NetBox backup daily

описание timer.

[Timer]

секция расписания.

OnCalendar=*-*-* 02:30:00

запуск каждый день в 02:30.

Формат:

год-месяц-день часы:минуты:секунды

Звездочки означают “любой год, месяц и день”.

Persistent=true

если сервер был выключен в момент планового backup, systemd выполнит пропущенный запуск после включения.

[Install]
WantedBy=timers.target

позволяет включить timer через systemctl enable.

25.5. Включить timer

sudo systemctl daemon-reload
sudo systemctl enable --now netbox-backup.timer

systemctl list-timers | grep netbox

Расшифровка:

systemctl daemon-reload

перечитывает новые unit-файлы.

enable --now

включает автозапуск timer и сразу запускает его.

list-timers

показывает активные systemd timers.

Проверить service вручную:

sudo systemctl start netbox-backup.service
sudo systemctl status netbox-backup.service --no-pager

26. Проверка после перезагрузки VM

sudo reboot

После перезагрузки:

systemctl status docker --no-pager

docker ps

cd /opt/netbox-docker
docker compose ps
curl -I http://192.168.1.70:8000

cd /opt/portainer
docker compose ps
curl -k -I https://192.168.1.70:9443

systemctl list-timers | grep netbox

timedatectl status
ip -6 addr
apt-mark showhold
sysctl vm.overcommit_memory

Ожидаемо:

NetBox containers: Up / healthy
Portainer: Up
NetBox URL: HTTP response from http://192.168.1.70:8000
Portainer URL: HTTP response from https://192.168.1.70:9443

27. Перевод VM в production-сеть 10.44.100.226/24

Выполнять после проверки NetBox и Portainer на временном IP. Лучше делать через консоль Proxmox, потому что SSH-сессия может оборваться.

27.1. Backup перед переводом

sudo /usr/local/sbin/netbox-backup.sh

sudo ls -lh /var/backups/netbox

27.2. Остановить сервисы перед сменой IP

cd /opt/netbox-docker
docker compose stop

cd /opt/portainer
docker compose stop

Расшифровка:

docker compose stop

останавливает контейнеры, но не удаляет их и не удаляет volumes.

27.3. Изменить netplan

sudo tee /etc/netplan/01-netbox-static.yaml > /dev/null <<'EOF'
network:
  version: 2
  renderer: networkd
  ethernets:
    ens18:
      dhcp4: false
      dhcp6: false
      accept-ra: false
      link-local: []
      optional: true
      addresses:
        - 10.44.100.226/24
      routes:
        - to: default
          via: 10.44.100.1
      nameservers:
        addresses:
          - 10.44.100.1
EOF

Если DNS в production-сети другой, заменить 10.44.100.1 на реальные DNS.

sudo chmod 600 /etc/netplan/01-netbox-static.yaml

sudo netplan generate

sudo netplan try

Или из консоли Proxmox:

sudo netplan apply

Проверить:

ip -br addr
ip route
resolvectl status
ping -c 4 10.44.100.1

27.4. Обновить NTP под production-сеть

sudo nano /etc/systemd/timesyncd.conf

Если 10.44.100.1 является NTP-сервером:

[Time]
NTP=10.44.100.1
FallbackNTP=

Применить:

sudo systemctl restart systemd-timesyncd
sudo timedatectl set-ntp true

timedatectl status
systemctl status systemd-timesyncd --no-pager

27.5. Изменить IP NetBox в Compose .env

cd /opt/netbox-docker

sed -i 's/^NETBOX_BIND_IP=.*/NETBOX_BIND_IP=10.44.100.226/' .env

cat .env

Расшифровка:

sed -i

редактирует файл на месте.

s/^NETBOX_BIND_IP=.*/NETBOX_BIND_IP=10.44.100.226/

заменяет всю строку, начинающуюся с NETBOX_BIND_IP=, на новое значение.

Ожидаемо:

NETBOX_BIND_IP=10.44.100.226
NETBOX_EXTERNAL_PORT=8000

27.6. Изменить IP в env/netbox.env

cd /opt/netbox-docker

nano env/netbox.env

Заменить строки:

ALLOWED_HOSTS=10.44.100.226 localhost 127.0.0.1
CSRF_TRUSTED_ORIGINS=http://10.44.100.226:8000

Проверить:

grep -E "ALLOWED_HOSTS|CSRF_TRUSTED_ORIGINS" env/netbox.env

27.7. Изменить IP Portainer в Compose .env

cd /opt/portainer

sed -i 's/^PORTAINER_BIND_IP=.*/PORTAINER_BIND_IP=10.44.100.226/' .env

cat .env

Ожидаемо:

PORTAINER_BIND_IP=10.44.100.226
PORTAINER_HTTPS_PORT=9443
PORTAINER_IMAGE=portainer/portainer-ce:lts

27.8. Обновить firewall под production-сеть

sudo ufw allow from 10.44.100.0/24 to any port 22 proto tcp
sudo ufw allow from 10.44.100.0/24 to any port 8000 proto tcp
sudo ufw allow from 10.44.100.0/24 to any port 9443 proto tcp

sudo ufw status numbered

После проверки доступа из production-сети старые правила для 192.168.1.0/24 можно удалить:

sudo ufw status numbered

sudo ufw delete <НОМЕР_ПРАВИЛА>

Удалять аккуратно: после каждого удаления номера правил пересчитываются.

27.9. Запустить сервисы на новом IP

Если контейнеры были остановлены через docker compose stop, restart policy unless-stopped не поднимет их сама. Нужно явно выполнить docker compose up -d.

cd /opt/netbox-docker
docker compose up -d

cd /opt/portainer
docker compose up -d

Проверить:

docker ps

ss -tulpn | grep -E ':8000|:9443'

curl -I http://10.44.100.226:8000

curl -k -I https://10.44.100.226:9443

В браузере:

http://10.44.100.226:8000

https://10.44.100.226:9443

28. Управление NetBox

cd /opt/netbox-docker

Статус:

docker compose ps

Запуск:

docker compose up -d

Остановка:

docker compose stop

Перезапуск:

docker compose restart

Логи:

docker compose logs -f netbox
docker compose logs -f netbox-worker
docker compose logs -f postgres

Проверить restart policy:

docker inspect -f '{{.Name}}  restart={{.HostConfig.RestartPolicy.Name}}' $(docker compose ps -q)

29. Управление Portainer

cd /opt/portainer

Статус:

docker compose ps

Запуск:

docker compose up -d

Перезапуск:

docker compose restart

Логи:

docker compose logs -f

30. Обновление NetBox Docker

Перед обновлением обязательно сделать backup:

sudo /usr/local/sbin/netbox-backup.sh

Обновление:

cd /opt/netbox-docker

git pull

docker compose pull

docker compose up -d

docker compose ps

docker compose logs --tail=100 netbox

Расшифровка:

git pull

забирает обновления файлов netbox-docker из GitHub.

docker compose pull

скачивает новые контейнерные образы.

docker compose up -d

пересоздает контейнеры на новых образах/настройках.

Docker Engine при этом не обновляется автоматически, потому что docker-ce и docker-ce-cli стоят на hold.

31. Лицензии и коммерческое использование

Данный раздел фиксирует лицензионную картину для установки NetBox на Ubuntu Server в Docker на коммерческом предприятии. Это не юридическое заключение, а техническая сводка по публичной документации и лицензиям проектов. Для закупки, аудита или внутреннего compliance лучше дополнительно согласовать выводы с юридической службой.

31.1. Общий вывод

Для выбранной схемы:

Ubuntu Server 24.04
Docker Engine 28.0.0
Docker Compose plugin
Portainer CE LTS
NetBox Docker
NetBox
PostgreSQL
Valkey / Redis-compatible сервисы
Proxmox VE как гипервизор

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

Кратко:

Компонент Лицензия / модель Коммерческое использование
Ubuntu Server набор open-source лицензий + политика Canonical по товарным знакам можно использовать внутри компании
Proxmox VE GNU AGPLv3 можно использовать, подписка нужна для enterprise repository/support
Docker Engine Apache License 2.0 можно использовать на Linux-сервере
Docker Compose Apache License 2.0 можно использовать
Portainer CE zlib license можно использовать; BE - отдельная лицензируемая редакция
NetBox Apache License 2.0 можно использовать
NetBox Docker Apache License 2.0 можно использовать
PostgreSQL PostgreSQL License можно использовать, в том числе в коммерческих продуктах
Valkey BSD 3-Clause / включает BSD-лицензированный код Redis можно использовать

31.2. Ubuntu Server 24.04

Ubuntu Server - это дистрибутив, состоящий из большого числа пакетов с разными open-source лицензиями. Для внутреннего использования на коммерческом предприятии Ubuntu Server можно устанавливать и использовать бесплатно. Подписка Ubuntu Pro - это отдельный коммерческий сервис поддержки и расширенных обновлений, а не базовое условие использования Ubuntu.

Практический вывод:

Использование Ubuntu Server 24.04 как ОС внутри VM на коммерческом предприятии допустимо.

31.3. Proxmox VE

Proxmox VE используется как гипервизор, на котором работает VM с Ubuntu Server. Proxmox VE распространяется как open-source решение под GNU AGPLv3.

Практический вывод:

Использование Proxmox VE как гипервизора на коммерческом предприятии допустимо.

Нужно разделять:

Лицензия Proxmox VE  — AGPLv3, право использовать ПО.
Proxmox subscription — коммерческая подписка на enterprise repository и поддержку.

Для production-среды желательно рассмотреть Proxmox subscription как вопрос поддержки и регламента обновлений, но это не базовое условие запуска VM.

31.4. Docker Engine и Docker Compose

В инструкции используется Docker Engine на Ubuntu Server, установленный из официального Docker APT-репозитория. Docker Engine и Docker Desktop - разные продукты с разными лицензионными условиями.

Практический вывод:

Docker Engine на Ubuntu Server можно использовать на коммерческом предприятии.
Docker Desktop на рабочих станциях предприятия — отдельный вопрос лицензирования.

Для данной инструкции:

Используется:
  docker-ce
  docker-ce-cli
  containerd.io
  docker-buildx-plugin
  docker-compose-plugin

Не используется:
  Docker Desktop

31.5. Apache License 2.0

Apache License 2.0 - разрешительная open-source лицензия. Она позволяет использовать, копировать, изменять, распространять исходный и объектный код, а также распространять производные работы.

Для предприятия это означает:

Можно:
  использовать ПО внутри компании;
  использовать ПО в коммерческой инфраструктуре;
  изменять ПО под себя;
  распространять исходный или бинарный вид;
  включать в коммерческие решения при соблюдении условий лицензии.

Основные обязанности:

1. Сохранять текст лицензии.
2. Сохранять copyright notices.
3. Сохранять NOTICE-файлы, если они есть.
4. Указывать существенные изменения, если распространяется модифицированная версия.
5. Не использовать товарные знаки проекта так, будто проект официально одобрил ваш продукт.

Для внутреннего использования NetBox обязательства минимальны, так как измененная сборка наружу не распространяется.

31.6. NetBox и NetBox Docker

NetBox core и NetBox Docker распространяются под Apache License 2.0.

Практический вывод:

NetBox и NetBox Docker можно использовать на коммерческом предприятии как внутренний IPAM/DCIM-сервис.

Важно:

1. Базовый NetBox core — Apache 2.0.
2. Отдельные add-ons, плагины или продукты NetBox Labs могут иметь другие лицензии.
3. Перед установкой дополнительных плагинов нужно отдельно проверять лицензию каждого плагина.

31.7. Portainer CE

В инструкции используется Portainer Community Edition, а не Business Edition.

Практический вывод:

Portainer CE можно использовать на коммерческом предприятии.
Portainer BE требует отдельной лицензии/ключа.

Для нашей инструкции:

Используется Portainer CE LTS.
Portainer BE не используется.
Порт Edge Agent 8000 не публикуется.

31.8. PostgreSQL

PostgreSQL распространяется под PostgreSQL License - либеральной open-source лицензией, близкой по смыслу к BSD/MIT.

Практический вывод:

PostgreSQL можно использовать на коммерческом предприятии.

31.9. Valkey / Redis-compatible сервисы

В актуальном NetBox Docker используются контейнеры Valkey:

redis
redis-cache

Valkey включает BSD 3-Clause licensed code и используется как Redis-compatible key-value store.

Практический вывод:

Valkey можно использовать на коммерческом предприятии.

31.10. Внутреннее использование и распространение наружу

Для большинства open-source лицензий принципиально различаются два сценария.

Внутреннее использование:

ПО установлено на сервере предприятия.
Доступ имеют сотрудники или внутренние системы.
ПО не продается и не передается заказчикам как продукт.

В этом сценарии по выбранным компонентам риски минимальны.

Распространение наружу:

предприятие передает готовую VM;
продает appliance;
публикует измененный Docker image;
распространяет модифицированные бинарники;
предоставляет измененную AGPL-систему как сетевой сервис внешним пользователям.

В этом сценарии нужно отдельно проверять:

Apache 2.0 notices;
BSD notices;
zlib notice;
AGPLv3 obligations;
товарные знаки Ubuntu/Canonical, Docker, NetBox, Portainer, Proxmox;
лицензии всех дополнительных плагинов.

31.11. Итоговый вывод для согласования

Выбранная схема установки NetBox на Ubuntu Server 24.04 в Docker с Portainer CE может использоваться на коммерческом предприятии как внутренний сервис.

Критичные условия:
1. Использовать Docker Engine на Linux-сервере, не Docker Desktop.
2. Использовать Portainer CE, не Portainer BE без лицензии.
3. Использовать базовый NetBox / NetBox Docker под Apache 2.0.
4. Проверять лицензии любых дополнительных NetBox-плагинов и add-ons отдельно.
5. Не распространять модифицированную сборку наружу без отдельной юридической проверки.
6. Зафиксировать версии контейнерных образов и компонентов для внутреннего учета.

32. Финальная проверка

docker --version
docker compose version
docker info | grep -E "Server Version|Storage Driver"
cat /etc/docker/daemon.json 2>/dev/null || echo "daemon.json отсутствует — используется штатная конфигурация Docker"
apt-mark showhold

systemctl status docker --no-pager
docker ps

curl -I http://10.44.100.226:8000
curl -k -I https://10.44.100.226:9443

ss -tulpn | grep -E ':8000|:9443'

sudo ufw status verbose

timedatectl status

ip -6 addr

systemctl list-timers | grep netbox

sysctl vm.overcommit_memory

Итоговые адреса:

NetBox:    http://10.44.100.226:8000
Portainer: https://10.44.100.226:9443

Финальное состояние:

Ubuntu Server 24.04 VM
  ├── Docker Engine 28.0.0
  ├── Docker Compose plugin
  ├── Portainer CE LTS
  │     └── https://10.44.100.226:9443
  │
  └── NetBox Docker
        ├── netbox
        ├── netbox-worker
        ├── postgres
        ├── redis / valkey
        └── redis-cache / valkey-cache

Конфигурация:
  /opt/netbox-docker
  /opt/portainer

Секреты:
  /root/netbox-secrets/netbox-secrets.txt

Backup:
  /var/backups/netbox

33. Что пока не делаем

На первом этапе не добавляем:

reverse proxy / Nginx
корпоративный HTTPS-сертификат для NetBox
LDAP/AD
Proxmox-интеграцию
NetBox-плагины
aвтоматическую синхронизацию устройств
systemd unit для автозапуска NetBox compose-стека

Сначала фиксируем стабильную работу базового NetBox, backup, restart policy и доступ из production-сети. Затем можно переходить к первичному наполнению: Sites, Locations, Racks, VLAN, Prefixes, Devices, Interfaces, а уже после этого - к интеграции с Proxmox.

34. Использованные источники

  • Docker Engine for Ubuntu: https://docs.docker.com/engine/install/ubuntu/
  • NetBox Docker: https://github.com/netbox-community/netbox-docker
  • NetBox required parameters / SECRET_KEY: https://netboxlabs.com/docs/netbox/configuration/required-parameters/
  • Portainer CE install with Docker: https://docs.portainer.io/start/install-ce/server/docker/linux
  • NetBox Community Device Type Library: https://github.com/netbox-community/devicetype-library
  • Device-Type-Library-Import: https://github.com/netbox-community/Device-Type-Library-Import
  • Ubuntu / Canonical intellectual property policy: https://canonical.com/legal/intellectual-property-policy
  • Proxmox VE features / source code / AGPLv3: https://www.proxmox.com/en/products/proxmox-virtual-environment/features
  • Portainer repository / zlib license: https://github.com/portainer/portainer
  • PostgreSQL license: https://www.postgresql.org/about/licence/
  • Valkey project: https://valkey.io/
  • BSD 3-Clause license: https://opensource.org/license/bsd-3-clause