osTicket Docker 환경 구축하기
개요
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. 접속
- osTicket: http://localhost:8080/setup/
- 관리자 패널: http://localhost:8080/scp
- phpMyAdmin: http://localhost:8081
🔧 트러블슈팅
"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
📋 설치 후 작업
- setup 디렉토리 삭제 (보안을 위해)
- 관리자 계정으로 로그인
- 이메일 설정 구성
- 부서 및 헬프토픽 설정
🔒 보안 권장사항
- 강한 비밀번호 사용
- SSL 인증서 적용 (프로덕션)
- 정기적인 백업
- 방화벽 설정