Требования
Устанавливать будем на FreeBSD 14.1, для Linux дистрибутивов шаги особо ничем не будут отличаться.
Установка PostgreSQL
Смотрим какие версии у нас есть в репозитории, нам нужна версия 10 или выше.
Ставим последнюю доступную версию:
Включаем службу и инициализируем СУБД:
postgresql_enable: -> YES
# service postgresql initdb
Настраиваем pg_hba.conf
Где ADDRESS - IP адрес или сеть откуда мы сможем соединиться с нашей СУБД.
METHOD - метод авторизации, в данном случае это шифрованный пароль. (md5 - хешированный пароль).
Редактируем postgresql.conf:
Запускаем службу:
Подключаемся к СУБД
И создаем базу, пользователя netbox и даем пользователю права на базу:
CREATE USER netbox WITH PASSWORD 'P@ssw0rd!';
ALTER DATABASE netbox OWNER TO netbox;
GRANT CREATE ON SCHEMA public TO netbox;
Выходим, набирая \q.
Далее можно проверить соединение с БД для пользователя netbox
Установка Redis
Устанавливаем пакет Redis (в разных дистрибутивах он может назваться по разному, например: redis-server) и проверяем версию, она должна быть не ниже 4.0.
# redis-server -v
Redis server v=7.2.5 sha=00000000:0 malloc=libc bits=64 build=a673021ce8a50e10
Далее включаем службу и проверяем работоспособность сервиса.
redis_enable: -> YES
# service redis start
# redis-cli ping
PONG
Установка NetBox
Перед установкой нам нужно доставить все зависимости, для разных дистрибутивов пакеты будут называться по разному, лучше обратиться к официальной документации
Качаем последнюю стабильную версию с Github Releases netbox-community/netbox (github.com) , распаковываем архив и ставим, возможно нас попросят доставить зависимости, например django.
# 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 и выдаем ему права на каталоги:
# 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/
Доставляем зависимости (увидим какие при выполнении скрипта):
$ 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)$ cp configuration_example.py configuration.py
В файле конфигурации вводим настройки соединения с базой Postgresql и Redis:
'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)
}
'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.
Устанавливаем SECRET_KEY, который является секретной, псевдослучайная строкой, используемой для помощи в создании новых криптографических хэшей для паролей и файлов cookie HTTP. Ключ, определенный здесь, не должен распространяться за пределами файла конфигурации. может быть изменен в любое время без влияния на сохраненные данные, однако имейте в виду, что это приведет к аннулированию всех существующих пользовательских сессий. Развертывания NetBox, состоящие из нескольких узлов, должны иметь один и тот же секретный ключ, настроенный на всех узлах.SECRET_KEY.
(venv)$ python3.11 netbox/generate_secret_key.py
После выполнения скрипта, копируем секретный ключ в файл конфигурации configuration.py
Далее создаем структуру базы данных и суперпользователя:
(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)$ python3.11 manage.py runserver 0.0.0.0:8000 --insecure
Теперь мы можем зайти по адресу netbox.example.com:8000 под пользователем которого мы создали в предыдущем шаге.

Настройка запуска в качестве службы
Для запуска сервиса будем использовать WSGI-сервер Gunicorn.
Ставим Gunicorn:
Если для дистрибутивов Linux примеры конфигурационных файлов сервисов лежать в каталоге /netbox-4.1.1/contrib/, то для freebsd скопируем текст скрипта сервиса в файл /usr/local/etc/rc.d/netbox
# 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-скрипта
# chmod +x /usr/local/etc/rc.d/netbox
Теперь можно запускать службу.
P.S. После запуска службы лично она у меня сразу грохалась с ошибкой создания .pid файла, для этого я создал заранее каталог для pid файла netbox и сделал пользователя netbox его владельцем
# chown netbox /var/run/netbox
Создание SSL сертификата
Для работы через протокол https нам потребуется сертификат, мы может сгенерировать самоподписанный сертификат на 10 лет командой:
-keyout /etc/ssl/private/netbox.key \
-out /etc/ssl/certs/netbox.crt
Но в моем случае, при наличии доменного центра сертификации я сгенерирую запрос на выдачу сертификата.
Для этого необходимо создать конфигурационный файл, например netbox_openssl.cnf:
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 req -new -key netbox.example.com.key -config netbox_openssl.cnf -reqexts req_ext -out netbox.csr
По запросу выдаем сертификат и кидаем к нам на сервер.
Установка NGINX в качестве обратного прокси
Перед тем как ставить nginx нам надо создать каталог static если мы его еще не создали.
И запускаем скрипт:
$ sh /usr/local/share/netbox-4.1.1/upgrade.sh
Ставим nginx и включаем службу:
# sysrc nginx_enable="YES"
Редактируем конфиг nginx где указываем location и пути до наших сертиков:
Запускаем службу и пробуем войти в netbox https://netbox.example.com
Настройка housekeeping
Для очистки старых заданий и очередей необходимо настроить housekeeping
открываем cron и вставляем туда команду:
Или создаем скрипт
Настройка Netbox RQ
Данная служба отвечает за выполнение заданий запускаемых из NetBox и является по сути обычным планировщиком, через который мы можем выполнять скрипты по расписанию.
Например мы сначала цепляем скрипт, а потом создаем задачу на его выполнение:


Для запуска службы нам по аналогии со службой netbox нужно создать файл скрипта службы:
# 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:
# sysrc netbox_rq_enable="YES"
# service netbox_rq start