feat(traccar): Update to Traccar 6

This commit is contained in:
hygienic-books 2025-03-05 02:27:53 +01:00
parent 9cfdc2ee54
commit af685d8788
13 changed files with 47 additions and 97 deletions

View File

@ -14,7 +14,6 @@ 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>
```
@ -25,20 +24,12 @@ On your deployment machine create the necessary Docker context to connect to and
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](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.
Pull both Traccar and MySQL:
```
docker compose --project-name "${COMPOSE_PROJECT}" --file "${COMPOSE_FILE}" --env-file "${COMPOSE_ENV}" --profile 'traccar' pull
docker compose --project-name "${COMPOSE_PROJECT}" --file "${COMPOSE_FILE}" --env-file "${COMPOSE_ENV}" --profile 'full' pull
```
## Copy to target
@ -46,16 +37,18 @@ docker compose --project-name "${COMPOSE_PROJECT}" --file "${COMPOSE_FILE}" --en
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](https://quico.space/Quico/copy-docker) where [copy-docker.sh](https://quico.space/Quico/copy-docker/src/branch/main/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
images="$(docker compose --project-name "${COMPOSE_PROJECT}" --file "${COMPOSE_FILE}" --env-file "${COMPOSE_ENV}" --profile 'full' config | grep -Pi -- 'image:' | awk '{print $2}' | sort | uniq)"
while IFS= read -u 10 -r image; do
copy-docker "${image}" fully.qualified.domain.name
done 10<<<"${images}"
```
## Start
## Start and clean up
```
docker --context 'fully.qualified.domain.name' compose --project-name "${COMPOSE_PROJECT}" --file "${COMPOSE_FILE}" --env-file "${COMPOSE_ENV}" --profile 'full' up --detach
docker --context 'fully.qualified.domain.name' system prune -af
docker system prune -af
```
# Initial setup
@ -68,58 +61,63 @@ Create ZFS datasets and set permissions as needed.
* Parent dateset
```
zfs create -o mountpoint=/opt/docker-data 'zpool/docker-data'
export "$(grep -Pi -- '^CONTEXT=' "${COMPOSE_ENV}")"
zfs create -o canmount=off zpool/data/opt
zfs create -o mountpoint=/opt/docker-data zpool/data/opt/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'
zfs create -p 'zpool/docker-data/traccar-'"${CONTEXT}"'/traccar/data'
zfs create -p 'zpool/docker-data/traccar-'"${CONTEXT}"'/traccar/config'
zfs create -p 'zpool/docker-data/traccar-'"${CONTEXT}"'/mysql/data'
zfs create -p 'zpool/docker-data/traccar-'"${CONTEXT}"'/mysql/config'
```
* Create subdirs
```
mkdir -p '/opt/docker-data/traccar-'"${COMPOSE_CTX}"'/mysql/config/'{'docker-entrypoint-initdb.d','db'}
mkdir -p '/opt/docker-data/traccar-'"${CONTEXT}"'/'{'traccar/data/'{'data','logs'},'mysql/config/'{'docker-entrypoint-initdb.d','db'}}
```
This will create a directory structure like so:
```
traccar-loft/
├── mysql
│ ├── config
│ │ ├── db
│ │ └── docker-entrypoint-initdb.d
│ └── data
└── traccar
├── config
└── data
├── data
└── logs
```
* Change ownership for MySQL daemon
```
chown -R 999:999 '/opt/docker-data/traccar-'"${COMPOSE_CTX}"'/mysql/'{*,.*}
chown -R 999:999 '/opt/docker-data/traccar-'"${CONTEXT}"'/mysql/'*
```
## Additional files
Place the following files on target server. Use the directory structure at [build-context](build-context) as a guide, specifically at `docker-data`.
Place both a `my.cnf` and `traccar.xml` file on target server. Use the directory structure at [build-context](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
│   ├── ...
│   └── ...
│ └── docker-data
│ └── config
│ └── db
│ └── my.cnf
└── traccar
├── docker-data
│   ├── config
│   │   └── traccar.xml
│   └── data
├── ...
└── ...
└── docker-data
└── config
└── traccar.xml
```
The [example my.cnf](build-context/mysql/docker-data/config/db/my.cnf) config file for MySQL follows [Traccar's recommendation for MySQL](https://www.traccar.org/mysql-optimization/) 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](#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)"](https://dev.mysql.com/doc/refman/8.0/en/innodb-redo-log.html#innodb-modifying-redo-log-capacity).
The [example my.cnf](build-context/mysql/docker-data/config/db/my.cnf) config file for MySQL follows [Traccar's recommendation for MySQL](https://www.traccar.org/mysql-optimization/) but uses 512 MiB of RAM instead of Traccar's 3 GiB example. Since we live in a world with MySQL 8.0.30+ we're using `innodb_redo_log_capacity` over Traccar's recommendation (as of Wednesday, March 5, 2025) of `innodb_log_file_size`. See also [MySQL 8.0 docs section "Configuring Redo Log Capacity (MySQL 8.0.30 or Higher)"](https://dev.mysql.com/doc/refman/8.0/en/innodb-redo-log.html#innodb-modifying-redo-log-capacity).
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"](https://dev.mysql.com/doc/refman/8.0/en/docker-mysql-more-topics.html#docker-additional-init).
In `docker-entrypoint-initdb.d` you can store database initialization scripts that are run when you start MySQL without any data. See also [MySQL 9.2 docs section "Running Additional Initialization Scripts"](https://dev.mysql.com/doc/refman/9.2/en/docker-mysql-more-topics.html#docker-additional-init).
Config `traccar.xml` is a minimal working example file taken from the Traccar Docker image. See [Docker Hub traccar/traccar overview](https://hub.docker.com/r/traccar/traccar) section "Get default traccar.xml". In [our example traccar.xml](build-context/traccar/docker-data/config/traccar.xml) file the default H2 database is replaced with MySQL to match this repo.

View File

@ -1,4 +0,0 @@
ARG MYSQL_VERSION
FROM "mysql:${MYSQL_VERSION}"
RUN mkdir -p /tmp/mysql

View File

@ -1,6 +0,0 @@
[mysqld]
innodb_buffer_pool_size = 512M
innodb_redo_log_capacity = 512M
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 0
tmpdir = /tmp/mysql

View File

@ -1,14 +0,0 @@
# For the remainder of this Dockerfile EXAMPLE_ARG_FOR_DOCKERFILE will be
# available with a value of 'must_be_available_in_dockerfile', check out the env
# file at 'env/fully.qualified.domain.name.example' for reference.
# ARG EXAMPLE_ARG_FOR_DOCKERFILE
# Another env var, this one's needed in the example build step below:
# ARG TRACCAR_VERSION
# Example
# FROM "traccar:${TRACCAR_VERSION}"
# RUN apt-get update && \
# apt-get -y install \
# somepackage-6.q16-6-extra && \
# rm -rf /var/lib/apt/lists/*

View File

@ -1,26 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE properties SYSTEM 'http://java.sun.com/dtd/properties.dtd'>
<properties>
<entry key='config.default'>./conf/default.xml</entry>
<!--
This is the main configuration file. All your configuration parameters should be placed in this file.
Default configuration parameters are located in the "default.xml" file. You should not modify it to avoid issues
with upgrading to a new version. Parameters in the main config file override values in the default file. Do not
remove "config.default" parameter from this file unless you know what you are doing.
For list of available parameters see following page: https://www.traccar.org/configuration-file/
-->
<entry key='database.driver'>com.mysql.cj.jdbc.Driver</entry>
<entry key='database.url'>jdbc:mysql://mysql/traccar?zeroDateTimeBehavior=round&amp;serverTimezone=UTC&amp;allowPublicKeyRetrieval=true&amp;useSSL=false&amp;allowMultiQueries=true&amp;autoReconnect=true&amp;useUnicode=yes&amp;characterEncoding=UTF-8&amp;sessionVariables=sql_mode=''</entry>
<entry key='database.user'>traccar</entry>
<entry key='database.password'>t0psecret</entry>
</properties>

View File

@ -7,12 +7,14 @@ MYSQL_ROOT_PASSWORD=Alsot0psecr3t
MYSQL_USER=traccar
MYSQL_VERSION=latest
SUBNET=172.24.10.0/24
TRACCAR_GPS_PORT_EXTERNAL=61000
TRACCAR_CLIENT_PORT_EXTERNAL=61000
TRACCAR_CLIENT_PORT_INTERNAL=5055
TRACCAR_GPS_PORT_EXTERNAL=61001
TRACCAR_GPS_PORT_INTERNAL=5008
TRACCAR_VERSION=latest
TRACCAR_WEBUI_PORT=8080
ULIMIT_NPROC=65535
# Other available defaults
# RESTARTPOLICY=unless-stopped
# TIMEZONE=Etc/UTC
# RESTARTPOLICY=always
# TIMEZONE=Etc/UTC