The following documents the steps needed to setup NetBox on OpenBSD. I am running NetBox on a PC Engines APU which holds up fairly well and I have since migrated my own setup from RackTables to NetBox, primarily because of the API functionality NetBox offers which allows for integration with SaltStack. But more on that some other time.

I have ported a few dependencies but gave up after realising all of the Django applications/modules needed to be ported including their dependencies. I chose against importing two dozen new py ports and use a virtualenv with --system-site-packages instead.

In the end you’ll have:

  • “installed” NetBox in /var/www/netbox
  • run it with gunicorn with nginx in front
  • have supervisord handle starting the service at boot
  • a working NetBox installation reachable on


  • OpenBSD-current as of early May 2018 (due to some newly imported packages)
  • PostgreSQL server running $somewhere (local or remote); if that’s not the case: pkg_add postgresql-server && cat /usr/local/share/doc/pkg-readmes/postgresql-*

Setting up the virtualenv

Install all the packages we’re going to need, note that we’ll instruct virtualenv to use as many system packages as it finds. This is partly to ensure that pkg_add -u updates the packages which depend on other shared libraries which may have gotten updated:

pkg_add py3-natsort py3-graphviz py3-pygfm py3-Pillow \
        py3-cryptodomex py3-ncclient py3-django-lts py3-psycopg2 \
        py3-paramiko py3-xmltodict py3-netaddr \
        py3-virtualenv py3-gunicorn nginx supervisor git

I’ve chosen to install netbox in /var/www/netbox and run it from a virtualenv. Note the tag I checkout here may have moved so use the latest release of netbox you want if not v2.3.3:

cd /var/www/
git clone
cd netbox
git checkout v2.3.3
virtualenv-3 --system-site-packages env
. env/bin/activate
pip3 install -r requirements.txt

Now follow the upstream documentation on configuring the database and setting up NetBox:

Note the commands should be run from /var/www/netbox/netbox.

Next up, verify that running the Django applications works before moving on:

python3 runserver --insecure

Make sure to navigate to one of the names configured as ALLOWED_HOSTS, i.e., otherwise you’ll end up with HTTP 400 errors.


^C the above command and configure NGINX. You’ll want to adjust /etc/nginx/nginx.conf to define the following server block:

server {
        listen       80;
        listen       [::]:80;
        client_max_body_size 25m;

        location /static {
                root /var/www/netbox/netbox/;

        location / {
                proxy_set_header X-Forwarded-Host $server_name;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-Proto $scheme;
                add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';

And start nginx:

rcctl restart nginx


Now, because we run NetBox from a virtualenv at boot we have to use a wrapper script that activates the environment before we can launch gunicorn. This allows us to run NetBox at boot with supervisord.

I created a small helper (/var/www/netbox/



. /var/www/netbox/env/bin/activate
export PYTHONPATH=/var/www/netbox/env/lib/python3.6/site-packages:$APPDIR:$PYTHONPATH

exec gunicorn-3 \
        --name netbox \
        --workers 3 \
        --user=www \
        --group=www \
        --bind= \
        --log-level=info \
        --log-file=- \

Now run this script to make sure the connection between nginx and gunicorn works, you can visit NetBox on port 80 now.

Wrapping up

The last part is to make sure NetBox starts at boot, I’ve chosen to use supervisord here.

cat << EOF > /etc/supervisord.d/netbox.ini
command = sh
directory = /var/www/netbox/netbox
user = www

Enable the needed services and start supervisord:

rcctl enable supervisord nginx
rcctl restart supervisord

That’s it, NetBox is now reachable on and starts like regular services do.