Installing NAV


This section specifies what software packages are needed to build and run NAV. Be aware that many of these packages have dependencies of their own.

Build requirements

To build NAV, you need at least the following:

  • make
  • automake
  • autoconf
  • Python >= 2.7.0
  • Sphinx >= 1.0 (for building this documentation)
  • A sass compiler >= 3.2.12, < 3.4 to build the NAV web interface’s stylesheets. Installing the rubygem sass or using the package ruby-sass from the Debian distribution jessie (testing) would satisfy this requirement.

Runtime requirements

To run NAV, these software packages are required:

  • Apache2 + mod_wsgi
  • PostgreSQL >= 9.1 (With the hstore extension available)
  • Graphite
  • Python >= 2.7.0
  • nbtscan = 1.5.1
  • dhcping (only needed if using DHCP service monitor)

PostgreSQL and Graphite are services that do not necessarily need to run on the same server as NAV.

Required Python modules can be installed from source using pip install -r requirements.txt (some of these modules are extensions that will require some C libraries to be correctly built. These include the psycopg2 driver and the python-ldap module), or you may opt to use your OS’ package manager to install these dependencies. The current requirements are as follows:

# for debian build-deps, see the apt-get commands in
# tools/

psycopg2==2.4.5  # requires libpq to build
simplejson==2.0.6  # freebsd doesn't have newer.
xmpppy==0.5.0rc1  # optional, for alerting via Jabber
python-ldap==2.4.10  # optional for LDAP authentication, requires libldap (OpenLDAP) to build

# REST framework

# dependencies that our dependencies forgot to mention
ipaddr==2.1.11  # req by pynetsnmp

# Our own, patched version of pynetsnmp, until pull request is accepted by upstream.


The pynetsnmp module is preferred over twistedsnmp for SNMP communication. The former is a Python binding to the well-known NetSNMP C library, whereas the latter is a pure-Python SNMP implementation. pynetsnmp will give better performance and IPv6-support. twistedsnmp also has a known, unfixed bug with table retrievals on slow SNMP agents. If, for some reason, you are forced to resort to using twistedsnmp, the contrib/patches directory contains a recommended patch for this problem.

Installing NAV

To build and install NAV:

make install


If you obtained your copy of NAV directly from a Git repository, you may need to run ./ first.

If you wish to configure NAV to run from a different location than the default /usr/local/nav you should specify a new directory using the –prefix= option of the configure script, e.g. ./configure --prefix=/opt/nav.

If you are building an RPM package (or similar) of NAV, you may wish to have the files installed in a physically different location (a temporary build directory) than what you configured the package for. In this case, you should specify this build directory by adding DESTDIR=/your/build/directory to the make install command.

Initializing the database

Before NAV can run, the database schema must be installed in your PostgreSQL server. NAV can create a database user and a database schema for you.

Choose a password for your NAV database user and set this in the userpw_nav in the db.conf config file. As the postgres superuser, run the following command:

navsyncdb -c

This will attempt to create a new database user, a new database and initialize it with NAV’s schema.

For more details on setting up PostgreSQL and initializing the schema, please refer to the sql/README file.

Making the Python libraries available system-wide

By default, NAV’s Python libraries are not installed in Python’s site-packages directory. To make them available system-wide, you need to add the path to the libraries to Python’s search path.

One way of accomplishing this is altering Python’s sys.path value at startup time, by modifying or adding your Python installation’s module, which is loaded every time python runs. Add these lines:

import sys
__navpath = "/usr/local/nav/lib/python"
if __navpath not in sys.path:

You should now be able to run the python command line interpreter and run import nav without a hitch:

$ python
Python 2.7.3 (default, Sep 26 2013, 20:03:06)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import nav

Configuring Apache

NAV’s web interface is implemented using the Django framework, and can be served in any web server environment supported by Django.

NAV does, however, come with Apache configuration to serve the web interface using mod_wsgi. For legacy reasons, NAV requires being served at the document root of the web server domain. The apache config file can be included in your virtualhost config, which needn’t contain much more than this:


Include /usr/local/nav/etc/apache/apache.conf

Create users and groups

NAV processes should run as the navcron user (the name of this user is configurable via the ./configure command at build-time), and preferably, a separate nav group should be added to the system:

sudo addgroup --system nav
sudo adduser --system --no-create-home --home /usr/local/nav \
             --shell /bin/sh --ingroup nav navcron;

If you want to use NAV’s SMS functionality in conjunction with Gammu, you should make sure the navcron user is allowed to write to the serial device you’ve connected your GSM device to. Often, this device has a group ownership set to the dialout group, so the easieast route is to add the navcron user to the dialout group:

sudo addgroup navcron dialout

You should also make sure navcron has permission to write log files, pid files and various other state information:

cd /usr/local/nav/var
sudo chown -R navcron:nav .

Integrating Graphite with NAV

NAV uses Graphite to store and retrieve/graph time-series data. NAV must be configured with the IP address and port of your Graphite installation’s Carbon backend, and the URL to the Graphite-web frontend used for graphing. These settings can be configured in the graphite.conf configuration file.


NAV requires the Carbon backend’s UDP listener to be enabled, as it will only transmit metrics over UDP.

For a simple, local Graphite installation, you may not need to touch this configuration file at all, but at its simplest it looks like this:

host =
port = 2003

base = http://localhost:8000/

Configuring Graphite

Installing Graphite itself is out of scope for this guide, but you will need to configure some options before letting NAV send data to Graphite.

  1. First and foremost, you will need to enable the UDP listener in the configuration file carbon.conf.

    For performance reasons, Carbon will also limit the number of new Whisper files that can be created per minute. This number is fairly low by default, and when starting NAV for the first time, it may send a ton of new metrics very fast. If the limit is set to 50, it will take a long time before all the metrics are created. You might want to increase the MAX_CREATES_PER_MINUTE option, or temporarily set it to inf.

  2. You should add the suggested storage-schema configurations for the various nav prefixes listed in etc/graphite/storage-schemas.conf:

    # Recommended Whisper schema definitions for using Graphite with NAV.
    # If you already have a Graphite installation you wish to use, use these
    # examples to adapt your own config.
    # Carbon's internal metrics. This entry should match what is specified in
    pattern = ^carbon\.
    retentions = 60:90d
    # Statistics - store data for a long time is more important than short
    # intervals.
    pattern = ^nav\.stats\.
    retentions = 300s:10d, 1h:100d, 1d:6y
    # NAV device/system metrics
    pattern = ^nav\..*(system|cpu|memory|services|ipdevpoll|sensors)\.
    retentions = 60s:1d, 300s:7d, 30m:12d, 2h:50d, 1d:600d
    # NAV multicast metrics
    pattern = ^nav\.multicast\.groups\.
    retentions = 60s:1d, 300s:7d, 30m:12d, 2h:50d, 1d:600d
    # NAV pping metrics. The default pping configuration pings in 20 second
    # intervals; the most detailes retention archive should match up with this.
    pattern = ^nav\..*\.ping\.
    retentions = 20s:6h, 60s:1d, 300s:7d, 30m:12d, 2h:50d, 1d:600d
    # NAV IP prefix utilization metrics. Default ARP/ND collection interval is
    # 30 minutes.
    pattern = ^nav\.prefixes\.
    retentions = 30m:30d, 2h:90d, 6h:600d
    # NAV generic metric retention archive
    pattern = ^nav\.
    retentions = 300s:7d, 30m:12d, 2h:50d, 1d:600d
    # A not-very-sane default for any metric not caught by the above.
    pattern = .*
    retentions = 60s:1d

    The highest precision retention archives are the most important ones here, as their data point interval must correspond with the collection intervals of various NAV processes. Other than that, the retention periods and the precision of any other archive can be freely experimented with.

    Remember, these schemas apply to new Whisper files as they are created. You should not start NAV until the schemas have been configured, otherwise the Whisper files will be created with the global Graphite defaults, and your data may be munged or inaccurate, and your graphs will be spotty.

  3. You should add the suggested storage-aggregation configurations listed in the file etc/graphite/storage-aggregation.conf:

    # Recommended Whisper aggregation methods for using Graphite with NAV.
    # If you already have a Graphite installation you wish to use, use these
    # examples to adapt your own config.
    # ipdevpoll jobs don't necesarily run very often; an xFilesFactor of 0 ensures
    # we roll up everything into the lower precision archives no matter how often
    # runs are logged.
    pattern = ^nav\..*\.ipdevpoll\..*runtime$
    xFilesFactor = 0
    aggregationMethod = average
    # Any kind of event counter NAV uses will log the number of events since the
    # last time the metric was logged, so the approprate aggregation is to sum the
    # counts.
    pattern = ^nav\..*-count$
    xFilesFactor = 0
    aggregationMethod = sum
    # NAV stores the raw octet/packet/error/etc counters of interfaces in Graphite.
    # Since these counter values are absolute, and the rates are calculated using
    # the difference of the port counter and the time difference between two
    # counter numbers, the appropriate aggregation method would be to picke the
    # last counter value when rolling up.
    pattern = ^nav\..*ports\..*
    aggregationMethod = last

    These will ensure that time-series data sent to Graphite by NAV will be aggregated properly when Graphite rolls them into lower-precision archives.