Skip to main content

Provision OSticket with Docker

Shenzhen, China

Update: The used Docker image in this tutorial is currently not compatible with the latest version of OSTicket (v1.17.3) => I recommend switching to this instead.

Installation using Docker

Pull osTicket Image from hub.docker.com:

docker pull osticket/osticket:latest

Make sure you have a MySQL container running that osTicket can use to store its data:

docker pull mariadb:latest
docker run --name osticket_mysql -d -e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_USER=osticket -e MYSQL_PASSWORD=secret -e MYSQL_DATABASE=osticket mariadb:latest

Now run this image and link the MySQL container:

docker run --name osticket -d --link osticket_mysql:mysql -p 8080:80 osticket/osticket

Wait for the setup process to finish - this will download the latest version of OSticket and might take a while:

docker logs osticket
Cloning into '.'...

Once installation is completed then browse to your osTicket staff control panel at http://localhost:8080/scp. Login with default admin user & password:

  • username: ostadmin
    • password: Admin1

Customize

Adding Plugins

docker exec -ti osticket /bin/bash

All plugins can be found in the following directory. Use a volume mount to add community plugins:

ls -la /var/www/src/public/include/plugins
total 2908
drwxr-xr-x 14 www-data www-data    4096 Oct 17 09:07 .
drwxr-xr-x 12 www-data www-data    4096 Oct 17 09:06 ..
drwxr-xr-x  8 www-data www-data    4096 Oct 17 09:06 .git
-rw-r--r--  1 www-data www-data     364 Oct 17 09:06 .gitignore
-rw-r--r--  1 www-data www-data       0 Oct 17 09:06 .keep
-rw-r--r--  1 www-data www-data   18026 Oct 17 09:06 LICENSE
-rw-r--r--  1 www-data www-data    1023 Oct 17 09:06 README.md
drwxr-xr-x  3 www-data www-data    4096 Oct 17 09:06 audit
drwxr-xr-x  3 www-data www-data    4096 Oct 17 09:07 auth-2fa
drwxr-xr-x  3 www-data www-data    4096 Oct 17 09:07 auth-cas
drwxr-xr-x  3 www-data www-data    4096 Oct 17 09:07 auth-ldap
drwxr-xr-x  3 www-data www-data    4096 Oct 17 09:07 auth-oauth2
drwxr-xr-x  2 www-data www-data    4096 Oct 17 09:06 auth-passthru
drwxr-xr-x  2 www-data www-data    4096 Oct 17 09:06 auth-password-policy
-rw-r--r--  1 www-data www-data     228 Oct 17 09:06 composer.json
-rw-r--r--  1 www-data www-data   41176 Oct 17 09:07 composer.lock
-rw-r--r--  1 www-data www-data 2808725 Oct 17 09:07 composer.phar
drwxr-xr-x  2 www-data www-data    4096 Oct 17 09:06 doc
drwxr-xr-x 15 www-data www-data    4096 Oct 17 09:07 lib
-rw-r--r--  1 www-data www-data   24618 Oct 17 09:06 make.php
drwxr-xr-x  2 www-data www-data    4096 Oct 17 09:06 storage-fs
drwxr-xr-x  3 www-data www-data    4096 Oct 17 09:07 storage-s3
-rw-r--r--  1 www-data www-data    1194 Oct 17 09:06 updates.pem

Install them from Manage/Plugins:

Provision OSticket with Docker

Language Packs

Download the language files and place them into:

ls -la /var/www/src/public/include/i18n/
total 44
drwxr-xr-x  4 www-data www-data  4096 Oct 17 10:14 .
drwxr-xr-x 12 www-data www-data  4096 Oct 17 10:14 ..
-rw-r--r--  1 www-data www-data  1097 Oct 17 10:14 README.md
drwxr-xr-x  4 www-data www-data  4096 Oct 17 10:14 en_US
-rw-r--r--  1 www-data www-data 20586 Oct 17 10:14 langs.php
drwxr-xr-x  3 www-data www-data  4096 Oct 17 10:14 vendor

by binding them into your container:

docker-compose.yml

volumes:
    - type: bind
      source: ./src/include/i18n/de.phar
      target: /var/www/src/public/include/i18n/de.phar
      read_only: true

And select them from the Admin panel:

Provision OSticket with Docker

Docker-Compose

version: '3.8'
services:

  osticket-app:
    image: osticket/osticket:latest
    container_name: osticket
    volumes:
      - type: bind
        source: ./src/include/i18n/de.phar
        target: /var/www/src/public/include/i18n/de.phar
        read_only: true
    environment:
      - CONTAINER_NAME=osticket
      - MYSQL_USER=osticket
      - MYSQL_HOST=osticket-db
      - MYSQL_PASSWORD=secret
      - MYSQL_DATABASE=osticket
    ports:
      - 8080:80
    depends_on:
      - osticket-db
    networks:
      - services
    links:
      - osticket-db
    restart: unless-stopped

  osticket-db:
    image: mariadb:latest
    container_name: osticket-db
    volumes:
      - /opt/osticket/db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=secret
      - MYSQL_USER=osticket
      - MYSQL_PASSWORD=secret
      - MYSQL_DATABASE=osticket
      - CONTAINER_NAME=osticket-db
    networks:
      - services
    restart: unless-stopped

networks:
  services:
    external: false

Note: The volume mount /opt/osticket/db:/var/lib/mysql makes sure that all data written to MariaDB will be persisted. Make sure the host path /opt/osticket/db exists and can be written to ~ or just change it to a dir that fulfills the requirement.

Build a customized OSTicket Image

The docker compose file contains a volume mount for the language file I added:

volumes:
  - type: bind
    source: ./src/include/i18n/de.phar
    target: /var/www/src/public/include/i18n/de.phar
    read_only: true

Actually, there are a lot more files that I need to mount - logos, styles and additional scripts. It makes sense for me to simply "bake" all of them into a customized image of OSTicket using the docker build command.

Here I ran into a few issues with the official docker image and found this fork of it that is based on a PHP8 Alpine Linux image that is much more suitable for my task. You can build this image of OSTicket with:

docker build -t my/osticket .

Now we can use this image to add our customizations with a Dockerfile

FROM instar/osticket:latest

# add all your files here, e.g.
COPY ./src/include/staff/header.inc.php /var/www/html/include/staff/header.inc.php
#...

Now build this image and tag it according to your Docker Registry setup:

docker build -t my.gitlab.com:12345/server_management/my-osticket:latest .

When you pull this image you can still use the docker-compose.yml file from above - but you no longer have to provide the volumen mounts and source files. Everything is baked in!

Backup & Restore

The database image uses a volume mount to persist all written data /opt/osticket/db:/var/lib/mysql. You can use it to drop in an SQL dump to /opt/osticket/db enter the MariaDB image:

docker exec -ti osticket-db /bin/bash

And restore your old OSTicket state:

Restore from MySQL Dump

mysql -uosticket -p osticket < Ticketsystem_2022-10-20.sql

Create a MySQL Dump

mysqldump -uosticket -p osticket > backup-file.sql
Enter password: secret