Programming/Docker

Docker - h5ai, 개인 파일 사이트 이미지 개발/배포

awesometic 2019. 1. 11. 10:49
반응형

Docker - h5ai


H2로 서버를 옮기면서 x86이기도 하고 용량도, 램도 넉넉하니 Docker로만 필요한 서비스들을 구축해보자 생각했습니다. Docker를 서버로 사용하면 얻을 수 있는 장점은 정말 많은데, 특히 서버 셋업이 잘못되더라도 복구하기가 쉽다는 점, 업데이트를 제가 하지 않아도 이미지 갱신만으로 된다는 점이 너무 매력적이었어요.

사실 약 1년 전부터 구상하고 있긴 했지만 기존 서버에 이미 손수 한땀한땀 정성들여 짜놨기 때문에 귀찮아서 시도는 하지 않고 있었습니다.

하지만 이번엔 어차피 새로 구축해야 하기 때문에 LinuxServer.io라는 단체에서 제공해주는 Docker 이미지들을 사용하기로 했습니다. 지금은 정상적으로 모두 설치가 됐고, 잘 사용하고 있어요. 게다가 저 단체에서 여러 Docker 이미지를 제공해줘서 다른 필요한 걸 설치할 때도 좋을 것 같아요. 심지어 x86 뿐 아니라 arm이나 arm64도 지원해주니까 ODROID-XU4, C2, Raspberry Pi에도 설치가 가능합니다.

근데! 제가 개인 웹 자료실로 사용하는 h5ai가 없었습니다. 정확히는 개발 중이긴 한데 오래 전에 개발이 중단된 것 같더라구요.

다른 사람들의 h5ai 이미지는 많았지만, 필요한 기능이 안 된다던가 서버 버전, PHP 버전이 너무 낮다던가, 딱 제가 원하는 게 없더라구요.

그래서 직접 만들었습니다. Docker 이미지 만드는 걸 해보기도 싶었고, 저도 필요하니까요 :)

 

특징

구성

최대한 최신 프로그램들로 구성하고 싶었습니다. 성능도 좋고, 기능도 많으며 버그는 상대적으로 적기 때문이죠.

다음 프로그램들로 이루어져 있습니다.

  • Alpine Linux 3.8
  • Nginx 1.15
  • PHP 7.2
  • h5ai 0.29.0

가볍고 안정적인 Alpine 리눅스 기반으로 했습니다. 순수 Alpine 이미지에서 Nginx를 설치해 직접 안에서 구축할까 했지만, Nginx 설정도 꽤 험난해 보여서 Nginx에서 제공하는 Alpine 이미지를 사용했습니다.

PHP는 당연히 5보다 훨씬 빨라진 7이고, 당연히 최신 h5ai를 설치했어요.

Supervisor로 Nginx와 PHP-FPM 프로세스를 관리합니다.

 

모든 추가 기능 지원

그리고 여러가지 추가 작업들도 완료했습니다.

  • Public/Private 캐싱 지원
  • h5ai에서 지원하는 모든 종류의 썸네일 지원
  • tar, zip 압축 지원
  • du 로 디렉토리 용량 계산 지원

몇몇 기능은 기본적으로 비활성화되어 있지만, options.json 파일을 수정해서 활성화할 수 있습니다.

 

HTPASSWD 지원

아무나 h5ai 웹사이트에 접속하는 걸 방지하기 위해 htpasswd를 적용했습니다.

처음 이미지를 실행할 때 한 가지 계정에 한해서 접속 가능한 계정을 생성할 수 있으며, 이후엔 사용자가 직접 사용자를 추가하거나 비밀번호를 변경해야 합니다.

 

Reverse Proxy를 통한 Let's Encrypt 지원

아직은 직접 SSL 인증 파일만으로 자체 SSL을 구축할 순 없지만, Reverse Proxy 서버와 Let's Encrypt를 통해 h5ai 웹사이트 도메인을 등록할 수 있습니다.

LinuxServer.io 의 Let's Encrypt 이미지를 사용하면 바로 가능합니다.

 

설정 파일 관리

호스트 컴퓨터에서 h5ai 이미지의 설정 파일을 관리할 수 있습니다.

직접 관리 가능한 파일들은 다음과 같습니다.

  • h5ai 소스 코드
  • h5ai options.json 파일
  • Nginx 서버 설정 파일

그리고 이 설정 파일들은 호스트 컴퓨터에 저장되기 때문에 언제든 재사용이 가능합니다. h5ai 이미지를 삭제하고 다시 구축하더라도 바로 적용할 수 있습니다.

 

사용법

Docker가 설치되어 있다면 간단합니다.

Docker Hub에서 awesometic/h5ai 이미지를 다운받습니다.

docker pull awesometic/h5ai

 

아래 예시에선 -it --rm 옵션이 있기 때문에 컨테이너 종료 시 바로 호스트 컴퓨터에서 컨테이너가 삭제됩니다.

기본적으로 아래 옵션들을 무조건 사용해야 합니다.

docker run -it --rm \
-p 80:80 \
-v /wherever/you/share:/h5ai \
-v /wherever/you/config:/config \
-e TZ=Asia/Seoul \
awesometic/h5ai
  • 웹에서 접속하기 위해 외부에서 80번 포트를 받아야 합니다.
  • 공유하기 원하는 디렉토리를 컨테이너의 /h5ai 로 등록합니다.
  • 설정 파일이 위치하길 원하는 디렉토리를 컨테이너의 /config 로 등록합니다.
  • PHP 시간대를 설정하기 위해 TZ 환경 변수에 Asia/Seoul 을 입력합니다.

 

컨테이너를 처음부터 백그라운드(데몬)에서 실행하려면 아래와 같이 입력하세요.

docker run -d --name=h5ai \
-p 80:80 \
-v /wherever/you/share:/h5ai \
-v /wherever/you/config:/config \
-e TZ=Asia/Seoul \
awesometic/h5ai

 

htpasswd로 접근을 제한하고 싶다면 아래 옵션을 추가해 계정을 생성하세요.

이 땐 계정 생성을 위해 데몬으로 하면 안 되고, -it 옵션이 꼭 필요합니다.

docker run -it --name=h5ai \
-p 80:80 \
-v /wherever/you/share:/h5ai \
-v /wherever/you/config:/config \
-e TZ=Asia/Seoul \
-e HTPASSWD=true \
-e HTPASSWD_USER=awesometic \
awesometic/h5ai
  • HTPASSWD 환경 변수를 true로 입력하세요. true가 아니라면 계정 생성 절차를 시행하지 않습니다.
  • HTPASSWD_USER 환경 변수에 원하는 사용자 이름을 입력합니다.


작동 중인 컨테이너는 http://localhost.com 으로 이동해서 접속할 수 있습니다.

 

config 디렉토리 설명

이미지 작동과 관련한 설정 파일들이 저장되는 곳입니다.

구성은 아래와 같습니다.

awesometic@awesometic-nas:/opt/docker/h5ai$ tree -d .
.
├── h5ai
│   └── _h5ai
│       ├── private
│       │   ├── cache
│       │   ├── conf
│       │   │   └── l10n
│       │   └── php
│       │       ├── core
│       │       ├── ext
│       │       └── pages
│       └── public
│           ├── cache
│           │   └── thumbs
│           ├── css
│           ├── ext
│           ├── images
│           │   ├── fallback
│           │   ├── favicon
│           │   ├── themes
│           │   │   ├── comity
│           │   │   └── default
│           │   └── ui
│           └── js
└── nginx

24 directories
  • h5ai 디렉토리에는 구동 중인 h5ai 소스 파일들이 있습니다.
  • options.json 파일은 h5ai/_h5ai/private/conf/options.json 에 있습니다.
  • nginx 디렉토리엔 .htpasswd와 h5ai.conf 서버 설정 파일이 있습니다.

 

WIP

직접 사용할 만한, 특히 설정 파일은 Host에서 관리하는, 뭐 그런 나름 구성이 가락진 Docker 이미지를 만드는 건 처음이라 좀 헤맸었습니다. 그래서 LinuxServer.io 에서 작업한 Dockerfile들을 참고삼아 하나씩 따라가고, 따라하며 없는 부분이나 잘 안 되는 부분은 구글링했습니다.

그래도 아직은 부족한 부분이 많을 수 있어요. 만약 써보신다면 언제든 문제점을 피드백 해주세요.

그나저나 리눅스의 Docker는 정말 사기입니다. 커널을 공유한다는 게 참, 성능 저하 없이 거의 모든 기능을 이미지에서 처리하니까 깔끔하고 좋네요.

 

참고


반응형