Traccar Docker Compose files

Docker Compose files to spin up an instance of Traccar.

How to run

Add a COMPOSE_ENV file and save its location as a shell variable along with the location where this repo lives, here for example /opt/containers/traccar plus all other variables. At env/fqdn_context.env.example you'll find an example environment file.

When everything's ready start Traccar with Docker Compose, otherwise head down to Initial setup first.

Environment

export COMPOSE_DIR='/opt/containers/traccar'
export COMPOSE_CTX='ux_vilnius'
export COMPOSE_PROJECT='traccar-'"${COMPOSE_CTX}"
export COMPOSE_FILE="${COMPOSE_DIR}"'/docker-compose.yml'
export COMPOSE_OVERRIDE="${COMPOSE_DIR%/}"'/docker-compose.override.yml'
export COMPOSE_ENV=<add accordingly>

Context

On your deployment machine create the necessary Docker context to connect to and control the Docker daemon on whatever target host you'll be using, for example:

docker context create fully.qualified.domain.name --docker 'host=ssh://root@fully.qualified.domain.name'

Build

We build only MySQL. Our local adjustment to the official image is simply adding /tmp/mysql to it. See build-context/mysql/Dockerfile. We use /tmp/mysql to bind-mount a dedicated ZFS dataset for MySQL tmpdir location.

docker compose --project-name "${COMPOSE_PROJECT}" --file "${COMPOSE_FILE}" --file "${COMPOSE_OVERRIDE}" --env-file "${COMPOSE_ENV}" --profile 'build-mysql' build

Pull

The Traccar image is just pulled from Docker Hub verbatim.

docker compose --project-name "${COMPOSE_PROJECT}" --file "${COMPOSE_FILE}" --env-file "${COMPOSE_ENV}" --profile 'traccar' pull

Copy to target

Copy images to target Docker host, that is assuming you deploy to a machine that itself has no network route to reach Docker Hub. Copying in its simplest form involves a local docker save and a remote docker load. Consider the helper mini-project quico.space/Quico/copy-docker where copy-docker.sh allows the following workflow:

source "${COMPOSE_ENV}"
for image in 'mysql:'"${MYSQL_VERSION}" 'traccar/traccar:'"${TRACCAR_VERSION}"; do
    copy-docker.sh "${image}" fully.qualified.domain.name
done

Start

docker --context 'fully.qualified.domain.name' compose --project-name "${COMPOSE_PROJECT}" --file "${COMPOSE_FILE}" --env-file "${COMPOSE_ENV}" --profile 'full' up --detach

Initial setup

We're assuming you run Docker Compose workloads with ZFS-based bind mounts. ZFS management, creating a zpool and setting adequate properties for its datasets is out of scope of this document.

Datasets

Create ZFS datasets and set permissions as needed.

  • Parent dateset

    zfs create -o mountpoint=/opt/docker-data 'zpool/docker-data'
    
  • Container-specific datasets

    zfs create -p 'zpool/docker-data/traccar-'"${COMPOSE_CTX}"'/traccar/data/data'
    zfs create -p 'zpool/docker-data/traccar-'"${COMPOSE_CTX}"'/traccar/data/logs'
    zfs create -p 'zpool/docker-data/traccar-'"${COMPOSE_CTX}"'/traccar/config'
    zfs create -p 'zpool/docker-data/traccar-'"${COMPOSE_CTX}"'/mysql/data/datadir'
    zfs create -p 'zpool/docker-data/traccar-'"${COMPOSE_CTX}"'/mysql/data/tmpdir'
    zfs create -p 'zpool/docker-data/traccar-'"${COMPOSE_CTX}"'/mysql/config'
    
  • Create subdirs

    mkdir -p '/opt/docker-data/traccar-'"${COMPOSE_CTX}"'/mysql/config/'{'docker-entrypoint-initdb.d','db'}
    
  • Change ownership for MySQL daemon

    chown -R 999:999 '/opt/docker-data/traccar-'"${COMPOSE_CTX}"'/mysql/'{*,.*}
    

Additional files

Place the following files on target server. Use the directory structure at build-context as a guide, specifically at docker-data.

build-context/
├── mysql
│   ├── docker-data
│   │   ├── config
│   │   │   ├── db
│   │   │   │   └── my.cnf
│   │   │   └── docker-entrypoint-initdb.d
│   │   └── data
│   │       ├── datadir
│   │       └── tmpdir
│   ├── ...
│   └── ...
└── traccar
    ├── docker-data
    │   ├── config
    │   │   └── traccar.xml
    │   └── data
    ├── ...
    └── ...

The example my.cnf config file for MySQL follows Traccar's recommendation for MySQL but uses 512 MiB of RAM instead of Traccar's 3 GiB example. We also add a tmpdir whose location gets created in our custom MySQL image up top during Build. Lastly since we live in a world with MySQL 8.0.30+ we're using innodb_redo_log_capacity over Traccar's recommendation (as of Thursday, June 22, 2023) of innodb_log_file_size. See also MySQL 8.0 docs section "Configuring Redo Log Capacity (MySQL 8.0.30 or Higher)".

In docker-entrypoint-initdb.d you can store database initialization scripts that are run when you start MySQL without any data. See also MySQL 8.0 docs section "Running Additional Initialization Scripts".

Config traccar.xml is a minimal working example file taken from the Traccar Docker image. See Docker Hub traccar/traccar overview section "Get default traccar.xml". In our example traccar.xml file the default H2 database is replaced with MySQL to match this repo.

When done head back up to How to run.

Description
Docker Compose files to spin up an instance of Traccar
Readme 41 KiB
Languages
Dockerfile 100%