• Stars
    star
    153
  • Rank 243,368 (Top 5 %)
  • Language
    Python
  • License
    BSD 3-Clause "New...
  • Created over 5 years ago
  • Updated 21 days ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

OpenWISP in docker. For production usage we recommend using the ansible-openwisp2 role.

Docker-OpenWISP

Automation Tests GitLab Container Registery Gitter Support GitHub license

This repository contains official docker images of OpenWISP. Designed with horizontal scaling, easily replicable deployments and user customization in mind.

kubernetes The sample files for deployment on kubernetes are available in the deploy/examples/kubernetes/ directory.

Table of contents

Images Available

Version Corresponding Ansible Version
0.1.0a2 0.9.0
0.1.0a3 0.12.0
0.1.0a4 0.12.0+
0.1.0a5 0.13.1
0.1.0a6 0.13.2+

* Roughly the same features would be available but it's not an exact one-to-one mapping.

The images are hosted on Docker Hub and GitLab Container Registry.

Image Tags

All images are tagged using the following convention:

Tag Software Version
latest Images built on the latest git tag
edge Images built on the current master branch

Architecture

A typical OpenWISP installation is made of multiple components (e.g. application servers, background workers, web servers, database, messaging queue, VPN server, etc. ) that have different scaling requirements.

The aim of Docker OpenWISP is to allow deploying OpenWISP in cloud based environments which allow potentially infinite horizontal scaling. That is the reason for which there are different docker images shipped in this repository.

Architecture

  • openwisp-dashboard: Your OpenWISP device administration dashboard.
  • openwisp-api: HTTP API from various openwisp modules which can be scaled simply by having multiple API containers as per requirement.
  • openwisp-websocket: Dedicated container for handling websocket requests, eg. for updating location of mobile network devices.
  • openwisp-celery: Runs all the background tasks for OpenWISP, eg. updating configurations of your device.
  • openwisp-celery-monitoring: Runs background tasks that perform active monitoring checks, eg. ping checks and configuration checks. It also executes task for writing monitoring data to the timeseries DB.
  • openwisp-celerybeat: Runs periodic background tasks. eg. revoking all the expired certificates.
  • openwisp-nginx: Internet facing container that facilitates all the HTTP and Websocket communication between the outside world and the service containers.
  • openwisp-freeradius: Freeradius container for OpenWISP.
  • openwisp-openvpn: OpenVPN container for out-of-the-box management VPN.
  • openwisp-postfix: Mail server for sending mails to MTA.
  • openwisp-nfs: NFS server that allows shared storage between different machines. It does not run in single server machines but provided for K8s setup.
  • openwisp-base: It is the base image which does not run on your server, but openwisp-api & openwisp-dashboard use it as a base.
  • Redis: data caching service (required for actions like login).
  • PostgreSQL: SQL database container for OpenWISP.

Deployment

Quick Setup

The auto-install.sh script can be used to quickly install a simple instance of openwisp on your server.

Quick Install

If you have created a .env file to configure your instance, then you can use it with the script otherwise.

It asks 5 questions for application configuration, 3 of them are domain names. The dashboard, api & openvpn can be setup on different domain, please ensure the domains you enter point to your server. The remaining 2 questions are email id for site manager email (used by django to send application emails) and letsencrypt (used by certbot to issue https certs on this address.)

To get started, run the following command:

   curl https://raw.githubusercontent.com/openwisp/docker-openwisp/master/deploy/auto-install.sh -o setup.sh
   sudo bash setup.sh
   # If you are upgrading from an older version setup by this script use
   # sudo bash setup.sh --upgrade
   # For more information
   # sudo bash setup.sh --help

To get a real-time streaming output of autoinstall logs, run the following command:

tail -n 50 -f /opt/openwisp/autoinstall.log

Notes:

  • If you're having any installation issues with the latest version, you can try auto-installation with the edge version, which has images built on the current master branch.

  • Still facing errors while installation? Please read the FAQ.

Compose

Setup on docker-compose is suitable for single-server setup requirements. It is quicker and requires less prior knowledge about openwisp & networking.

Kubernetes

Setup on kubernetes is complex and requires prior knowledge about linux systems, kubernetes, docker & openwisp. However, it provides scalability for very large networks.

Useful commands for startup and readiness probes which are provided by the images:

  • startup probe example: test $(ps aux | grep -c uwsgi) -ge 2
  • readiness probe example: python services.py uwsgi_status "127.0.0.1:8001"

Customization

The following commands will create the directory structure required for adding customizations. Execute these commands in the same location as the docker-compose.yml file.

mkdir -p customization/configuration/django
touch customization/configuration/django/__init__.py
touch customization/configuration/django/custom_django_settings.py
mkdir -p customization/theme

You can also refer to the directory structure of this repository for an example.

Custom Django Settings

The customization/configuration/django directory created in the above section is mounted at /opt/openwisp/openwisp/configuration in the dashboard, api, celery, celery_monitoring and celerybeat containers.

You can specify additional Django settings (e.g. SMTP configuration) in the customization/configuration/django/custom_django_settings.py file. Django will use these settings at the project startup.

You can also put additional files in customization/configuration/django that needs to be mounted at /opt/openwisp/openwisp/configuration in the containers.

Custom Styles and JavaScript

If you want to use your custom styles, add custom JavaScript you can follow the following guide.

  1. Read about the option OPENWISP_ADMIN_THEME_LINKS. Please make ensure the value you have enter is a valid JSON and add the desired JSON in .env file. example:
OPENWISP_ADMIN_THEME_LINKS=[{"type": "text/css", "href": "/static/custom/css/custom-theme.css", "rel": "stylesheet", "media": "all"},{"type": "image/x-icon", "href": "/static/custom/bootload.png", "rel": "icon"},{"type": "image/svg+xml", "href": "/static/ui/openwisp/images/openwisp-logo-small.svg", "rel": "icons"}]
  1. Create your custom CSS / Javascript file in customization/theme directory created in the above section. E.g. customization/theme/static/custom/css/custom-theme.css.
  2. Start the nginx containers.

Notes:

  1. You can edit the styles / JavaScript files now without restarting the container, as long as file is in the correct place, it will be picked.
  2. You can create a maintenance.html file inside the customize directory to have a custom maintenance page for scheduled downtime.

Customizing uWSGI configuration

By default, you can only configure processes, threads and listen settings of uWSGI using environment variables. If you want to configure more uWSGI settings, you can supply your uWSGI configuration by following these steps:

  1. Create the uWSGI configuration file in the customization/configuration directory. For the sake of this example, let's assume the filename is custom_uwsgi.ini.
  2. In dashboard and api services of docker-compose.yml, add volumes as following
  services:
    dashboard:
      ... # other configuration
      volumes:
        ... # other volumes
        - ${PWD}/customization/configuration/custom_uwsgi.ini:/opt/openwisp/uwsgi.ini:ro
    api:
      ... # other configuration
      volumes:
        ... # other volumes
        - ${PWD}/customization/configuration/custom_uwsgi.ini:/opt/openwisp/uwsgi.ini:ro

Changing Python Packages

You can build with your own python package by creating a file named .build.env in the root of the repository, then set the variables inside .build.env file in <variable>=<value> format. Multiple variable should be separated in newline. These are the variables that can be changed:

  • OPENWISP_MONITORING_SOURCE
  • OPENWISP_FIRMWARE_SOURCE
  • OPENWISP_CONTROLLER_SOURCE
  • OPENWISP_NOTIFICATION_SOURCE
  • OPENWISP_TOPOLOGY_SOURCE
  • OPENWISP_RADIUS_SOURCE
  • OPENWISP_IPAM_SOURCE
  • OPENWISP_USERS_SOURCE
  • OPENWISP_UTILS_SOURCE
  • DJANGO_X509_SOURCE
  • DJANGO_SOURCE

For example, if you want to supply your own django and openwisp-controller source, your .build.env should be written like this:

DJANGO_SOURCE=django==3.2
OPENWISP_CONTROLLER_SOURCE=https://github.com/<username>/openwisp-controller/tarball/master

Disabling Services

Right now, this is only tentative guide. Errata may exist. Please report errors on the gitter channel.

  • openwisp-dashboard: You cannot disable the openwisp-dashboard. It is the heart of OpenWISP and performs core functionalities.
  • openwisp-api: You cannot disable the openwisp-api. It is required for interacting with your devices.
  • openwisp-websocket: Removing this container will cause the system to not able to update real-time location for mobile devices.

If you want to disable a service, you can simply remove the container for that service, however, there are additional steps for some images:

  • openwisp-network-topology: Set the USE_OPENWISP_TOPOLOGY variable to False.
  • openwisp-firmware-upgrader : Set the USE_OPENWISP_FIRMWARE variable to False.
  • openwisp-monitoring : Set the USE_OPENWISP_MONITORING variable to False.
  • openwisp-radius : Set the USE_OPENWISP_RADIUS variable to False.
  • openwisp-postgres: If you are using a seperate database instance,
    • Ensure your database instance is reachable by the following OpenWISP containers: openvpn, freeradius, celerybeat, celery, celery_monitoring, websocket, api, dashboard.
    • Ensure your database server supports GeoDjango. (Install PostGIS for PostgreSQL)
    • Change the database configuration variables to point to your instances, if you are using SSL, remember to set DB_SSLMODE, DB_SSLKEY, DB_SSLCERT, DB_SSLROOTCERT.
    • If you are using SSL, remember to mount volume containing the certificates and key in all the containers which contact the database server and make sure that the private key permission is 600 and owned by root:root.
    • In your database, create database with name <DB_NAME>.
  • openwisp-postfix:

Development

Workbench setup

  1. Install docker & docker-compose.
  2. In the root of the repository, run make develop, when the containers are ready, you can test them out by going to the domain name of the modules.

Notes:

  • Default username & password are admin.
  • Default domains are: dashboard.openwisp.org and api.openwisp.org.
  • To reach the dashboard you may need to add the openwisp domains set in your .env to your hosts file, example: bash -c 'echo "127.0.0.1 dashboard.openwisp.org api.openwisp.org" >> /etc/hosts'
  • Now you'll need to do steps (2) everytime you make a changes and want to build the images again.
  • If you want to perform actions like cleaning everything produced by docker-openwisp, please use the makefile options.

Runtests

You can run tests either with geckodriver (firefox) or chromedriver (chromium). Chromium is preferred as it checks for console log errors as well.

  1. Setup driver for selenium:

    • Setup chromedriver

      1. Install chromium:
      # On debian
      sudo apt --yes install chromium
      # On ubuntu
      sudo apt --yes install chromium-browser
      1. Check version: chromium --version
      2. Install Driver for your version: https://chromedriver.chromium.org/downloads
      3. Extract chromedriver to one of directories from your $PATH. (example: /usr/bin/)
    • Setup geckodriver

      1. Install: sudo apt --yes install firefox
      2. Check version: firefox --version
      3. Install Driver for your version: https://github.com/mozilla/geckodriver/releases
      4. Extract geckodriver to one of directories from your $PATH. (example: /usr/bin/)
  2. Install selenium: python3 -m pip install selenium

  3. (Optional) Configure: open tests/config.json and configure variables as per your requirement, options are:

    driver: Name of driver to use for tests, "chromium" or "firefox"
    logs: print container's logs if an error occurs.
    logs_file: Location of the log file for saving logs generated for tests.
    headless: Run selenium chrome driver in headless mode
    load_init_data: Flag for running tests/data.py, only needs to be done once after database creation
    app_url: URL to reach the admin dashboard
    username: username for logging in admin dashboard
    password: password for logging in admin dashboard
    services_max_retries: Maximum number of retries to check if services are running
    services_delay_retries: Delay time (in seconds) to each retries for checking if services are running
  4. Run tests: make runtests

Note: To run a single test use the following command

python3 tests/runtests.py <TestSuite>.<TestCase>
# python3 tests/runtests.py TestServices.test_celery

Run Quality Assurance Checks

We use shfmt to format shell scripts and hadolint to lint Dockerfile

To format all files, Run:

./qa-format

To run quality assurance checks you can use the run-qa-checks script:

# install test requirements first
pip install requirements-test.txt

# run QA checks before committing code
./run-qa-checks

Usage

Makefile Options

Most commonly used:

  • start<USER=docker-username> <TAG=image-tag>: Start OpenWISP containers on your server.
  • pull<USER=docker-username> <TAG=image-tag>: Pull Images from registry.
  • stop: Stop make containers on your server.
  • develop: Bundles all the commands required to build the images and run containers.
  • runtests: Run testcases to ensure all the services are working.
  • clean: Aggressively purge all the containers, images, volumes & networks related to docker-openwisp.

Other options:

  • publish <USER=docker-username> <TAG=image-tag>: Build, test and publish images.
  • python-build: Generate a random django secret and set it in the .env file.
  • nfs-build: Build openwisp-nfs server image.
  • base-build: Build openwisp-base image. The base image is used in other OpenWISP images.
  • compose-build: (default) Build OpenWISP images for development.
  • develop-runtests: Similar to runtests, it runs the testcases except doesn't stop the containers after running the tests which maybe desired for debugging & analyzing failing container's logs.

More Repositories

1

django-rest-framework-gis

Geographic add-ons for Django REST Framework. Maintained by the OpenWISP Project.
Python
1,081
star
2

openwisp-controller

Network and WiFi controller: provisioning, configuration management and updates, (pull via openwisp-config or push via SSH), x509 PKI management and more. Mainly OpenWRT, but designed to work also on other systems.
Python
556
star
3

ansible-openwisp2

Ansible role that installs and upgrades OpenWISP.
Python
477
star
4

openwisp-config

OpenWRT configuration agent for OpenWISP Controller
Lua
374
star
5

django-freeradius

Administration web interface and REST API for freeradius 3 build in django & python, development has moved to openwisp-radius
Python
365
star
6

openwisp-radius

Administration web interface and REST API for freeradius 3 build in django & python. Supports captive portal authentication, WPA Enerprise (802.1x), freeradius rlm_rest, social login, Hotspot 2.0 / 802.11u, importing users from CSV, registration of new users and more.
Python
363
star
7

netjsonconfig

Network configuration management library based on NetJSON DeviceConfiguration
Python
359
star
8

django-x509

Reusable django app implementing x509 PKI certificates management
Python
340
star
9

netjsongraph.js

NetJSON NetworkGraph visualizer.
JavaScript
270
star
10

django-netjsonconfig

Configuration manager for embedded devices, implemented as a reusable django-app
JavaScript
194
star
11

django-loci

Reusable Django app for storing geographic and indoor coordinates. Maintained by the OpenWISP Project.
Python
181
star
12

openwisp-network-topology

Network topology collector and visualizer. Collects network topology data from dynamic mesh routing protocols or other popular networking software like OpenVPN, allows to visualize the network graph, save daily snapshots that can be viewed in the future and more.
Python
170
star
13

openwisp-monitoring

Network monitoring system written in Python and Django, designed to be extensible, programmable, scalable and easy to use by end users: once the system is configured, monitoring checks, alerts and metric collection happens automatically.
Python
166
star
14

openwisp-users

Implementation of user management and multi-tenancy for OpenWISP
Python
163
star
15

django-netjsongraph

Network Topology Visualizer & Network Topology Collector
Python
141
star
16

openwisp-wifi-login-pages

Configurable captive page for public/private WiFi services providing login, sign up, social login, SMS verification, change password, reset password, change phone number and more.
JavaScript
128
star
17

ansible-openwisp2-imagegenerator

Automatically build several openwisp2 firmware images for different organizations while keeping track of their differences
Shell
120
star
18

openwisp-ipam

IP address space administration module of OpenWISP
Python
104
star
19

OpenWISP-Firmware

An OpenWRT based firmware to be used with OpenWISP Manager
Shell
86
star
20

netdiff

Python library for parsing network topology data (e.g.: OpenVPN, Wireguard, ZeroTier, NetJSON, Dynamic Routing Protocols) and detect changes.
Python
80
star
21

django-ipam

The development of this project has moved to openwisp-ipam
Python
78
star
22

openwisp-utils

Python and Django utilities shared between different openwisp modules
Python
74
star
23

django-flat-json-widget

Flat JSON widget for django, used and maintained by the OpenWISP project.
Python
64
star
24

OpenWISP-Captive-Portals-Manager

OWCPM is a captive portal written from scratch with Ruby on Rails.
Ruby
58
star
25

openwisp-firmware-upgrader

Firmware upgrade solution for OpenWRT with possibility to add support for other embedded OSes. Provides features like automatic retry for network failures, mass upgrades, REST API and more.
Python
53
star
26

openwisp-docs

OpenWISP Documentation.
Python
50
star
27

vagrant-openwisp2

Ansible Vagrant profile to install an OpenWISP 2 server
44
star
28

openwisp-notifications

Notifications module of OpenWISP
Python
41
star
29

OpenWISP-User-Management-System

OpenWISP User Management System (OWUMS) is a Ruby on Rails application, capable of managing a WISP's user base.
Ruby
40
star
30

OpenWISP-Website

OpenWISP Project's website
HTML
39
star
31

netengine

Python abstraction layer for extracting information from network devices.
Python
38
star
32

OpenWISP-Manager

The OpenWISP Manager is a RoR web GUI for configuring OpenWISP firmware-based access points.
Ruby
36
star
33

openwrt-openwisp-monitoring

OpenWRT monitoring agent for openwisp-monitoring
Lua
23
star
34

luci-openwisp

OpenWISP configuration interface implemented as LuCI extensions
HTML
20
star
35

django-owm-legacy

OpenWISP Manager backward compatible legacy features implemented in django
Python
17
star
36

OpenWISP-Geographic-Monitoring

A Rails application for managing a wISP's access points
Ruby
15
star
37

coova-chilli-openwrt

Makefile
13
star
38

openwrt-zabbixd

Ucified Zabbix Packages
Makefile
13
star
39

netjsonconfig-editor.js

[GSOC 2017] This project has stalled.
JavaScript
12
star
40

django-jsonschema-widget

JavaScript
11
star
41

OpenWISP-Middle-Ware

A Sinatra application for interconnecting OpenWISP applications via a RESTful API
Ruby
11
star
42

OpenWISP-Puppet-Modules

A set of modules and hacks for the https://openwisp.caspur.it project
HTML
10
star
43

AdaLoveBot-intents

Helping bot of the OpenWISP Chat
JavaScript
9
star
44

ansible-freeitaliawifi-login-page

Standard login page for Free ItaliaWifi federated networks
JavaScript
9
star
45

openwisp-netcheck

Shell
9
star
46

openwisp-template-library-backend

Python
8
star
47

netjson-templates

CSS
6
star
48

ansible-wireguard-openwisp

Python
6
star
49

openwisp-template-library-frontend

GSOC 19
JavaScript
6
star
50

OpenWISP-ETL

Extract Transform Load Module developed with pentaho pdi ce-5.0.1.A
6
star
51

openVPNServer

Ruby
5
star
52

openwrt-feed

DEPRECATED, work moved on OpenWisp-Firmware repo
Shell
5
star
53

ansible-openwisp-wifi-login-pages

Ansible role to deploy and manage OpenWISP WiFi Login Pages
Jinja
5
star
54

lxdock-openwisp2

This repository is only a mirror. If you want to work on it, make a fork on https://gitlab.com/openwisp/lxdock-openwisp2
5
star
55

packet-legacy

packet-legacy
Ruby
4
star
56

ansible-ow-influxdb

4
star
57

OpenWISP-BI

Business Intelligence module developed with pentaho biserver ce-4.8.0
4
star
58

openwisp-sphinx-theme

OpenWISP Sphinx Theme
CSS
3
star
59

openwisp-dev-env

Automated development environment for OpenWISP, work in progress.
3
star
60

openwisp-sentry-utils

Python
2
star
61

ansible-openwisp2-iptables

ansible role containing iptables rules to protect an openwisp2 instance
Shell
2
star