Установка 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. Проверка сетевого интерфейса
ip -br link
Обычно в Proxmox VM интерфейс называется:
ens18
Дальше в инструкции используется ens18. Если имя другое, в netplan нужно заменить ens18 на фактическое имя интерфейса.
Расшифровка:
ip
утилита для просмотра и настройки сетевых параметров Linux.
-br
brief, краткий вывод.
link
показывает сетевые интерфейсы канального уровня.
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