Compare commits
69 Commits
Author | SHA1 | Date | |
---|---|---|---|
61a3afbb3b | |||
91ab616cc5 | |||
43d62f1284 | |||
d61470d6ef | |||
091d23d537 | |||
2f24902436 | |||
36d47b9b88 | |||
2c20771682 | |||
a9cdec6d87 | |||
f1efccea6b | |||
226d8438de | |||
b6d6f85dc0 | |||
49ed10bbee | |||
3afdd3bf13 | |||
0170ed7d6f | |||
dad2e93572 | |||
d726426611 | |||
b31d99b936 | |||
8860d32f97 | |||
b9dff0d22e | |||
297aab1fd3 | |||
54bf7a3819 | |||
52876be723 | |||
ff20e4f49c | |||
ee47ba04bc | |||
688374d13f | |||
22c4212438 | |||
26dcb2f2e0 | |||
46afa266fa | |||
b2d26d9dce | |||
0b622361f3 | |||
ed48909f96 | |||
60d191bb2a | |||
4f482e484f | |||
58a1579832 | |||
6d5cf7a815 | |||
2e92554423 | |||
2456a642b7 | |||
b5108625ff | |||
9ab54f27b1 | |||
4b7037bbe6 | |||
f183603bc0 | |||
544a58325d | |||
9557bdf209 | |||
4890a8510d | |||
66f77b5eb1 | |||
661b6b07a3 | |||
ce8db1065d | |||
9a0e1115ed | |||
2b4c058af8 | |||
a206ad6811 | |||
a1dabcb758 | |||
940c1bb50c | |||
6c49d4fef5 | |||
621df33df9 | |||
7e86ba002f | |||
6f12cb36af | |||
4ef35aadb6 | |||
d4081c15e1 | |||
6e870b4d0b | |||
1e78ccd204 | |||
84e9b63524 | |||
4cc7f13b6e | |||
fc2d0d1852 | |||
ef98ad54fa | |||
4785e09945 | |||
d4f9bb6da3 | |||
ab41eaa5d9 | |||
02794f368b |
7
.github/workflows/push.yml
vendored
7
.github/workflows/push.yml
vendored
@ -13,11 +13,11 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
name: Checks syntax of our code
|
name: Checks syntax of our code
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
# Full git history is needed to get a proper list of changed files within `super-linter`
|
# Full git history is needed to get a proper list of changed files within `super-linter`
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- uses: actions/setup-python@v2
|
- uses: actions/setup-python@v3
|
||||||
- name: Lint Code Base
|
- name: Lint Code Base
|
||||||
uses: github/super-linter@v4
|
uses: github/super-linter@v4
|
||||||
env:
|
env:
|
||||||
@ -46,14 +46,13 @@ jobs:
|
|||||||
- ./build.sh develop
|
- ./build.sh develop
|
||||||
docker_from:
|
docker_from:
|
||||||
- '' # use the default of the build script
|
- '' # use the default of the build script
|
||||||
- alpine:edge
|
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
name: Builds new NetBox Docker Images
|
name: Builds new NetBox Docker Images
|
||||||
steps:
|
steps:
|
||||||
- id: git-checkout
|
- id: git-checkout
|
||||||
name: Checkout
|
name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
- id: docker-build
|
- id: docker-build
|
||||||
name: Build the image from '${{ matrix.docker_from }}' with '${{ matrix.build_cmd }}'
|
name: Build the image from '${{ matrix.docker_from }}' with '${{ matrix.build_cmd }}'
|
||||||
run: ${{ matrix.build_cmd }}
|
run: ${{ matrix.build_cmd }}
|
||||||
|
102
.github/workflows/release.yml
vendored
102
.github/workflows/release.yml
vendored
@ -1,9 +1,9 @@
|
|||||||
name: release
|
name: release
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
release:
|
||||||
branches:
|
types:
|
||||||
- release
|
- published
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '45 5 * * *'
|
- cron: '45 5 * * *'
|
||||||
|
|
||||||
@ -19,65 +19,69 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
name: Builds new NetBox Docker Images
|
name: Builds new NetBox Docker Images
|
||||||
|
env:
|
||||||
|
GH_ACTION: enable
|
||||||
steps:
|
steps:
|
||||||
- id: git-checkout
|
-
|
||||||
name: Checkout
|
name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
- id: docker-build
|
-
|
||||||
|
name: Get Version of NetBox Docker
|
||||||
|
run: |
|
||||||
|
echo "::set-output name=version::$(cat VERSION)"
|
||||||
|
shell: bash
|
||||||
|
-
|
||||||
|
id: docker-build
|
||||||
name: Build the image with '${{ matrix.build_cmd }}'
|
name: Build the image with '${{ matrix.build_cmd }}'
|
||||||
run: ${{ matrix.build_cmd }}
|
run: ${{ matrix.build_cmd }}
|
||||||
env:
|
-
|
||||||
GH_ACTION: enable
|
|
||||||
- id: docker-test
|
|
||||||
name: Test the image
|
name: Test the image
|
||||||
run: IMAGE="${FINAL_DOCKER_TAG}" ./test.sh
|
run: IMAGE="${FINAL_DOCKER_TAG}" ./test.sh
|
||||||
if: steps.docker-build.outputs.skipped != 'true'
|
if: steps.docker-build.outputs.skipped != 'true'
|
||||||
- id: registry-login
|
|
||||||
name: Login to the Docker Registry
|
# docker.io
|
||||||
run: |
|
-
|
||||||
echo "::add-mask::$DOCKERHUB_USERNAME"
|
name: Login to docker.io
|
||||||
echo "::add-mask::$DOCKERHUB_PASSWORD"
|
uses: docker/login-action@v1
|
||||||
docker login -u "$DOCKERHUB_USERNAME" --password "${DOCKERHUB_PASSWORD}" "${DOCKER_REGISTRY}"
|
with:
|
||||||
env:
|
registry: docker.io
|
||||||
DOCKERHUB_USERNAME: ${{ secrets.dockerhub_username }}
|
username: ${{ secrets.dockerhub_username }}
|
||||||
DOCKERHUB_PASSWORD: ${{ secrets.dockerhub_password }}
|
password: ${{ secrets.dockerhub_password }}
|
||||||
if: steps.docker-build.outputs.skipped != 'true'
|
if: steps.docker-build.outputs.skipped != 'true'
|
||||||
- id: registry-push
|
-
|
||||||
name: Push the image
|
name: Push the image to docker.io
|
||||||
run: ${{ matrix.build_cmd }} --push-only
|
run: ${{ matrix.build_cmd }} --push-only
|
||||||
if: steps.docker-build.outputs.skipped != 'true'
|
if: steps.docker-build.outputs.skipped != 'true'
|
||||||
- id: registry-logout
|
|
||||||
name: Logout of the Docker Registry
|
|
||||||
run: docker logout "${DOCKER_REGISTRY}"
|
|
||||||
if: steps.docker-build.outputs.skipped != 'true'
|
|
||||||
|
|
||||||
# Quay.io
|
# quay.io
|
||||||
- id: quayio-docker-build
|
-
|
||||||
name: Build the image with '${{ matrix.build_cmd }}'
|
name: Login to Quay.io
|
||||||
run: ${{ matrix.build_cmd }}
|
uses: docker/login-action@v1
|
||||||
env:
|
with:
|
||||||
DOCKER_REGISTRY: quay.io
|
registry: quay.io
|
||||||
GH_ACTION: enable
|
username: ${{ secrets.quayio_username }}
|
||||||
- id: quayio-registry-login
|
password: ${{ secrets.quayio_password }}
|
||||||
name: Login to the Quay.io Registry
|
|
||||||
run: |
|
|
||||||
echo "::add-mask::$QUAYIO_USERNAME"
|
|
||||||
echo "::add-mask::$QUAYIO_PASSWORD"
|
|
||||||
docker login -u "$QUAYIO_USERNAME" --password "${QUAYIO_PASSWORD}" "${DOCKER_REGISTRY}"
|
|
||||||
env:
|
|
||||||
DOCKER_REGISTRY: quay.io
|
|
||||||
QUAYIO_USERNAME: ${{ secrets.quayio_username }}
|
|
||||||
QUAYIO_PASSWORD: ${{ secrets.quayio_password }}
|
|
||||||
if: steps.docker-build.outputs.skipped != 'true'
|
if: steps.docker-build.outputs.skipped != 'true'
|
||||||
- id: quayio-registry-push
|
-
|
||||||
name: Push the image
|
name: Build and push the image with '${{ matrix.build_cmd }}'
|
||||||
run: ${{ matrix.build_cmd }} --push-only
|
run: ${{ matrix.build_cmd }} --push
|
||||||
env:
|
env:
|
||||||
DOCKER_REGISTRY: quay.io
|
DOCKER_REGISTRY: quay.io
|
||||||
if: steps.docker-build.outputs.skipped != 'true'
|
if: steps.docker-build.outputs.skipped != 'true'
|
||||||
- id: quayio-registry-logout
|
|
||||||
name: Logout of the Docker Registry
|
# ghcr.io
|
||||||
run: docker logout "${DOCKER_REGISTRY}"
|
-
|
||||||
env:
|
name: Login to GitHub Container Registry
|
||||||
DOCKER_REGISTRY: quay.io
|
uses: docker/login-action@v1
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.repository_owner }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
if: steps.docker-build.outputs.skipped != 'true'
|
||||||
|
-
|
||||||
|
name: Build and push the image with '${{ matrix.build_cmd }}'
|
||||||
|
run: ${{ matrix.build_cmd }} --push
|
||||||
|
env:
|
||||||
|
DOCKER_REGISTRY: ghcr.io
|
||||||
|
DOCKER_ORG: netbox-community
|
||||||
if: steps.docker-build.outputs.skipped != 'true'
|
if: steps.docker-build.outputs.skipped != 'true'
|
||||||
|
@ -63,6 +63,7 @@ RUN apk add --no-cache \
|
|||||||
libjpeg-turbo \
|
libjpeg-turbo \
|
||||||
libxslt \
|
libxslt \
|
||||||
openssl \
|
openssl \
|
||||||
|
postgresql-client \
|
||||||
postgresql-libs \
|
postgresql-libs \
|
||||||
py3-pip \
|
py3-pip \
|
||||||
python3 \
|
python3 \
|
||||||
@ -96,7 +97,7 @@ WORKDIR /opt/netbox/netbox
|
|||||||
RUN mkdir -p static /opt/unit/state/ /opt/unit/tmp/ \
|
RUN mkdir -p static /opt/unit/state/ /opt/unit/tmp/ \
|
||||||
&& chown -R unit:root media /opt/unit/ \
|
&& chown -R unit:root media /opt/unit/ \
|
||||||
&& chmod -R g+w media /opt/unit/ \
|
&& chmod -R g+w media /opt/unit/ \
|
||||||
&& cd /opt/netbox/ && /opt/netbox/venv/bin/python -m mkdocs build \
|
&& cd /opt/netbox/ && SECRET_KEY="dummy" /opt/netbox/venv/bin/python -m mkdocs build \
|
||||||
--config-file /opt/netbox/mkdocs.yml --site-dir /opt/netbox/netbox/project-static/docs/ \
|
--config-file /opt/netbox/mkdocs.yml --site-dir /opt/netbox/netbox/project-static/docs/ \
|
||||||
&& SECRET_KEY="dummy" /opt/netbox/venv/bin/python /opt/netbox/netbox/manage.py collectstatic --no-input
|
&& SECRET_KEY="dummy" /opt/netbox/venv/bin/python /opt/netbox/netbox/manage.py collectstatic --no-input
|
||||||
|
|
||||||
|
101
README.md
101
README.md
@ -7,47 +7,28 @@
|
|||||||

|

|
||||||
[][netbox-docker-license]
|
[][netbox-docker-license]
|
||||||
|
|
||||||
[The Github repository](netbox-docker-github) houses the components needed to build NetBox as a Docker container.
|
[The GitHub repository](netbox-docker-github) houses the components needed to build NetBox as a container.
|
||||||
Images are built using this code and are released to [Docker Hub][netbox-dockerhub] and [Quay.io][netbox-quayio] once a day.
|
Images are built regularly using the code in that repository and are pushed to [Docker Hub][netbox-dockerhub], [Quay.io][netbox-quayio] and [GitHub Container Registry][netbox-ghcr].
|
||||||
|
|
||||||
Do you have any questions?
|
Do you have any questions?
|
||||||
Before opening an issue on Github,
|
Before opening an issue on Github,
|
||||||
please join the [our Slack][netbox-docker-slack] and ask for help in the [`#netbox-docker`][netbox-docker-slack-channel] channel.
|
please join [our Slack][netbox-docker-slack] and ask for help in the [`#netbox-docker`][netbox-docker-slack-channel] channel.
|
||||||
|
|
||||||
[github-stargazers]: https://github.com/netbox-community/netbox-docker/stargazers
|
[github-stargazers]: https://github.com/netbox-community/netbox-docker/stargazers
|
||||||
[github-release]: https://github.com/netbox-community/netbox-docker/releases
|
[github-release]: https://github.com/netbox-community/netbox-docker/releases
|
||||||
[netbox-docker-microbadger]: https://microbadger.com/images/netboxcommunity/netbox
|
[netbox-docker-microbadger]: https://microbadger.com/images/netboxcommunity/netbox
|
||||||
[netbox-dockerhub]: https://hub.docker.com/r/netboxcommunity/netbox/
|
[netbox-dockerhub]: https://hub.docker.com/r/netboxcommunity/netbox/
|
||||||
|
[netbox-quayio]: https://quay.io/repository/netboxcommunity/netbox
|
||||||
|
[netbox-ghcr]: https://github.com/netbox-community/netbox-docker/pkgs/container/netbox
|
||||||
[netbox-docker-github]: https://github.com/netbox-community/netbox-docker/
|
[netbox-docker-github]: https://github.com/netbox-community/netbox-docker/
|
||||||
[netbox-docker-slack]: https://join.slack.com/t/netdev-community/shared_invite/zt-mtts8g0n-Sm6Wutn62q_M4OdsaIycrQ
|
[netbox-docker-slack]: https://join.slack.com/t/netdev-community/shared_invite/zt-mtts8g0n-Sm6Wutn62q_M4OdsaIycrQ
|
||||||
[netbox-docker-slack-channel]: https://netdev-community.slack.com/archives/C01P0GEVBU7
|
[netbox-docker-slack-channel]: https://netdev-community.slack.com/archives/C01P0GEVBU7
|
||||||
[netbox-slack-channel]: https://netdev-community.slack.com/archives/C01P0FRSXRV
|
[netbox-slack-channel]: https://netdev-community.slack.com/archives/C01P0FRSXRV
|
||||||
[netbox-docker-license]: https://github.com/netbox-community/netbox-docker/blob/release/LICENSE
|
[netbox-docker-license]: https://github.com/netbox-community/netbox-docker/blob/release/LICENSE
|
||||||
[netbox-quayio]: https://quay.io/repository/netboxcommunity/netbox
|
|
||||||
|
|
||||||
## Docker Tags
|
|
||||||
|
|
||||||
* `vX.Y.Z`: These are release builds, automatically built from [the corresponding releases of NetBox][netbox-releases].
|
|
||||||
* `latest`: These are release builds, automatically built from [the `master` branch of NetBox][netbox-master].
|
|
||||||
* `snapshot`: These are pre-release builds, automatically built from the [`develop` branch of NetBox][netbox-develop].
|
|
||||||
* `develop-X.Y`: These are pre-release builds, automatically built from the corresponding [branch of NetBox][netbox-branches].
|
|
||||||
|
|
||||||
Then there is currently one extra tags for each of the above tags:
|
|
||||||
|
|
||||||
* `-ldap`: Contains additional dependencies and configurations for connecting NetBox to an LDAP directory.
|
|
||||||
[Learn more about that in our wiki][netbox-docker-ldap].
|
|
||||||
|
|
||||||
New images are built and published automatically every ~24h.
|
|
||||||
|
|
||||||
[netbox-releases]: https://github.com/netbox-community/netbox/releases
|
|
||||||
[netbox-master]: https://github.com/netbox-community/netbox/tree/master
|
|
||||||
[netbox-develop]: https://github.com/netbox-community/netbox/tree/develop
|
|
||||||
[netbox-branches]: https://github.com/netbox-community/netbox/branches
|
|
||||||
[netbox-docker-ldap]: https://github.com/netbox-community/netbox-docker/wiki/LDAP
|
|
||||||
|
|
||||||
## Quickstart
|
## Quickstart
|
||||||
|
|
||||||
To get NetBox Docker up and running run the following commands.
|
To get _NetBox Docker_ up and running run the following commands.
|
||||||
There is a more complete [_Getting Started_ guide on our wiki][wiki-getting-started] which explains every step.
|
There is a more complete [_Getting Started_ guide on our wiki][wiki-getting-started] which explains every step.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@ -77,16 +58,65 @@ The default credentials are:
|
|||||||
[wiki-getting-started]: https://github.com/netbox-community/netbox-docker/wiki/Getting-Started
|
[wiki-getting-started]: https://github.com/netbox-community/netbox-docker/wiki/Getting-Started
|
||||||
[docker-reception]: https://github.com/nxt-engineering/reception
|
[docker-reception]: https://github.com/nxt-engineering/reception
|
||||||
|
|
||||||
|
## Container Image Tags
|
||||||
|
|
||||||
|
New container images are built and published automatically every ~24h.
|
||||||
|
|
||||||
|
> We recommend to use either the `vX.Y.Z-a.b.c` tags or the `vX.Y-a.b.c` tags in production!
|
||||||
|
|
||||||
|
* `vX.Y.Z-a.b.c`, `vX.Y-a.b.c`:
|
||||||
|
These are release builds containing _NetBox version_ `vX.Y.Z`.
|
||||||
|
They contain the support files of _NetBox Docker version_ `a.b.c`.
|
||||||
|
You must use _NetBox Docker version_ `a.b.c` to guarantee the compatibility.
|
||||||
|
These images are automatically built from [the corresponding releases of NetBox][netbox-releases].
|
||||||
|
* `latest-a.b.c`:
|
||||||
|
These are release builds, containing the latest stable version of NetBox.
|
||||||
|
They contain the support files of _NetBox Docker version_ `a.b.c`.
|
||||||
|
You must use _NetBox Docker version_ `a.b.c` to guarantee the compatibility.
|
||||||
|
These images are automatically built from [the `master` branch of NetBox][netbox-master].
|
||||||
|
* `snapshot-a.b.c`:
|
||||||
|
These are prerelease builds.
|
||||||
|
They contain the support files of _NetBox Docker version_ `a.b.c`.
|
||||||
|
You must use _NetBox Docker version_ `a.b.c` to guarantee the compatibility.
|
||||||
|
These images are automatically built from the [`develop` branch of NetBox][netbox-develop].
|
||||||
|
|
||||||
|
For each of the above tag, there is an extra tag:
|
||||||
|
|
||||||
|
* `vX.Y.Z`, `vX.Y`:
|
||||||
|
This is the same version as `vX.Y.Z-a.b.c` (or `vX.Y-a.b.c`, respectively).
|
||||||
|
It always points to the latest version of _NetBox Docker_.
|
||||||
|
* `latest`
|
||||||
|
This is the same version as `latest-a.b.c`.
|
||||||
|
It always points to the latest version of _NetBox Docker_.
|
||||||
|
* `snapshot`
|
||||||
|
This is the same version as `snapshot-a.b.c`.
|
||||||
|
It always points to the latest version of _NetBox Docker_.
|
||||||
|
|
||||||
|
Then there is currently one extra tags for each of the above tags:
|
||||||
|
|
||||||
|
* `-ldap`:
|
||||||
|
These container images contain additional dependencies and configuration files for connecting NetBox to an LDAP directory.
|
||||||
|
[Learn more about that in our wiki][netbox-docker-ldap].
|
||||||
|
|
||||||
|
[netbox-releases]: https://github.com/netbox-community/netbox/releases
|
||||||
|
[netbox-master]: https://github.com/netbox-community/netbox/tree/master
|
||||||
|
[netbox-develop]: https://github.com/netbox-community/netbox/tree/develop
|
||||||
|
[netbox-branches]: https://github.com/netbox-community/netbox/branches
|
||||||
|
[netbox-docker-ldap]: https://github.com/netbox-community/netbox-docker/wiki/LDAP
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
Please refer [to our wiki on Github][netbox-docker-wiki] for further information on how to use this NetBox Docker image properly.
|
Please refer [to our wiki on GitHub][netbox-docker-wiki] for further information on how to use the NetBox Docker image properly.
|
||||||
It covers advanced topics such as using files for secrets, deployment to Kubernetes, monitoring and configuring NAPALM or LDAP.
|
The wiki covers advanced topics such as using files for secrets, configuring TLS, deployment to Kubernetes, monitoring and configuring NAPALM and LDAP.
|
||||||
|
|
||||||
|
Our wiki is a community effort.
|
||||||
|
Feel free to correct errors, update outdated information or provide additional guides and insights.
|
||||||
|
|
||||||
[netbox-docker-wiki]: https://github.com/netbox-community/netbox-docker/wiki/
|
[netbox-docker-wiki]: https://github.com/netbox-community/netbox-docker/wiki/
|
||||||
|
|
||||||
## Getting Help
|
## Getting Help
|
||||||
|
|
||||||
Feel free to ask questions in our [Github Community][netbox-community]
|
Feel free to ask questions in our [GitHub Community][netbox-community]
|
||||||
or [join our Slack][netbox-docker-slack] and ask [in our channel `#netbox-docker`][netbox-docker-slack-channel],
|
or [join our Slack][netbox-docker-slack] and ask [in our channel `#netbox-docker`][netbox-docker-slack-channel],
|
||||||
which is free to use and where there are almost always people online that can help you in the Slack channel.
|
which is free to use and where there are almost always people online that can help you in the Slack channel.
|
||||||
|
|
||||||
@ -104,22 +134,19 @@ This project relies only on *Docker* and *docker-compose* meeting these requirem
|
|||||||
|
|
||||||
To check the version installed on your system run `docker --version` and `docker-compose --version`.
|
To check the version installed on your system run `docker --version` and `docker-compose --version`.
|
||||||
|
|
||||||
## Breaking Changes
|
## Updating
|
||||||
|
|
||||||
From time to time it might become necessary to re-engineer the structure of this setup.
|
|
||||||
Things like the `docker-compose.yml` file or your Kubernetes or OpenShift configurations have to be adjusted as a consequence.
|
|
||||||
|
|
||||||
Since November 2019 each image built from this repo contains a `org.opencontainers.image.version` label.
|
|
||||||
(The images contained labels since April 2018, although in November 2019 the labels' names changed.)
|
|
||||||
You can check the label of your local image by running `docker inspect netboxcommunity/netbox:v2.7.1 --format "{{json .Config.Labels}}"`.
|
|
||||||
|
|
||||||
Please read [the release notes][releases] carefully when updating to a new image version.
|
Please read [the release notes][releases] carefully when updating to a new image version.
|
||||||
|
Note that the version of the NetBox Docker container image must stay in sync with the code.
|
||||||
|
|
||||||
|
If you update for the first time, be sure [to follow our _How To Update NetBox Docker_ guide in the wiki][netbox-docker-wiki-updating].
|
||||||
|
|
||||||
[releases]: https://github.com/netbox-community/netbox-docker/releases
|
[releases]: https://github.com/netbox-community/netbox-docker/releases
|
||||||
|
[netbox-docker-wiki-updating]: https://github.com/netbox-community/netbox-docker/wiki/Updating
|
||||||
|
|
||||||
## Rebuilding the Image
|
## Rebuilding the Image
|
||||||
|
|
||||||
`./build.sh` can be used to rebuild the Docker image. See `./build.sh --help` for more information.
|
`./build.sh` can be used to rebuild the container image. See `./build.sh --help` for more information.
|
||||||
|
|
||||||
For more details on custom builds [consult our wiki][netbox-docker-wiki-build].
|
For more details on custom builds [consult our wiki][netbox-docker-wiki-build].
|
||||||
|
|
||||||
|
@ -3,6 +3,14 @@
|
|||||||
|
|
||||||
echo "▶️ $0 $*"
|
echo "▶️ $0 $*"
|
||||||
|
|
||||||
|
###
|
||||||
|
# Check for the jq library needed for parsing JSON
|
||||||
|
###
|
||||||
|
if ! command -v jq; then
|
||||||
|
echo "⚠️ jq command missing from \$PATH!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
###
|
###
|
||||||
# Checking for the presence of GITHUB_OAUTH_CLIENT_ID
|
# Checking for the presence of GITHUB_OAUTH_CLIENT_ID
|
||||||
# and GITHUB_OAUTH_CLIENT_SECRET
|
# and GITHUB_OAUTH_CLIENT_SECRET
|
||||||
|
@ -62,6 +62,7 @@ REDIS = {
|
|||||||
'PASSWORD': _read_secret('redis_password', environ.get('REDIS_PASSWORD', '')),
|
'PASSWORD': _read_secret('redis_password', environ.get('REDIS_PASSWORD', '')),
|
||||||
'DATABASE': int(environ.get('REDIS_DATABASE', 0)),
|
'DATABASE': int(environ.get('REDIS_DATABASE', 0)),
|
||||||
'SSL': environ.get('REDIS_SSL', 'False').lower() == 'true',
|
'SSL': environ.get('REDIS_SSL', 'False').lower() == 'true',
|
||||||
|
'INSECURE_SKIP_TLS_VERIFY': environ.get('REDIS_INSECURE_SKIP_TLS_VERIFY', 'False').lower() == 'true',
|
||||||
},
|
},
|
||||||
'caching': {
|
'caching': {
|
||||||
'HOST': environ.get('REDIS_CACHE_HOST', environ.get('REDIS_HOST', 'localhost')),
|
'HOST': environ.get('REDIS_CACHE_HOST', environ.get('REDIS_HOST', 'localhost')),
|
||||||
@ -69,6 +70,7 @@ REDIS = {
|
|||||||
'PASSWORD': _read_secret('redis_cache_password', environ.get('REDIS_CACHE_PASSWORD', environ.get('REDIS_PASSWORD', ''))),
|
'PASSWORD': _read_secret('redis_cache_password', environ.get('REDIS_CACHE_PASSWORD', environ.get('REDIS_PASSWORD', ''))),
|
||||||
'DATABASE': int(environ.get('REDIS_CACHE_DATABASE', 1)),
|
'DATABASE': int(environ.get('REDIS_CACHE_DATABASE', 1)),
|
||||||
'SSL': environ.get('REDIS_CACHE_SSL', environ.get('REDIS_SSL', 'False')).lower() == 'true',
|
'SSL': environ.get('REDIS_CACHE_SSL', environ.get('REDIS_SSL', 'False')).lower() == 'true',
|
||||||
|
'INSECURE_SKIP_TLS_VERIFY': environ.get('REDIS_CACHE_INSECURE_SKIP_TLS_VERIFY', environ.get('REDIS_INSECURE_SKIP_TLS_VERIFY', 'False')).lower() == 'true',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,6 +147,9 @@ ENFORCE_GLOBAL_UNIQUE = environ.get('ENFORCE_GLOBAL_UNIQUE', 'False').lower() ==
|
|||||||
# by anonymous users. List models in the form `<app>.<model>`. Add '*' to this list to exempt all models.
|
# by anonymous users. List models in the form `<app>.<model>`. Add '*' to this list to exempt all models.
|
||||||
EXEMPT_VIEW_PERMISSIONS = list(filter(None, environ.get('EXEMPT_VIEW_PERMISSIONS', '').split(' ')))
|
EXEMPT_VIEW_PERMISSIONS = list(filter(None, environ.get('EXEMPT_VIEW_PERMISSIONS', '').split(' ')))
|
||||||
|
|
||||||
|
# Enable GraphQL API.
|
||||||
|
GRAPHQL_ENABLED = environ.get('GRAPHQL_ENABLED', 'True').lower() == 'true'
|
||||||
|
|
||||||
# Enable custom logging. Please see the Django documentation for detailed guidance on configuring custom logs:
|
# Enable custom logging. Please see the Django documentation for detailed guidance on configuring custom logs:
|
||||||
# https://docs.djangoproject.com/en/stable/topics/logging/
|
# https://docs.djangoproject.com/en/stable/topics/logging/
|
||||||
LOGGING = {}
|
LOGGING = {}
|
||||||
|
@ -18,7 +18,7 @@ services:
|
|||||||
- ./scripts:/etc/netbox/scripts:z,ro
|
- ./scripts:/etc/netbox/scripts:z,ro
|
||||||
- netbox-media-files:/opt/netbox/netbox/media:z
|
- netbox-media-files:/opt/netbox/netbox/media:z
|
||||||
postgres:
|
postgres:
|
||||||
image: postgres:13-alpine
|
image: postgres:14-alpine
|
||||||
env_file: env/postgres.env
|
env_file: env/postgres.env
|
||||||
redis:
|
redis:
|
||||||
image: redis:6-alpine
|
image: redis:6-alpine
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
version: '3.4'
|
version: '3.4'
|
||||||
services:
|
services:
|
||||||
netbox: &netbox
|
netbox: &netbox
|
||||||
image: netboxcommunity/netbox:${VERSION-v3.0-1.4.1}
|
image: netboxcommunity/netbox:${VERSION-v3.2-1.6.1}
|
||||||
depends_on:
|
depends_on:
|
||||||
- postgres
|
- postgres
|
||||||
- redis
|
- redis
|
||||||
@ -35,7 +35,7 @@ services:
|
|||||||
|
|
||||||
# postgres
|
# postgres
|
||||||
postgres:
|
postgres:
|
||||||
image: postgres:13-alpine
|
image: postgres:14-alpine
|
||||||
env_file: env/postgres.env
|
env_file: env/postgres.env
|
||||||
volumes:
|
volumes:
|
||||||
- netbox-postgres-data:/var/lib/postgresql/data
|
- netbox-postgres-data:/var/lib/postgresql/data
|
||||||
|
@ -82,3 +82,10 @@ def __getattr__(name):
|
|||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
raise AttributeError
|
raise AttributeError
|
||||||
|
|
||||||
|
|
||||||
|
def __dir__():
|
||||||
|
names = []
|
||||||
|
for config in _loaded_configurations:
|
||||||
|
names.extend(config.__dir__())
|
||||||
|
return names
|
||||||
|
3
env/netbox.env
vendored
3
env/netbox.env
vendored
@ -14,6 +14,7 @@ EMAIL_USERNAME=netbox
|
|||||||
# EMAIL_USE_SSL and EMAIL_USE_TLS are mutually exclusive, i.e. they can't both be `true`!
|
# EMAIL_USE_SSL and EMAIL_USE_TLS are mutually exclusive, i.e. they can't both be `true`!
|
||||||
EMAIL_USE_SSL=false
|
EMAIL_USE_SSL=false
|
||||||
EMAIL_USE_TLS=false
|
EMAIL_USE_TLS=false
|
||||||
|
GRAPHQL_ENABLED=true
|
||||||
HOUSEKEEPING_INTERVAL=86400
|
HOUSEKEEPING_INTERVAL=86400
|
||||||
MAX_PAGE_SIZE=1000
|
MAX_PAGE_SIZE=1000
|
||||||
MEDIA_ROOT=/opt/netbox/netbox/media
|
MEDIA_ROOT=/opt/netbox/netbox/media
|
||||||
@ -23,10 +24,12 @@ NAPALM_TIMEOUT=10
|
|||||||
NAPALM_USERNAME=
|
NAPALM_USERNAME=
|
||||||
REDIS_CACHE_DATABASE=1
|
REDIS_CACHE_DATABASE=1
|
||||||
REDIS_CACHE_HOST=redis-cache
|
REDIS_CACHE_HOST=redis-cache
|
||||||
|
REDIS_CACHE_INSECURE_SKIP_TLS_VERIFY=false
|
||||||
REDIS_CACHE_PASSWORD=t4Ph722qJ5QHeQ1qfu36
|
REDIS_CACHE_PASSWORD=t4Ph722qJ5QHeQ1qfu36
|
||||||
REDIS_CACHE_SSL=false
|
REDIS_CACHE_SSL=false
|
||||||
REDIS_DATABASE=0
|
REDIS_DATABASE=0
|
||||||
REDIS_HOST=redis
|
REDIS_HOST=redis
|
||||||
|
REDIS_INSECURE_SKIP_TLS_VERIFY=false
|
||||||
REDIS_PASSWORD=H733Kdjndks81
|
REDIS_PASSWORD=H733Kdjndks81
|
||||||
REDIS_SSL=false
|
REDIS_SSL=false
|
||||||
RELEASE_CHECK_URL=https://api.github.com/repos/netbox-community/netbox/releases
|
RELEASE_CHECK_URL=https://api.github.com/repos/netbox-community/netbox/releases
|
||||||
|
7
initializers/asns.yml
Normal file
7
initializers/asns.yml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# - asn: 1
|
||||||
|
# rir: RFC1918
|
||||||
|
# tenant: tenant1
|
||||||
|
# - asn: 2
|
||||||
|
# rir: RFC4193 ULA
|
||||||
|
# - asn: 3
|
||||||
|
# rir: RFC3849
|
@ -3,7 +3,6 @@
|
|||||||
# region: Downtown
|
# region: Downtown
|
||||||
# status: active
|
# status: active
|
||||||
# facility: Amsterdam 1
|
# facility: Amsterdam 1
|
||||||
# asn: 12345
|
|
||||||
# custom_field_data:
|
# custom_field_data:
|
||||||
# text_field: Description for AMS1
|
# text_field: Description for AMS1
|
||||||
# - name: AMS 2
|
# - name: AMS 2
|
||||||
@ -11,7 +10,6 @@
|
|||||||
# region: Downtown
|
# region: Downtown
|
||||||
# status: active
|
# status: active
|
||||||
# facility: Amsterdam 2
|
# facility: Amsterdam 2
|
||||||
# asn: 54321
|
|
||||||
# custom_field_data:
|
# custom_field_data:
|
||||||
# text_field: Description for AMS2
|
# text_field: Description for AMS2
|
||||||
# - name: AMS 3
|
# - name: AMS 3
|
||||||
@ -19,7 +17,6 @@
|
|||||||
# region: Suburbs
|
# region: Suburbs
|
||||||
# status: active
|
# status: active
|
||||||
# facility: Amsterdam 3
|
# facility: Amsterdam 3
|
||||||
# asn: 67890
|
|
||||||
# tenant: tenant1
|
# tenant: tenant1
|
||||||
# custom_field_data:
|
# custom_field_data:
|
||||||
# text_field: Description for AMS3
|
# text_field: Description for AMS3
|
||||||
@ -28,7 +25,6 @@
|
|||||||
# region: Singapore
|
# region: Singapore
|
||||||
# status: active
|
# status: active
|
||||||
# facility: Singapore 1
|
# facility: Singapore 1
|
||||||
# asn: 09876
|
|
||||||
# tenant: tenant2
|
# tenant: tenant2
|
||||||
# custom_field_data:
|
# custom_field_data:
|
||||||
# text_field: Description for SING1
|
# text_field: Description for SING1
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
napalm==3.3.1
|
django-auth-ldap==4.0.0
|
||||||
ruamel.yaml==0.17.16
|
django-storages[azure,boto3,dropbox,google,libcloud,sftp]==1.12.3
|
||||||
django-auth-ldap==3.0.0
|
|
||||||
google-crc32c==1.3.0
|
google-crc32c==1.3.0
|
||||||
django-storages[azure,boto3,dropbox,google,libcloud,sftp]==1.12.1
|
napalm==3.4.0
|
||||||
|
ruamel.yaml==0.17.21
|
||||||
|
@ -18,6 +18,6 @@ for groupname, group_details in groups.items():
|
|||||||
|
|
||||||
if user:
|
if user:
|
||||||
group.user_set.add(user)
|
group.user_set.add(user)
|
||||||
print(" 👤 Assigned user %s to group %s" % (username, AdminGroup.name))
|
print(" 👤 Assigned user %s to group %s" % (username, group.name))
|
||||||
|
|
||||||
group.save()
|
group.save()
|
||||||
|
@ -47,7 +47,10 @@ for permission_name, permission_details in object_permissions.items():
|
|||||||
|
|
||||||
if group:
|
if group:
|
||||||
object_permission.groups.add(group)
|
object_permission.groups.add(group)
|
||||||
print(" 👥 Assigned group %s object permission of %s" % (groupname, groupname))
|
print(
|
||||||
|
" 👥 Assigned group %s object permission of %s"
|
||||||
|
% (groupname, object_permission.name)
|
||||||
|
)
|
||||||
|
|
||||||
if permission_details.get("users", 0):
|
if permission_details.get("users", 0):
|
||||||
for username in permission_details["users"]:
|
for username in permission_details["users"]:
|
||||||
@ -55,6 +58,9 @@ for permission_name, permission_details in object_permissions.items():
|
|||||||
|
|
||||||
if user:
|
if user:
|
||||||
object_permission.users.add(user)
|
object_permission.users.add(user)
|
||||||
print(" 👤 Assigned user %s object permission of %s" % (username, groupname))
|
print(
|
||||||
|
" 👤 Assigned user %s object permission of %s"
|
||||||
|
% (username, object_permission.name)
|
||||||
|
)
|
||||||
|
|
||||||
object_permission.save()
|
object_permission.save()
|
@ -42,6 +42,9 @@ for cf_name, cf_details in customfields.items():
|
|||||||
if cf_details.get("type", False):
|
if cf_details.get("type", False):
|
||||||
custom_field.type = cf_details["type"]
|
custom_field.type = cf_details["type"]
|
||||||
|
|
||||||
|
if cf_details.get("filter_logic", False):
|
||||||
|
custom_field.filter_logic = cf_details["filter_logic"]
|
||||||
|
|
||||||
if cf_details.get("weight", -1) >= 0:
|
if cf_details.get("weight", -1) >= 0:
|
||||||
custom_field.weight = cf_details["weight"]
|
custom_field.weight = cf_details["weight"]
|
||||||
|
|
@ -1,42 +0,0 @@
|
|||||||
import sys
|
|
||||||
|
|
||||||
from dcim.models import Site
|
|
||||||
from startup_script_utils import load_yaml, pop_custom_fields, set_custom_fields_values
|
|
||||||
from tenancy.models import Tenant
|
|
||||||
from virtualization.models import Cluster, ClusterGroup, ClusterType
|
|
||||||
|
|
||||||
clusters = load_yaml("/opt/netbox/initializers/clusters.yml")
|
|
||||||
|
|
||||||
if clusters is None:
|
|
||||||
sys.exit()
|
|
||||||
|
|
||||||
required_assocs = {"type": (ClusterType, "name")}
|
|
||||||
|
|
||||||
optional_assocs = {
|
|
||||||
"site": (Site, "name"),
|
|
||||||
"group": (ClusterGroup, "name"),
|
|
||||||
"tenant": (Tenant, "name"),
|
|
||||||
}
|
|
||||||
|
|
||||||
for params in clusters:
|
|
||||||
custom_field_data = pop_custom_fields(params)
|
|
||||||
|
|
||||||
for assoc, details in required_assocs.items():
|
|
||||||
model, field = details
|
|
||||||
query = {field: params.pop(assoc)}
|
|
||||||
|
|
||||||
params[assoc] = model.objects.get(**query)
|
|
||||||
|
|
||||||
for assoc, details in optional_assocs.items():
|
|
||||||
if assoc in params:
|
|
||||||
model, field = details
|
|
||||||
query = {field: params.pop(assoc)}
|
|
||||||
|
|
||||||
params[assoc] = model.objects.get(**query)
|
|
||||||
|
|
||||||
cluster, created = Cluster.objects.get_or_create(**params)
|
|
||||||
|
|
||||||
if created:
|
|
||||||
set_custom_fields_values(cluster, custom_field_data)
|
|
||||||
|
|
||||||
print("🗄️ Created cluster", cluster.name)
|
|
@ -1,15 +0,0 @@
|
|||||||
import sys
|
|
||||||
|
|
||||||
from startup_script_utils import load_yaml
|
|
||||||
from virtualization.models import ClusterGroup
|
|
||||||
|
|
||||||
cluster_groups = load_yaml("/opt/netbox/initializers/cluster_groups.yml")
|
|
||||||
|
|
||||||
if cluster_groups is None:
|
|
||||||
sys.exit()
|
|
||||||
|
|
||||||
for params in cluster_groups:
|
|
||||||
cluster_group, created = ClusterGroup.objects.get_or_create(**params)
|
|
||||||
|
|
||||||
if created:
|
|
||||||
print("🗄️ Created Cluster Group", cluster_group.name)
|
|
33
startup_scripts/260_asns.py
Normal file
33
startup_scripts/260_asns.py
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
import sys
|
||||||
|
|
||||||
|
from ipam.models import ASN, RIR
|
||||||
|
from startup_script_utils import load_yaml
|
||||||
|
from tenancy.models import Tenant
|
||||||
|
|
||||||
|
asns = load_yaml("/opt/netbox/initializers/asns.yml")
|
||||||
|
|
||||||
|
if asns is None:
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
required_assocs = {"rir": (RIR, "name")}
|
||||||
|
|
||||||
|
optional_assocs = {"tenant": (Tenant, "name")}
|
||||||
|
|
||||||
|
for params in asns:
|
||||||
|
for assoc, details in required_assocs.items():
|
||||||
|
model, field = details
|
||||||
|
query = {field: params.pop(assoc)}
|
||||||
|
|
||||||
|
params[assoc] = model.objects.get(**query)
|
||||||
|
|
||||||
|
for assoc, details in optional_assocs.items():
|
||||||
|
if assoc in params:
|
||||||
|
model, field = details
|
||||||
|
query = {field: params.pop(assoc)}
|
||||||
|
|
||||||
|
params[assoc] = model.objects.get(**query)
|
||||||
|
|
||||||
|
asn, created = ASN.objects.get_or_create(**params)
|
||||||
|
|
||||||
|
if created:
|
||||||
|
print(f"🔡 Created ASN {asn.asn}")
|
@ -52,6 +52,7 @@ for params in ip_addresses:
|
|||||||
params["assigned_object_id"] = Interface.objects.get(**query).id
|
params["assigned_object_id"] = Interface.objects.get(**query).id
|
||||||
else:
|
else:
|
||||||
query = {field: params.pop(assoc)}
|
query = {field: params.pop(assoc)}
|
||||||
|
|
||||||
params[assoc] = model.objects.get(**query)
|
params[assoc] = model.objects.get(**query)
|
||||||
|
|
||||||
ip_address, created = IPAddress.objects.get_or_create(**params)
|
ip_address, created = IPAddress.objects.get_or_create(**params)
|
Reference in New Issue
Block a user