카테고리 없음

osTicket을 Docker로 구축하기

백봉 2025. 9. 11. 18:16

osTicket Docker 환경 구축하기

osTicket Docker PHP MariaDB

개요

osTicket을 Docker 환경에서 빠르고 안정적으로 구축하는 방법을 설명합니다.

구성 요소

  • osTicket: PHP 8.1 + Apache 기반 헬프데스크 시스템
  • MariaDB 10.11: 데이터베이스
  • Redis: 캐시 및 세션 관리
  • phpMyAdmin: 데이터베이스 관리 도구

🚀 빠른 시작

1. 프로젝트 준비

mkdir osticket-docker && cd osticket-docker
mkdir -p osTicket mysql-init logs

2. osTicket 다운로드

wget https://github.com/osTicket/osTicket/releases/download/v1.18.1/osTicket-v1.18.1.zip
unzip osTicket-v1.18.1.zip -d osTicket/

⚠️ 필수: 설정 파일 준비

# 이 단계를 반드시 Docker 빌드 전에 실행해야 함!
cp osTicket/upload/include/ost-sampleconfig.php osTicket/upload/include/ost-config.php

3. 환경변수 설정 (.env)

# 데이터베이스 설정
MYSQL_ROOT_PASSWORD=rootpassword123
MYSQL_DATABASE=osticket
MYSQL_USER=osticket
MYSQL_PASSWORD=osticketpass123

# osTicket 관리자 계정
ADMIN_FIRSTNAME=Admin
ADMIN_LASTNAME=User
ADMIN_EMAIL=admin@yourdomain.com
ADMIN_USERNAME=admin
ADMIN_PASSWORD=adminpass123

# 보안 설정
INSTALL_SECRET=changeme123456789
SECRET_SALT=RandomSaltValue123456789

# URL 설정
OSTICKET_URL=http://localhost:8080
OSTICKET_ADMIN_URL=http://localhost:8080/scp

4. Dockerfile

FROM php:8.1-apache

# PHP 확장 및 도구 설치
RUN apt-get update && apt-get install -y \
    libzip-dev libfreetype6-dev libjpeg62-turbo-dev libpng-dev \
    libonig-dev libxml2-dev libkrb5-dev libldap2-dev libicu-dev \
    cron unzip git netcat-openbsd curl \W
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-configure ldap --with-libdir=lib/x86_64-linux-gnu/ \
    && docker-php-ext-install -j$(nproc) \
        gd gettext intl ldap mbstring mysqli pdo_mysql sockets xml zip \
    && a2enmod rewrite headers \
    && rm -rf /var/lib/apt/lists/*

# Apache 설정
COPY apache-config.conf /etc/apache2/sites-available/000-default.conf

# osTicket 소스 복사
COPY osTicket/upload/ /var/www/html/

# Cron 작업 추가
COPY osticket-cron /etc/cron.d/osticket
RUN chmod 0644 /etc/cron.d/osticket && crontab /etc/cron.d/osticket

# 권한 설정
RUN chown -R www-data:www-data /var/www/html \
    && chmod -R 755 /var/www/html \
    && mkdir -p /var/www/html/attachments \
    && chown -R www-data:www-data /var/www/html/attachments \
    && chmod -R 777 /var/www/html/attachments

# 시작 스크립트
COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.sh

EXPOSE 80
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["apache2-foreground"]

5. docker-compose.yaml

services:
  mariadb:
    image: mariadb:10.11
    container_name: osticket_db
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_CHARSET: utf8mb4
      MYSQL_COLLATION: utf8mb4_unicode_ci
    volumes:
      - mariadb_data:/var/lib/mysql
      - ./mysql-init:/docker-entrypoint-initdb.d
    networks:
      - osticket_network
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"]
      timeout: 20s
      retries: 10
      interval: 30s
      start_period: 40s

  redis:
    image: redis:7-alpine
    container_name: osticket_redis
    restart: unless-stopped
    command: redis-server --requirepass ${SECRET_SALT}
    volumes:
      - redis_data:/data
    networks:
      - osticket_network
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      timeout: 5s
      retries: 3

  osticket:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: osticket_web
    restart: unless-stopped
    ports:
      - "8080:80"
    environment:
      MYSQL_HOST: mariadb
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      ADMIN_FIRSTNAME: ${ADMIN_FIRSTNAME}
      ADMIN_LASTNAME: ${ADMIN_LASTNAME}
      ADMIN_EMAIL: ${ADMIN_EMAIL}
      ADMIN_USERNAME: ${ADMIN_USERNAME}
      ADMIN_PASSWORD: ${ADMIN_PASSWORD}
      INSTALL_SECRET: ${INSTALL_SECRET}
      SECRET_SALT: ${SECRET_SALT}
      OSTICKET_URL: ${OSTICKET_URL}
      OSTICKET_ADMIN_URL: ${OSTICKET_ADMIN_URL}
    volumes:
      - osticket_attachments:/var/www/html/attachments
      - osticket_uploads:/var/www/html/upload
      - ./logs:/var/log/apache2
    networks:
      - osticket_network
    depends_on:
      mariadb:
        condition: service_healthy

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    container_name: osticket_phpmyadmin
    restart: unless-stopped
    ports:
      - "8081:80"
    environment:
      PMA_HOST: mariadb
      PMA_USER: root
      PMA_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    networks:
      - osticket_network
    depends_on:
      mariadb:
        condition: service_healthy

volumes:
  mariadb_data:
  osticket_uploads:
  osticket_attachments:
  redis_data:

networks:
  osticket_network:

6. 실행

# 설정 파일 준비 (필수!)
cp osTicket/upload/include/ost-sampleconfig.php osTicket/upload/include/ost-config.php

# 컨테이너 시작
docker-compose up -d --build

7. 접속

🔧 트러블슈팅

"Access Denied!" 오류

원인: ost-config.php 파일이 빌드 시점에 없음

해결:

docker-compose down
cp osTicket/upload/include/ost-sampleconfig.php osTicket/upload/include/ost-config.php
docker-compose up -d --build

"Configuration file does NOT exist" 오류

위의 해결방법과 동일

데이터베이스 연결 오류

# 데이터베이스 상태 확인
docker-compose exec mariadb mysql -u root -p -e "SHOW DATABASES;"

# 환경변수 확인
cat .env

📋 설치 후 작업

  1. setup 디렉토리 삭제 (보안을 위해)
  2. 관리자 계정으로 로그인
  3. 이메일 설정 구성
  4. 부서 및 헬프토픽 설정

🔒 보안 권장사항

  • 강한 비밀번호 사용
  • SSL 인증서 적용 (프로덕션)
  • 정기적인 백업
  • 방화벽 설정