Установка NetBox

Редактировал(а) Антон Волков 2025/12/14 19:37

Требования

 Устанавливать будем на FreeBSD 14.1, для Linux дистрибутивов шаги особо ничем не будут отличаться.

Для Netbox требуется сначала установить следующие компоненты:
PostgreSQL >= 12
Python = 3.10,3.11,3.12
Redis > 4.0
Для веб-сервера нам понадобиться Nginx.

Установка PostgreSQL

 Смотрим какие версии у нас есть в репозитории, нам нужна версия 10 или выше.

# pkg search postgresql

postgresql16-client-16.3       PostgreSQL database (client)
postgresql16-contrib-16.3      The contrib utilities from the PostgreSQL distribution
postgresql16-docs-16.3         The PostgreSQL documentation set
postgresql16-plperl-16.3       Write SQL functions for PostgreSQL using Perl5
postgresql16-plpython-16.3     Module for using Python to write SQL functions
postgresql16-pltcl-16.3        Module for using Tcl to write SQL functions
postgresql16-server-16.3       PostgreSQL is the most advanced open-source database available anywhere

 Ставим последнюю доступную версию:

# pkg install postgresql16-server

 Включаем службу и инициализируем СУБД:

# sysrc postgresql_enable="YES"
postgresql_enable:  -> YES
# service postgresql initdb

 Настраиваем pg_hba.conf

TYPE  DATABASE        USER            ADDRESS                 METHOD
# IPv4 local connections:
host    all           all             0.0.0.0/0             scram-sha-256

Где ADDRESS - IP адрес или сеть откуда мы сможем соединиться с нашей СУБД.

METHOD - метод авторизации, в данном случае это шифрованный пароль. (md5 - хешированный пароль).

 Редактируем postgresql.conf:

listen_addresses = '*'          #  '*' - слушает на всех интерфейсах, но можно оставить и localhost;
port = 5432                         # порт оставляем по умолчанию
max_connections = 600     #  на всякий случай увеличим количество соединений (100 по умолчанию

Запускаем службу:

# service postgresql start

 Подключаемся к СУБД

# psql -U postgres

 И создаем базу, пользователя netbox и даем пользователю права на базу:

CREATE DATABASE netbox;
CREATE USER netbox WITH PASSWORD 'P@ssw0rd!';
ALTER DATABASE netbox OWNER TO netbox;
GRANT CREATE ON SCHEMA public TO netbox; 

 Выходим, набирая \q.

 Далее можно проверить соединение с БД для пользователя netbox

# psql --username netbox --password --host localhost netbox

Установка Redis

 Устанавливаем пакет Redis (в разных дистрибутивах он может назваться по разному, например: redis-server) и проверяем версию, она должна быть не ниже 4.0.

# pkg install redis
# redis-server -v
Redis server v=7.2.5 sha=00000000:0 malloc=libc bits=64 build=a673021ce8a50e10

 Далее включаем службу и проверяем работоспособность сервиса.

# sysrc redis_enable="YES"
redis_enable:  -> YES
# service redis start
# redis-cli ping
PONG

Установка NetBox

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

 Качаем последнюю стабильную версию с Github Releases  netbox-community/netbox (github.com) , распаковываем архив и ставим, возможно нас попросят доставить зависимости, например django.

# cd /usr/local/share
# wget https://github.com/netbox-community/netbox/archive/v4.1.1.tar.gz
# tar -xzf v4.1.1.tar.gz -C /usr/local/share/
# mv /usr/local/share/netbox-4.1.1 /usr/local/share/netbox
Или
# pkg install git
# git clone -b master --depth 1 https://github.com/netbox-community/netbox.git

 Создаем пользователя netbox и выдаем ему права на каталоги:

# adduser netbox
# chown -R netbox /usr/local/share/netbox/netbox/media/
# chown -R netbox /usr/local/share/netbox/netbox/reports/
# chown -R netbox /usr/local/share/netbox/netbox/scripts/

Доставляем зависимости (увидим какие при выполнении скрипта):

--- Активируем venv для Python например из каталога Netbox---
$ cd /usr/local/share/netbox/
$ pip install venv
$ python3.11 -m venv venv
$ . venv/bin/activate
(venv)$ pkg install py311-django50
(venv)$ pkg install py311-pip
(venv)$ pkg install rust
(venv)$ pkg install openjpeg
(venv)$ pkg install zlib-ng
(venv)$ pip install --upgrade pip setuptools wheel
(venv)$ pip install --upgrade pillow
(venv)$ cd /usr/local/share/netbox/
(venv)$ pip install -r requirements.txt

 Проваливаемся в каталог с конфигами NetBox и переименовываем пример файла конфигурации, который называется configuration.py.

(venv)$ cd /usr/local/share/netbox/netbox/netbox/
(venv)$ cp configuration_example.py configuration.py

В файле конфигурации вводим настройки соединения с базой Postgresql и Redis:

DATABASE = {
    'NAME': 'netbox',               # Database name
   'USER': 'netbox',               # PostgreSQL username
   'PASSWORD': 'P@ssw0rd!', # PostgreSQL password
   'HOST': 'localhost',            # Database server
   'PORT': '',                     # Database port (leave blank for default)
   'CONN_MAX_AGE': 300,            # Max database connection age (seconds)
}
REDIS = {
    'tasks': {
       'HOST': 'localhost',      # Redis server
       'PORT': 6379,             # Redis port
       'PASSWORD': '',           # Redis password (optional)
       'DATABASE': 0,            # Database ID
       'SSL': False,             # Use SSL (optional)
    },
   'caching': {
       'HOST': 'localhost',
       'PORT': 6379,
       'PASSWORD': '',
       'DATABASE': 1,            # Unique ID for second database
       'SSL': False,
    }
}

Указываем список имен FQDN или IP адресов с которых мы будем иметь доступ к сервису NetBox ('*' звездочка означает все доступные адреса), обычно эта запись дублирует имя и адрес хоста на котором стоит Netbox.

ALLOWED_HOSTS = ['netbox.example.com', 'localhost']

Устанавливаем SECRET_KEY, который является секретной, псевдослучайная строкой, используемой для помощи в создании новых криптографических хэшей для паролей и файлов cookie HTTP. Ключ, определенный здесь, не должен распространяться за пределами файла конфигурации. может быть изменен в любое время без влияния на сохраненные данные, однако имейте в виду, что это приведет к аннулированию всех существующих пользовательских сессий. Развертывания NetBox, состоящие из нескольких узлов, должны иметь один и тот же секретный ключ, настроенный на всех узлах.SECRET_KEY.

(venv)$ cd /usr/local/share/netbox
(venv)$ python3.11 netbox/generate_secret_key.py

 После выполнения скрипта, копируем секретный ключ в файл конфигурации configuration.py

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

# ln -s /usr/local/bin/python3.11 /usr/local/bin/python3
(venv)$ cd /usr/local/share/netbox/netbox
(venv)$ python3.11 manage.py migrate
(venv)$ python3.11 manage.py createsuperuser
(venv)$ python3.11 manage.py collectstatic --no-input

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

(venv)$ cd /usr/local/share/netbox/netbox
(venv)$ python3.11 manage.py runserver 0.0.0.0:8000 --insecure

Теперь мы можем зайти по адресу netbox.example.com:8000 под пользователем которого мы создали в предыдущем шаге. 

1727094875543-494.png

Настройка запуска в качестве службы

Для запуска сервиса будем использовать WSGI-сервер Gunicorn.

Ставим Gunicorn:

# pkg install py311-gunicorn

Если для дистрибутивов Linux примеры конфигурационных файлов сервисов лежать в каталоге /netbox-4.1.1/contrib/, то для freebsd скопируем текст скрипта сервиса в файл /usr/local/etc/rc.d/netbox

#!/bin/sh

# This sample rc script eliminate the need to use sysutils/py-supervisor to
# run NetBox as a system service. Only www/py-gunicorn is needed as a WSGI.
#
# Of course a working HTTP server like Apache/nginx is still required to make
# use of the gunicorn WSGI.
#

# PROVIDE: netbox
# REQUIRE: DAEMON
# KEYWORD: shutdown

# netbox_enable (bool): Set to NO by default.
#                       Set it to YES to enable netbox.
# netbox_config (str):  Default to "/usr/local/etc/${name}.conf}"
#                       Config file for gunicorn's netbox config file
# netbox_command (str): Default to "/usr/local/share/netbox/venv/bin/gunicorn"
#                       Path to gunicorn to run netbox
# netbox_bind (str):    Default to "localhost:8001"
#                       Interface and port to bind to
# netbox_workers (int): Default to "3"
#                       Number of gunicorn works
# netbox_timeout (int): Default to "120"
#                       Worker timeout for gunicorn


. /etc/rc.subr

name="netbox"
rcvar=netbox_enable
netbox_path=/usr/local/share/netbox/netbox/

load_rc_config $name

start_precmd="netbox_precmd"
command=${netbox_program:-/usr/local/share/netbox/venv/bin/gunicorn}
procname=${netbox_procname:-/usr/local/share/netbox/venv/bin/python3.11}
netbox_chdir=${netbox_path}
pidfile=${netbox_pidfile:-/var/run/${name}/${name}.pid}
netbox_user=${netbox_user:-netbox}
netbox_bind=${netbox_bind:-localhost:8001}
netbox_workers=${netbox_workers:-3}
netbox_timeout=${netbox_timeout:-120}

command_args="${netbox_args} -D \
        --log-syslog --log-syslog-prefix 
${name} \
        --log-syslog-to unix:///var/run/log#dgram \
        --disable-redirect-access-to-syslog \
        -p 
${pidfile} --pythonpath ${netbox_chdir} \
        -b 
${netbox_bind} -w ${netbox_workers} -t ${netbox_timeout} \
        netbox.wsgi"


netbox_precmd()
{
        install -d -o ${netbox_user} 'dirname ${pidfile}'
}

run_rc_command "$1"

Добавляем записи в rc.conf и разрешаем выполнение rc-скрипта

# sysrc netbox_enable="YES"
# chmod +x /usr/local/etc/rc.d/netbox

 Теперь можно запускать службу.

P.S. После запуска службы лично она у меня сразу грохалась с ошибкой создания .pid файла, для этого я создал заранее каталог для pid файла netbox и сделал пользователя netbox его владельцем

# mkdir /var/run/netbox
# chown netbox /var/run/netbox

Создание SSL сертификата

Для работы через протокол https нам потребуется сертификат, мы может сгенерировать самоподписанный сертификат на 10 лет командой:

# openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout /etc/ssl/private/netbox.key \
-out /etc/ssl/certs/netbox.crt

Но в моем случае, при наличии доменного центра сертификации я сгенерирую запрос на выдачу сертификата.

Для этого необходимо создать конфигурационный файл, например netbox_openssl.cnf:

[req]
distinguished_name=req_distinguished_name
promt = no
[ req_distinguished_name ]
commonName = FQDN of server
commonName_default = APACHE-SERVER.mydom.com
countryName = Country Name (2 letter code)
countryName_default = RU
0.organizationName = Organization Name (eg, company)
0.organizationName_default = MyCompany
localityName = Locality Name (eg, city)
localityName_default = Moscow
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default = MOSCOW
subjectAltName = domain name
subjectAltName_default = example.com

[req_ext]
subjectAltName = @alt_names

[alt_names]
DNS.1 = netbox.example.com
IP.1 = 172.16.1.100

Создаем закрытый ключ и запрос на сертификат:

# openssl genrsa -out netbox.example.com.key 2048
# openssl req -new -key netbox.example.com.key -config netbox_openssl.cnf -reqexts req_ext -out netbox.csr

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

Установка NGINX в качестве обратного прокси

Перед тем как ставить nginx нам надо создать каталог static если мы его еще не создали.

# ln -s /usr/local/bin/python3.11 /usr/local/bin/python3

И запускаем скрипт:

# chown -R netbox /usr/local/share/netbox-4.1.1/venv
$ sh /usr/local/share/netbox-4.1.1/upgrade.sh

Ставим nginx и включаем службу:

# pkg install nginx
# sysrc nginx_enable="YES"

Редактируем конфиг nginx где указываем location и пути до наших сертиков:

Запускаем службу и пробуем войти в netbox https://netbox.example.com

Настройка housekeeping

Для очистки старых заданий и очередей необходимо настроить housekeeping

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

/usr/local/bin/python3.11 /usr/local/share/netbox/netbox/manage.py housekeeping

 Или создаем  скрипт

Настройка Netbox RQ

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

Например мы сначала цепляем скрипт, а потом создаем задачу на его выполнение:

1728652313316-346.png

 

1728652385802-848.png

Для запуска службы нам по аналогии со службой netbox нужно создать файл скрипта службы:

#!/bin/sh

# This sample rc script starts the RQ worker background service which is
# required for Webhooks and various automation tasks.

#
# PROVIDE: netbox_rq
# REQUIRE: DAEMON
# KEYWORD: shutdown
#
# Add the following line to /etc/rc.conf.local or /etc/rc.conf
# to enable netbox-rq:
#
# netbox_rq_enable (bool):              Set to NO by default.
#                                       Set it to YES to enable netbox_rq.

. /etc/rc.subr

name=netbox_rq
rcvar=netbox_rq_enable

load_rc_config $name

start_cmd="netbox_rq_start"
start_precmd="netbox_rq_precmd"
command="/usr/local/share/netbox/venv/bin/python3.11"
command_args="/usr/local/share/netbox/netbox/manage.py rqworker"
pidfile=${netbox_rq_pidfile:-/var/run/${name}/${name}.pid}
netbox_rq_user=${netbox_rq_user:-netbox}


netbox_rq_precmd()
{
        install -d -o ${netbox_rq_user} `dirname ${pidfile}`
}

netbox_rq_start()
{
       echo "Starting netbox_rq."
        /usr/sbin/daemon -cf -p ${pidfile} -u ${netbox_rq_user} ${command} ${command_args}
}

run_rc_command "$1"

Дать разрешение на выполнения файла скрипта и добавить его rc.conf:

# chmod +x /usr/loca/etc/rc.d/netbox_rq
# sysrc netbox_rq_enable="YES"
# service netbox_rq start