Production: Container deployment
OpenKAT can be deployed using containers. We aim to support both simple docker / docker compose setups and container orchestration systems like Kubernetes and Nomad.
There is a docker-compose.release-example.yml in the root directory that can be used as an example how to deploy using docker-compose.
Container images
The container images can be found here:
https://github.com/minvws/nl-kat-boefjes/pkgs/container/nl-kat-boefjes
https://github.com/minvws/nl-kat-bytes/pkgs/container/nl-kat-bytes
https://github.com/minvws/nl-kat-mula/pkgs/container/nl-kat-mula
https://github.com/minvws/nl-kat-octopoes/pkgs/container/nl-kat-octopoes
https://github.com/minvws/nl-kat-rocky/pkgs/container/nl-kat-rocky
https://github.com/minvws/nl-kat-keiko/pkgs/container/nl-kat-keiko
Setup
To set up an installation with pre-built containers, you can pull the repository using:
git clone https://github.com/minvws/nl-kat-coordination.git
If this is your first install, and you do not have an .env file yet, you can create an .env
file using the following command:
make env
This will create an .env
file with the default values. You can edit this file to change the default values.
Make sure that you also add the keys and values from .env-defaults
to your .env
file, and modify them for production use where necessary.
Now you can pull and start the containers using the following command:
docker compose --env-file .env-prod -f docker-compose.release-example.yml up -d
The container image run the necessary database migration commands in the entrypoint if DATABASE_MIGRATION is set. You manually need to run setup commands in the rocky container to initialize everything. In the rocky container we first need to import the OOI database seed:
python3 manage.py loaddata OOI_database_seed.json
With docker compose you would run this as:
docker compose --env-file .env-prod -f docker-compose.release-example.yml exec rocky python3 manage.py loaddata OOI_database_seed.json
Next we need to create the superuser, this will prompt for the e-mail address and password:
python3 manage.py createsuperuser
With docker compose you would run this as:
docker compose --env-file .env-prod -f docker-compose.release-example.yml exec rocky python3 manage.py createsuperuser
We also need to create an organisation, this command will create a development organisation:
python3 manage.py setup_dev_account
With docker compose you would run this as:
docker compose --env-file .env-prod -f docker-compose.release-example.yml exec rocky python3 manage.py setup_dev_account
IPv6 support
In order to perform scans against IPv6 addresses you need to manually enable IPv6 support in Dockerized setups. Add the following snippet to the file /etc/docker/daemon.json
. If this file doesn’t exist yet, you can create it and save it with the following configuration:
{
"experimental": true,
"ip6tables": true
}
Restart the Docker daemon for your changes to take effect.
$ sudo systemctl restart docker
By default OpenKAT has an IPv6 subnet configured. This configuration (step 4 and onwards from the official Docker documentation as listed below) can be found in the docker-compose.yml
file. For more information on IPv6 support within Docker look at the Docker documentation.
Container commands
We have three container images that are used to run multiple containers. What the container runs is be specified by overriding the CMD of the container.
Container image |
CMD |
Description |
---|---|---|
rocky |
web |
Django web application |
rocky |
worker |
Rocky reports runner |
boefjes |
boefje |
Boefjes runtime |
boefjes |
normalizer |
Normalizers runtime |
boefjes |
katalogus |
Katalogus API |
octopoes |
web |
Octopoes API |
octopoes |
worker-beat |
Celery worker running beat. There must only be exactly one container of this type |
octopoes |
worker |
Celery worker. Use this if you need to more than one work container for scaling |
Upgrading
When deploying new container images the database migrations are automatically run in the entrypoint. The OOI_database_seed.json file needs to be loaded manually using the following command:
python3 manage.py loaddata OOI_database_seed.json
With docker compose you would run this as:
docker compose --env-file .env-prod -f docker-compose.release-example.yml exec rocky python3 manage.py loaddata OOI_database_seed.json