반응형
홈서버 구축기 — MariaDB + Redis + Paperless-ngx 설치 및 외부 접속 설정
Mac mini 2012 Late (Ubuntu 24.04, Docker) 기반 홈서버에 MariaDB, Redis, Paperless-ngx를 설치하고 Cloudflare Tunnel로 외부 접속까지 설정한 과정을 정리합니다.
전체 구성 개요
~/stacks/
├── shared/ ← MariaDB + Redis (공용)
│ ├── docker-compose.yml
│ └── mariadb-data/
└── paperless/ ← Paperless-ngx
├── docker-compose.yml
├── docker-compose.env
├── Dockerfile
└── data/
├── consume/
├── media/
├── export/
└── data/MariaDB와 Redis는 shared 스택으로 분리해 Nextcloud, n8n 등 다른 서비스에서도 재사용할 수 있도록 구성했습니다.
1. MariaDB + Redis 설치
폴더 생성
mkdir -p ~/stacks/shared
cd ~/stacks/shared
docker-compose.yml 작성
vi ~/stacks/shared/docker-compose.yml
services:
db:
image: mariadb:11
restart: unless-stopped
environment:
MARIADB_ROOT_PASSWORD: your_root_password
MARIADB_DATABASE: paperless
MARIADB_USER: paperless
MARIADB_PASSWORD: your_password
volumes:
- ./mariadb-data:/var/lib/mysql
command: >
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
--transaction-isolation=READ-COMMITTED
--binlog-format=ROW
ports:
- "3306:3306"
redis:
image: redis:7
restart: unless-stopped
ports:
- "6379:6379"
networks:
default:
name: shared-network
driver: bridge
MariaDB 설정 포인트:
utf8mb4+utf8mb4_unicode_ci: 한국어 포함 다국어 지원READ-COMMITTED+ROW: Paperless-ngx 필수 요구사항shared-network: 다른 스택에서 이 DB/Redis를 참조할 수 있도록 네트워크 이름 고정
실행
docker compose up -d
정상 확인
# MariaDB 접속 테스트
docker exec -it shared-db-1 mariadb -u paperless -pyour_password paperless -e "SELECT 1;"
# Redis 접속 테스트
docker exec -it shared-redis-1 redis-cli ping
# PONG 나오면 정상
2. Paperless-ngx 설치
폴더 및 데이터 디렉토리 생성
mkdir -p ~/stacks/paperless
mkdir -p ~/stacks/paperless/data/{data,media,consume,export}
cd ~/stacks/paperless
Dockerfile 작성 (한국어 OCR 포함)
Paperless-ngx 공식 이미지에는 한국어 Tesseract 언어팩이 없어서 직접 빌드합니다.
vi ~/stacks/paperless/Dockerfile
FROM paperlessngx/paperless-ngx:latest
RUN apt-get update && apt-get install -y tesseract-ocr-kor && rm -rf /var/lib/apt/lists/*
docker-compose.yml 작성
vi ~/stacks/paperless/docker-compose.yml
services:
webserver:
build: .
restart: unless-stopped
depends_on:
- gotenberg
- tika
ports:
- "8010:8000"
volumes:
- ./data/data:/usr/src/paperless/data
- ./data/media:/usr/src/paperless/media
- ./data/consume:/usr/src/paperless/consume
- ./data/export:/usr/src/paperless/export
env_file: docker-compose.env
gotenberg:
image: gotenberg/gotenberg:8
restart: unless-stopped
tika:
image: apache/tika:latest
restart: unless-stopped
networks:
default:
name: shared-network
external: true
포인트:
build: .: 직접 빌드한 이미지 사용 (한국어 OCR 포함)gotenberg: Office 문서(docx, xlsx 등) → PDF 변환tika: 텍스트 추출 보조shared-network: external: true: shared 스택의 MariaDB/Redis 참조
환경변수 파일 작성
vi ~/stacks/paperless/docker-compose.env
# 데이터베이스
PAPERLESS_DBENGINE=mariadb
PAPERLESS_DBHOST=shared-db-1
PAPERLESS_DBPORT=3306
PAPERLESS_DBNAME=paperless
PAPERLESS_DBUSER=paperless
PAPERLESS_DBPASS=your_password
# Redis
PAPERLESS_REDIS=redis://shared-redis-1:6379/0
# 서버 설정
PAPERLESS_URL=https://paperless.yourdomain.com
PAPERLESS_CSRF_TRUSTED_ORIGINS=https://paperless.yourdomain.com
PAPERLESS_SECRET_KEY=여기에_openssl_rand_-hex_32_결과값
PAPERLESS_TIME_ZONE=Asia/Seoul
PAPERLESS_OCR_LANGUAGE=kor+eng
# 리소스 제한 (구형 하드웨어 배려)
PAPERLESS_TASK_WORKERS=1
PAPERLESS_THREADS_PER_WORKER=1
# Tika / Gotenberg
PAPERLESS_TIKA_ENABLED=1
PAPERLESS_TIKA_ENDPOINT=http://tika:9998
PAPERLESS_TIKA_GOTENBERG_ENDPOINT=http://gotenberg:3000
SECRET_KEY 생성:
openssl rand -hex 32
빌드 및 실행
docker compose up -d --build
관리자 계정 생성
docker exec -it paperless-webserver-1 python3 manage.py createsuperuser
3. Cloudflare Tunnel 연동
이미 cloudflared가 설치되어 있고 터널이 운영 중인 상태에서 Paperless를 추가합니다.
config.yml에 Paperless 추가
sudo vi /etc/cloudflared/config.yml
ingress:
- hostname: ssh.yourdomain.com
service: ssh://localhost:22
- hostname: portainer.yourdomain.com
service: https://localhost:9443
originRequest:
noTLSVerify: true
- hostname: paperless.yourdomain.com
service: http://localhost:8010
- service: http_status:404
DNS 레코드 등록
cloudflared tunnel route dns your-server-name paperless.yourdomain.com
cloudflared 재시작
sudo systemctl restart cloudflared
이후 https://paperless.yourdomain.com 으로 외부 접속 가능합니다.
4. DataGrip으로 MariaDB 외부 접속 (SSH 터널링)
~/.ssh/config 설정 (맥북 기준)
Host your-server-name
HostName ssh.yourdomain.com
User your_username
ProxyCommand cloudflared access ssh --hostname %h
Host mac-mini-db
HostName ssh.yourdomain.com
User your_username
ProxyCommand cloudflared access ssh --hostname %h
LocalForward 3307 127.0.0.1:3306사용 방법
터미널에서 터널 열기:
ssh mac-mini-db -N
DataGrip 접속 설정:
Host : 127.0.0.1
Port : 3307
User : root
Password : your_root_password-N 옵션은 쉘 없이 포트포워딩 터널만 유지하는 옵션입니다.
트러블슈팅
ghcr.io 이미지 pull 실패
한국에서 GitHub Container Registry 접근이 막히는 경우가 있습니다.
# 변경 전
image: ghcr.io/paperless-ngx/paperless-ngx:latest
image: ghcr.io/paperless-ngx/tika:latest
# 변경 후
image: paperlessngx/paperless-ngx:latest (Docker Hub)
image: apache/tika:latest (Docker Hub)Portainer와 포트 충돌 (8000)
Portainer가 8000 포트를 사용 중이라 Paperless를 8010으로 변경했습니다.
ports:
- "8010:8000"
CSRF 검증 실패
외부 도메인으로 접속 시 CSRF 오류가 발생하면 환경변수에 추가:
PAPERLESS_URL=https://paperless.yourdomain.com
PAPERLESS_CSRF_TRUSTED_ORIGINS=https://paperless.yourdomain.com
한국어 OCR 언어팩 컨테이너 재시작 시 초기화
컨테이너 내부에 직접 설치한 패키지는 재시작 시 사라집니다. Dockerfile로 이미지를 직접 빌드하면 영구적으로 유지됩니다.
FROM paperlessngx/paperless-ngx:latest
RUN apt-get update && apt-get install -y tesseract-ocr-kor && rm -rf /var/lib/apt/lists/*
서비스별 Redis DB 번호 분리
향후 다른 서비스 추가 시 Redis DB 번호로 격리:
Paperless-ngx → redis://shared-redis-1:6379/0
n8n → redis://shared-redis-1:6379/1
Nextcloud → redis://shared-redis-1:6379/2최종 접속 정보
| 서비스 | 내부 접속 | 외부 접속 |
|---|---|---|
| Paperless-ngx | http://192.168.x.x:8010 | https://paperless.yourdomain.com |
| MariaDB | 192.168.x.x:3306 | ssh mac-mini-db -N → 127.0.0.1:3307 |
반응형