NETBOX — различия между версиями

Материал из megapuper
Перейти к: навигация, поиск
 
(не показано 26 промежуточных версий этого же участника)
Строка 1: Строка 1:
The following sections detail how to set up a new instance of NetBox:
+
Установим Netbox на Debian 13
  
PostgreSQL database<br>
 
  
Ставим PostgreSQL в данном случае версия 17
+
'''<font color=blue>PostgreSQL</font>'''<br>
 +
 
 +
Ставим БД, в данном случае версия 17
 
  apt install -y postgresql
 
  apt install -y postgresql
 
  sudo -u postgres psql
 
  sudo -u postgres psql
 +
  
 
Создаём базу и пользователя
 
Создаём базу и пользователя
Строка 14: Строка 16:
 
  \connect netbox;
 
  \connect netbox;
 
  GRANT CREATE ON SCHEMA public TO netbox;
 
  GRANT CREATE ON SCHEMA public TO netbox;
 +
  
 
Проверяем подключение
 
Проверяем подключение
Строка 27: Строка 30:
  
  
Redis<br>
+
'''<font color=blue>Redis</font>'''<br>
  
Устанавливаем редис сервер
+
Устанавливаем redis-сервер
  
 
  apt install -y redis-server
 
  apt install -y redis-server
 +
  
 
Проверяем
 
Проверяем
Строка 40: Строка 44:
  
  
NetBox components<br>
+
'''<font color=blue>Компоненты Netbox</font>'''<br>
  
 
Переходим к установке Netbox. Устанавливаемая версия 4.5 поддерживает Python 3.12 и выше
 
Переходим к установке Netbox. Устанавливаемая версия 4.5 поддерживает Python 3.12 и выше
  
  
Устанавливаем зависимости
+
Ставим зависимости
 
  apt install -y python3 python3-pip python3-venv python3-dev build-essential libxml2-dev libxslt1-dev libffi-dev libpq-dev libssl-dev zlib1g-dev
 
  apt install -y python3 python3-pip python3-venv python3-dev build-essential libxml2-dev libxslt1-dev libffi-dev libpq-dev libssl-dev zlib1g-dev
  
Строка 60: Строка 64:
  
 
Рекомендуется устанавливать NetBox в каталог, названный в соответствии с номером его версии. Например, NetBox v4.5.0 следует установить в /opt/netbox-4.5.0, а симлинк из /opt/netbox/ будет указывать на это местоположение. Это позволяет устанавливать будущие версии параллельно, не прерывая текущую установку. При переходе на новую версию необходимо обновить только симлинк.
 
Рекомендуется устанавливать NetBox в каталог, названный в соответствии с номером его версии. Например, NetBox v4.5.0 следует установить в /opt/netbox-4.5.0, а симлинк из /opt/netbox/ будет указывать на это местоположение. Это позволяет устанавливать будущие версии параллельно, не прерывая текущую установку. При переходе на новую версию необходимо обновить только симлинк.
 +
  
 
Создаём пользователя и даём ему права
 
Создаём пользователя и даём ему права
Строка 74: Строка 79:
  
 
Готовим конфиг<br>
 
Готовим конфиг<br>
<config>
 
#########################
 
#                      #
 
#  Required settings  #
 
#                      #
 
#########################
 
  
# This is a list of valid fully-qualified domain names (FQDNs) for the NetBox server. NetBox will not permit write
+
Основное блоки
# access to the server via any other hostnames. The first FQDN in the list will be treated as the preferred name.
+
* ALLOWED_HOSTS
#
+
* API_TOKEN_PEPPERS
# Example: ALLOWED_HOSTS = ['netbox.example.com', 'netbox.internal.local']
+
* DATABASES
ALLOWED_HOSTS = ['netboxold.iwad.ru', '172.16.37.26', '172.16.37.10']
+
* REDIS
 +
* SECRET_KEY
  
# PostgreSQL database configuration. See the Django documentation for a complete list of available parameters:
 
#  https://docs.djangoproject.com/en/stable/ref/settings/#databases
 
DATABASES = {
 
    'default': {
 
        'ENGINE': 'django.db.backends.postgresql',  # Database engine
 
        'NAME': 'netbox',        # Database name
 
        'USER': 'netbox',              # PostgreSQL username
 
        'PASSWORD': 'PvqMVVdLDb1Nz6gxZrwG',          # PostgreSQL password
 
        'HOST': 'localhost',      # Database server
 
        'PORT': '',              # Database port (leave blank for default)
 
        'CONN_MAX_AGE': 300,      # Max database connection age
 
    }
 
}
 
  
# Redis database settings. Redis is used for caching and for queuing background tasks such as webhook events. A separate
+
'''ALLOWED_HOSTS'''<br>
# configuration exists for each. Full connection details are required in both sections, and it is strongly recommended
+
Это список допустимых имен хостов и IP-адресов, с помощью которых можно получить доступ к этому серверу. Надо указать хотя бы одно имя или IP-адрес(Для проверки заголовка HTTP-узла)
# to use two separate database IDs.
+
ALLOWED_HOSTS = ['netbox.example.com', '192.0.2.123']
REDIS = {
 
    'tasks': {
 
        'HOST': 'localhost',
 
        'PORT': 6379,
 
        # Comment out `HOST` and `PORT` lines and uncomment the following if using Redis Sentinel
 
        # 'SENTINELS': [('mysentinel.redis.example.com', 6379)],
 
        # 'SENTINEL_SERVICE': 'netbox',
 
        'USERNAME': '',
 
        'PASSWORD': '',
 
        'DATABASE': 0,
 
        'SSL': False,
 
        # Set this to True to skip TLS certificate verification
 
        # This can expose the connection to attacks, be careful
 
        # 'INSECURE_SKIP_TLS_VERIFY': False,
 
        # Set a path to a certificate authority, typically used with a self signed certificate.
 
        # 'CA_CERT_PATH': '/etc/ssl/certs/ca.crt',
 
    },
 
    'caching': {
 
        'HOST': 'localhost',
 
        'PORT': 6379,
 
        # Comment out `HOST` and `PORT` lines and uncomment the following if using Redis Sentinel
 
        # 'SENTINELS': [('mysentinel.redis.example.com', 6379)],
 
        # 'SENTINEL_SERVICE': 'netbox',
 
        'USERNAME': '',
 
        'PASSWORD': '',
 
        'DATABASE': 1,
 
        'SSL': False,
 
        # Set this to True to skip TLS certificate verification
 
        # This can expose the connection to attacks, be careful
 
        # 'INSECURE_SKIP_TLS_VERIFY': False,
 
        # Set a path to a certificate authority, typically used with a self signed certificate.
 
        # 'CA_CERT_PATH': '/etc/ssl/certs/ca.crt',
 
    }
 
}
 
  
# This key is used for secure generation of random numbers and strings. It must never be exposed outside of this file.
 
# For optimal security, SECRET_KEY should be at least 50 characters in length and contain a mix of letters, numbers, and
 
# symbols. NetBox will not run without this defined. For more information, see
 
# https://docs.djangoproject.com/en/stable/ref/settings/#std:setting-SECRET_KEY
 
SECRET_KEY = 'N9-)X8OWr^aLQ-BL+dpNnR2r!uqV0bs%P8bHzEYUw2xrg73Ja4'
 
  
 +
'''API_TOKEN_PEPPERS'''<br>
 +
Код который будет использоваться для генерации контрольных сумм API-токенов
 +
API_TOKEN_PEPPERS = {
 +
    # DO NOT USE THIS EXAMPLE PEPPER IN PRODUCTION
 +
    1: 'kp7ht*76fiQAhUiiop086HfASLlYUE_S^gI^(7J^K5M!LfoH@vl&b_',
 +
}
  
#########################
+
Можем использовать generate_secret_key.py скрипт для генерации случайного pepper
#                      #
+
python3 ../generate_secret_key.py
#  Optional settings  #
 
#                      #
 
#########################
 
  
# Specify one or more name and email address tuples representing NetBox administrators. These people will be notified of
 
# application errors (assuming correct email settings are provided).
 
ADMINS = [
 
    # ('John Doe', 'jdoe@example.com'),
 
]
 
  
# Permit the retrieval of API tokens after their creation.
+
'''DATABASES'''<br>
ALLOW_TOKEN_RETRIEVAL = False
+
Задаём параметры подключения к БД
 +
DATABASES = {
 +
    'default': {
 +
        'NAME': 'netbox',              # Database name
 +
        'USER': 'netbox',              # PostgreSQL username
 +
        'PASSWORD': 'STronGPassWord',  # PostgreSQL password
 +
        'HOST': 'localhost',            # Database server
 +
        'PORT': '',                      # Database port (leave blank for default)
 +
        'CONN_MAX_AGE': 300,            # Max database connection age (seconds)
 +
    }
 +
}
  
# Enable any desired validators for local account passwords below. For a list of included validators, please see the
 
# Django documentation at https://docs.djangoproject.com/en/stable/topics/auth/passwords/#password-validation.
 
AUTH_PASSWORD_VALIDATORS = [
 
    # {
 
    #    'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
 
    #    'OPTIONS': {
 
    #        'min_length': 10,
 
    #    }
 
    # },
 
]
 
  
# Base URL path if accessing NetBox within a directory. For example, if installed at https://example.com/netbox/, set:
+
'''REDIS'''<br>
# BASE_PATH = 'netbox/'
+
Задаём параметры подключения к redis-серверу
BASE_PATH = ''
+
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,
 +
    }
 +
}
  
# API Cross-Origin Resource Sharing (CORS) settings. If CORS_ORIGIN_ALLOW_ALL is set to True, all origins will be
+
'''SECRET_KEY'''<br>
# allowed. Otherwise, define a list of allowed origins using either CORS_ORIGIN_WHITELIST or
+
Создаём secret-key
# CORS_ORIGIN_REGEX_WHITELIST. For more information, see https://github.com/ottoyiu/django-cors-headers
+
python3 ../generate_secret_key.py
CORS_ORIGIN_ALLOW_ALL = False
 
CORS_ORIGIN_WHITELIST = [
 
#    'https://netbox.iwad.ru',
 
]
 
CORS_ORIGIN_REGEX_WHITELIST = [
 
    # r'^(https?://)?(\w+\.)?example\.com$',
 
]
 
  
# The name to use for the CSRF token cookie.
 
#CSRF_COOKIE_NAME = 'csrftoken'
 
  
CSRF_TRUSTED_ORIGINS = ['https://netboxold.iwad.ru']
+
Пример конфига
 +
ALLOWED_HOSTS = ['netbox.iwad.ru', '172.16.37.28', '172.16.37.10']
 +
 +
DATABASES = {
 +
    'default': {
 +
        'ENGINE': 'django.db.backends.postgresql',  # Database engine
 +
        'NAME': 'netbox',        # Database name
 +
        'USER': 'netbox',        # PostgreSQL username
 +
        'PASSWORD': 'PASSWORD',  # PostgreSQL password
 +
        'HOST': 'localhost',      # Database server
 +
        'PORT': '',              # Database port (leave blank for default)
 +
        'CONN_MAX_AGE': 300,      # Max database connection age
 +
    }
 +
}
 +
 +
REDIS = {
 +
    'tasks': {
 +
        'HOST': 'localhost',
 +
        'PORT': 6379,
 +
        'USERNAME': '',
 +
        'PASSWORD': '',
 +
        'DATABASE': 0,
 +
        'SSL': False,
 +
    },
 +
    'caching': {
 +
        'HOST': 'localhost',
 +
        'PORT': 6379,
 +
        'USERNAME': '',
 +
        'PASSWORD': '',
 +
        'DATABASE': 1,
 +
        'SSL': False,
 +
    }
 +
}
 +
 +
SECRET_KEY = 'N9-)X8OWr^aLQ-BL+dpNn897gdfg0bs%P8bHzEYUw2xrg73Ja4'
 +
 +
# Optional settings  #
 +
ADMINS = [
 +
    # ('John Doe', 'jdoe@example.com'),
 +
]
 +
 +
# Permit the retrieval of API tokens after their creation.
 +
ALLOW_TOKEN_RETRIEVAL = False
 +
 +
# Base URL path if accessing NetBox within a directory. For example, if installed at https://example.com/netbox/, set:
 +
# BASE_PATH = 'netbox/'
 +
BASE_PATH = ''
 +
 +
# API Cross-Origin Resource Sharing (CORS) settings. If CORS_ORIGIN_ALLOW_ALL is set to True, all origins will be
 +
# allowed. Otherwise, define a list of allowed origins using either CORS_ORIGIN_WHITELIST or
 +
# CORS_ORIGIN_REGEX_WHITELIST. For more information, see https://github.com/ottoyiu/django-cors-headers
 +
CORS_ORIGIN_ALLOW_ALL = False
 +
CORS_ORIGIN_WHITELIST = [
 +
  #    'https://hostname.example.com'',
 +
]
 +
CORS_ORIGIN_REGEX_WHITELIST = [
 +
    # r'^(https?://)?(\w+\.)?example\.com$',
 +
]
 +
 +
# The name to use for the CSRF token cookie.
 +
#CSRF_COOKIE_NAME = 'csrftoken'
 +
 +
CSRF_TRUSTED_ORIGINS = ['https://netbox.iwad.ru']
 +
 +
# Enable installed plugins. Add the name of each plugin to the list.
 +
PLUGINS = [
 +
#"netbox_ipcalculator",
 +
]
 +
 +
# Remote authentication support
 +
REMOTE_AUTH_ENABLED = False
 +
REMOTE_AUTH_BACKEND = 'netbox.authentication.LDAPBackend'
 +
REMOTE_AUTH_HEADER = 'HTTP_REMOTE_USER'
 +
REMOTE_AUTH_USER_FIRST_NAME = 'HTTP_REMOTE_USER_FIRST_NAME'
 +
REMOTE_AUTH_USER_LAST_NAME = 'HTTP_REMOTE_USER_LAST_NAME'
 +
REMOTE_AUTH_USER_EMAIL = 'HTTP_REMOTE_USER_EMAIL'
 +
REMOTE_AUTH_AUTO_CREATE_USER = True
 +
REMOTE_AUTH_DEFAULT_GROUPS = []
 +
REMOTE_AUTH_DEFAULT_PERMISSIONS = {}
  
# Set to True to enable server debugging. WARNING: Debugging introduces a substantial performance penalty and may reveal
 
# sensitive information about your installation. Only enable debugging while performing testing. Never enable debugging
 
# on a production system.
 
DEBUG = False
 
  
# Set the default preferred language/locale
+
Запускаем установку Netbox
DEFAULT_LANGUAGE = 'en-us'
+
/opt/netbox/upgrade.sh
  
# Email settings
 
EMAIL = {
 
    'SERVER': 'localhost',
 
    'PORT': 25,
 
    'USERNAME': '',
 
    'PASSWORD': '',
 
    'USE_SSL': False,
 
    'USE_TLS': False,
 
    'TIMEOUT': 10,  # seconds
 
    'FROM_EMAIL': '',
 
}
 
  
# Exempt certain models from the enforcement of view permissions. Models listed here will be viewable by all users and
+
Запускаем виртуальное окружение и создаём суперпользователя
# by anonymous users. List models in the form `<app>.<model>`. Add '*' to this list to exempt all models.
+
source /opt/netbox/venv/bin/activate
EXEMPT_VIEW_PERMISSIONS = [
+
    # 'dcim.site',
+
cd /opt/netbox/netbox
    # 'dcim.region',
+
python3 manage.py createsuperuser
    # 'ipam.prefix',
 
]
 
  
# HTTP proxies NetBox should use when sending outbound HTTP requests (e.g. for webhooks).
 
# HTTP_PROXIES = {
 
#    'http': 'http://10.10.1.10:3128',
 
#    'https': 'http://10.10.1.10:1080',
 
# }
 
  
# IP addresses recognized as internal to the system. The debugging toolbar will be available only to clients accessing
+
Netbox работает как WSGI-приложение за HTTP-сервером. В нашем примере показано, как установить и настроить uWSGI для этой роли, однако доступны и другие WSGI-серверы, которые должны работать аналогично.
# NetBox from an internal IP.
 
INTERNAL_IPS = ('127.0.0.1', '::1')
 
  
# Enable custom logging. Please see the Django documentation for detailed guidance on configuring custom logs:
+
Запускаем виртуальное окружение, если вышли на прошлом шаге, и ставим pyuwsgi
#  https://docs.djangoproject.com/en/stable/topics/logging/
+
source /opt/netbox/venv/bin/activate
LOGGING = {}
+
pip3 install pyuwsgi
  
# Automatically reset the lifetime of a valid session upon each authenticated request. Enables users to remain
 
# authenticated to NetBox indefinitely.
 
LOGIN_PERSISTENCE = False
 
  
# Setting this to False will permit unauthenticated users to access most areas of NetBox (but not make any changes).
+
После установки добавим пакет в файл local_requirements.txt, чтобы обеспечить его повторную установку при последующих пересборках виртуальной среды
LOGIN_REQUIRED = True
+
echo 'pyuwsgi' >> /opt/netbox/local_requirements.txt
  
# The length of time (in seconds) for which a user will remain logged into the web UI before being prompted to
 
# re-authenticate. (Default: 1209600 [14 days])
 
LOGIN_TIMEOUT = None
 
  
# Hide the login form. Useful when only allowing SSO authentication.
+
Копируем дефолтный конфиг, его вполне достаточно для работы
LOGIN_FORM_HIDDEN = False
+
cp /opt/netbox/contrib/uwsgi.ini /opt/netbox/uwsgi.ini
  
# The view name or URL to which users are redirected after logging out.
 
LOGOUT_REDIRECT_URL = 'home'
 
  
# The file path where uploaded media such as image attachments are stored. A trailing slash is not needed. Note that
+
Далее скопируем файлы systemd для управления uWSGI и фоновым рабочим процессом NetBox
# the default value of this setting is derived from the installed location.
+
cp -v /opt/netbox/contrib/*.service /etc/systemd/system/
# MEDIA_ROOT = '/opt/netbox/netbox/media'
 
  
# Expose Prometheus monitoring metrics at the HTTP endpoint '/metrics'
 
METRICS_ENABLED = False
 
  
# Enable installed plugins. Add the name of each plugin to the list.
+
Отредактируем файл netbox.service, удалив строку начинающуюся с ExecStart=/opt/netbox/venv/bin/gunicorn, и раскомментируем строку с ExecStart=/opt/netbox/venv/bin/uwsgi
PLUGINS = [
+
  systemctl daemon-reload
#"netbox_ipcalculator",
 
]
 
  
# Plugins configuration settings. These settings are used by various plugins that the user may have installed.
 
# Each key in the dictionary is the name of an installed plugin and its value is a dictionary of settings.
 
# PLUGINS_CONFIG = {
 
#    'my_plugin': {
 
#        'foo': 'bar',
 
#        'buzz': 'bazz'
 
#    }
 
# }
 
  
# Remote authentication support
+
Стартуем сервис и проверяем, что он запустился
REMOTE_AUTH_ENABLED = True
+
systemctl enable --now netbox netbox-rq
REMOTE_AUTH_BACKEND = 'netbox.authentication.LDAPBackend'
+
systemctl status netbox.service
REMOTE_AUTH_HEADER = 'HTTP_REMOTE_USER'
 
REMOTE_AUTH_USER_FIRST_NAME = 'HTTP_REMOTE_USER_FIRST_NAME'
 
REMOTE_AUTH_USER_LAST_NAME = 'HTTP_REMOTE_USER_LAST_NAME'
 
REMOTE_AUTH_USER_EMAIL = 'HTTP_REMOTE_USER_EMAIL'
 
REMOTE_AUTH_AUTO_CREATE_USER = True
 
REMOTE_AUTH_DEFAULT_GROUPS = []
 
REMOTE_AUTH_DEFAULT_PERMISSIONS = {}
 
  
# This repository is used to check whether there is a new release of NetBox available. Set to None to disable the
 
# version check or use the URL below to check for release in the official NetBox repository.
 
RELEASE_CHECK_URL = None
 
# RELEASE_CHECK_URL = 'https://api.github.com/repos/netbox-community/netbox/releases'
 
  
# The file path where custom reports will be stored. A trailing slash is not needed. Note that the default value of
+
Для удобства поставим Nginx и добавим конфиг для Netbox
# this setting is derived from the installed location.
+
server {
# REPORTS_ROOT = '/opt/netbox/netbox/reports'
+
        listen 80;
 
+
        server_name netboxold.iwad.ru;
# Maximum execution time for background tasks, in seconds.
+
RQ_DEFAULT_TIMEOUT = 300
+
location /static/ {
 
+
        alias /opt/netbox/netbox/static/;
# The file path where custom scripts will be stored. A trailing slash is not needed. Note that the default value of
+
    }
# this setting is derived from the installed location.
+
# SCRIPTS_ROOT = '/opt/netbox/netbox/scripts'
+
location / {
 
+
        # proxy_pass http://127.0.0.1:8001;
# The name to use for the session cookie.
+
        # proxy_set_header X-Forwarded-Host $http_host;
SESSION_COOKIE_NAME = 'sessionid'
+
        # proxy_set_header X-Real-IP $remote_addr;
 
+
        # proxy_set_header X-Forwarded-Proto $scheme;
# By default, NetBox will store session data in the database. Alternatively, a file path can be specified here to use
+
        # comment the lines above and uncomment the lines below if using uWSGI
# local file storage instead. (This can be useful for enabling authentication on a standby instance with read-only
+
        include uwsgi_params;
# database access.) Note that the user as which NetBox runs must have read and write permissions to this path.
+
        uwsgi_pass  127.0.0.1:8001;
SESSION_FILE_PATH = None
+
        uwsgi_param Host $host;
 
+
        uwsgi_param X-Real-IP $remote_addr;
# By default the memory and disk sizes are displayed using base 10 (e.g. 1000 MB = 1 GB).
+
        uwsgi_param X-Forwarded-For $proxy_add_x_forwarded_for;
# If you would like to use base 2 (e.g. 1024 MB = 1 GB) set this to 1024.
+
        uwsgi_param X-Forwarded-Proto $http_x_forwarded_proto;
# DISK_BASE_UNIT = 1024
+
# RAM_BASE_UNIT = 1024
+
        access_log /var/log/nginx/netbox.access.log;
 
+
        error_log  /var/log/nginx/netbox.error.log;
# Within the STORAGES dictionary, "default" is used for image uploads, "staticfiles" is for static files and "scripts"
+
       
# is used for custom scripts. See django-storages and django-storage-swift libraries for more details. By default the
+
        location = /favicon.ico {
# following configuration is used:
+
            log_not_found off;
# STORAGES = {
+
            access_log off;
#    "default": {
+
                }
#        "BACKEND": "django.core.files.storage.FileSystemStorage",
+
          location ~ /\.ht {
#    },
+
            deny all;
#    "staticfiles": {
+
              }
#        "BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage",
+
    }
#    },
+
}
#    "scripts": {
 
#        "BACKEND": "extras.storage.ScriptFileSystemStorage",
 
#    },
 
# }
 
 
 
# Time zone (default: UTC)
 
TIME_ZONE = 'UTC'
 
 
 
</config>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
uWSGI<br>
 
HTTP server<br>
 
LDAP authentication (optional)<br>
 
  
  
 +
Установка завершена, заходим в браузер и смотрим картинки
  
  
 +
<font color=blue>'''LDAP аутентификация'''</font><br>
  
 +
Ставим нужные пакеты
 +
apt install -y libldap2-dev libsasl2-dev libssl-dev
  
  
 +
Запускаем виртуальное окружение, если вышли на прошлом шаге, и ставим django-auth-ldap
 +
source /opt/netbox/venv/bin/activate
 +
pip3 install django-auth-ldap
  
  
 +
После установки добавим пакет в файл local_requirements.txt, чтобы обеспечить его повторную установку при последующих пересборках виртуальной среды
 +
echo 'django-auth-ldap' >> /opt/netbox/local_requirements.txt
  
  
 +
Включаем ldap-аутентификацию в <code>configuration.py</code>
 +
REMOTE_AUTH_ENABLED = True
 +
REMOTE_AUTH_BACKEND = 'netbox.authentication.LDAPBackend'
  
  
 +
Далее создаём файл в той же директории, что и configuration.py(обычно /opt/netbox/netbox/netbox/), с именем ldap_config.py и определяем все необходимые параметры
 +
import ldap
 +
from django_auth_ldap.config import LDAPSearch, GroupOfNamesType, LDAPGroupQuery
 +
 +
# включение логирования
 +
#import logging
 +
#logger = logging.getLogger('django_auth_ldap')
 +
#logger.addHandler(logging.StreamHandler())
 +
#logger.setLevel(logging.DEBUG)
 +
 +
# Server URI
 +
AUTH_LDAP_SERVER_URI = "ldap://ldap.iwad.ru"
 +
 
 +
# Set the DN and password for the NetBox service account.
 +
AUTH_LDAP_BIND_DN = "cn=admin,dc=iwad,dc=ru"
 +
AUTH_LDAP_BIND_PASSWORD = "kQN5UVz3jISa9LLvk2q5"
 +
#AUTH_LDAP_BIND_DN = "cn=netbox,dc=iwad,dc=ru"
 +
#AUTH_LDAP_BIND_PASSWORD = "FepfLVh8xjd9xnN7fZqv"
  
 +
# Include this setting if you want to ignore certificate errors. This might be needed to accept a self-signed cert.
 +
# Note that this is a NetBox-specific setting which sets:
 +
#    ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
 +
LDAP_IGNORE_CERT_ERRORS = True
 +
 +
# Include this setting if you want to validate the LDAP server certificates against a CA certificate directory on your server
 +
# Note that this is a NetBox-specific setting which sets:
 +
#    ldap.set_option(ldap.OPT_X_TLS_CACERTDIR, LDAP_CA_CERT_DIR)
 +
LDAP_CA_CERT_DIR = '/etc/ssl/certs'
 +
 +
# User configuration
 +
AUTH_LDAP_USER_SEARCH = LDAPSearch("ou=users,dc=iwad,dc=ru", ldap.SCOPE_SUBTREE,"(uid=%(user)s)")
 +
AUTH_LDAP_USER_DN_TEMPLATE = None
 +
AUTH_LDAP_USER_ATTR_MAP = {
 +
    "first_name": "givenName",
 +
    "last_name": "sn",
 +
    "email": "mail"
 +
}
 +
 +
AUTH_LDAP_GROUP_SEARCH = LDAPSearch("groups,dc=iwad,dc=ru", ldap.SCOPE_SUBTREE, "(objectClass=groupOfNames)")
 +
# Ограничение доступа только для группы netbox_users
 +
AUTH_LDAP_REQUIRE_GROUP = "cn=netbox_users,ou=groups,dc=iwad,dc=ru"
 +
 +
AUTH_LDAP_GROUP_TYPE = GroupOfNamesType()
 +
AUTH_LDAP_CACHE_TIMEOUT = 3600
  
  
 +
Перезагружаем Netbox и проверяем авторизацию
 +
systemctl restart netbox
  
  
https://nixhub.ru/posts/netbox-install/<br>
+
Здесь тоже самое на англицком https://netboxlabs.com/docs/netbox/installation/
https://netboxlabs.com/docs/netbox/installation/
 

Текущая версия на 16:19, 15 марта 2026

Установим Netbox на Debian 13


PostgreSQL

Ставим БД, в данном случае версия 17

apt install -y postgresql
sudo -u postgres psql


Создаём базу и пользователя

CREATE DATABASE netbox;
CREATE USER netbox WITH PASSWORD 'пароль';
ALTER DATABASE netbox OWNER TO netbox;
-- the next two commands are needed on PostgreSQL 15 and later
\connect netbox;
GRANT CREATE ON SCHEMA public TO netbox;


Проверяем подключение

root@netbox ~ # psql --username netbox --password --host localhost netbox
Password: 
psql (17.8 (Debian 17.8-1.pgdg13+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off, ALPN: postgresql)
Type "help" for help.

netbox=> \conninfo
You are connected to database "netbox" as user "netbox" on host "localhost" (address "127.0.0.1") at port "5432".
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off, ALPN: postgresql)


Redis

Устанавливаем redis-сервер

apt install -y redis-server


Проверяем

# redis-server -v
Redis server v=8.0.2 sha=00000000:0 malloc=jemalloc-5.3.0 bits=64 build=3951f4e1c0288395
# redis-cli ping
PONG


Компоненты Netbox

Переходим к установке Netbox. Устанавливаемая версия 4.5 поддерживает Python 3.12 и выше


Ставим зависимости

apt install -y python3 python3-pip python3-venv python3-dev build-essential libxml2-dev libxslt1-dev libffi-dev libpq-dev libssl-dev zlib1g-dev


Проверяем версию Python после установки

python3 -V
Python 3.13.5


Определяемся с версией Netbox https://github.com/netbox-community/netbox/releases и скачиваем

wget https://github.com/netbox-community/netbox/archive/refs/tags/vX.Y.Z.tar.gz
tar -xzf vX.Y.Z.tar.gz -C /opt
ln -s /opt/netbox-X.Y.Z/ /opt/netbox

Рекомендуется устанавливать NetBox в каталог, названный в соответствии с номером его версии. Например, NetBox v4.5.0 следует установить в /opt/netbox-4.5.0, а симлинк из /opt/netbox/ будет указывать на это местоположение. Это позволяет устанавливать будущие версии параллельно, не прерывая текущую установку. При переходе на новую версию необходимо обновить только симлинк.


Создаём пользователя и даём ему права

adduser --system --group netbox
chown --recursive netbox /opt/netbox/netbox/media/
chown --recursive netbox /opt/netbox/netbox/reports/
chown --recursive netbox /opt/netbox/netbox/scripts/


Переходим к конфигурационному файлу

cd /opt/netbox/netbox/netbox/
cp configuration_example.py configuration.py


Готовим конфиг

Основное блоки

  • ALLOWED_HOSTS
  • API_TOKEN_PEPPERS
  • DATABASES
  • REDIS
  • SECRET_KEY


ALLOWED_HOSTS
Это список допустимых имен хостов и IP-адресов, с помощью которых можно получить доступ к этому серверу. Надо указать хотя бы одно имя или IP-адрес(Для проверки заголовка HTTP-узла)

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


API_TOKEN_PEPPERS
Код который будет использоваться для генерации контрольных сумм API-токенов

API_TOKEN_PEPPERS = {
    # DO NOT USE THIS EXAMPLE PEPPER IN PRODUCTION
    1: 'kp7ht*76fiQAhUiiop086HfASLlYUE_S^gI^(7J^K5M!LfoH@vl&b_',
}

Можем использовать generate_secret_key.py скрипт для генерации случайного pepper

python3 ../generate_secret_key.py


DATABASES
Задаём параметры подключения к БД

DATABASES = {
    'default': {
        'NAME': 'netbox',               # Database name
        'USER': 'netbox',               # PostgreSQL username
        'PASSWORD': 'STronGPassWord',   # PostgreSQL password
        'HOST': 'localhost',            # Database server
        'PORT': ,                      # Database port (leave blank for default)
        'CONN_MAX_AGE': 300,            # Max database connection age (seconds)
    }
}


REDIS
Задаём параметры подключения к redis-серверу

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,
    }
}

SECRET_KEY
Создаём secret-key

python3 ../generate_secret_key.py


Пример конфига

ALLOWED_HOSTS = ['netbox.iwad.ru', '172.16.37.28', '172.16.37.10']

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',  # Database engine
        'NAME': 'netbox',         # Database name
        'USER': 'netbox',         # PostgreSQL username
        'PASSWORD': 'PASSWORD',   # PostgreSQL password
        'HOST': 'localhost',      # Database server
        'PORT': ,               # Database port (leave blank for default)
        'CONN_MAX_AGE': 300,      # Max database connection age
    }
}

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

SECRET_KEY = 'N9-)X8OWr^aLQ-BL+dpNn897gdfg0bs%P8bHzEYUw2xrg73Ja4'

# Optional settings   #
ADMINS = [
    # ('John Doe', 'jdoe@example.com'),
]

# Permit the retrieval of API tokens after their creation.
ALLOW_TOKEN_RETRIEVAL = False

# Base URL path if accessing NetBox within a directory. For example, if installed at https://example.com/netbox/, set:
# BASE_PATH = 'netbox/'
BASE_PATH = 

# API Cross-Origin Resource Sharing (CORS) settings. If CORS_ORIGIN_ALLOW_ALL is set to True, all origins will be
# allowed. Otherwise, define a list of allowed origins using either CORS_ORIGIN_WHITELIST or
# CORS_ORIGIN_REGEX_WHITELIST. For more information, see https://github.com/ottoyiu/django-cors-headers
CORS_ORIGIN_ALLOW_ALL = False
CORS_ORIGIN_WHITELIST = [
 #     'https://hostname.example.com,
]
CORS_ORIGIN_REGEX_WHITELIST = [
    # r'^(https?://)?(\w+\.)?example\.com$',
]

# The name to use for the CSRF token cookie.
#CSRF_COOKIE_NAME = 'csrftoken'

CSRF_TRUSTED_ORIGINS = ['https://netbox.iwad.ru']

# Enable installed plugins. Add the name of each plugin to the list.
PLUGINS = [
#"netbox_ipcalculator",
]

# Remote authentication support
REMOTE_AUTH_ENABLED = False
REMOTE_AUTH_BACKEND = 'netbox.authentication.LDAPBackend'
REMOTE_AUTH_HEADER = 'HTTP_REMOTE_USER'
REMOTE_AUTH_USER_FIRST_NAME = 'HTTP_REMOTE_USER_FIRST_NAME'
REMOTE_AUTH_USER_LAST_NAME = 'HTTP_REMOTE_USER_LAST_NAME'
REMOTE_AUTH_USER_EMAIL = 'HTTP_REMOTE_USER_EMAIL'
REMOTE_AUTH_AUTO_CREATE_USER = True
REMOTE_AUTH_DEFAULT_GROUPS = []
REMOTE_AUTH_DEFAULT_PERMISSIONS = {}


Запускаем установку Netbox

/opt/netbox/upgrade.sh


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

source /opt/netbox/venv/bin/activate

cd /opt/netbox/netbox
python3 manage.py createsuperuser


Netbox работает как WSGI-приложение за HTTP-сервером. В нашем примере показано, как установить и настроить uWSGI для этой роли, однако доступны и другие WSGI-серверы, которые должны работать аналогично.

Запускаем виртуальное окружение, если вышли на прошлом шаге, и ставим pyuwsgi

source /opt/netbox/venv/bin/activate
pip3 install pyuwsgi


После установки добавим пакет в файл local_requirements.txt, чтобы обеспечить его повторную установку при последующих пересборках виртуальной среды

echo 'pyuwsgi' >> /opt/netbox/local_requirements.txt


Копируем дефолтный конфиг, его вполне достаточно для работы

cp /opt/netbox/contrib/uwsgi.ini /opt/netbox/uwsgi.ini


Далее скопируем файлы systemd для управления uWSGI и фоновым рабочим процессом NetBox

cp -v /opt/netbox/contrib/*.service /etc/systemd/system/


Отредактируем файл netbox.service, удалив строку начинающуюся с ExecStart=/opt/netbox/venv/bin/gunicorn, и раскомментируем строку с ExecStart=/opt/netbox/venv/bin/uwsgi

 systemctl daemon-reload


Стартуем сервис и проверяем, что он запустился

systemctl enable --now netbox netbox-rq
systemctl status netbox.service


Для удобства поставим Nginx и добавим конфиг для Netbox

server {
        listen 80;
        server_name netboxold.iwad.ru;

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

location / {
        # proxy_pass http://127.0.0.1:8001;
        # proxy_set_header X-Forwarded-Host $http_host;
        # proxy_set_header X-Real-IP $remote_addr;
        # proxy_set_header X-Forwarded-Proto $scheme;
        # comment the lines above and uncomment the lines below if using uWSGI
        include uwsgi_params;
        uwsgi_pass  127.0.0.1:8001;
        uwsgi_param Host $host;
        uwsgi_param X-Real-IP $remote_addr;
        uwsgi_param X-Forwarded-For $proxy_add_x_forwarded_for;
        uwsgi_param X-Forwarded-Proto $http_x_forwarded_proto;

        access_log /var/log/nginx/netbox.access.log;
        error_log  /var/log/nginx/netbox.error.log;
       
        location = /favicon.ico {
            log_not_found off;
            access_log off;
               }
         location ~ /\.ht {
            deny all;
              }
    }
}


Установка завершена, заходим в браузер и смотрим картинки


LDAP аутентификация

Ставим нужные пакеты

apt install -y libldap2-dev libsasl2-dev libssl-dev


Запускаем виртуальное окружение, если вышли на прошлом шаге, и ставим django-auth-ldap

source /opt/netbox/venv/bin/activate
pip3 install django-auth-ldap


После установки добавим пакет в файл local_requirements.txt, чтобы обеспечить его повторную установку при последующих пересборках виртуальной среды

echo 'django-auth-ldap' >> /opt/netbox/local_requirements.txt


Включаем ldap-аутентификацию в configuration.py

REMOTE_AUTH_ENABLED = True
REMOTE_AUTH_BACKEND = 'netbox.authentication.LDAPBackend'


Далее создаём файл в той же директории, что и configuration.py(обычно /opt/netbox/netbox/netbox/), с именем ldap_config.py и определяем все необходимые параметры

import ldap
from django_auth_ldap.config import LDAPSearch, GroupOfNamesType, LDAPGroupQuery

# включение логирования
#import logging
#logger = logging.getLogger('django_auth_ldap')
#logger.addHandler(logging.StreamHandler())
#logger.setLevel(logging.DEBUG)

# Server URI
AUTH_LDAP_SERVER_URI = "ldap://ldap.iwad.ru"
 
# Set the DN and password for the NetBox service account.
AUTH_LDAP_BIND_DN = "cn=admin,dc=iwad,dc=ru"
AUTH_LDAP_BIND_PASSWORD = "kQN5UVz3jISa9LLvk2q5"
#AUTH_LDAP_BIND_DN = "cn=netbox,dc=iwad,dc=ru"
#AUTH_LDAP_BIND_PASSWORD = "FepfLVh8xjd9xnN7fZqv"
# Include this setting if you want to ignore certificate errors. This might be needed to accept a self-signed cert.
# Note that this is a NetBox-specific setting which sets:
#     ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
LDAP_IGNORE_CERT_ERRORS = True

# Include this setting if you want to validate the LDAP server certificates against a CA certificate directory on your server
# Note that this is a NetBox-specific setting which sets:
#     ldap.set_option(ldap.OPT_X_TLS_CACERTDIR, LDAP_CA_CERT_DIR)
LDAP_CA_CERT_DIR = '/etc/ssl/certs'

# User configuration
AUTH_LDAP_USER_SEARCH = LDAPSearch("ou=users,dc=iwad,dc=ru", ldap.SCOPE_SUBTREE,"(uid=%(user)s)")
AUTH_LDAP_USER_DN_TEMPLATE = None
AUTH_LDAP_USER_ATTR_MAP = {
    "first_name": "givenName",
    "last_name": "sn",
    "email": "mail"
}

AUTH_LDAP_GROUP_SEARCH = LDAPSearch("groups,dc=iwad,dc=ru", ldap.SCOPE_SUBTREE, "(objectClass=groupOfNames)")
# Ограничение доступа только для группы netbox_users
AUTH_LDAP_REQUIRE_GROUP = "cn=netbox_users,ou=groups,dc=iwad,dc=ru"

AUTH_LDAP_GROUP_TYPE = GroupOfNamesType()
AUTH_LDAP_CACHE_TIMEOUT = 3600


Перезагружаем Netbox и проверяем авторизацию

systemctl restart netbox


Здесь тоже самое на англицком https://netboxlabs.com/docs/netbox/installation/