Skip to main content
Deploy Osticket via Docker
  1. doc/

Deploy Osticket via Docker

·3 mins·

Disclaimer: artikel ini menggunakan image osTicket berbasis komunitas karena image resmi dari tim osTicket belum dirilis saat artikel ini ditulis. Berdasarkan pernyataan tim resmi, image resmi direncanakan hadir pada versi 2.

Deploy osTicket via Docker
#

Panduan ini menjelaskan cara menjalankan osTicket menggunakan Docker Compose dan MariaDB, dengan dukungan scale-to-zero melalui Sablier serta routing melalui Nginx Reverse Proxy.

1. Struktur Direktori
#

Pastikan struktur direktori volume dan program sudah dibuat di server. Contoh berikut memakai path dummy, sesuaikan dengan environment deployment anda:

/srv/user/
├── program/
│   └── osticket/
│       └── docker-compose.yml
└── volume-docker-mount/
    ├── mount-osticket/
    │   └── attachments/
    └── mount-mariadb-osticket/

2. Docker Compose File (docker-compose.yml)
#

Simpan konfigurasi berikut di /srv/user/program/osticket/docker-compose.yml. Konfigurasi ini sudah mencakup Resource Limits, Labels untuk Sablier, dan Healthchecks.

services:
  osticket:
    image: rinkp/osticket-dockerized:latest
    container_name: osticket_app
    ports:
      - "127.0.0.1:8700:80"
    environment:
      OST_SECRET_SALT: "[REDACTED - secret salt]"
      OST_ADMIN_EMAIL: "admin@example.test"
      OST_ADMIN_PASSWD: "[REDACTED - admin password]"
      OST_HELPDESK_URL: "https://ticket.example.test"
      OST_DBHOST: "mariadb_osticket"
      OST_DBNAME: "osticket"
      OST_DBUSER: "osticket"
      OST_DBPASS: "[REDACTED - database password]"
      OST_TRUSTED_PROXIES: "127.0.0.1"
    volumes:
      - /srv/user/volume-docker-mount/mount-osticket/attachments:/var/www/attachments
    labels:
      - "sablier.enable=true"
      - "sablier.group=osticket"
    networks:
      - osticket_network
      - sablier-network
    depends_on:
      - mariadb_osticket
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -fL http://127.0.0.1:80/ || wget -qO- http://127.0.0.1:80/ > /dev/null || exit 1",
        ]
      interval: 5s
      timeout: 5s
      retries: 5
    deploy:
      resources:
        limits:
          memory: 512M

  mariadb_osticket:
    image: mariadb:11
    container_name: mariadb_osticket
    environment:
      MARIADB_ROOT_PASSWORD: "[REDACTED - root password]"
      MARIADB_DATABASE: "osticket"
      MARIADB_USER: "osticket"
      MARIADB_PASSWORD: "[REDACTED - database password]"
    labels:
      - "sablier.enable=true"
      - "sablier.group=osticket"
    volumes:
      - /srv/user/volume-docker-mount/mount-mariadb-osticket:/var/lib/mysql
    networks:
      - osticket_network
      - sablier-network
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "/usr/local/bin/healthcheck.sh --su mysql --connect --innodb_initialized",
        ]
      interval: 5s
      timeout: 5s
      retries: 5
    deploy:
      resources:
        limits:
          memory: 384M

networks:
  osticket_network:
    name: osticket_network
    driver: bridge
  sablier-network:
    external: true

3. Konfigurasi Nginx Server Block
#

File ini mengatur reverse proxy dan integrasi auth_request untuk membangunkan container melalui Sablier. Letakkan di /etc/nginx/sites-available/ticket.example.test.

server {
    server_name ticket.example.test;

    location / {
        auth_request /sablier_wake;

        proxy_pass http://127.0.0.1:8700;
        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;
    }

    location = /sablier_wake {
        internal;

        # Wajib menggunakan GET agar Sablier tidak menolak request POST dari user
        proxy_method GET;

        proxy_pass http://127.0.0.1:[YOUR-SABLIER-PORT]/api/strategies/blocking?group=osticket&session_duration=5m;
        proxy_pass_request_body off;
        proxy_set_header Content-Length "";

        # Wajib dikosongkan agar parser Sablier (Go/Gin) tidak error 400 saat menerima sisa request POST
        proxy_set_header Content-Type "";
    }

    [OUTPUT-REDACDTED]
}

Catatan Penting & Troubleshooting (Lesson Learned)
#

Volume /config di-hapus: Pada osTicket dockerized, jangan lakukan bind mount pada direktori /config jika host folder tersebut masih kosong. Entrypoint script akan gagal mengeksekusi proses cp (copy) dan mengakibatkan container osTicket crash.

Koneksi Database di Awal: Saat pertama kali di-deploy dengan volume kosong, MariaDB memerlukan waktu ekstra (~30 detik) untuk inisialisasi. Jika osTicket crash dengan error Connection refused, cukup biarkan hingga MariaDB ready for connections, lalu hidupkan kembali osTicket dengan docker compose start osticket.

Ketergantungan Sablier pada Healthcheck: di kasus kali ini Sablier membutuhkan healthcheck yang proper pada Docker. Tanpa healthcheck yang proper, Sablier tidak tahu kapan container sudah sepenuhnya siap melayani trafik, yang akan berujung pada error 504 Gateway Timeout di sisi browser.

Healthcheck osTicket (Toleransi Redirect 302): Perintah curl standar dengan opsi -f akan gagal jika aplikasi membalas dengan status 302 Redirect (perilaku umum osTicket). Tambahkan opsi -L (curl -fL) agar healthcheck Docker mengikuti alur redirect dan mendapatkan status 200 OK.

Sablier & Form POST: Jika pengguna melakukan submit data via form (Metode POST), Nginx akan meneruskan header Content-Type: application/x-www-form-urlencoded ke API Sablier, meskipun body request-nya telah dibuang oleh Nginx. Ini memicu API Sablier mengembalikan 400 Bad Request. Solusinya adalah secara eksplisit mengeset instruksi proxy_method GET; dan proxy_set_header Content-Type “”; pada blok /sablier_wake Nginx.

Askarhabibulloh
Author
Askarhabibulloh