Local installation with Docker

  1. Follow these instructions to install Docker.

  2. Deploy a Kaplan Cloud container:


    Please note that with Docker containers, storage is ephemeral. This means that when you upgrade to a newer version, you will essentially remove the container and its contents along with any work you may have done. Docker solves this with mounts/volumes. If you would like to just fiddle around with Kaplan Cloud, the invocation below is all you need:

    docker run -d \
    -p 8080:8080 \
    --restart always \
    --name kaplan-cloud \

    However, if you’d like your locally stored data to persist, you’ll first need to create some directories and files, which we will attach (or bind) to the container:

    mkdir kaplan-cloud && \
    mkdir kaplan-cloud/projects && \
    touch kaplan-cloud/db.sqlite3

    Now, let’s start the container with them attached:

    docker run -d \
    -p 8080:8080 \
    --mount type=bind,source=${PWD}/kaplan-cloud/db.sqlite3,target=/code/db.sqlite3 \
    --mount type=bind,source=${PWD}/kaplan-cloud/projects,target=/code/kaplancloudapp/projects \
    --restart always \
    --name kaplan-cloud \
  3. Create an admin (superuser) account:

    docker exec -it kaplan-cloud python createsuperuser
  4. We’re done! Head on over to and explore Kaplan Cloud.

Production installation with Docker Compose

  1. Follow these instructions to install Docker.

  2. Follow these instructions to install Docker Compose.

  3. If you have not set a dedicated Docker network for your proxy tier, create one:

    docker network create network-name

    Replace “network-name” with an arbitrary name of your choosing.

  4. If you do not already have one, deploy an nginxproxy/nginx-proxy container:

    docker run --detach \
    --name nginx-proxy \
    --network network-name \
    --publish 80:80 \
    --publish 443:443 \
    --volume certs:/etc/nginx/certs \
    --volume vhost:/etc/nginx/vhost.d \
    --volume html:/usr/share/nginx/html \
    --volume /var/run/docker.sock:/tmp/docker.sock:ro \
    --restart unless-stopped \

This container will be routing traffic to your Kaplan Cloud instance.

  1. If you do not already have one, deploy an nginxproxy/acme-companion container:

    docker run --detach \
    --name nginx-proxy-acme \
    --volumes-from nginx-proxy \
    --volume /var/run/docker.sock:/var/run/docker.sock:ro \
    --volume acme:/etc/ \
    --env "[email protected]" \
    --restart unless-stopped \

This container will be provisioning free SSL certificates for your Kaplan Cloud instance.

  1. Download the repository from here and enter the .docker directory.

  2. You will find three *.env.template files. Create .env, db.env and web.env files following the guidance on the templates.

  3. Use docker-compose to run the containers:

    docker-compose up -d

    If, for some reason, this step fails, run this command without the -d flag to see what went wrong:

    docker-compose up
  4. Create an admin (superuser) account:

    docker-compose exec app python createsuperuser

Additional steps for Cloudflare users

  1. Add the following page rule:

    For: *yourdomain.tld/.well-known/*
    With: Disable Security, Cache Level: Bypass, Automatic HTTPS Rewrites: Off

    It might take a minute or two for the SSL certificate to kick in.