Skip to content

Advanced installation of OTOBO with Docker Compose

Advanced OTOBO installation with Docker Compose

This guide covers advanced configuration for the official otobo-docker stack. It assumes you have already completed the basic Docker Compose installation and want to enable HTTPS, tune the stack, or adapt it to your infrastructure.

[!NOTE] All commands below use docker compose (Compose v2). On older systems you can replace it with docker-compose.

  • A working OTOBO installation with the official otobo-docker repository cloned to /opt/otobo-docker
  • SSH access to the host
  • For HTTPS: a valid TLS certificate and private key (e.g. from Let’s Encrypt or your CA)

The Compose stack runs five services for HTTP, or six when HTTPS is enabled:

ServiceContainer (OTOBO 11)Purpose
webotobo-web-1OTOBO web server (internal port 5000)
daemonotobo-daemon-1Background tasks (mail fetch, escalations, cron)
dbotobo-db-1MariaDB database (internal port 3306)
elasticotobo-elastic-1Elasticsearch (ports 9200/9300)
redisotobo-redis-1Redis cache
nginx (HTTPS only)otobo-nginx-1Nginx reverse proxy with TLS

[!NOTE] On OTOBO 10.x installations, container names use underscores instead of hyphens (e.g. otobo_web_1).

Verify running containers:

Terminal window
cd /opt/otobo-docker
sudo docker compose ps

Docker volumes persist data on the host. Containers can be recreated without losing application data:

VolumeMount pointUsed by
otobo_opt_otobo/opt/otoboweb, daemon
otobo_mariadb_data/var/lib/mysqldb
otobo_elasticsearch_data/usr/share/elasticsearch/dataelastic
otobo_redis_dataRedis data directoryredis
otobo_nginx_sslTLS certificate and keynginx (HTTPS)

[!WARNING] Never delete volumes unless you have a verified backup. See Backup & Restore for guidance.

Enable HTTPS with the built-in Nginx proxy

Section titled “Enable HTTPS with the built-in Nginx proxy”

For production environments, run OTOBO over HTTPS using the Nginx container included in the stack.

Step 1: Switch to the HTTPS environment file

Section titled “Step 1: Switch to the HTTPS environment file”
Terminal window
cd /opt/otobo-docker
sudo cp -p .docker_compose_env_https .env

If you already have a .env file from an HTTP installation, back it up first or merge your existing settings (especially OTOBO_DB_ROOT_PASSWORD) into the new file.

Edit .env and set the paths to your certificate and private key inside the Nginx container:

Terminal window
sudo nano .env
OTOBO_NGINX_SSL_CERTIFICATE=/etc/nginx/ssl/acme.crt
OTOBO_NGINX_SSL_CERTIFICATE_KEY=/etc/nginx/ssl/acme.key

Place your certificate files in the otobo_nginx_ssl volume or mount them from the host. The exact mount is defined in docker-compose/otobo-override-https.yml.

Terminal window
sudo docker compose up --detach

With HTTPS enabled, six containers should be running (including nginx). Open the installer or agent interface at:

https://<your-server-fqdn>/otobo/

If this is a fresh installation, follow the web installer steps and use the same database settings as for HTTP (db as hostname, OTOBO_DB_ROOT_PASSWORD as root password).

The .env file controls the entire stack. The sample files .docker_compose_env_http and .docker_compose_env_https are starting points; adjust values as needed.

VariableDescription
OTOBO_DB_ROOT_PASSWORDMariaDB root password. Required for the db service and the web installer.

Elasticsearch needs adequate memory in production. See the Elasticsearch Docker production guide for host-level requirements.

VariableDescription
OTOBO_Elasticsearch_ES_JAVA_OPTSJVM heap settings, e.g. -Xms512m -Xmx512m. Increase up to 4 GB for larger installations.
VariableDescription
OTOBO_WEB_HTTP_PORTExternal HTTP port (default 80). Redirects to HTTPS when Nginx is enabled.
OTOBO_WEB_HTTPS_PORTExternal HTTPS port (default 443).
OTOBO_NGINX_SSL_CERTIFICATEPath to the TLS certificate inside the Nginx container.
OTOBO_NGINX_SSL_CERTIFICATE_KEYPath to the TLS private key inside the Nginx container.
OTOBO_NGINX_WEB_HOSTInternal HTTP host used by Nginx to reach the web service.
OTOBO_NGINX_WEB_PORTInternal HTTP port of the web service.
VariableDescription
OTOBO_NGINX_KERBEROS_KEYTABKerberos keytab file (default /etc/krb5.keytab). Must be mounted from the host.
OTOBO_NGINX_KERBEROS_CONFIGKerberos config file (default /etc/krb5.conf).
OTOBO_NGINX_KERBEROS_REALMKerberos realm, used in /etc/krb5.conf.
OTOBO_NGINX_KERBEROS_KDCKDC / Active Directory controller.
OTOBO_NGINX_KERBEROS_ADMIN_SERVERKerberos admin server.
OTOBO_NGINX_KERBEROS_DEFAULT_DOMAINDefault domain for Kerberos.

Use .docker_compose_env_https_kerberos as the base and follow the dedicated Kerberos SSO guide for Active Directory setup.

VariableDescription
COMPOSE_PROJECT_NAMEPrefix for container and volume names (default otobo). Change this to run multiple OTOBO instances on one host.
COMPOSE_FILEColon-separated list of Compose files, e.g. docker-compose/otobo-base.yml:docker-compose/otobo-override-https.yml.
COMPOSE_PATH_SEPARATORSeparator character for COMPOSE_FILE (default : on Linux).
OTOBO_IMAGE_OTOBOOverride the OTOBO web/daemon image tag.
OTOBO_IMAGE_OTOBO_ELASTICSEARCHOverride the Elasticsearch image.
OTOBO_IMAGE_OTOBO_NGINXOverride the Nginx image.

The nginx container uses an OTOBO-specific template at /etc/nginx/template/otobo_nginx.conf.template. Environment variables are substituted when the container starts.

For changes beyond what the .env file supports, export the active configuration and mount your own file:

Terminal window
cd /opt/otobo-docker
mkdir -p nginx
sudo docker cp otobo-nginx-1:/etc/nginx/conf.d/otobo_nginx.conf nginx/otobo_nginx.conf

Add a volume mount in a custom override file (do not edit files under docker-compose/ directly — see below):

custom_nginx.yml
services:
nginx:
volumes:
- /opt/otobo-docker/nginx/otobo_nginx.conf:/etc/nginx/conf.d/otobo_nginx.conf:ro

Include the file via COMPOSE_FILE in .env, then restart:

Terminal window
sudo docker compose up --detach

For a fully custom Nginx setup, start from .docker_compose_env_https_custom_nginx.

If ports 80 or 443 are already in use, set alternative ports in .env:

OTOBO_WEB_HTTP_PORT=8080
OTOBO_WEB_HTTPS_PORT=8443

Restart the stack after changing port values.

By default, all five (or six) services start together. If MariaDB runs outside Docker, start only the services you need:

Terminal window
sudo docker compose up --detach web nginx daemon redis elastic

Alternatively, create a custom Compose override that removes or disables the db service, then point OTOBO to your external database during installation.

Avoid editing files in docker-compose/ directly — they are overwritten when you update the otobo-docker repository. Instead, add your own YAML file and reference it in COMPOSE_FILE.

Example: expose the database on port 3306 for external access.

Create custom_db.yml:

services:
db:
ports:
- "0.0.0.0:3306:3306"

Add it to .env:

COMPOSE_FILE=docker-compose/otobo-base.yml:docker-compose/otobo-override-http.yml:custom_db.yml

Recreate the containers:

Terminal window
sudo docker compose stop
sudo docker compose up --detach

This pattern works for any service or volume customization.

Most application-level changes belong in the otobo_opt_otobo volume (/opt/otobo inside the container), not in a modified Docker image.

Install a local Perl module without rebuilding the image:

Terminal window
sudo docker compose exec web bash
cd /opt/otobo
cpanm -l local Some::Module
exit

Modules installed under /opt/otobo/local persist across container restarts.

To add system packages (e.g. extra Debian tools), build a custom image from a Dockerfile based on rotheross/otobo, or use docker commit on a temporary root session. This is rarely needed for production installations.

[!NOTE] Building images locally is mainly useful for OTOBO development or when you need a patched base image.

Dockerfiles live in the OTOBO source repository:

Terminal window
cd /opt
git clone https://github.com/RotherOSS/otobo.git
cd otobo
git checkout rel-11_0
bin/docker/build_docker_images.sh
docker image ls

Built images are tagged as local-<OTOBO_VERSION>. Reference them in .env:

OTOBO_IMAGE_OTOBO=local-11.0.x
OTOBO_IMAGE_OTOBO_ELASTICSEARCH=local-11.0.x
OTOBO_IMAGE_OTOBO_NGINX=local-11.0.x

For test environments, skip the web installer and use the built-in setup script:

[!WARNING] docker compose down -v deletes all volumes and data. Use only on disposable test systems.

Terminal window
cd /opt/otobo-docker
sudo docker compose down -v
sudo docker compose up --detach
sudo docker compose stop daemon
sudo docker compose exec web bash -c \
"rm -f Kernel/Config/Files/ZZZAAuto.pm ; bin/docker/quick_setup.pl --db-password otobo_root"
sudo docker compose start daemon
Terminal window
sudo docker compose ps # show running containers
sudo docker compose logs -f web # follow web server logs
sudo docker compose logs -f elastic # follow Elasticsearch logs
sudo docker compose restart # restart all services
sudo docker compose stop # stop all services
sudo docker compose config # validate and display merged config
Terminal window
sudo docker compose exec web bash # open a shell in the web container
Terminal window
docker system prune -a # remove unused images, containers, and networks (use with care)

For professional support with installation or integration, contact Softoft.de.

Frequently asked questions

When should I use the advanced Docker Compose guide?

Use it after the basic Docker Compose install when you need HTTPS, Nginx, custom overrides, or stack tuning.

Does the otobo-docker stack include an Nginx reverse proxy?

Yes. For HTTPS you enable the built-in Nginx container with TLS certificate paths in the .env file.

Will Docker volumes keep my OTOBO data if containers are recreated?

Yes. Application, database, Elasticsearch, and Redis data live in named Docker volumes and persist across recreations.