Compare commits

...

100 Commits

Author SHA1 Message Date
Tobias Genannt
c60defe0e6
Merge pull request #1609 from netbox-community/develop
Release 4.0.0
2026-02-03 11:22:18 +01:00
Tobias Genannt
7e956129d0
Merge pull request #1606 from tobiasge/fix-deocs
Fixed the local documentation and prepare for a new release
2026-02-03 09:54:23 +01:00
Tobias Genannt
01a36c69c4 Preparation for 4.0.0 2026-02-02 12:46:51 +01:00
Tobias Genannt
52b1e23c80 Fixed serving of the local documentation 2026-02-02 12:46:02 +01:00
Tobias Genannt
6430391602
Merge pull request #1604 from netbox-community/renovate/sentry-sdk-2.x
chore(deps): update dependency sentry-sdk to v2.51.0
2026-01-28 12:43:16 +01:00
renovate[bot]
a4a83453d9
chore(deps): update dependency sentry-sdk to v2.51.0 2026-01-28 11:07:37 +00:00
Tobias Genannt
5b8320bcca
Merge pull request #1599 from netbox-community/renovate/sentry-sdk-2.x
chore(deps): update dependency sentry-sdk to v2.50.0
2026-01-20 16:23:37 +01:00
renovate[bot]
909c234af6
chore(deps): update dependency sentry-sdk to v2.50.0 2026-01-20 14:45:03 +00:00
Tobias Genannt
b6cf435091
Merge pull request #1598 from netbox-community/renovate/dulwich-1.x
Update dependency dulwich to v1
2026-01-18 12:13:28 +01:00
renovate[bot]
050f313485
chore(deps): update dependency dulwich to v1 2026-01-18 02:03:43 +00:00
Tobias Genannt
68717f8d21
Merge pull request #1594 from netbox-community/renovate/dulwich-0.x
Update dependency dulwich to v0.25.2
2026-01-12 06:43:29 +01:00
renovate[bot]
4f60741e79
chore(deps): update dependency dulwich to v0.25.2 2026-01-12 01:54:47 +00:00
Tobias Genannt
848b5d9150
Merge pull request #1593 from netbox-community/renovate/dulwich-0.x
chore(deps): update dependency dulwich to v0.25.1
2026-01-09 06:38:26 +01:00
renovate[bot]
c8232c058e
chore(deps): update dependency dulwich to v0.25.1 2026-01-09 00:43:09 +00:00
Tobias Genannt
fd6a75ac96
Support new API token format (#1591)
Support new API token format
2026-01-08 13:36:54 +01:00
Tobias Genannt
94dd752652
Merge pull request #1592 from netbox-community/renovate/sentry-sdk-2.x
chore(deps): update dependency sentry-sdk to v2.49.0
2026-01-08 11:46:48 +01:00
renovate[bot]
20cccc3869
chore(deps): update dependency sentry-sdk to v2.49.0 2026-01-08 10:09:25 +00:00
Tobias Genannt
269cf83362
Merge pull request #1590 from netbox-community/renovate/granian-2.x
chore(deps): update dependency granian to v2.6.1
2026-01-08 09:18:35 +01:00
renovate[bot]
da0784992e
chore(deps): update dependency granian to v2.6.1 2026-01-07 13:54:12 +00:00
Tobias Genannt
c0ead010ec
Merge pull request #1571 from tobiasge/fix-pg-volume
Changed volume to match upstream image
2026-01-07 14:53:42 +01:00
Tobias Genannt
ebba20d02b Changed volume to match upstream image 2026-01-07 14:18:31 +01:00
Tobias Genannt
36bf34ddc1
Merge pull request #1583 from netbox-community/renovate/django-auth-ldap-5.x
Update dependency django-auth-ldap to v5.3.0
2025-12-27 09:12:47 +01:00
renovate[bot]
36f075e407
chore(deps): update dependency django-auth-ldap to v5.3.0 2025-12-26 18:05:18 +00:00
Tobias Genannt
937216ecb0
Merge pull request #1580 from netbox-community/renovate/dulwich-0.x
Update dependency dulwich to v0.25.0
2025-12-18 07:00:14 +01:00
renovate[bot]
968bef976c
chore(deps): update dependency dulwich to v0.25.0 2025-12-18 00:05:52 +00:00
renovate[bot]
021c3fea99
chore(deps): update dependency sentry-sdk to v2.48.0 (#1579)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-16 19:14:21 +00:00
Skye Fugate
8387b4d0f6
NetBox-Docker Okta & Google SSO Environment Additions (#1475)
* feat: add SSO environment variable support for OKTA and Google OAuth2

Add native support for SSO configuration through environment variables
and Docker secrets, eliminating the need to modify configuration.py
for common SSO providers.

Changes:
- Add OKTA OpenID Connect configuration variables:
  - SOCIAL_AUTH_OKTA_OPENIDCONNECT_KEY (env var)
  - SOCIAL_AUTH_OKTA_OPENIDCONNECT_SECRET (env var + Docker secret: okta_openidconnect_secret)
  - SOCIAL_AUTH_OKTA_OPENIDCONNECT_API_URL (env var)

- Add Google OAuth2 configuration variables:
  - SOCIAL_AUTH_GOOGLE_OAUTH2_KEY (env var)
  - SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET (env var + Docker secret: google_oauth2_secret)

Follows existing patterns with _read_secret() for sensitive data and
environ.get() for non-sensitive configuration.

Resolves: netbox-community/netbox-docker#1139

* Secrets example

* fix: add newline at end of file

---------

Co-authored-by: skyefugate <skyefugate@users.noreply.github.com>
2025-12-10 07:51:30 +01:00
Tobias Genannt
d24afeecb0
Merge pull request #1576 from matandomuertos/fix-storages-example
Update STORAGES example in extra.py
2025-12-09 16:27:33 +01:00
Nahuel Cassinari
ac419312ae
Update STORAGES example 2025-12-09 15:27:25 +01:00
Tobias Genannt
95c201f416
Merge pull request #1572 from fbouynot/patch-1
fix: change the netbox docker version in the image tag
2025-12-08 08:29:27 +01:00
Tobias Genannt
a0961edd76
Merge pull request #1574 from netbox-community/renovate/sentry-sdk-2.x
Update dependency sentry-sdk to v2.47.0
2025-12-03 21:08:13 +01:00
renovate[bot]
9a68d6fd70
Update dependency sentry-sdk to v2.47.0 2025-12-03 19:34:23 +00:00
Félix Bouynot
6967b2ca34
feat: bump the version to 3.4.2 so it match a newer docker image 2025-12-01 14:57:07 +01:00
Tobias Genannt
d6ee283a24
Merge pull request #1567 from netbox-community/renovate/sentry-sdk-2.x
Update dependency sentry-sdk to v2.46.0
2025-11-24 15:22:50 +01:00
renovate[bot]
10031c2990
Update dependency sentry-sdk to v2.46.0 2025-11-24 13:50:32 +00:00
Tobias Genannt
50021466ad
Merge pull request #1565 from netbox-community/renovate/actions-checkout-6.x
Update actions/checkout action to v6
2025-11-20 20:55:15 +01:00
renovate[bot]
0f2fb47d9c
Update actions/checkout action to v6 2025-11-20 18:38:17 +00:00
Tobias Genannt
cff630efa0
Merge pull request #1564 from netbox-community/renovate/sentry-sdk-2.x
Update dependency sentry-sdk to v2.45.0
2025-11-19 06:52:02 +01:00
renovate[bot]
74b0a41f3e
Update dependency sentry-sdk to v2.45.0 2025-11-18 22:51:24 +00:00
Tobias Genannt
9de4e23f9c
Merge pull request #1562 from netbox-community/renovate/granian-2.x
Update dependency granian to v2.6.0
2025-11-16 19:27:33 +01:00
renovate[bot]
db027b14a3
Update dependency granian to v2.6.0 2025-11-16 17:56:30 +00:00
Tobias Genannt
07fcb205b4
Switch server to Granian (#1561)
* Switch server to Granian

Because the development of Nginx Unit has been stopped, switch the server
to Granian which still allows to serve the Python application and the
static files from one server.

* Addressed review comments

* Update docker/launch-netbox.sh

Co-authored-by: Christian Mäder <cimnine@users.noreply.github.com>

* Update docker/launch-netbox.sh

Co-authored-by: Christian Mäder <cimnine@users.noreply.github.com>

---------

Co-authored-by: Christian Mäder <cimnine@users.noreply.github.com>
2025-11-12 12:57:50 +00:00
Tobias Genannt
c89fd3331b
Merge pull request #1560 from netbox-community/renovate/sentry-sdk-2.x
Update dependency sentry-sdk to v2.44.0
2025-11-11 15:15:09 +01:00
renovate[bot]
f474cc585c
Update dependency sentry-sdk to v2.44.0 2025-11-11 13:43:40 +00:00
Tobias Genannt
8147115847
Merge pull request #1559 from netbox-community/renovate/dulwich-0.x
Update dependency dulwich to v0.24.10
2025-11-10 22:42:50 +01:00
renovate[bot]
22688dedd4
Update dependency dulwich to v0.24.10 2025-11-10 20:51:29 +00:00
Tobias Genannt
86223f210a
Merge pull request #1523 from netbox-community/renovate/docker.io-postgres-18.x
Update docker.io/postgres Docker tag to v18
2025-11-10 12:57:48 +01:00
Tobias Genannt
665e27560f
Merge pull request #1500 from netbox-community/renovate/docker.io-valkey-valkey-9.x
Update docker.io/valkey/valkey Docker tag to v9
2025-11-10 12:57:24 +01:00
Tobias Genannt
7d6f00662c
Merge pull request #1558 from netbox-community/develop
Version 3.4.2
2025-11-10 12:55:32 +01:00
Tobias Genannt
4965e7e988 Preparation for 3.4.2 2025-11-10 10:28:40 +01:00
Tobias Genannt
d194cf7fff
Merge pull request #1554 from netbox-community/renovate/sentry-sdk-2.x
Update dependency sentry-sdk to v2.43.0
2025-11-10 10:02:13 +01:00
Tobias Genannt
0439c610de
Merge pull request #1555 from netbox-community/renovate/dulwich-0.x
Update dependency dulwich to v0.24.8
2025-11-10 10:01:53 +01:00
renovate[bot]
35473e755b
Update dependency dulwich to v0.24.8 2025-10-30 03:30:40 +00:00
renovate[bot]
3f0f4e7160
Update dependency sentry-sdk to v2.43.0 2025-10-29 19:47:17 +00:00
Tobias Genannt
10a57990e2
Merge pull request #1553 from netbox-community/renovate/dulwich-0.x
Update dependency dulwich to v0.24.7
2025-10-23 15:18:16 +02:00
renovate[bot]
2d6d5058fe
Update dependency dulwich to v0.24.7 2025-10-23 12:46:08 +00:00
Tobias Genannt
f6cab681b4
Merge pull request #1547 from WillNilges/patch-1
Correct typo in launch-netbox.sh
2025-10-22 14:52:48 +02:00
Tobias Genannt
4bdf66157b
Merge pull request #1550 from netbox-community/renovate/sentry-sdk-2.x
Update dependency sentry-sdk to v2.42.1
2025-10-22 14:20:41 +02:00
renovate[bot]
73bbf17d6b
Update dependency sentry-sdk to v2.42.1 2025-10-20 15:32:40 +00:00
Tobias Genannt
9b2793a808
Merge pull request #1548 from netbox-community/renovate/dulwich-0.x
Update dependency dulwich to v0.24.6
2025-10-19 15:31:13 +02:00
renovate[bot]
b0aad0dfda
Update dependency dulwich to v0.24.6 2025-10-19 12:45:34 +00:00
Willard Nilges
eb2822a978
Fix typo in error message for Unit configuration 2025-10-19 01:17:23 -04:00
Tobias Genannt
016a2ab4fe
Merge pull request #1542 from netbox-community/renovate/dulwich-0.x
Update dependency dulwich to v0.24.5
2025-10-16 19:39:19 +02:00
renovate[bot]
56d27f84a7
Update dependency dulwich to v0.24.5 2025-10-16 14:11:49 +00:00
Tobias Genannt
24641dabc5
Merge pull request #1540 from netbox-community/renovate/sentry-sdk-2.x
Update dependency sentry-sdk to v2.42.0
2025-10-15 13:16:39 +02:00
renovate[bot]
07258394d1
Update dependency sentry-sdk to v2.42.0 2025-10-15 10:43:52 +00:00
Tobias Genannt
b6cc5e3c06
Merge pull request #1537 from netbox-community/renovate/dulwich-0.x
Update dependency dulwich to v0.24.4
2025-10-15 06:43:09 +02:00
renovate[bot]
95bcfeb69d
Update dependency dulwich to v0.24.4 2025-10-14 21:08:52 +00:00
Tobias Genannt
c10d4e71c7
Merge pull request #1533 from netbox-community/renovate/sentry-sdk-2.x
Update dependency sentry-sdk to v2.41.0
2025-10-14 07:17:32 +02:00
renovate[bot]
85615a9bea
Update dependency sentry-sdk to v2.41.0 2025-10-14 04:46:28 +00:00
Tobias Genannt
1abb784f9b
Merge pull request #1535 from netbox-community/renovate/dulwich-0.x
Update dependency dulwich to v0.24.3
2025-10-14 06:45:35 +02:00
renovate[bot]
f89f907408
Update dependency dulwich to v0.24.3 2025-10-14 01:45:18 +00:00
Tobias Genannt
6b7121564b
Merge pull request #1532 from tobiasge/new-api-token
Support new API_TOKEN format
2025-10-10 11:36:01 +02:00
Tobias Genannt
1f0ef020a9 Support new API_TOKEN format
Allows configuration the new API_TOKEN_PEPPERS setting from an
ENV variable or secret file.

Feature request: https://github.com/netbox-community/netbox/issues/20210
Pull request: https://github.com/netbox-community/netbox/pull/20477
2025-10-08 08:26:27 +02:00
Tobias Genannt
f07c9d533d
Merge pull request #1531 from netbox-community/renovate/ghcr.io-astral-sh-uv-0.x
Update ghcr.io/astral-sh/uv Docker tag to v0.9
2025-10-08 07:29:21 +02:00
renovate[bot]
7067475a81
Update ghcr.io/astral-sh/uv Docker tag to v0.9 2025-10-08 05:08:30 +00:00
Tobias Genannt
0072d59ea2
Merge pull request #1528 from netbox-community/renovate/sentry-sdk-2.x
Update dependency sentry-sdk to v2.40.0
2025-10-06 15:59:15 +02:00
renovate[bot]
88bc5cf8d6
Update dependency sentry-sdk to v2.40.0 2025-10-06 13:37:57 +00:00
Tobias Genannt
993628d8f0
Merge pull request #1525 from netbox-community/renovate/dulwich-0.x
Update dependency dulwich to v0.24.2
2025-09-26 13:04:17 +02:00
renovate[bot]
dbc1b37cf7
Update dependency dulwich to v0.24.2 2025-09-26 10:42:24 +00:00
Tobias Genannt
7aeec92141
Merge pull request #1479 from tobiasge/update-readme
Use our example file in the Readme
2025-09-26 12:41:55 +02:00
Tobias Genannt
ae5f7d2419
Merge pull request #1524 from netbox-community/develop
Version 3.4.1
2025-09-26 11:04:31 +02:00
Tobias Genannt
a945236c81 Preparation for 3.4.1 2025-09-26 09:47:06 +02:00
Tobias Genannt
481a102d30
Merge pull request #1515 from alexanderhofstaetter/patch-1
Increase default NGINX Unit request body limit to 100 MB in nginx settings
2025-09-26 09:25:28 +02:00
renovate[bot]
88a2e48923
Update docker.io/postgres Docker tag to v18 2025-09-26 02:25:40 +00:00
Tobias Genannt
81fb62ecef
Merge pull request #1519 from netbox-community/renovate/sentry-sdk-2.x
Update dependency sentry-sdk to v2.39.0
2025-09-25 15:14:25 +02:00
renovate[bot]
2c49500e8d
Update dependency sentry-sdk to v2.39.0 2025-09-25 12:49:11 +00:00
Tobias Genannt
c16c79ff16
Merge pull request #1517 from netbox-community/renovate/sentry-sdk-2.x
Update dependency sentry-sdk to v2.38.0
2025-09-16 06:39:49 +02:00
renovate[bot]
c05e838edc
Update dependency sentry-sdk to v2.38.0 2025-09-15 23:32:23 +00:00
Alexander Hofstätter
e62af8be76
Increase default NGINX Unit request body limit to 100 MB in docker/nginx-unit.json
The current NGINX Unit configuration in netbox-docker implicitly limits
incoming HTTP request bodies to roughly 2.5 MB. This causes file uploads
(custom scripts, attachments, etc.) to fail with HTTP 413 before they
reach Django, even when NetBox settings like FILE_UPLOAD_MAX_MEMORY_SIZE
are raised.

This change adds a settings block to docker/nginx-unit.json to raise
the default limit:

{
  "settings": {
    "http": {
      "max_body_size": 104857600
    }
  }
}

With this change, new deployments can handle uploads up to 100 MB out
of the box, aligning the container default with the capabilities of
NetBox core and preventing unexpected 413 errors.

Fixes: https://github.com/netbox-community/netbox-docker/issues/897
2025-09-13 13:06:29 +02:00
Tobias Genannt
a229603d90
Merge pull request #1513 from netbox-community/renovate/sentry-sdk-2.x
Update dependency sentry-sdk to v2.37.1
2025-09-09 17:08:38 +02:00
renovate[bot]
942fc04776
Update dependency sentry-sdk to v2.37.1 2025-09-09 14:47:12 +00:00
Tobias Genannt
b76bd3d780
Merge pull request #1511 from LeoColomb/patch-1
Update `BUILD_DATE` format to include seconds
2025-09-08 08:12:34 +02:00
Léo Colombaro
4744eeb3ef
Update BUILD_DATE format to include seconds
* Comply with all standards (RFC 3339, ISO 8601, and HTML).
* Reduce ambiguity.
* Ensure a fully compliant `org.opencontainers.image.created`. (fix artifacthub error)
2025-09-07 14:41:44 +02:00
Tobias Genannt
bdea0cf05a
Merge pull request #1510 from netbox-community/renovate/sentry-sdk-2.x
Update dependency sentry-sdk to v2.37.0
2025-09-05 15:21:12 +02:00
renovate[bot]
76f670faaa
Update dependency sentry-sdk to v2.37.0 2025-09-05 12:59:40 +00:00
Tobias Genannt
263fcf35bf
Merge pull request #1509 from netbox-community/renovate/sentry-sdk-2.x
Update dependency sentry-sdk to v2.36.0
2025-09-04 12:17:06 +02:00
renovate[bot]
fb1cfd880a
Update dependency sentry-sdk to v2.36.0 2025-09-04 09:54:49 +00:00
renovate[bot]
00d8dd75d6
Update docker.io/valkey/valkey Docker tag to v9 2025-08-15 00:38:39 +00:00
Tobias Genannt
c8d766a95b Use our example file in the Readme 2025-07-08 07:45:38 +02:00
21 changed files with 162 additions and 219 deletions

View File

@ -4,4 +4,4 @@ extend-ignore = E203, W503
per-file-ignores =
configuration/*:E131,E251,E266,E302,E305,E501,E722
startup_scripts/startup_script_utils/__init__.py:F401
docker/*:E266,E722
docker/*:E266,E722,E501

View File

@ -23,7 +23,7 @@ jobs:
packages: read
statuses: write
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6
with:
# Full git history is needed to get a proper
# list of changed files within `super-linter`
@ -36,12 +36,14 @@ jobs:
SUPPRESS_POSSUM: true
LINTER_RULES_PATH: /
VALIDATE_ALL_CODEBASE: false
VALIDATE_BIOME_FORMAT: false
VALIDATE_CHECKOV: false
VALIDATE_DOCKERFILE: false
VALIDATE_GITHUB_ACTIONS_ZIZMOR: false
VALIDATE_GITLEAKS: false
VALIDATE_JSCPD: false
VALIDATE_PYTHON_PYLINT: false
VALIDATE_TRIVY: false
VALIDATE_GITHUB_ACTIONS_ZIZMOR: false
FILTER_REGEX_EXCLUDE: (.*/)?(LICENSE|configuration/.*)
EDITORCONFIG_FILE_NAME: .editorconfig-checker.json
DOCKERFILE_HADOLINT_FILE_NAME: .hadolint.yaml
@ -72,7 +74,7 @@ jobs:
steps:
- id: git-checkout
name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v6
- id: buildx-setup
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

View File

@ -32,7 +32,7 @@ jobs:
steps:
- id: source-checkout
name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
ref: ${{ matrix.build.branch }}
- id: set-netbox-docker-version

View File

@ -1,7 +1,7 @@
ARG FROM
FROM ${FROM} AS builder
COPY --from=ghcr.io/astral-sh/uv:0.8 /uv /usr/local/bin/
COPY --from=ghcr.io/astral-sh/uv:0.9 /uv /usr/local/bin/
RUN export DEBIAN_FRONTEND=noninteractive \
&& apt-get update -qq \
&& apt-get upgrade \
@ -27,7 +27,7 @@ ARG NETBOX_PATH
COPY ${NETBOX_PATH}/requirements.txt requirements-container.txt /
ENV VIRTUAL_ENV=/opt/netbox/venv
RUN \
# Gunicorn is not needed because we use Nginx Unit
# Gunicorn is not needed because we use Granian
sed -i -e '/gunicorn/d' /requirements.txt && \
# We need 'social-auth-core[all]' in the Docker image. But if we put it in our own requirements-container.txt
# we have potential version conflicts and the build will fail.
@ -46,8 +46,6 @@ RUN \
ARG FROM
FROM ${FROM} AS main
COPY docker/unit.list /etc/apt/sources.list.d/unit.list
ADD --chmod=444 --chown=0:0 https://unit.nginx.org/keys/nginx-keyring.gpg /usr/share/keyrings/nginx-keyring.gpg
RUN export DEBIAN_FRONTEND=noninteractive \
&& apt-get update -qq \
&& apt-get upgrade \
@ -64,8 +62,6 @@ RUN export DEBIAN_FRONTEND=noninteractive \
openssl \
python3 \
tini \
unit-python3.12=1.34.2-1~noble \
unit=1.34.2-1~noble \
&& rm -rf /var/lib/apt/lists/*
# Copy the modified 'requirements*.txt' files, to have the files actually used during installation
@ -80,22 +76,23 @@ COPY docker/configuration.docker.py /opt/netbox/netbox/netbox/configuration.py
COPY docker/ldap_config.docker.py /opt/netbox/netbox/netbox/ldap_config.py
COPY docker/docker-entrypoint.sh /opt/netbox/docker-entrypoint.sh
COPY docker/launch-netbox.sh /opt/netbox/launch-netbox.sh
COPY docker/super_user.py /opt/netbox/super_user.py
COPY configuration/ /etc/netbox/config/
COPY docker/nginx-unit.json /etc/unit/
COPY docker/granian.py /opt/netbox/netbox/netbox/granian.py
COPY VERSION /opt/netbox/VERSION
WORKDIR /opt/netbox/netbox
# Must set permissions for '/opt/netbox/netbox/media' directory
# to g+w so that pictures can be uploaded to netbox.
RUN mkdir -p static media /opt/unit/state/ /opt/unit/tmp/ \
&& chown -R unit:root /opt/unit/ media reports scripts \
&& chmod -R g+w /opt/unit/ media reports scripts \
&& cd /opt/netbox/ && SECRET_KEY="dummyKeyWithMinimumLength-------------------------" /opt/netbox/venv/bin/python -m mkdocs build \
--config-file /opt/netbox/mkdocs.yml --site-dir /opt/netbox/netbox/project-static/docs/ \
&& DEBUG="true" SECRET_KEY="dummyKeyWithMinimumLength-------------------------" /opt/netbox/venv/bin/python /opt/netbox/netbox/manage.py collectstatic --no-input \
&& mkdir /opt/netbox/netbox/local \
&& echo "build: Docker-$(cat /opt/netbox/VERSION)" > /opt/netbox/netbox/local/release.yaml
RUN useradd --home-dir /opt/netbox/ --no-create-home --no-user-group --system --shell /bin/false --uid 999 --gid 0 netbox \
&& mkdir -p static media local \
&& chown -R netbox:root media reports scripts \
&& chmod -R g+w media reports scripts \
&& cd /opt/netbox/ && SECRET_KEY="dummyKeyWithMinimumLength-------------------------" /opt/netbox/venv/bin/python -m mkdocs build \
--config-file /opt/netbox/mkdocs.yml --site-dir /opt/netbox/netbox/project-static/docs/ \
&& DEBUG="true" SECRET_KEY="dummyKeyWithMinimumLength-------------------------" /opt/netbox/venv/bin/python /opt/netbox/netbox/manage.py collectstatic --no-input \
&& echo "build: Docker-$(cat /opt/netbox/VERSION)" > /opt/netbox/netbox/local/release.yaml
ENV LANG=C.utf8 PATH=/opt/netbox/venv/bin:$PATH VIRTUAL_ENV=/opt/netbox/venv UV_NO_CACHE=1
ENTRYPOINT [ "/usr/bin/tini", "--" ]

View File

@ -39,12 +39,9 @@ There is a more complete [_Getting Started_ guide on our wiki][wiki-getting-star
```bash
git clone -b release https://github.com/netbox-community/netbox-docker.git
cd netbox-docker
tee docker-compose.override.yml <<EOF
services:
netbox:
ports:
- 8000:8080
EOF
# Copy the example override file
cp docker-compose.override.yml.example docker-compose.override.yml
# Read and edit the file to your liking
docker compose pull
docker compose up
```

View File

@ -1 +1 @@
3.4.0
4.0.0

View File

@ -223,7 +223,7 @@ fi
###
# Variables for labelling the docker image
###
BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M+00:00')"
BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M:%S+00:00')"
if [ -d ".git" ] && [ -z "${SKIP_GIT}" ]; then
GIT_REF="$(git rev-parse HEAD)"

View File

@ -116,6 +116,11 @@ REDIS = {
# https://docs.djangoproject.com/en/stable/ref/settings/#std:setting-SECRET_KEY
SECRET_KEY = _read_secret('secret_key', environ.get('SECRET_KEY', ''))
API_TOKEN_PEPPERS = {}
if api_token_pepper := _read_secret('api_token_pepper_1', environ.get('API_TOKEN_PEPPER_1', '')):
API_TOKEN_PEPPERS.update({1: api_token_pepper})
#########################
# #
@ -305,6 +310,12 @@ REMOTE_AUTH_SUPERUSER_GROUPS = _environ_get_and_map('REMOTE_AUTH_SUPERUSER_GROUP
REMOTE_AUTH_SUPERUSERS = _environ_get_and_map('REMOTE_AUTH_SUPERUSERS', '', _AS_LIST)
REMOTE_AUTH_STAFF_GROUPS = _environ_get_and_map('REMOTE_AUTH_STAFF_GROUPS', '', _AS_LIST)
REMOTE_AUTH_STAFF_USERS = _environ_get_and_map('REMOTE_AUTH_STAFF_USERS', '', _AS_LIST)
# SSO Configuration
SOCIAL_AUTH_OKTA_OPENIDCONNECT_KEY = environ.get('SOCIAL_AUTH_OKTA_OPENIDCONNECT_KEY')
SOCIAL_AUTH_OKTA_OPENIDCONNECT_SECRET = _read_secret('okta_openidconnect_secret', environ.get('SOCIAL_AUTH_OKTA_OPENIDCONNECT_SECRET', ''))
SOCIAL_AUTH_OKTA_OPENIDCONNECT_API_URL = environ.get('SOCIAL_AUTH_OKTA_OPENIDCONNECT_API_URL')
SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = environ.get('SOCIAL_AUTH_GOOGLE_OAUTH2_KEY')
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = _read_secret('google_oauth2_secret', environ.get('SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET', ''))
# 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.

View File

@ -33,13 +33,20 @@
## By default uploaded media is stored on the local filesystem. Using Django-storages is also supported. Provide the
## class path of the storage driver in STORAGE_BACKEND and any configuration options in STORAGE_CONFIG. For example:
# STORAGE_BACKEND = 'storages.backends.s3boto3.S3Boto3Storage'
# STORAGE_CONFIG = {
# 'AWS_ACCESS_KEY_ID': 'Key ID',
# 'AWS_SECRET_ACCESS_KEY': 'Secret',
# 'AWS_STORAGE_BUCKET_NAME': 'netbox',
# 'AWS_S3_REGION_NAME': 'eu-west-1',
## class path of the storage driver and any configuration options in STORAGES. For example:
# STORAGES = {
# 'default': {
# 'BACKEND': 'storages.backends.s3boto3.S3Boto3Storage',
# 'OPTIONS': {
# 'access_key': 'Key ID',
# 'secret_key': 'Secret',
# 'bucket_name': 'netbox',
# 'region_name': 'us-west-1',
# }
# },
# 'staticfiles': {
# 'BACKEND': 'django.contrib.staticfiles.storage.StaticFilesStorage',
# }
# }

View File

@ -2,9 +2,6 @@ services:
netbox:
ports:
- "8000:8080"
# If you want the Nginx unit status page visible from the
# outside of the container add the following port mapping:
# - "8001:8081"
# healthcheck:
# Time for which the health check can fail after the container is started.
# This depends mostly on the performance of your database. On the first start,
@ -19,4 +16,18 @@ services:
# SUPERUSER_EMAIL: ""
# SUPERUSER_NAME: ""
# SUPERUSER_PASSWORD: ""
# SSO Configuration
# SOCIAL_AUTH_OKTA_OPENIDCONNECT_KEY: "your_okta_client_id"
# SOCIAL_AUTH_OKTA_OPENIDCONNECT_API_URL: "https://your-domain.okta.com"
# SOCIAL_AUTH_GOOGLE_OAUTH2_KEY: "your_google_client_id"
# secrets:
# - okta_openidconnect_secret
# - google_oauth2_secret
# Uncomment to use Docker secrets for SSO credentials
# secrets:
# okta_openidconnect_secret:
# file: ./secrets/okta_secret.txt
# google_oauth2_secret:
# file: ./secrets/google_secret.txt

View File

@ -9,7 +9,7 @@ services:
redis-cache:
condition: service_healthy
env_file: env/netbox.env
user: "unit:root"
user: "netbox:root"
volumes:
- ./test-configuration/test_config.py:/etc/netbox/config/test_config.py:z,ro
healthcheck:
@ -30,7 +30,7 @@ services:
interval: 15s
postgres:
image: docker.io/postgres:17-alpine
image: docker.io/postgres:18-alpine
env_file: env/postgres.env
healthcheck:
test: pg_isready -q -t 2 -d $$POSTGRES_DB -U $$POSTGRES_USER ## $$ because of docker-compose
@ -40,7 +40,7 @@ services:
retries: 5
redis: &redis
image: docker.io/valkey/valkey:8.1-alpine
image: docker.io/valkey/valkey:9.0-alpine
command:
- sh
- -c # this is to evaluate the $REDIS_PASSWORD from the env

View File

@ -1,12 +1,12 @@
services:
netbox: &netbox
image: docker.io/netboxcommunity/netbox:${VERSION-v4.4-3.4.0}
image: docker.io/netboxcommunity/netbox:${VERSION-v4.5-4.0.0}
depends_on:
- postgres
- redis
- redis-cache
env_file: env/netbox.env
user: "unit:root"
user: "netbox:root"
healthcheck:
test: curl -f http://localhost:8080/login/ || exit 1
start_period: 90s
@ -34,7 +34,7 @@ services:
# postgres
postgres:
image: docker.io/postgres:17-alpine
image: docker.io/postgres:18-alpine
healthcheck:
test: pg_isready -q -t 2 -d $$POSTGRES_DB -U $$POSTGRES_USER
start_period: 20s
@ -43,11 +43,11 @@ services:
retries: 5
env_file: env/postgres.env
volumes:
- netbox-postgres-data:/var/lib/postgresql/data
- netbox-postgres:/var/lib/postgresql
# redis
redis:
image: docker.io/valkey/valkey:8.1-alpine
image: docker.io/valkey/valkey:9.0-alpine
command:
- sh
- -c # this is to evaluate the $REDIS_PASSWORD from the env
@ -62,7 +62,7 @@ services:
volumes:
- netbox-redis-data:/data
redis-cache:
image: docker.io/valkey/valkey:8.1-alpine
image: docker.io/valkey/valkey:9.0-alpine
command:
- sh
- -c # this is to evaluate the $REDIS_PASSWORD from the env
@ -75,7 +75,7 @@ services:
volumes:
netbox-media-files:
driver: local
netbox-postgres-data:
netbox-postgres:
driver: local
netbox-redis-cache-data:
driver: local

View File

@ -54,43 +54,10 @@ fi
if [ "$SKIP_SUPERUSER" == "true" ]; then
echo "↩️ Skip creating the superuser"
else
if [ -z ${SUPERUSER_NAME+x} ]; then
SUPERUSER_NAME='admin'
fi
if [ -z ${SUPERUSER_EMAIL+x} ]; then
SUPERUSER_EMAIL='admin@example.com'
fi
if [ -f "/run/secrets/superuser_password" ]; then
SUPERUSER_PASSWORD="$(</run/secrets/superuser_password)"
elif [ -z ${SUPERUSER_PASSWORD+x} ]; then
SUPERUSER_PASSWORD='admin'
fi
if [ -f "/run/secrets/superuser_api_token" ]; then
SUPERUSER_API_TOKEN="$(</run/secrets/superuser_api_token)"
elif [ -z ${SUPERUSER_API_TOKEN+x} ]; then
SUPERUSER_API_TOKEN='0123456789abcdef0123456789abcdef01234567'
fi
./manage.py shell --interface python <<END
from users.models import Token, User
if not User.objects.filter(username='${SUPERUSER_NAME}'):
u = User.objects.create_superuser('${SUPERUSER_NAME}', '${SUPERUSER_EMAIL}', '${SUPERUSER_PASSWORD}')
Token.objects.create(user=u, key='${SUPERUSER_API_TOKEN}')
END
echo "💡 Superuser Username: ${SUPERUSER_NAME}, E-Mail: ${SUPERUSER_EMAIL}"
./manage.py shell --no-startup --no-imports --interface python \
</opt/netbox/super_user.py
fi
./manage.py shell --interface python <<END
from users.models import Token
try:
old_default_token = Token.objects.get(key="0123456789abcdef0123456789abcdef01234567")
if old_default_token:
print("⚠️ Warning: You have the old default admin API token in your database. This token is widely known; please remove it. Log in as your superuser and check API Tokens in your user menu.")
except Token.DoesNotExist:
pass
END
echo "✅ Initialisation is done."
# Launch whatever is passed by docker

13
docker/granian.py Normal file
View File

@ -0,0 +1,13 @@
from granian.utils.proxies import wrap_wsgi_with_proxy_headers
from netbox.wsgi import application
application = wrap_wsgi_with_proxy_headers(
application,
trusted_hosts=[
"10.0.0.0/8",
"172.16.0.0/12",
"192.168.0.0/16",
"fc00::/7",
"fe80::/10",
],
)

View File

@ -1,57 +1,21 @@
#!/bin/bash
UNIT_CONFIG="${UNIT_CONFIG-/etc/unit/nginx-unit.json}"
# Also used in "nginx-unit.json"
UNIT_SOCKET="/opt/unit/unit.sock"
load_configuration() {
MAX_WAIT=10
WAIT_COUNT=0
while [ ! -S $UNIT_SOCKET ]; do
if [ $WAIT_COUNT -ge $MAX_WAIT ]; then
echo "⚠️ No control socket found; configuration will not be loaded."
return 1
fi
WAIT_COUNT=$((WAIT_COUNT + 1))
echo "⏳ Waiting for control socket to be created... (${WAIT_COUNT}/${MAX_WAIT})"
sleep 1
done
# even when the control socket exists, it does not mean unit has finished initialisation
# this curl call will get a reply once unit is fully launched
curl --silent --output /dev/null --request GET --unix-socket $UNIT_SOCKET http://localhost/
echo "⚙️ Applying configuration from $UNIT_CONFIG"
RESP_CODE=$(
curl \
--silent \
--output /dev/null \
--write-out '%{http_code}' \
--request PUT \
--data-binary "@${UNIT_CONFIG}" \
--unix-socket $UNIT_SOCKET \
http://localhost/config
)
if [ "$RESP_CODE" != "200" ]; then
echo "⚠️ Could no load Unit configuration"
kill "$(cat /opt/unit/unit.pid)"
return 1
fi
echo "✅ Unit configuration loaded successfully"
}
load_configuration &
exec unitd \
--no-daemon \
--control unix:$UNIT_SOCKET \
--pid /opt/unit/unit.pid \
--log /dev/stdout \
--statedir /opt/unit/state/ \
--tmpdir /opt/unit/tmp/ \
--user unit \
--group root
exec granian \
--host "::" \
--port "8080" \
--interface "wsgi" \
--no-ws \
--workers "${GRANIAN_WORKERS:-4}" \
--respawn-failed-workers \
--backpressure "${GRANIAN_BACKPRESSURE:-${GRANIAN_WORKERS:-4}}" \
--loop "uvloop" \
--log \
--log-level "info" \
--access-log \
--working-dir "/opt/netbox/netbox/" \
--static-path-route "/static" \
--static-path-mount "/opt/netbox/netbox/static/" \
--static-path-dir-to-file index.html \
--pid-file "/tmp/granian.pid" \
"${GRANIAN_EXTRA_ARGS[@]}" \
"netbox.granian:application"

View File

@ -1,77 +0,0 @@
{
"listeners": {
"0.0.0.0:8080": {
"pass": "routes/main",
"forwarded": {
"client_ip": "X-Forwarded-For",
"protocol": "X-Forwarded-Proto",
"source": ["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"]
}
},
"0.0.0.0:8081": {
"pass": "routes/status",
"forwarded": {
"client_ip": "X-Forwarded-For",
"protocol": "X-Forwarded-Proto",
"source": ["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"]
}
},
"[::]:8080": {
"pass": "routes/main",
"forwarded": {
"client_ip": "X-Forwarded-For",
"protocol": "X-Forwarded-Proto",
"source": ["fc00::/7", "fe80::/10"]
}
},
"[::]:8081": {
"pass": "routes/status",
"forwarded": {
"client_ip": "X-Forwarded-For",
"protocol": "X-Forwarded-Proto",
"source": ["fc00::/7", "fe80::/10"]
}
}
},
"routes": {
"main": [
{
"match": {
"uri": "/static/*"
},
"action": {
"share": "/opt/netbox/netbox${uri}"
}
},
{
"action": {
"pass": "applications/netbox"
}
}
],
"status": [
{
"match": {
"uri": "/status/*"
},
"action": {
"proxy": "http://unix:/opt/unit/unit.sock"
}
}
]
},
"applications": {
"netbox": {
"type": "python 3",
"path": "/opt/netbox/netbox/",
"module": "netbox.wsgi",
"home": "/opt/netbox/venv",
"processes": {
"max": 4,
"spare": 1,
"idle_timeout": 120
}
}
},
"access_log": "/dev/stdout"
}

36
docker/super_user.py Normal file
View File

@ -0,0 +1,36 @@
from os import environ
from django.conf import settings
from users.choices import TokenVersionChoices
from users.models import Token, User
# Read secret from file
def _read_secret(secret_name: str, default: str | None = None) -> str | None:
try:
f = open("/run/secrets/" + secret_name, "r", encoding="utf-8")
except EnvironmentError:
return default
else:
with f:
return f.readline().strip()
su_name = environ.get("SUPERUSER_NAME", "admin")
su_email = environ.get("SUPERUSER_EMAIL", "admin@example.com")
su_password = _read_secret("superuser_password", environ.get("SUPERUSER_PASSWORD", "admin"))
su_api_token = _read_secret(
"superuser_api_token",
environ.get("SUPERUSER_API_TOKEN", "0123456789abcdef0123456789abcdef01234567"),
)
if not User.objects.filter(username=su_name):
u = User.objects.create_superuser(su_name, su_email, su_password)
msg = ""
if not settings.API_TOKEN_PEPPERS:
print("⚠️ No API token will be created as API_TOKEN_PEPPERS is not set")
msg = f"💡 Superuser Username: {su_name}, E-Mail: {su_email}"
else:
t = Token.objects.create(user=u, token=su_api_token, version=TokenVersionChoices.V2)
msg = f"💡 Superuser Username: {su_name}, E-Mail: {su_email}, API Token: {t} (use with '{t.get_auth_header_prefix()}<Your token>')"
print(msg)

View File

@ -1 +0,0 @@
deb [signed-by=/usr/share/keyrings/nginx-keyring.gpg] http://packages.nginx.org/unit/ubuntu/ noble unit

11
env/netbox.env vendored
View File

@ -1,3 +1,4 @@
API_TOKEN_PEPPER_1=Qy+F=OTeGskWQ(wTMgjc+NPPlz6YwFXY=KHIIg=wpYXT&e(6u8
CORS_ORIGIN_ALLOW_ALL=True
DB_HOST=postgres
DB_NAME=netbox
@ -14,6 +15,8 @@ EMAIL_USERNAME=netbox
# EMAIL_USE_SSL and EMAIL_USE_TLS are mutually exclusive, i.e. they can't both be `true`!
EMAIL_USE_SSL=false
EMAIL_USE_TLS=false
GRANIAN_BACKPRESSURE=4
GRANIAN_WORKERS=4
GRAPHQL_ENABLED=true
MEDIA_ROOT=/opt/netbox/netbox/media
METRICS_ENABLED=false
@ -30,4 +33,12 @@ REDIS_SSL=false
RELEASE_CHECK_URL=https://api.github.com/repos/netbox-community/netbox/releases
SECRET_KEY='r(m)9nLGnz$(_q3N4z1k(EFsMCjjjzx08x9VhNVcfd%6RF#r!6DE@+V5Zk2X'
SKIP_SUPERUSER=true
# SSO Configuration (uncomment and configure as needed)
# OKTA OpenID Connect
# SOCIAL_AUTH_OKTA_OPENIDCONNECT_KEY=your_okta_client_id
# SOCIAL_AUTH_OKTA_OPENIDCONNECT_SECRET=your_okta_client_secret
# SOCIAL_AUTH_OKTA_OPENIDCONNECT_API_URL=https://your-domain.okta.com
# Google OAuth2
# SOCIAL_AUTH_GOOGLE_OAUTH2_KEY=your_google_client_id
# SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET=your_google_client_secret
WEBHOOKS_ENABLED=true

View File

@ -1,6 +1,7 @@
django-auth-ldap==5.2.0
dulwich==0.24.1
django-auth-ldap==5.3.0
dulwich==1.0.0
granian[uvloop]==2.7.0
python3-saml==1.16.0
--no-binary lxml
--no-binary xmlsec
sentry-sdk[django]==2.35.2
sentry-sdk[django]==2.51.0

View File

@ -10,3 +10,7 @@ PLUGINS = [
ALLOW_TOKEN_RETRIEVAL = True
DEFAULT_PERMISSIONS = {}
API_TOKEN_PEPPERS = {
1: 'TEST-VALUE-DO-NOT-USE-TEST-VALUE-DO-NOT-USE-TEST-VALUE-DO-NOT-USE',
}