Docker Deployment - openises/tickets GitHub Wiki

Docker Deployment Guide

Deploy TicketsCAD in minutes using Docker. Works on Windows, Linux, and macOS.

Quick Start

Prerequisites

Deploy (3 commands)

mkdir ticketscad && cd ticketscad
curl -LO https://raw.githubusercontent.com/openises/tickets/main/docker-compose.yml
docker compose up -d

Open http://localhost:8080 and login with admin / admin.

Change the admin password immediately after first login.


Custom Configuration

Set environment variables before starting:

export ADMIN_PASS="MySecurePassword"
export DB_PASS="SecureDatabasePass"
docker compose up -d

All Environment Variables

Variable Default Description
DB_HOST db Database hostname
DB_USER tickets Database username
DB_PASS tickets Database password
DB_NAME tickets Database name
ADMIN_USER admin Initial admin username
ADMIN_PASS admin Initial admin password
ADMIN_NAME Super Administrator Admin display name
WEB_PORT 8080 Host port for web interface
AUTO_INSTALL true Auto-create tables on first run

Windows Setup

Install Docker Desktop

  1. Download from https://www.docker.com/products/docker-desktop/
  2. Run installer — enable "WSL 2 based engine" when prompted
  3. Restart computer if prompted
  4. Start Docker Desktop from the Start menu

Deploy from PowerShell

mkdir C:\TicketsCAD
cd C:\TicketsCAD
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/openises/tickets/main/docker-compose.yml" -OutFile "docker-compose.yml"
$env:ADMIN_PASS = "MySecurePassword"
docker compose up -d

Linux Setup

Install Docker (Debian/Ubuntu)

curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
# Log out and back in, then:
docker compose version

Deploy

mkdir ~/ticketscad && cd ~/ticketscad
curl -LO https://raw.githubusercontent.com/openises/tickets/main/docker-compose.yml
ADMIN_PASS="$(openssl rand -base64 12)" docker compose up -d

Persistent Data

All data survives container restarts and upgrades:

Volume Contents
db_data Database (incidents, users, settings)
uploads File attachments
tile_cache Cached map tiles
config Database connection settings

Never use docker compose down -v on production — the -v flag deletes volumes.


Backup & Restore

Backup

docker exec ticketscad_db mariadb-dump -u tickets -pYOUR_PASS tickets > backup_$(date +%Y%m%d).sql

Restore

docker exec -i ticketscad_db mariadb -u tickets -pYOUR_PASS tickets < backup_20260401.sql

Upgrade

cd ~/ticketscad
docker compose pull
docker compose up -d

The installer detects version mismatches and prompts for database upgrade.


Production: Add HTTPS

For internet-facing deployments, add nginx as a reverse proxy with SSL:

sudo apt install nginx certbot python3-certbot-nginx

sudo tee /etc/nginx/sites-available/ticketscad << 'EOF'
server {
    listen 80;
    server_name your-domain.com;
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
EOF

sudo ln -sf /etc/nginx/sites-available/ticketscad /etc/nginx/sites-enabled/
sudo certbot --nginx -d your-domain.com

Troubleshooting

Problem Solution
Container won't start docker compose logs web
Database connection error docker compose logs db — wait for "ready for connections"
Blank pages (Situation, Units, etc.) Pull latest code — MySQL 8.0 strict mode fix included
Map tiles "Access blocked" Clear browser cache — tiles now route through server proxy
White screen docker exec ticketscad tail -50 /var/log/php_errors.log
"ONLY_FULL_GROUP_BY" errors Pull latest — SQL mode set at connection time
"Incorrect DATETIME value" Pull latest — strict DATETIME mode disabled
Port in use WEB_PORT=9090 docker compose up -d
Reset everything docker compose down -v && docker compose up -d