← Все заметки
Linux и инфраструктура

Развёртывание NetBox 4.7 на AlmaLinux 9: PostgreSQL, Redis, Gunicorn и Nginx

Практическое развёртывание NetBox в виртуальной машине Proxmox на AlmaLinux 9: PostgreSQL 16, Redis, Python 3.12, Gunicorn, Nginx, systemd, SELinux, firewalld и диагностика ошибок.

Статус: актуальноОпубликовано: 2026-10-19Обновлено: 2026-10-19

Проверено на: AlmaLinux 9.8 · NetBox 4.7.1 → 4.7.3 · Python 3.12.15 · PostgreSQL 16.15 · Redis 6.2.24 · Proxmox VE

Контекст и задача

NetBox внедрялся как единый источник данных об ИТ-инфраструктуре (Source of Truth): площадках, устройствах, IP-адресах, VLAN, сетевых интерфейсах и виртуальных машинах. В отличие от мониторинга, NetBox описывает как инфраструктура должна быть устроена, а не её текущее состояние.

В основе статьи — первоначальная установка NetBox 4.7.1, выполненная в сентябре 2026 года на отдельной виртуальной машине в Proxmox. Успешно проверены запуск web-интерфейса, фонового обработчика задач, PostgreSQL, Redis и Nginx. Реальные домены, адреса и имена серверов заменены на примеры. Приведённые команды реконструируют воспроизводимую процедуру и не являются дословным журналом терминала.

Обновление от 19.10.2026. 19 октября 2026 года сервер был успешно обновлён до NetBox 4.7.3; разбор обновления — в отдельной статье. Версии 4.7.0–4.7.1 имеют исправленную в 4.7.2 проблему: значения API-токенов, созданных через фоновые массовые запросы, могли попасть в результаты задач. Для действующих установок следует планировать обновление и замену таких токенов, если они создавались. Ниже намеренно зафиксирована первоначально развёрнутая версия; для новой установки используйте актуальный исправленный релиз и его документацию.

01 / Схема развёртывания

Компонент Конфигурация
Виртуализация Proxmox VE, отдельная VM
Ресурсы около 8 GiB RAM / системный диск 20 GiB (по финальной проверке)
Операционная система AlmaLinux 9.8
Приложение NetBox 4.7.1 при первичной установке → 4.7.3 после обновления
Runtime Python 3.12.15 (подтверждено при обновлении)
База данных PostgreSQL 16.15
Очереди и кеш Redis 6.2.24
WSGI Gunicorn, 127.0.0.1:8001
Reverse proxy Nginx
Службы netbox, netbox-rq, postgresql-16, redis, nginx

Путь запроса:

Browser → Nginx :80 / :443 → Gunicorn 127.0.0.1:8001 → NetBox
                                             ├── PostgreSQL :5432
                                             └── Redis :6379
Background jobs → netbox-rq → Redis → PostgreSQL

PostgreSQL и Redis размещены локально и не открываются во внешние подсети. TLS завершается на Nginx, а Gunicorn слушает только loopback. Настройке HTTPS через Microsoft AD CS посвящена вторая статья.

02 / Подготовка AlmaLinux

Устанавливаем обновления и необходимые пакеты:

sudo dnf update -y
sudo dnf install -y \
  git curl wget nginx redis openssl \
  python3.12 python3.12-devel python3.12-pip \
  gcc gcc-c++ make libxml2-devel libxslt-devel \
  libffi-devel openssl-devel zlib-devel \
  policycoreutils-python-utils

python3.12 --version
getenforce

Для PostgreSQL 16 используем официальный репозиторий PGDG (пример для EL9/x86_64):

sudo dnf install -y \
  https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo dnf -qy module disable postgresql
sudo dnf install -y postgresql16 postgresql16-server postgresql16-devel
sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
sudo systemctl enable --now postgresql-16 redis nginx

/usr/pgsql-16/bin/psql --version
redis-server --version

Если PostgreSQL уже установлен и содержит данные, не запускайте initdb повторно. Сначала проверьте существующий кластер и план миграции.

03 / База данных PostgreSQL и Redis

Создаём роль и базу; пароль вводим интерактивно, без записи в историю shell:

sudo -u postgres psql
CREATE ROLE netbox LOGIN;
\password netbox
CREATE DATABASE netbox OWNER netbox ENCODING 'UTF8';
\connect netbox
CREATE EXTENSION IF NOT EXISTS ltree;
\dx
\q

Начиная с NetBox 4.7 используется расширение PostgreSQL ltree, поэтому база должна поддерживать его, а роль NetBox должна иметь необходимые права на создание расширений и объектов схемы. Проверяем подключение:

psql -h 127.0.0.1 -U netbox -d netbox -c 'SELECT current_database();'
redis-cli -h 127.0.0.1 ping
# Ожидается: PONG

Redis должен оставаться привязанным к loopback (bind 127.0.0.1 либо эквивалентная настройка). Не публикуйте порт 6379: запись в очередь задач NetBox — чувствительная операция с точки зрения безопасности.

04 / Получение NetBox из Git

Для первоначальной установки использовался релиз 4.7.1; для новых установок следует выбирать актуальный исправленный релиз:

sudo git clone \
  --branch v4.7.1 --depth 1 \
  https://github.com/netbox-community/netbox.git \
  /opt/netbox

cd /opt/netbox
git describe --tags --exact-match

Создаём сервисного пользователя и локальный конфигурационный файл:

sudo useradd --system --home-dir /opt/netbox \
  --shell /sbin/nologin netbox

sudo cp /opt/netbox/netbox/netbox/configuration_example.py \
  /opt/netbox/netbox/netbox/configuration.py

python3.12 /opt/netbox/netbox/generate_secret_key.py

Сгенерируйте ещё одно, отдельное случайное значение для API_TOKEN_PEPPERS: оба секрета обязательны в конфигурации NetBox 4.7 и не должны публиковаться в Git.

В /opt/netbox/netbox/netbox/configuration.py задаём как минимум:

ALLOWED_HOSTS = ['netbox.lab.shandrov.ru']

DATABASES = {
    'default': {
        'NAME': 'netbox',
        'USER': 'netbox',
        'PASSWORD': 'REPLACE_WITH_DB_PASSWORD',
        'HOST': '127.0.0.1',
        'PORT': '5432',
        'CONN_MAX_AGE': 300,
    }
}

REDIS = {
    'tasks': {
        'HOST': '127.0.0.1', 'PORT': 6379,
        'PASSWORD': '', 'DATABASE': 0, 'SSL': False,
    },
    'caching': {
        'HOST': '127.0.0.1', 'PORT': 6379,
        'PASSWORD': '', 'DATABASE': 1, 'SSL': False,
    },
}

SECRET_KEY = 'REPLACE_WITH_INDEPENDENT_RANDOM_SECRET'
API_TOKEN_PEPPERS = {
    1: 'REPLACE_WITH_INDEPENDENT_RANDOM_PEPPER',
}

Не используйте ALLOWED_HOSTS = ['*'] в постоянной конфигурации. Имя netbox.lab.shandrov.ru в этой статье пример, не адрес развёрнутого корпоративного сервиса.

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

sudo chown root:netbox /opt/netbox/netbox/netbox/configuration.py
sudo chmod 640 /opt/netbox/netbox/netbox/configuration.py
sudo chown -R netbox:netbox \
  /opt/netbox/netbox/media \
  /opt/netbox/netbox/reports \
  /opt/netbox/netbox/scripts

05 / Python environment, миграции и администратор

Штатный upgrade.sh создаёт venv, устанавливает зависимости, применяет миграции и собирает статические файлы:

sudo PYTHON=/usr/bin/python3.12 /opt/netbox/upgrade.sh

cd /opt/netbox/netbox
sudo -u netbox /opt/netbox/venv/bin/python manage.py check
sudo -u netbox /opt/netbox/venv/bin/python manage.py showmigrations | tail -n 20

Создаём первого администратора интерактивно:

cd /opt/netbox/netbox
sudo -u netbox /opt/netbox/venv/bin/python manage.py createsuperuser

Команда manage.py --version выводит версию Django, а не релиз NetBox. Для NetBox, установленного из Git, релиз проверяется так:

cd /opt/netbox
git describe --tags --exact-match

В нашей установке Django был 6.1.1, а тег приложения — v4.7.1.

06 / Gunicorn и systemd

Сохраняем локальную конфигурацию Gunicorn отдельно от contrib:

sudo cp /opt/netbox/contrib/gunicorn.py /opt/netbox/gunicorn.py
sudoedit /opt/netbox/gunicorn.py

В конфигурации проверяем строку:

bind = '127.0.0.1:8001'

Используем штатные unit-файлы NetBox:

sudo cp /opt/netbox/contrib/netbox.service \
  /opt/netbox/contrib/netbox-rq.service \
  /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now netbox netbox-rq

systemctl is-active netbox netbox-rq
ss -lntp | grep ':8001'

netbox-rq отвечает за фоновые задания; наличие только работающего web-интерфейса ещё не означает полноценную работоспособность NetBox.

07 / Nginx, SELinux и firewalld

Создаём /etc/nginx/conf.d/netbox.conf. На этом этапе для первого запуска используем HTTP только внутри доверенной сети, затем переходим на HTTPS:

server {
    listen 80;
    server_name netbox.lab.shandrov.ru;

    client_max_body_size 20m;

    location /static/ {
        alias /opt/netbox/netbox/static/;
    }

    location / {
        proxy_pass http://127.0.0.1:8001;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Для работы обратного прокси при включённом SELinux:

sudo setsebool -P httpd_can_network_connect 1
sudo semanage fcontext -a -t httpd_sys_content_t \
  '/opt/netbox/netbox/static(/.*)?'
sudo restorecon -Rv /opt/netbox/netbox/static
sudo nginx -t
sudo systemctl reload nginx

Команда semanage fcontext -a применяется при первом добавлении правила. Если правило уже существует, просмотрите semanage fcontext -l и используйте -m для изменения.

Порт HTTP на сервере разрешаем только с административной подсети; замените демонстрационный CIDR на свой:

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.20.30.0/24" service name="http" accept'
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

Не добавляйте общий --add-service=http, если доступ должен быть ограничен сетями администраторов. После перехода на TLS аналогично разрешается https, а правило http может оставаться исключительно для контролируемого перенаправления.

08 / Реальные сложности: права после umask 077

В ходе настройки обнаружилась проблема с доступом к статическим ресурсам после операций, выполненных с ограничительным umask 077. Симптом: сам NetBox отвечает, а стили или JavaScript возвращают 403.

Диагностика:

namei -l /opt/netbox/netbox/static
sudo nginx -t
sudo journalctl -u nginx -n 80 --no-pager
sudo ausearch -m AVC -ts recent

Права проверяем по всей цепочке директорий; веб-серверу нужен доступ на проход к публичной статике. Корректируем только публичный каталог, не ослабляя права на configuration.py и приватные ключи:

sudo find /opt/netbox/netbox/static -type d -exec chmod 755 {} +
sudo find /opt/netbox/netbox/static -type f -exec chmod 644 {} +
sudo restorecon -Rv /opt/netbox/netbox/static

Если система не выдаёт AVC, не следует отключать SELinux ради диагностики. Также не нужно выполнять chmod -R 777 /opt/netbox.

09 / Финальные проверки

systemctl is-active postgresql-16 redis netbox netbox-rq nginx
redis-cli ping
cd /opt/netbox && git describe --tags --exact-match
sudo -u netbox /opt/netbox/venv/bin/python \
  /opt/netbox/netbox/manage.py check
ss -lntp | grep -E ':(80|8001|5432|6379)\b'
curl -I -H 'Host: netbox.lab.shandrov.ru' http://127.0.0.1/

Ожидаем активные сервисы, PONG, отсутствие ошибок manage.py check, ответ Nginx без 502 и успешную загрузку интерфейса.

Что ещё проверить перед промышленной эксплуатацией

Результат

NetBox запущен на AlmaLinux под systemd, хранит данные в PostgreSQL, использует Redis для кеширования и фоновых задач и обслуживается через Nginx. Продолжение цикла — выпуск и установка HTTPS-сертификата от Microsoft AD CS и обновление NetBox до 4.7.3.

Источники