NetBox в Docker Compose: готовый файл
Учёт IP-адресов в экселе разваливается быстро: кто-то занял адрес мимо таблицы, дубликаты никто не подсвечивает, а найти свободный блок под новый сервис — уже квест на полчаса. Когда серверов десятки, а стоек или локаций больше одной, ручной учёт превращается в источник инцидентов, а не в документацию. NetBox закрывает эту дыру: единая база IP-планов, VLAN, стоек и оборудования с REST/GraphQL API поверх неё. Ниже — рабочий docker-compose.yml, с которым NetBox поднимается за вечер, разбор каждого параметра и грабли первого запуска.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что такое NetBox и когда он реально нужен
NetBox — это открытая (Apache 2.0) IPAM/DCIM-система, которую изначально написали в DigitalOcean для собственной инфраструктуры, а сейчас её развивает сообщество под крылом NetBox Labs. Два слоя функциональности:
- IPAM (IP Address Management) — префиксы, IP-адреса, VLAN, VRF, агрегаты, роли адресов. Система сама подсвечивает пересечения подсетей и занятые адреса, умеет искать свободный блок нужного размера.
- DCIM (Data Center Infrastructure Management) — сайты, стойки (с визуальной схемой юнитов), устройства, порты, кабели между ними, инвентарные номера.
Сверху — тенанты (мультиарендность), схемы кабелей и цепей провайдеров (circuits), кастомные поля, теги, шаблоны отчётов на Python и вебхуки. Из NetBox можно тянуть данные через API в Ansible-инвентарь или Terraform-провайдер — это его главное отличие от таблицы: он не просто хранит данные, а отдаёт их машинам.
Разворачивать стоит, когда серверов больше десятка, локаций или стоек несколько, а IP-планом пользуется больше одного человека. Для трёх VPS в одной подсети это избыточно, хватит README с таблицей. NetBox также не заменяет мониторинг — он не проверяет, жив ли хост, а отвечает на вопрос «что вообще есть в инфраструктуре и где».
Готовый docker-compose.yml
Официальный проект netbox-community/netbox-docker собирает стек из нескольких образов: Postgres для данных, два инстанса Redis (очередь задач и кэш) и сам NetBox в трёх ролях — веб, воркер фоновых задач и housekeeping для чистки истёкших сессий. Ниже — компактный вариант для одного узла.
version: "3.8"
services:
postgres:
image: postgres:16-alpine
container_name: netbox-postgres
restart: unless-stopped
environment:
POSTGRES_DB: netbox
POSTGRES_USER: netbox
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- netbox-postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U netbox"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
container_name: netbox-redis
restart: unless-stopped
command: redis-server --requirepass ${REDIS_PASSWORD} --appendonly yes
volumes:
- netbox-redis-data:/data
redis-cache:
image: redis:7-alpine
container_name: netbox-redis-cache
restart: unless-stopped
command: redis-server --requirepass ${REDIS_CACHE_PASSWORD}
volumes:
- netbox-redis-cache-data:/data
netbox:
image: netboxcommunity/netbox:v4.1
container_name: netbox
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_started
redis-cache:
condition: service_started
env_file: .env
ports:
- "127.0.0.1:8080:8080"
volumes:
- netbox-media:/opt/netbox/netbox/media
- netbox-reports:/opt/netbox/netbox/reports
- netbox-scripts:/opt/netbox/netbox/scripts
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/login/"]
interval: 30s
timeout: 10s
retries: 3
netbox-worker:
image: netboxcommunity/netbox:v4.1
container_name: netbox-worker
restart: unless-stopped
command: /opt/netbox/venv/bin/python /opt/netbox/netbox/manage.py rqworker high default low
depends_on:
- netbox
env_file: .env
volumes:
- netbox-media:/opt/netbox/netbox/media
- netbox-reports:/opt/netbox/netbox/reports
- netbox-scripts:/opt/netbox/netbox/scripts
netbox-housekeeping:
image: netboxcommunity/netbox:v4.1
container_name: netbox-housekeeping
restart: unless-stopped
command: /opt/netbox/housekeeping.sh
depends_on:
- netbox
env_file: .env
volumes:
netbox-postgres-data:
netbox-redis-data:
netbox-redis-cache-data:
netbox-media:
netbox-reports:
netbox-scripts:
Тег v4.1 актуален на момент подготовки статьи (конец августа 2026), но перед запуском сверьтесь со списком тегов netboxcommunity/netbox на Docker Hub и возьмите конкретную минорную версию — привязка к плавающему latest на проде чревата неожиданной миграцией схемы БД при рестарте.
Порт веб-приложения намеренно опубликован только на 127.0.0.1 — снаружи NetBox должен смотреть через обратный прокси с TLS.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверФайл .env и генерация SECRET_KEY
Все секреты и параметры подключения вынесены в .env рядом с docker-compose.yml:
SECRET_KEY=замените_на_случайную_строку_50_символов
DB_NAME=netbox
DB_USER=netbox
DB_PASSWORD=надёжный_пароль_postgres
DB_HOST=postgres
DB_PORT=5432
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=пароль_redis
REDIS_CACHE_HOST=redis-cache
REDIS_CACHE_PASSWORD=пароль_redis_cache
ALLOWED_HOSTS=netbox.example.com 127.0.0.1 localhost
SUPERUSER_NAME=admin
SUPERUSER_EMAIL=admin@example.com
SUPERUSER_PASSWORD=временный_пароль_смените_после_входа
SUPERUSER_API_TOKEN=сгенерируйте_отдельно_для_api
SECRET_KEY — не пароль, а ключ подписи сессий и CSRF-токенов Django, не менее 50 символов, без пробелов:
python3 -c "import secrets; print(secrets.token_urlsafe(50))"
ALLOWED_HOSTS перечисляет через пробел домены и IP, с которых NetBox готов принимать запросы — забудете добавить реальный домен, получите Bad Request (400) вместо интерфейса логина. Файл .env добавьте в .gitignore, если храните конфиг в репозитории: в нём пароль от БД, ключ Redis и токен суперпользователя.
Первый запуск, миграции и суперпользователь
Поднимаем стек:
docker compose up -d
docker compose logs -f netbox
При первом старте контейнер netbox сам прогоняет миграции Django и — если заданы переменные SUPERUSER_* — создаёт первого администратора (в логах видны строки Running migrations и Superuser created successfully). Если переменные не заданы, создайте суперпользователя вручную:
docker compose exec netbox /opt/netbox/venv/bin/python /opt/netbox/netbox/manage.py createsuperuser
До настройки прокси интерфейс доступен по SSH-туннелю: ssh -L 8080:127.0.0.1:8080 user@server, дальше http://127.0.0.1:8080/. После логина смените временный пароль и, если нужно, сгенерируйте постоянный API-токен в профиле.
Проверьте статус контейнеров: docker compose ps. Если netbox-worker постоянно перезапускается — почти всегда неверный пароль к redis в .env.
HTTPS через обратный прокси
Открывать NetBox напрямую в интернет без TLS не стоит — в базе хранятся не только IP-адреса, но и секреты в кастомных полях, история изменений инфраструктуры. Проще всего вынести терминацию TLS на Traefik или nginx перед контейнером netbox, оставив сам NetBox на 127.0.0.1:8080. Развёртывание и сертификат Let's Encrypt через Traefik разобраны в статье Traefik как reverse proxy для Docker — для NetBox набор лейблов минимальный:
netbox:
# ...
ports: []
networks:
- traefik-public
labels:
- "traefik.enable=true"
- "traefik.http.routers.netbox.rule=Host(`netbox.example.com`)"
- "traefik.http.routers.netbox.entrypoints=websecure"
- "traefik.http.routers.netbox.tls.certresolver=letsencrypt"
- "traefik.http.services.netbox.loadbalancer.server.port=8080"
Если предпочитаете nginx с certbot, достаточно proxy_pass http://127.0.0.1:8080; с проброской заголовков Host, X-Forwarded-For и X-Forwarded-Proto — NetBox их учитывает при формировании ссылок в интерфейсе и API.
Наполнение базы: сайты, стойки, IP-планы
Пустой NetBox бесполезен, пока в него не занесена структура. Порядок обычно такой:
- Organization → Sites — создайте сайт под каждую физическую или логическую локацию (дата-центр, офис, отдельная стойка у провайдера).
- DCIM → Racks — заведите стойки внутри сайта, укажите высоту в юнитах — дальше устройства размещаются визуально по позициям.
- DCIM → Device Types → Devices — типы оборудования (модель, вендор, число юнитов) и сами устройства, привязанные к стойке и позиции.
- IPAM → Aggregates → Prefixes → IP Addresses — сначала крупные агрегаты (например, весь блок, выданный провайдером), затем префиксы для подсетей, затем конкретные адреса на интерфейсах устройств.
Ручной ввод годится для старта, но сила NetBox — в API. Пример синхронизации существующего сервера через pynetbox:
import pynetbox
nb = pynetbox.api("https://netbox.example.com", token="ваш_api_token")
nb.dcim.devices.create(
name="app-server-01",
device_type=1,
site=1,
status="active",
)
nb.ipam.ip_addresses.create(
address="10.20.0.15/24",
status="active",
)
Такими скриптами удобно наполнять базу из существующего инвентаря (Ansible facts, вывод terraform show, старая таблица) без ручного клика по интерфейсу, а дальше держать NetBox источником правды для инвентаря и Terraform-модулей.
Бэкапы, обновления и типичные проблемы
Данные NetBox живут в трёх местах: база Postgres, том netbox-media (загруженные файлы и изображения устройств) и .env с секретами. Бэкап Postgres — простой pg_dump по расписанию:
docker compose exec -T postgres pg_dump -U netbox netbox | gzip > /backups/netbox-$(date +%F).sql.gz
Для регулярных бэкапов с ротацией и переносом во внешнее хранилище подойдёт BorgBackup — туда же логично добавить том netbox-media.
Обновление:
docker compose pull
docker compose up -d
docker compose logs -f netbox # проверить, что миграции прошли без ошибок
NetBox сам прогоняет миграции схемы при старте контейнера, но перед мажорным обновлением обязательно снимите свежий дамп — откат назад после неудачной миграции без бэкапа не тривиален.
Частые проблемы первого месяца:
Bad Request (400)сразу после логина — не добавлен домен вALLOWED_HOSTS.- Загруженные файлы пропадают после пересоздания контейнера — забыли примонтировать том
netbox-media, вместо него использовался анонимный volume, удалённый вместе с контейнером. - Медленный поиск на тысячах объектов — не хватает ресурсов Postgres; для баз с десятками тысяч записей стоит смотреть в сторону выделенного инстанса Postgres, а не контейнера на том же VPS, что и веб-нагрузка. Общие подходы к диагностике — в статье PostgreSQL на сервере: частые ошибки и решения.
- Плагины NetBox требуют совпадения версии с ядром — при обновлении проверяйте совместимость заранее, а не по трейсбеку в логах постфактум.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Сколько ресурсов хватит для NetBox?
Для команды с сотнями устройств и IP-адресов достаточно 2 vCPU и 2-4 ГБ RAM с запасом под Postgres. Для десятков тысяч объектов и активной работы через API закладывайте больше памяти и отдельный диск под том Postgres — точная цифра зависит от объёма данных, ориентируйтесь по факту после недели-двух эксплуатации.
Можно ли обойтись без второго Redis (redis-cache)?
Технически да, направив на один инстанс с разными номерами БД, но официальная схема разделяет очередь задач и кэш намеренно, чтобы всплеск задач не выбивал кэш представлений. На проде лучше оставить оба контейнера.
NetBox мониторит доступность серверов?
Нет — он хранит и отдаёт данные об инфраструктуре, а не проверяет «жив ли хост». Для доступности и метрик нужен отдельный инструмент, например Zabbix; NetBox при этом может быть источником списка хостов для автообнаружения через API.
Как перенести NetBox на другой сервер?
Перенести дамп Postgres, скопировать том netbox-media, поднять тот же docker-compose.yml с тем же SECRET_KEY — если ключ изменится, существующие сессии и часть токенов станут недействительны.
Подходит ли NetBox для 5-10 серверов?
Формально да, но выгода ощутима, когда счёт идёт на десятки хостов и несколько подсетей — для совсем небольшой инфраструктуры проще вести таблицу или markdown-файл в репозитории.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →