!!! danger "Not for Production Use"
This is a beta release of NetBox intended for testing and evaluation. **Do not use this software in production.** Also be aware that no upgrade path is provided to future releases.
!!! warning "PostgreSQL 15 or Later Required"
This release of NetBox drops support for PostgreSQL 14.
!!! warning "PostgreSQL ltree Extension Required"
The PostgreSQL database must support the [ltree extension](https://www.postgresql.org/docs/current/ltree.html). This trusted module ships with PostgreSQL and does not require superuser permission to activate. NetBox will install it automatically during the upgrade if it is not already present. This requires the NetBox database user to hold the `CREATE` privilege on the database. Installations created using NetBox's standard PostgreSQL setup instructions already satisfy this requirement because the NetBox user owns the database. See [Verify Database Permissions](../installation/upgrading.md#verify-database-permissions) for details.
!!! warning "Redis 6.0 or Later Required"
This release of NetBox drops support for Redis 5.x.
{"value": "datacenter", "label": "Data Center"}) in both the REST and GraphQL APIs. These fields continue to accept the raw value on write.protocol and ports fields on the ipam.Service and ipam.ServiceTemplate models have been replaced by a unified port_mappings field, which supports multiple protocols per service. The legacy fields are retained (as deprecated) in the REST and GraphQL APIs, but at the ORM level they are now read-only properties derived from port_mappings: Passing protocol or ports to the model raises a TypeError, and assigning to service.ports raises an AttributeError.protocol is now filtered against the port_mappings array rather than a dedicated model field, the character-based REST filter lookups previously generated for it (protocol__ic, protocol__isw, protocol__empty, etc.) are no longer available. The port__empty lookup has been removed as well.ipam.Service and ipam.ServiceTemplate have changed shape: The nested ports integer lookup has been replaced by the flat port, port__gt, port__gte, port__lt, and port__lte parameters (each accepting a list of values), alongside the new port_mappings parameter. Additionally, the members of ServiceProtocolEnum have been renamed to drop a spurious ROLE_ prefix (e.g. ROLE_TCP is now TCP).DeviceWithConfigContextSerializer and VirtualMachineWithConfigContextSerializer classes have been removed (merged into the base serializers), and the ?exclude=config_context query parameter is now silently ignored.{"detail": ..., "errors": [{"index": N, "errors": {...}}]}, correlating each error with the index of the offending object in the submitted list. (Bulk operations remain all-or-none.)token field is now read-only, and any value supplied is ignored. (This restriction was already in effect in the web UI.)ltree column rather than django-mptt. The MPTT-backed NestedGroupModel base class is retained for backward compatibility with plugins, but is deprecated: New code should use NestedLtreeGroupModel instead.querystring template tag to querystring_replace and removes the RelatedLinkColumn class.request object passed to custom link templates is now a sanitized subset of the current request. Only the id, path, path_info, method, GET, and user attributes are available; cookies, headers, and session state are no longer accessible.ALLOWED_URL_SCHEMES configuration parameter. A value entered without a scheme is assumed to use https and stored as an absolute URL.RQ_DEFAULT_TIMEOUT to 60 seconds or less, you must also set WEBHOOK_DEFAULT_TIMEOUT to a lower value; NetBox will refuse to start otherwise.EMAIL configuration parameter is now mandatory in order to send mail: A deployment which does not define EMAIL['SERVER'] will raise an InvalidMailer exception when attempting to send, rather than failing at the SMTP connection.rebuild_config_context_cache management command to populate the new config context cache. This may extend the duration of the upgrade for deployments with a large number of devices and virtual machines.housekeeping management command has been removed. (Its constituent tasks are performed by the individual management commands introduced in NetBox v4.6.)querystring template tag has been removed in favor of Django's built-in tag of the same name.SENTRY_DSN, SENTRY_SAMPLE_RATE, SENTRY_SEND_DEFAULT_PII, and SENTRY_TRACES_SAMPLE_RATE have been removed. Use SENTRY_CONFIG instead.DEFAULT_ACTION_PERMISSIONS constant has been removed.LEGACY_ACTIONS constant has been removed.registry['models']. (Use ObjectType.objects.public() instead.) The registry['denormalized_fields'] store has been removed as well.OptionalLimitOffsetPagination (now NetBoxPagination), ExpandableIPAddressField (now ExpandableIPNetworkField), and expand_ipaddress_pattern() (now expand_ipnetwork_pattern()) have been removed.request_id and username keys have been removed from the context available to outgoing webhooks. Use request.id and request.user instead.OwnerMixin (e.g. site_set) has been removed.NetBox has long modeled power distribution end to end, but had no equivalent for cooling. This release introduces a cooling data model which deliberately mirrors the power model, so that the concepts and workflows feel familiar.
Two new top-level models parallel PowerPanel and PowerFeed: CoolingSource represents facility-level cooling plant (a chiller, cooling tower, dry cooler, or facility water system) scoped to a site or location, and CoolingFeed represents a coolant loop delivered from a source to a rack. Two new device components parallel PowerPort and PowerOutlet: CoolingIntake represents a coolant intake on a device (e.g. a server cold-plate connection or a CDU's facility water inlet), and CoolingOutflow represents a coolant outlet on a CDU or manifold which supplies downstream equipment. Each intake may reference the upstream outflow which serves it, and both components have corresponding device type templates. CDUs and manifolds are modeled as ordinary devices carrying these components.
Lightweight descriptive attributes have also been added for users who want to record cooling characteristics without modeling the full plumbing: a cooling_method field (air, liquid, hybrid, or immersion) on the Device, DeviceType, and ModuleType models, and cooling_capability (air-only, hybrid, or liquid-only) and cooling_capacity fields on the Rack and RackType models.
Channelized (breakout) interfaces can now be modeled natively. A new channels field on the Interface model indicates the number of physical channels into which an interface is divided, and each channel is represented by a subinterface of the new generic channel type, bound to its parent via the new channel_id field. A single cable terminates to the channelized parent interface, and NetBox traces a distinct cable path for each channel subinterface. Both fields are available on interface templates as well.
Application services and service templates can now expose the same port on multiple protocols — for example, DNS listening on both tcp/53 and udp/53. The single-protocol protocol and ports fields have been replaced by a unified port_mappings field, represented in the APIs as a flat list of protocol/port strings (e.g. ["tcp/80", "udp/53"]). New port_mappings, protocol, and port filters are available in the UI and in both APIs, with the latter two correlated so that they must be satisfied by a single mapping.
A new ModuleBayType model has been introduced to convey which kinds of modules a module bay is able to accommodate (e.g. an SFP28 cage or a PCIe x16 slot). Bay types can be assigned to module bays, module bay templates, and module types; where both a bay and a module type declare bay types, NetBox validates that the two sets share at least one type in common before permitting installation. Bay types assigned to a module bay template propagate automatically to each instantiated module bay.
An installed module can now be moved to a different module bay, including a bay on a different device, rather than having to be deleted and recreated. A move relocates the module's entire subtree — its components, its own module bays, and any child modules installed within them — and re-resolves any component names, labels, and positions derived from the module type's templates for the destination bay. Cross-device moves are permitted only where the moved components carry no active topology or device-scoped configuration.
Bulk write operations via the REST API can now be processed as a background job rather than synchronously, avoiding proxy and gateway timeouts on large batches. Appending ?background=true to a bulk write request enqueues a job and immediately returns an HTTP 202 Accepted response containing the job's ID and URL; the job's data field records the response the synchronous request would have returned. Note that validation is deferred to the worker, so a 202 response indicates only that the request was accepted, and the job's final status must be inspected to confirm the outcome.
When a bulk create or update via the REST API fails validation, the response now identifies each offending object by its index within the submitted list, along with its specific field errors, rather than reporting only the first failure. This enables clients to correct and resubmit only the objects which actually failed.
Rather than compiling config context data on demand from the full set of applicable ConfigContext instances, NetBox now pre-renders each device's and virtual machine's merged context data and caches it on the object itself. The cache is invalidated automatically whenever an upstream change is detected — a config context being created, modified, or deleted, or a change to an attribute which determines which contexts apply — and repopulated by a non-blocking background job. During the brief window between invalidation and re-render, reads fall back to the original on-demand rendering path, so the data returned is always correct rather than stale.
Event rule conditions can now inspect the pre-change and post-change snapshots captured at the time of an event, rather than only the object's current data. New changed and unchanged operators compare an attribute's value across the two snapshots, and the snapshots.prechange.<attr> and snapshots.postchange.<attr> dot-path syntax exposes either snapshot to any standard operator. This makes it possible to express the long-requested "fire only when status changes to active" rule, avoiding webhooks and scripts triggered by unrelated updates. A new regex operator has been added as well, and conditions which reference an attribute that cannot be resolved now fail closed and log an error rather than silently disabling the rule.
mac_address fieldis_primary field to the MAC address REST API representationFIELD_CHOICESend_of_life date field to device types and module types to aid in hardware lifecycle planningnulls_first parameter to control the placement of empty values when ordering by a custom fieldWEBHOOK_DEFAULT_TIMEOUT configuration parameterBULK_UPDATE_CHUNK_SIZE configuration parameter to bound the number of rows affected by a single bulk UPDATE statementALLOWED_URL_SCHEMES when validating URL custom field valuessocial-auth-core to permit the installation of newer PyJWT versionsltree implementation for hierarchical modelsGenericObjectChoiceField and GenericObjectFormMixin to represent a generic foreign key relation as a single form fieldEventRuleActionJINJA2_FILTERS configuration parameter has been renamed to JINJA_FILTERS. The old name remains supported, but will be removed in NetBox v5.0.form_factor, width, outer_width, outer_height, outer_depth, and outer_unit fields on the Rack model have been deprecated, and will be removed in NetBox v5.0. These values will instead be inferred from the rack's assigned rack type, which will become a mandatory assignment.protocol and ports fields on application services and service templates have been deprecated in favor of port_mappings, and will be removed from the REST & GraphQL APIs in NetBox v5.0.NestedGroupModel base class has been deprecated in favor of NestedLtreeGroupModel, and will be removed in a future release.querystring template tag in favor of Django's built-in tagNULLS NOT DISTINCThousekeeping management commandDEFAULT_ACTION_PERMISSIONS constantmodels key from the application registryOptionalLimitOffsetPaginationExpandableIPAddressFieldexpand_ipaddress_pattern()*TestMixin suffixOwnerMixinjinja_filters, get_jinja_context(), register_jinja_filters()) for consistency with JINJA_FILTERSAppConfig.ready() and break its import cyclerequest_id and username keys from the webhook contextbackground=true query parameter requests background processing of a bulk write operation, returning HTTP 202 Accepted with the enqueued job's ID and URL{value, label} objectsexclude=config_context query parameter is ignoredGET/POST /api/dcim/cooling-feeds/GET/PUT/PATCH/DELETE /api/dcim/cooling-feeds/<id>/GET/POST /api/dcim/cooling-intakes/GET/PUT/PATCH/DELETE /api/dcim/cooling-intakes/<id>/GET/POST /api/dcim/cooling-intake-templates/GET/PUT/PATCH/DELETE /api/dcim/cooling-intake-templates/<id>/GET/POST /api/dcim/cooling-outflows/GET/PUT/PATCH/DELETE /api/dcim/cooling-outflows/<id>/GET/POST /api/dcim/cooling-outflow-templates/GET/PUT/PATCH/DELETE /api/dcim/cooling-outflow-templates/<id>/GET/POST /api/dcim/cooling-sources/GET/PUT/PATCH/DELETE /api/dcim/cooling-sources/<id>/GET/POST /api/dcim/module-bay-types/GET/PUT/PATCH/DELETE /api/dcim/module-bay-types/<id>/core.Job
execution_timedcim.Device
cooling_methodconfig_context (previously available only via DeviceWithConfigContextSerializer)cooling_intake_count) and outflows (cooling_outflow_count)dcim.DeviceType
cooling_methodend_of_lifecooling_intake_template_count, cooling_outflow_template_count)dcim.Interface
channels and channel_idmac_address field is now writable, and creates or updates the interface's primary MAC addressdcim.InterfaceTemplate
channels and channel_idparentdcim.MACAddress
is_primarydcim.Module
is_bay_compatiblemodule_bay (the device is derived from the target bay)dcim.ModuleBay
module_bay_typesis_module_compatibledcim.ModuleBayTemplate
module_bay_typesdcim.ModuleType
cooling_methodend_of_lifemodule_bay_typescooling_intake_template_count, cooling_outflow_template_count)dcim.Rack
cooling_capabilitycooling_capacitydcim.RackType
cooling_capabilitycooling_capacityextras.CustomField
nulls_firstextras.EventRule
action_is_availableaction_object_type field is now optional, and is no longer restricted to object types which support event rulesaction_type now include any action types registered by pluginsextras.Webhook
timeoutipam.Service
port_mappings list fieldprotocol and ports fields are deprecated; they are populated only for single-protocol services and return null otherwiseport_mappings in place of protocol and portsipam.ServiceTemplate
port_mappings list fieldprotocol and ports fields are deprecated; they are populated only for single-protocol services and return null otherwiseport_mappings in place of protocol and portsusers.Token
token field is now read-only; a plaintext value can no longer be specified on creationvirtualization.VirtualMachine
config_context (previously available only via VirtualMachineWithConfigContextSerializer)cooling_feed / cooling_feed_listcooling_intake / cooling_intake_listcooling_intake_template / cooling_intake_template_listcooling_outflow / cooling_outflow_listcooling_outflow_template / cooling_outflow_template_listcooling_source / cooling_source_listmodule_bay_type / module_bay_type_listcustom_fields are now returned as {value, label} objectsServiceFilter and ServiceTemplateFilter types now expose the flat port_mappings, protocol, port, port__gt, port__gte, port__lt, and port__lte parameters in place of the previous protocol and nested ports lookupsServiceProtocolEnum have been renamed from ROLE_TCP, ROLE_UDP, and ROLE_SCTP to TCP, UDP, and SCTPchannels and channel_id fields