무료로 호스팅하고 있는 리눅스 서버에 응용프로그램 가상화를 통해 이런 저런 편리하게 사용할 수 있는 서버들을설치하고 있다. 오늘은 PDF 파일 읽기와 간단한 편집은 물론 페이지 단위로 분리하거나 이미지 또는 텍스트를 추출할 수 있는 등 매우 많은 기능을 수행할 수 있는 Stirling-PDF(스털링 PDF)라는 웹 기반의 셀프호스팅 서버를 설치했다.

Stirling-PDF 서버 설치
설치는 Vaultwarden 이나 Calibre-web을 설치하듯 Portainer에서 Stack으로 설치했다. 다음은 설치할 때 사용한 Docker Compose 파일 즉 YAML 파일의 내용이다.
version: '1.0'
services:
stirling-pdf:
image: frooodle/s-pdf:latest
container_name: stirling-pdf
environment:
- TZ=Asia/Seoul
volumes:
- /data/stirlingpdf:/configs
restart: unless-stopped
expose:
- "8080"
networks:
- reverse_proxy
networks:
reverse_proxy:
external: true
컨테이너 이름은 stirling-pdf 이고 시간대(TZ)를 Asia/Seoul로 맞춰주었다. 혹시라도 pdf 파일, 이미지파일 등을 추출하거나 생성할 때 생성일자의 오류를 줄일 수 있을까 싶어 적용해줬다. 그리고 생성되는 임시파일들이 저장될 configs 디렉토리는 호스트의 /data/ 디렉토리에 미리 stirlingpdf 라고 생성한 다음 volumes에서 컨테이너의 /configs 디렉토리에 마운트 하도록 했다.
그리고 Caddy에서 pdf.abc.co.kr 과 같이 pdf 라는 호스트 주소만 바꿔서 vaultwarden과 Calibre-web과 구별하여 접속할 수 있도록 pdf 라는 호스트명을 DNS에 등록해줬다. 따라서 컨테이너의 8080을 Caddy와 연결해주기위해서 reverse_proxy 네트워크 인터페이스를 사용하도록 했다.
이 yaml 파일을 Portainer에서 Stack을 생성하면서 Editor에 작성하면 된다.
Caddy에서 사용자 인증 적용
그런데 이 Stirling-PDF 서버는 로그인이 구현되어 있지 않다. 즉 인터넷에 공개된 서버에 설치하면 개나~소나~ 다 들어와 PDF 변환 등의 작업을 수행할 수 있다. 그래서 어디에선가 Stirling-PDF 웹서버에 접속하기 전에 사용자 인증(로그인)을 하도록 해야 한다.
그래서 필자는 Reverse-Proxy 서버인 Caddy에서 구현하기로 했다. Caddyfile에 pdf.abc.co.kr 도메인을 등록하면서 다음과 같이 basicauth 를 적용하면 된다. 가장 아래의 pdf.abc.pe.kr 도메인 주소가 Stirling-PDF가 설치된 컨테이너에 접속하게 해주는 설정이다.
(app_common) {
encode gzip
header {
Strict-Transport-Security "max-age=31536000;"
}
}
app.abc.pe.kr {
import app_common
reverse_proxy vaultwarden:80
}
}
comics.abc.pe.kr {
import app_common
reverse_proxy calibre-web:8083
}
pdf.abc.pe.kr {
import app_common
basicauth /* {
taeho $2a$14$4dSsymhLquwc*****************jXwRor8.yEDoMgLW
}
reverse_proxy stirling-pdf:8080
}
# Caddyfile 예제
Caddy의 사용자 인증에 사용될 비밀번호 HASH 생성방법
앞의 Caddyfile 파일예제에서 pdf.abc.pe.kr에 접속하게 되면 basicauth가 설정되어 있기 때문에 ID와 비밀번호 입력창을 표시하고 ID와 비밀번호를 입력 받아 검증하게 되는데. 이 때 Caddy의 basicauth에서 사용할 비밀번호의 Hash 값을 생성해서 앞의 코드에 보이는 것과 같이 ID (taeho) 옆에 설정해주었다.
이 비밀번호의 Hash 값을 Caddyfile에 설정하기 위해서는 caddy 라는 명령어를 사용해 평문 비밀번호에 매칭되는 Hash 값을 생성해야 하는데 그러기 위해서는 다음과 같이 Caddy 컨테이너의 쉘(shell)에 연결해야 한다. 다음과 같이 Caddy 컨테이너가 설치된 호스트에 SSH 접속하여 Caddy 컨테이너에 쉘을 연결한다. (컨테이너 이름이 caddy다)
$
$ docker exec -it caddy sh
/srv #
프롬프트가 #으로 바뀌며 컨테이너 내부의 root 권한으로 컨테이너에 쉘(Shell) 접속이 된다. Caddy 컨테이너에 쉘 접속을 했다면 다음 명령으로 비밀번호의 Hash 값을 생성한다.
/srv# caddy hash-password --plaintext newpassword
이 명령을 실행하면 다음과 같이 비밀번호의 bcrypt 해시값이 생성된다. 단 비밀번호는 따옴표 등을 붙이지 않고 순수하게 비밀번호만 입력한다. Caddy에서는 기본적으로 일방향암호알고리즘을 지정해주지 않으면 bcrypt를 사용한다.

$2a$로 시작해서 n5qG로 끝나는 bcrypt 해시값을 복사한 다음 Caddyfile의 비밀번호 해시 위치 즉 ID 옆에 한칸 띄우고 붙여넣는다. 앞의 Caddyfile에서는 taeho 라는 ID 옆에 붙여넣은 것이다.

이제 Caddy를 재구동한 다음 https://pdf.abc.pe.kr에 접속하면 다음과 같이 먼저 로그인 창이 표시되고 ID와 비밀번호를 입력해야만 Stirling-PDF 서버의 웹 페이지로 전환된다.
#Stirling-PDF #caddy #basicauth
답글 남기기