From 11dd76ed13adb9d154d2b151f406d069cbee4a06 Mon Sep 17 00:00:00 2001 From: misazr Date: Thu, 11 May 2017 14:14:55 +0200 Subject: [PATCH] Dockerize django netbox --- .gitignore | 2 +- Dockerfile | 24 +++++++++ docker-compose.yml | 70 ++++++++++++++++++++++++++ docker/docker-entrypoint.sh | 22 ++++++++ docker/nginx.conf | 35 +++++++++++++ netbox/netbox/configuration.py | 92 ++++++++++++++++++++++++++++++++++ 6 files changed, 244 insertions(+), 1 deletion(-) create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100755 docker/docker-entrypoint.sh create mode 100644 docker/nginx.conf create mode 100644 netbox/netbox/configuration.py diff --git a/.gitignore b/.gitignore index 2f957c678..68b781c9f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ *.pyc -/netbox/netbox/configuration.py +#/netbox/netbox/configuration.py /netbox/netbox/ldap_config.py /netbox/static .idea diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..9695596fa --- /dev/null +++ b/Dockerfile @@ -0,0 +1,24 @@ +FROM python:2.7-wheezy + +WORKDIR /opt/netbox + +ARG BRANCH=master +ARG URL=https://github.com/digitalocean/netbox.git +RUN git clone --depth 1 $URL -b $BRANCH . && \ + apt-get update -qq && apt-get install -y libldap2-dev libsasl2-dev libssl-dev graphviz && \ + pip install gunicorn==17.5 && \ + pip install django-auth-ldap && \ + pip install -r requirements.txt && \ + pip install graphene_django && \ + pip install django-filter + +RUN rm -r /opt/netbox/netbox + +ADD docker/docker-entrypoint.sh /docker-entrypoint.sh +ADD netbox/netbox/configuration.docker.py /opt/netbox/netbox/netbox/configuration.py + +ENTRYPOINT [ "/docker-entrypoint.sh" ] + +ADD docker/gunicorn_config.py /opt/netbox/ +ADD docker/nginx.conf /etc/netbox-nginx/ +VOLUME ["/etc/netbox-nginx/"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..d36f54214 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,70 @@ +version: '2' + +services: + postgres: + image: postgres:9.6 + container_name: postgres + environment: + POSTGRES_USER: netbox + POSTGRES_PASSWORD: J5brHrAXFLQSif0K + POSTGRES_DB: netbox + volumes: + - ./netbox:/opt + phppgadmin: + image: einfallstoll/phppgadmin + container_name: phppgadmin + environment: + APACHE_SERVERNAME: docker.local + POSTGRES_HOST: postgres + POSTGRES_DB: 5432 + links: + - postgres + depends_on: + - postgres + ports: + - 8057:80 + + netbox: + build: . + image: digitalocean/netbox + links: + - postgres + container_name: netbox + depends_on: + - postgres + environment: + SUPERUSER_NAME: admin + SUPERUSER_EMAIL: admin@example.com + SUPERUSER_PASSWORD: admin + ALLOWED_HOSTS: localhost + DB_NAME: netbox + DB_USER: netbox + DB_PASSWORD: J5brHrAXFLQSif0K + DB_HOST: postgres + SECRET_KEY: r8OwDznj!!dci#P9ghmRfdu1Ysxm0AiPeDCQhKE+N_rClfWNj + EMAIL_SERVER: localhost + EMAIL_PORT: 25 + EMAIL_USERNAME: foo + EMAIL_PASSWORD: bar + EMAIL_TIMEOUT: 10 + EMAIL_FROM: netbox@bar.com + NETBOX_USERNAME: guest + NETBOX_PASSWORD: guest + volumes: + - netbox-static-files:/opt/netbox/netbox/static + - ./netbox:/opt/netbox/netbox + nginx: + image: nginx:1.11.1-alpine + links: + - netbox + container_name: nginx + command: nginx -g 'daemon off;' -c /etc/netbox-nginx/nginx.conf + depends_on: + - netbox + ports: + - 8055:80 + volumes_from: + - netbox +volumes: + netbox-static-files: + driver: local diff --git a/docker/docker-entrypoint.sh b/docker/docker-entrypoint.sh new file mode 100755 index 000000000..762d5d8ec --- /dev/null +++ b/docker/docker-entrypoint.sh @@ -0,0 +1,22 @@ +#!/bin/bash +set -e + +# run db migrations (retry on error) +while ! /opt/netbox/netbox/manage.py migrate 2>&1; do + sleep 5 +done + +# create superuser silently +if [[ -z ${SUPERUSER_NAME} || -z ${SUPERUSER_EMAIL} || -z ${SUPERUSER_PASSWORD} ]]; then + SUPERUSER_NAME='admin' + SUPERUSER_EMAIL='admin@example.com' + SUPERUSER_PASSWORD='admin' + echo "Using defaults: Username: ${SUPERUSER_NAME}, E-Mail: ${SUPERUSER_EMAIL}, Password: ${SUPERUSER_PASSWORD}" +fi +#echo "from django.contrib.auth.models import User; User.objects.create_superuser('${SUPERUSER_NAME}', '${SUPERUSER_EMAIL}', '${SUPERUSER_PASSWORD}')" | python /opt/netbox/netbox/manage.py shell + +# copy static files +/opt/netbox/netbox/manage.py collectstatic --no-input + +# start unicorn +gunicorn --log-level debug --debug --error-logfile /dev/stderr --log-file /dev/stdout -c /opt/netbox/gunicorn_config.py netbox.wsgi diff --git a/docker/nginx.conf b/docker/nginx.conf new file mode 100644 index 000000000..2a794f314 --- /dev/null +++ b/docker/nginx.conf @@ -0,0 +1,35 @@ +worker_processes 1; + +events { + worker_connections 1024; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + sendfile on; + tcp_nopush on; + keepalive_timeout 65; + gzip on; + server_tokens off; + + server { + listen 80; + + server_name localhost; + + access_log off; + + location /static/ { + alias /opt/netbox/netbox/static/; + } + + location / { + proxy_pass http://netbox:8001; + 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"'; + } + } +} diff --git a/netbox/netbox/configuration.py b/netbox/netbox/configuration.py new file mode 100644 index 000000000..c31e43885 --- /dev/null +++ b/netbox/netbox/configuration.py @@ -0,0 +1,92 @@ +######################### +# # +# Required settings # +# # +######################### + +# This is a list of valid fully-qualified domain names (FQDNs) for the NetBox server. NetBox will not permit write +# access to the server via any other hostnames. The first FQDN in the list will be treated as the preferred name. +# +# Example: ALLOWED_HOSTS = ['netbox.example.com', 'netbox.internal.local'] +ALLOWED_HOSTS = ['0.0.0.0', 'localhost'] + +# PostgreSQL database configuration. +DATABASE = { + 'NAME': 'netbox', # Database name + 'USER': 'netbox', # PostgreSQL username + 'PASSWORD': 'J5brHrAXFLQSif0K', # PostgreSQL password + 'HOST': 'postgres', # Database server + 'PORT': '5432', # Database port (leave blank for default) +} + +# This key is used for secure generation of random numbers and strings. It must never be exposed outside of this file. +# For optimal security, SECRET_KEY should be at least 50 characters in length and contain a mix of letters, numbers, and +# symbols. NetBox will not run without this defined. For more information, see +# https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-SECRET_KEY +SECRET_KEY = 'yxox%0o(mm0gmzf8ez*h0#3k_b9#vifc2#h46)l*uc!#a3wd@c' + + +######################### +# # +# Optional settings # +# # +######################### + +# Specify one or more name and email address tuples representing NetBox administrators. These people will be notified of +# application errors (assuming correct email settings are provided). +ADMINS = [ + # ['John Doe', 'jdoe@example.com'], +] + +# Email settings +EMAIL = { + 'SERVER': 'localhost', + 'PORT': 25, + 'USERNAME': '', + 'PASSWORD': '', + 'TIMEOUT': 10, # seconds + 'FROM_EMAIL': '', +} + +# Setting this to True will permit only authenticated users to access any part of NetBox. By default, anonymous users +# are permitted to access most data in NetBox (excluding secrets) but not make any changes. +LOGIN_REQUIRED = False + +# Base URL path if accessing NetBox within a directory. For example, if installed at http://example.com/netbox/, set: +# BASE_PATH = 'netbox/' +BASE_PATH = '' + +# Setting this to True will display a "maintenance mode" banner at the top of every page. +MAINTENANCE_MODE = False + +# Credentials that NetBox will use to access live devices. +NETBOX_USERNAME = '' +NETBOX_PASSWORD = '' + +# Determine how many objects to display per page within a list. (Default: 50) +PAGINATE_COUNT = 50 + +# Time zone (default: UTC) +TIME_ZONE = 'UTC' + +# Date/time formatting. See the following link for supported formats: +# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = 'N j, Y' +SHORT_DATE_FORMAT = 'Y-m-d' +TIME_FORMAT = 'g:i a' +SHORT_TIME_FORMAT = 'H:i:s' +DATETIME_FORMAT = 'N j, Y g:i a' +SHORT_DATETIME_FORMAT = 'Y-m-d H:i' + +# Optionally display a persistent banner at the top and/or bottom of every page. To display the same content in both +# banners, define BANNER_TOP and set BANNER_BOTTOM = BANNER_TOP. +BANNER_TOP = '' +BANNER_BOTTOM = '' + +# When determining the primary IP address for a device, IPv6 is preferred over IPv4 by default. Set this to True to +# prefer IPv4 instead. +PREFER_IPV4 = False + +# Enforcement of unique IP space can be toggled on a per-VRF basis. To enforce unique IP space within the global table +# (all prefixes and IP addresses not assigned to a VRF), set ENFORCE_GLOBAL_UNIQUE to True. +ENFORCE_GLOBAL_UNIQUE = False