본문 바로가기
  • AI 시대에 적응하는 현대인을 위한 지식 공간
  • AI를 위한 데이터를 과학으로 역어본다
AI 코딩

Cloudflare Tunnel을 활용한 HTTPS 연결하기(2) - Synology NAS

by 피크나인 2026. 1. 23.

Synology NAS에서 24시간 안정적인 홈 서버 구축하기

제1편에서 Mac 환경에서의 Cloudflare Tunnel 설정과 관련한 내용을 다루었다면, 이번 제2편에서는 24시간 가동되는 Synology NAS 환경에서 Docker로 안정적인 홈 서버를 구축하는 방법을 살펴보겠습니다. Mac은 필요에 따라 켜고 끄지만, NAS는 항상 켜져 있어 진정한 의미의 홈 클라우드 서비스를 제공할 수 있습니다. DSM 웹 인터페이스 외부 접근부터 여러 Docker 서비스 통합 관리, 자동 백업과 모니터링까지 실무에서 바로 적용할 수 있는 완전한 가이드를 제공합니다.

Synology NAS와 Cloudflare Tunnel로 24시간 가동되는 안정적인 홈 서버를 구축할 수 있습니다
Synology NAS와 Cloudflare Tunnel로 24시간 가동되는 안정적인 홈 서버를 구축할 수 있습니다



1. 왜 Synology NAS를 사용해야 하는가

Mac에서 Cloudflare Tunnel을 운영하는 것도 좋지만, 진정한 24시간 홈 서버를 구축하려면 Synology NAS가 더 적합합니다. Mac은 일반적으로 작업할 때만 켜놓고 퇴근 후나 외출 시에는 절전 모드로 전환하는 경우가 많습니다. 반면 NAS는 저전력으로 항상 가동되도록 설계되었으며, RAID 구성으로 데이터 안정성도 보장됩니다. 전력 소비 측면에서도 NAS는 5~20W 정도로, Mac의 30~100W에 비해 월등히 효율적입니다.

 

실제 사용 사례를 살펴보면 NAS의 장점이 명확해집니다.

  • 첫째, 개인 클라우드 서비스로 활용할 수 있습니다. Synology의 Drive나 Photos 앱을 통해 Google Drive나 iCloud를 대체할 수 있으며, Cloudflare Tunnel로 외부에서도 안전하게 접근할 수 있습니다.
  • 둘째, 미디어 서버로 활용 가능합니다. Plex나 Jellyfin을 설치하여 어디서나 개인 미디어 라이브러리에 접근할 수 있으며, 스트리밍 품질도 안정적입니다.
  • 셋째, 백업 서버로 활용할 수 있습니다. Mac의 Time Machine 대상으로 설정하거나, 스마트폰 사진을 자동 백업할 수 있습니다.

자동화 플랫폼으로서의 NAS도 매력적입니다. n8n을 설치하여 24시간 작동하는 워크플로우를 구축할 수 있으며, Mac처럼 컴퓨터를 꺼서 워크플로우가 중단되는 일이 없습니다. Home Assistant를 설치하면 스마트 홈 허브로도 활용할 수 있으며, 모든 IoT 기기를 중앙에서 관리할 수 있습니다. PostgreSQL이나 MariaDB 같은 데이터베이스를 운영하여 다른 애플리케이션의 중앙 저장소로 사용할 수도 있습니다.

 

Mac과 NAS를 비교하면 다음과 같습니다. 가동 시간 측면에서 Mac은 필요할 때만 켜지만 NAS는 24시간 365일 가동됩니다. 전력 소비는 Mac이 30~100W인 반면 NAS는 5~20W로 훨씬 효율적입니다. 스토리지 용량은 Mac이 512GB~2TB 정도지만 NAS는 4TB부터 100TB 이상까지 확장 가능합니다.

 

cloudflared 설치 방식은 Mac에서는 네이티브 바이너리를 사용하지만 NAS에서는 Docker 컨테이너로 실행합니다. 관리 편의성은 Mac이 CLI 중심인 반면 NAS는 웹 GUI와 CLI를 모두 제공하여 더 직관적입니다.

[!] RAID란? Redundant Array of Independent Disks의 약자로, 여러 개의 하드디스크를 하나로 묶어 데이터 안정성과 성능을 향상시키는 기술입니다. RAID 1은 미러링으로 동일한 데이터를 두 디스크에 저장하여 한 디스크가 고장나도 데이터가 보존됩니다. 일반적으로 데이터의 효율적 이용과 안정성을 위하여 RAID 5, 6을 주로 이용합니다.


2. Synology NAS 환경 준비

Cloudflare Tunnel을 NAS에 설치하기 전에 몇 가지 사전 준비가 필요합니다.

 

먼저 DSM(DiskStation Manager) 버전을 확인해야 합니다. 제어판 → 업데이트 및 복원 메뉴로 이동하여 현재 설치된 DSM 버전을 확인합니다. Cloudflare Tunnel은 DSM 7.0 이상에서 정상 작동하며, 가능하면 최신 버전으로 업데이트하는 것을 권장합니다. DSM 7.2부터는 Container Manager가 Docker를 대체하면서 더 나은 기능을 제공합니다.

 

SSH 접근을 활성화해야 터미널에서 고급 설정을 진행할 수 있습니다. 제어판 → 터미널 및 SNMP 메뉴로 이동하여 SSH 서비스를 활성화합니다. 포트는 기본값인 22를 사용해도 되지만, 보안을 강화하려면 다른 포트(예: 2222)로 변경할 수 있습니다. SSH를 활성화한 후 Mac이나 Windows에서 터미널로 접속합니다.

# Mac/Linux에서 SSH 접속
ssh admin@nas.local

# 또는 IP 주소로 접속
ssh admin@192.168.1.100

# 비표준 포트 사용 시
ssh -p 2222 admin@192.168.1.100

 

Windows에서는 PowerShell을 열고 동일한 명령으로 접속할 수 있습니다. Windows 10 이상에는 OpenSSH 클라이언트가 기본 내장되어 있습니다. 접속 시 비밀번호를 입력하면 NAS의 터미널 환경에 접근할 수 있습니다.

폴더 구조를 미리 생성해두면 편리합니다. SSH로 접속한 상태에서 cloudflared 전용 폴더를 만듭니다.

# Docker 관련 폴더 구조 생성
sudo mkdir -p /volume1/docker/cloudflared
sudo chmod 755 /volume1/docker/cloudflared

 

File Station GUI를 사용하는 경우에는 웹 브라우저에서 DSM에 로그인한 후, File Station을 열고 docker → cloudflared 폴더를 순서대로 생성합니다. 권한 설정은 기본값으로 두어도 무방합니다.

[!] volume1이란? Synology NAS에서 첫 번째 스토리지 볼륨을 의미합니다. 여러 볼륨을 사용하는 경우 volume2, volume3 등으로 구분됩니다. 대부분의 사용자는 volume1만 사용합니다.


3. Container Manager 설치 및 설정

Container Manager는 Synology에서 제공하는 Docker 관리 도구로, DSM 7.2부터 기존 Docker 패키지를 대체했습니다. 웹 기반 GUI를 통해 Docker 컨테이너, 이미지, 네트워크, 볼륨을 쉽게 관리할 수 있으며, Docker Compose를 네이티브로 지원하여 복잡한 멀티 컨테이너 애플리케이션도 간편하게 배포할 수 있습니다.

 

패키지 센터를 열고 검색창에 "Container Manager"를 입력합니다. 검색 결과에서 Container Manager를 선택하고 "설치" 버튼을 클릭합니다. 설치 과정은 자동으로 진행되며, 몇 분 정도 소요됩니다. 설치가 완료되면 DSM 메인 화면에 Container Manager 아이콘이 나타납니다.

 

Container Manager를 처음 실행하면 간단한 초기 설정 마법사가 표시됩니다. Docker Hub 계정 연동은 선택 사항이며, 나중에 설정할 수도 있습니다. 리소스 제한 설정에서는 CPU와 메모리 사용량을 제한할 수 있는데, 일반적으로 기본값으로 두어도 충분합니다. 네트워크 설정은 자동으로 bridge 네트워크가 생성되므로 별도 설정이 필요 없습니다.

 

Container Manager의 주요 메뉴를 살펴보겠습니다. 대시보드는 전체 컨테이너의 상태와 리소스 사용량을 한눈에 보여줍니다. 컨테이너 탭에서는 실행 중이거나 중지된 모든 컨테이너를 관리할 수 있습니다. 이미지 탭에서는 다운로드한 Docker 이미지를 확인하고 삭제할 수 있습니다. 프로젝트 탭은 Docker Compose를 통한 멀티 컨테이너 애플리케이션을 관리하는 곳으로, 우리는 여기서 cloudflared를 설정할 것입니다.

 

네트워크와 볼륨 탭도 중요합니다. 네트워크 탭에서는 Docker 네트워크를 생성하고 관리할 수 있으며, 컨테이너 간 통신을 위한 사용자 정의 네트워크를 만들 수 있습니다. 볼륨 탭에서는 데이터 영속성을 위한 Docker 볼륨을 관리하지만, cloudflared는 바인드 마운트 방식을 사용하므로 별도 볼륨 생성은 필요 없습니다.


4. Cloudflare 인증 및 Tunnel 생성

NAS에서 Cloudflare Tunnel을 사용하려면 먼저 Cloudflare 계정과 연동하고 터널을 생성해야 합니다. 인증 방법은 두 가지가 있으며, 각각 장단점이 있습니다.

방법 1: Mac에서 먼저 설정 후 파일 복사 (권장)

이미 Mac에서 제1편을 따라 cloudflared를 설정했다면, 생성된 인증 파일을 NAS로 복사하는 것이 가장 간단합니다. Mac Terminal에서 다음 명령을 실행합니다.

# Mac에서 터널이 없는 경우에만 생성
cloudflared tunnel create nas-home

# 터널 ID 확인
cloudflared tunnel list

 

터널이 생성되면 ~/.cloudflared/ 폴더에 JSON 형식의 인증 파일이 생성됩니다. 이 파일을 NAS로 복사합니다.

# Mac에서 NAS로 파일 복사
scp ~/.cloudflared/<TUNNEL-ID>.json \
    admin@192.168.1.100:/volume1/docker/cloudflared/

# cert.pem도 복사 (DNS 자동 설정 시 필요)
scp ~/.cloudflared/cert.pem \
    admin@192.168.1.100:/volume1/docker/cloudflared/

 

파일 복사가 완료되면 NAS SSH에서 권한을 설정합니다.

# NAS SSH에서 실행
cd /volume1/docker/cloudflared
sudo chown -R 65532:65532 .
sudo chmod 600 *.json

 

65532는 cloudflared Docker 이미지가 사용하는 기본 사용자 ID입니다. 이 권한 설정을 하지 않으면 컨테이너가 파일을 읽지 못해 시작에 실패할 수 있습니다.

방법 2: NAS에서 직접 설정

Mac 없이 NAS에서 직접 인증을 진행할 수도 있습니다. 이 경우 임시 Docker 컨테이너를 실행하여 cloudflared 명령을 사용합니다. 물론 방법 1에서 지정된 사전 설정하는 내용은 미리 진행하셔야 합니다.

# NAS SSH에서 실행
# Docker 컨테이너 Cloudflared홈 디렉토리
mkdir -p /volume1/docker/cloudflared
cd /volume1/docker/cloudflared

# 접근권한 변경
sudo chown -R 65532:65532 .

# Cloudflare 로그인
sudo docker run -it --rm \
  -v /volume1/docker/cloudflared:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest \
  tunnel login
  
# 로그인 > 도메인 지정 > 승인이 완료되면 위에서 지정된 /volume1/docker/cloudflared에 인증파일 생성
# cert.pem이 이미 올바른 위치에 있습니다
ls -la /volume1/docker/cloudflared/

# 현재 사용자도 읽을 수 있도록 권한 변경
sudo chmod 644 /volume1/docker/cloudflared/cert.pem

# cert.pem 파일이 보여야 합니다
cat /volume1/docker/cloudflared/cert.pem

 

이 명령을 실행하면 브라우저로 접근해야 할 URL이 터미널에 표시됩니다. 해당 URL을 복사하여 브라우저에서 열고 Cloudflare에 로그인합니다. 도메인을 선택하면 인증이 완료되고 cert.pem 파일이 생성됩니다.

터널을 생성합니다.

# 터널 생성
sudo docker run -it --rm \
  -v /volume1/docker/cloudflared:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest \
  tunnel create nas-home

# 터널 ID 확인
sudo docker run -it --rm \
  -v /volume1/docker/cloudflared:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest \
  tunnel list
  
> tunnel list
You can obtain more detailed information for each tunnel with `cloudflared tunnel info <name/uuid>`
ID                                   NAME            CREATED              CONNECTIONS
6837ebc2-6db7-4b9c-8ba8-8ae2b9f01dd8 mac-gems-tunnel 2026-01-22T03:40:01Z 1xicn01, 1xicn05, 2xicn06
35411f8d-fcd5-4f49-920c-8d72dd3332a2 nas-tron        2026-01-23T06:00:00Z

 

터널이 생성되면 JSON 인증 파일이 /volume1/docker/cloudflared/ 폴더에 저장됩니다. 권한 설정은 방법 1과 동일하게 진행합니다.

[!] Docker 볼륨 마운트 -v 옵션은 호스트(NAS)의 폴더를 컨테이너 내부로 마운트하는 역할을 합니다. /volume1/docker/cloudflared의 파일들이 컨테이너의 /home/nonroot/.cloudflared로 연결됩니다.


5. Docker Compose로 cloudflared 실행

인증 파일이 준비되었다면 이제 Docker Compose 파일을 작성하여 cloudflared를 실행합니다. Docker Compose는 YAML 형식의 설정 파일로 컨테이너를 정의하며, Container Manager의 프로젝트 기능을 통해 쉽게 관리할 수 있습니다.

먼저 config.yml 파일을 생성합니다. SSH로 NAS에 접속하여 vi나 nano 편집기로 파일을 작성합니다.

# NAS SSH에서 config.yml
cd /volume1/docker/cloudflared
nano config.yml

 

기본 config.yml 내용:

tunnel: 35411f8d-fcd5-4f49-920c-8d72dd3332a2
credentials-file: /home/nonroot/.cloudflared/35411f8d-fcd5-4f49-920c-8d72dd3332a2.json

# 선택사항: 메트릭 활성화 - 같은 네트워크의 모든 기기 접근 활성화
metrics: 0.0.0.0:2000

ingress:
  - hostname: three.unoware.com
    service: http://localhost:8001

  # 기본 규칙 (아직 서비스 없음)
  - service: http_status:404

 

확장형 config.yml 내용 : 

# Cloudflare Tunnel Configuration for Synology NAS
# 최적화된 프로덕션 설정

# ============================================
# 기본 터널 설정
# ============================================
tunnel: 3cfa2e4a-af3b-4241-9302-7c0bab3c6f83
credentials-file: /home/nonroot/.cloudflared/3cfa2e4a-af3b-4241-9302-7c0bab3c6f83.json

# ============================================
# 메트릭 및 모니터링
# ============================================
# Prometheus/Grafana 연동을 위한 메트릭 엔드포인트
# 0.0.0.0 = 같은 네트워크의 모든 기기에서 접근 가능
# 127.0.0.1 = NAS 내부에서만 접근 가능
metrics: 0.0.0.0:2000

# ============================================
# 로깅 설정
# ============================================
# 로그 레벨: debug, info, warn, error
# 프로덕션 환경에서는 info 권장
loglevel: info

# ============================================
# 연결 최적화 설정
# ============================================
# Cloudflare Edge와의 연결 설정
# 프로토콜: auto, quic, http2 (auto 권장)
protocol: auto

# 연결 재시도 설정
# 연결 실패 시 재시도 횟수 (기본값: 5)
retries: 5

# Grace period (초) - 종료 시 연결을 닫기 전 대기 시간
grace-period: 30s

# ============================================
# 라우팅 규칙 (Ingress Rules)
# ============================================
# 우선순위: 위에서 아래로 순차적으로 매칭
# 첫 번째 매칭되는 규칙이 적용됨
# 마지막은 반드시 catch-all 규칙이어야 함

ingress:
  # ---------------------------------------
  # 1. Synology DSM (관리자 인터페이스)
  # ---------------------------------------
  - hostname: nas.yourdomain.com
    service: https://localhost:5001
    originRequest:
      # DSM의 자체 서명 인증서 허용
      noTLSVerify: true
      # DSM이 올바른 호스트를 인식하도록 헤더 설정
      httpHostHeader: localhost
      # 연결 타임아웃 (기본값: 30s)
      connectTimeout: 30s
      # TLS 연결 타임아웃 (기본값: 10s)
      tlsTimeout: 10s
      # TCP Keep-Alive 간격 (기본값: 30s)
      keepAliveTimeout: 90s
      # Keep-Alive 연결 수 (기본값: 100)
      keepAliveConnections: 100

  # ---------------------------------------
  # 2. n8n 워크플로우 자동화
  # ---------------------------------------
  - hostname: n8n.yourdomain.com
    service: http://localhost:5678
    originRequest:
      # n8n 웹훅을 위한 호스트 헤더 설정 (중요!)
      httpHostHeader: n8n.yourdomain.com
      connectTimeout: 30s
      # 큰 웹훅 페이로드 처리
      noHappyEyeballs: false
      keepAliveTimeout: 90s

  # ---------------------------------------
  # 3. Grafana 모니터링 대시보드
  # ---------------------------------------
  - hostname: grafana.yourdomain.com
    service: http://localhost:3000
    originRequest:
      httpHostHeader: grafana.yourdomain.com
      connectTimeout: 30s

  # ---------------------------------------
  # 4. Portainer 컨테이너 관리
  # ---------------------------------------
  - hostname: portainer.yourdomain.com
    service: https://localhost:9443
    originRequest:
      noTLSVerify: true
      httpHostHeader: localhost
      connectTimeout: 30s

  # ---------------------------------------
  # 5. Synology Drive (파일 동기화)
  # ---------------------------------------
  - hostname: drive.yourdomain.com
    service: https://localhost:6690
    originRequest:
      noTLSVerify: true
      httpHostHeader: localhost
      # Drive는 큰 파일 업로드/다운로드를 처리하므로
      # 타임아웃을 길게 설정
      connectTimeout: 60s
      keepAliveTimeout: 120s

  # ---------------------------------------
  # 6. PostgreSQL (웹 클라이언트 - pgAdmin 등)
  # ---------------------------------------
  - hostname: pgadmin.yourdomain.com
    service: http://localhost:5050
    originRequest:
      connectTimeout: 30s

  # ---------------------------------------
  # 7. Home Assistant (스마트홈)
  # ---------------------------------------
  # - hostname: ha.yourdomain.com
  #   service: http://localhost:8123
  #   originRequest:
  #     # WebSocket 지원 활성화
  #     disableChunkedEncoding: true
  #     connectTimeout: 30s

  # ---------------------------------------
  # 8. Vaultwarden (비밀번호 관리)
  # ---------------------------------------
  # - hostname: vault.yourdomain.com
  #   service: http://localhost:8080
  #   originRequest:
  #     connectTimeout: 30s
  #     # 보안을 위한 추가 헤더
  #     httpHostHeader: vault.yourdomain.com

  # ---------------------------------------
  # 9. Plex Media Server
  # ---------------------------------------
  # - hostname: plex.yourdomain.com
  #   service: http://localhost:32400
  #   originRequest:
  #     # Plex는 자체 인증을 사용하므로
  #     httpHostHeader: localhost
  #     connectTimeout: 30s
  #     # 미디어 스트리밍을 위한 긴 타임아웃
  #     keepAliveTimeout: 120s

  # ---------------------------------------
  # 10. Jellyfin Media Server
  # ---------------------------------------
  # - hostname: jellyfin.yourdomain.com
  #   service: http://localhost:8096
  #   originRequest:
  #     disableChunkedEncoding: true
  #     connectTimeout: 30s
  #     keepAliveTimeout: 120s

  # ---------------------------------------
  # Catch-all 규칙 (필수!)
  # ---------------------------------------
  # 위의 모든 hostname과 매칭되지 않으면
  # 404 Not Found 응답
  - service: http_status:404

# ============================================
# 성능 최적화 옵션 (선택사항)
# ============================================

# WARP 라우팅 비활성화 (일반 사용자는 불필요)
# warp-routing:
#   enabled: false

# 연결당 최대 업로드/다운로드 속도 제한 (선택사항)
# originRequest:
#   # 초당 바이트 (0 = 무제한)
#   maxUploadSize: 0
#   maxDownloadSize: 0

# ============================================
# 보안 옵션
# ============================================

# TLS 버전 설정
# originRequest:
#   # 최소 TLS 버전 (1.0, 1.1, 1.2, 1.3)
#   tlsMinVersion: "1.2"
#   # TLS 최대 버전
#   tlsMaxVersion: "1.3"

# ============================================
# 주의사항 및 팁
# ============================================
# 
# 1. hostname 순서:
#    - 더 구체적인 규칙을 위에 배치
#    - 와일드카드(*.domain.com)는 아래에 배치
#
# 2. noTLSVerify: true
#    - 자체 서명 인증서를 사용하는 서비스에만 사용
#    - DSM, Portainer 등
#
# 3. httpHostHeader:
#    - 백엔드 서비스가 호스트 검증을 하는 경우 필수
#    - n8n, Grafana 등
#
# 4. connectTimeout:
#    - 느린 서비스는 60s 이상 설정
#    - 빠른 API는 10-30s
#
# 5. keepAliveTimeout:
#    - 스트리밍 서비스: 90-120s
#    - 일반 웹: 30-60s
#
# 6. WebSocket 지원:
#    - disableChunkedEncoding: true 추가
#    - Home Assistant, Grafana Live 등
#
# 7. 파일 업로드/다운로드:
#    - keepAliveTimeout을 길게 설정
#    - Drive, Nextcloud 등
#
# 8. 메트릭 포트 (2000):
#    - NAS 방화벽에서 로컬 네트워크만 허용
#    - Cloudflare Tunnel로 노출하지 말 것!
#
# 9. DNS 설정:
#    - 각 hostname마다 Cloudflare DNS에 CNAME 레코드 생성
#    - 예: nas CNAME 3cfa2e4a-af3b-4241-9302-7c0bab3c6f83.cfargotunnel.com
#
# 10. Zero Trust Access:
#     - 민감한 서비스(DSM, Portainer)는 Access 정책 적용 권장
#     - Networks → Tunnels → Public Hostname → Configure

 

tunnel 항목에는 앞서 확인한 터널 ID를, credentials-file에는 JSON 파일의 전체 경로를 입력합니다. 파일 경로는 컨테이너 내부 경로이므로 /home/nonroot/.cloudflared/로 시작합니다.

 

docker-compose.yml 파일을 생성합니다.

# docker-compose.yml or compose.yaml
version: '3.8'

services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    restart: unless-stopped
    command: tunnel --no-autoupdate run nas-home
    volumes:
      - /volume1/docker/cloudflared:/home/nonroot/.cloudflared:ro
    network_mode: host  // NAS 네트워크 직접사용, bridge의 격리공간과 차이 있음

 

중요한 설정 항목을 설명하겠습니다.

  • restart: unless-stopped는 NAS 재부팅 시 자동으로 컨테이너를 시작하며, 사용자가 수동으로 중지하지 않는 한 항상 실행 상태를 유지합니다.
  • command: tunnel --no-autoupdate run은 자동 업데이트를 비활성화합니다. Docker 이미지 업데이트는 Container Manager에서 수동으로 관리하는 것이 더 안전하기 때문입니다.
  • nas-home: tunnel name 또는 tunnel ID로 설정된 내용을 입력합니다. 지정하지 않으면 설정된 값을 찾지 못해서 터널 연결이 실패합니다. 기억할 수 있고 간편한 tunnel name을 입력하세요.
  • volumes :ro 플래그는 읽기 전용 마운트를 의미하며, 컨테이너가 설정 파일을 실수로 수정하는 것을 방지합니다.
  • network_mode: host는 호스트 네트워크를 사용하여 localhost 주소로 NAS 서비스에 접근할 수 있게 합니다.

Container Manager에서 프로젝트를 생성합니다.

 

Container Manager를 열고 "프로젝트" 탭으로 이동한 후 "생성" 버튼을 클릭합니다. 프로젝트 이름을 "cloudflared"로 입력하고, 경로는 /volume1/docker/cloudflared를 선택합니다. 소스를 "로컬 docker-compose.yml 사용"으로 선택하면 앞서 작성한 파일이 자동으로 인식됩니다.

 

"다음" 버튼을 누르고 설정을 검토한 후 "완료" 버튼을 클릭하면 프로젝트가 생성되고 컨테이너가 자동으로 시작됩니다. 컨테이너 탭에서 "cloudflared" 컨테이너가 "실행 중" 상태인지 확인합니다.

로그를 확인하여 정상 작동하는지 검증합니다.

# SSH에서 로그 확인
docker logs cloudflared

# 또는 Container Manager GUI에서
# 컨테이너 → cloudflared → 세부 정보 → 로그 탭

 

정상적으로 연결되면 다음과 같은 로그가 표시됩니다.

INFO Connection established connIndex=0 location=ICN
INFO Connection established connIndex=1 location=ICN
INFO Registered tunnel connection

6.  Cloudflare DNS 수동 등록

터미널에서 config.yml로 터널을 설정하는 경우, Cloudflare DNS에 레코드를 반드시 수동으로 추가해야 합니다. Zero Trust UI 방식은 Public Hostname을 추가할 때 DNS 레코드가 자동으로 생성되지만, 터미널 방식은 사용자가 직접 CNAME 레코드를 만들어야 합니다. 이 단계를 빠뜨리면 터널은 정상 작동하지만 도메인으로 접속할 수 없으니 주의해야 합니다.

터널 ID 확인

DNS 레코드를 추가하려면 먼저 터널 ID를 확인해야 합니다. NAS SSH에 접속하여 다음 명령어로 터널 ID를 조회할 수 있습니다.

# config.yml에서 터널 ID 확인
cat /volume1/docker/cloudflared/config.yml | grep tunnel:

# 출력 예시:
# tunnel: 35411f8d-fcd5-4f49-920c-8d72dd3332a2

# 또는 Docker 명령어로 터널 목록 확인
sudo docker run -it --rm \
  -v /volume1/docker/cloudflared:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest \
  tunnel list

 

터널 ID는 35411f8d-fcd5-4f49-920c-8d72dd3332a2 형식의 UUID 문자열입니다. 이 값을 복사해둡니다.

Cloudflare 대시보드에서 DNS 레코드 추가

Cloudflare 대시보드(https://dash.cloudflare.com)에 로그인한 후 도메인을 선택하고, 왼쪽 메뉴에서 "DNS" → "레코드"로 이동합니다. "레코드 추가" 버튼을 클릭하여 다음과 같이 입력합니다.

Type: CNAME
Name: nas (또는 원하는 서브도메인)
Target: 35411f8d-fcd5-4f49-920c-8d72dd3332a2.cfargotunnel.com
Proxy status: Proxied (주황색 구름)
TTL: Auto

 

중요 포인트:

  • Target 끝에 반드시 .cfargotunnel.com 포함
  • Proxy는 "Proxied" (주황색) 상태 유지
  • config.yml의 모든 hostname마다 DNS 레코드 추가 필요 (하나의 터널을 여러 서비스가 공유하면, 동일한 호스명을 등록

여러 서비스를 위한 DNS 레코드 추가

config.yml에 여러 hostname이 정의되어 있다면 각각에 대해 DNS 레코드를 추가해야 합니다.

# config.yml 예시
ingress:
  - hostname: nas.yourdomain.com      # DNS: nas
  - hostname: n8n.yourdomain.com      # DNS: n8n
  - hostname: grafana.yourdomain.com  # DNS: grafana

 

위의 경우 3개의 CNAME 레코드를 추가하며, 모두 같은 터널 ID를 Target으로 가리킵니다.

Name Type Target Proxy
nas CNAME 35411f8d-...cfargotunnel.com Proxied
n8n CNAME 35411f8d-...cfargotunnel.com Proxied
grafana CNAME 35411f8d-...cfargotunnel.com Proxied

새롭게 추가된 CNAME=next가 TunnelID값을 갖는 호스트명으로 등록되었습니다
새롭게 추가된 CNAME=next가 TunnelID값을 갖는 호스트명으로 등록되었습니다

DNS 전파 확인

DNS 레코드 추가 후 1-2분 정도 기다린 다음 전파 상태를 확인합니다.

# NAS SSH 또는 Mac/PC 터미널에서
nslookup nas.yourdomain.com

# 정상 출력 예시:
# nas.yourdomain.com canonical name = 35411f8d-...cfargotunnel.com
# Address: 104.21.x.x (Cloudflare IP)

 

또는 온라인 도구 https://dnschecker.org에서 도메인을 입력하고 CNAME 레코드 전파 상태를 확인할 수 있습니다.

[!] 주의사항

DNS 레코드 없이는 터널이 HEALTHY 상태여도 웹사이트 접속이 불가능합니다. 반드시 각 hostname마다 DNS 레코드를 추가해야 합니다.

자주 하는 실수

DNS 설정 시 흔히 발생하는 실수들입니다.

 

실수 1: Target에 .cfargotunnel.com 누락

잘못된 Target: 35411f8d-fcd5-4f49-920c-8d72dd3332a2
올바른 Target: 35411f8d-fcd5-4f49-920c-8d72dd3332a2.cfargotunnel.com

 

실수 2: Proxy를 "DNS only"로 설정

Proxy: DNS only (회색 구름) → 터널 작동 안 함
Proxy: Proxied (주황색 구름) → 터널 정상 작동

 

실수 3: Type을 A 레코드로 설정

Type: A → IP 주소 필요, 터널 사용 불가
Type: CNAME → 터널 도메인 사용

 

DNS 레코드까지 추가했다면 이제 모든 설정이 완료되었습니다. 브라우저에서 https://nas.yourdomain.com으로 접속하여 Synology DSM 로그인 화면이 나타나는지 확인합니다. 정상적으로 접속된다면 Cloudflare Tunnel 설정이 성공적으로 완료된 것입니다


7. DSM 웹 인터페이스 외부 접근

Cloudflare Tunnel이 정상적으로 실행되면 이제 DSM 웹 인터페이스를 외부에서 접근할 수 있도록 설정합니다. DSM은 기본적으로 HTTPS 5001 포트에서 실행되며, HTTP 5000 포트도 지원하지만 보안을 위해 HTTPS를 사용하는 것이 좋습니다.

config.yml 파일을 수정합니다.

tunnel: abc123def-456-789-ghi-jkl012mno345
credentials-file: /home/nonroot/.cloudflared/abc123def-456-789-ghi-jkl012mno345.json
metrics: 0.0.0.0:2000

ingress:
  # DSM 웹 인터페이스
  - hostname: nas.yourdomain.com
    service: https://localhost:5001
    originRequest:
      noTLSVerify: true
      httpHostHeader: localhost
  
  # 기본 규칙
  - service: http_status:404

 

  • noTLSVerify: true 설정이 매우 중요합니다. DSM은 자체 서명(Self-signed) SSL 인증서를 사용하므로, 이 옵션이 없으면 cloudflared가 인증서 검증 실패로 연결을 거부합니다.
  • httpHostHeader: localhost는 DSM이 localhost로 오는 요청을 정상적으로 처리하도록 합니다.

DNS 레코드를 생성합니다.

# Mac이나 관리용 컴퓨터에서 실행
cloudflared tunnel route dns nas-home nas.yourdomain.com

 

또는 Cloudflare 대시보드에서 수동으로 CNAME 레코드를 추가합니다.

항목
Type CNAME
Name nas
Target abc123def-456-789.cfargotunnel.com
Proxy status Proxied (주황색)

 

config.yml을 수정한 후에는 컨테이너를 재시작해야 합니다.

# SSH에서
cd /volume1/docker/cloudflared
docker compose restart

# 또는 Container Manager GUI에서
# 프로젝트 → cloudflared → 액션 → 재시작

 

외부에서 접근을 테스트합니다. 다른 네트워크(모바일 핫스팟, 회사 와이파이 등)에서 브라우저를 열고 https://nas.yourdomain.com에 접속합니다. DSM 로그인 화면이 나타나면 성공입니다.

[!] 주의
DSM 관리자 계정의 강력한 비밀번호 설정과 2단계 인증 활성화는 필수입니다. 외부에서 접근 가능한 만큼 보안에 더욱 신경 써야 합니다.

8. 여러 NAS 서비스 통합 노출

Synology NAS는 다양한 패키지와 Docker 서비스를 제공하므로, 하나의 Cloudflare Tunnel로 여러 서비스를 동시에 노출할 수 있습니다. 각 서비스마다 서브도메인을 할당하여 깔끔하게 관리할 수 있습니다.

대표적인 NAS 서비스와 포트

서비스 기본 포트 프로토콜 용도
DSM 5001 HTTPS 관리 인터페이스
File Station 5001 HTTPS 파일 관리
Synology Drive 6690 HTTPS 개인 클라우드
Photos 5001 HTTPS 사진 관리
Download Station 5001 HTTPS 다운로드 관리
Docker 서비스 (n8n) 5678 HTTP 자동화
Docker 서비스 (PostgreSQL) 5432 TCP 데이터베이스
Docker 서비스 (Grafana) 3000 HTTP 모니터링

 

통합 config.yml 예시:

tunnel: abc123def-456-789-ghi-jkl012mno345
credentials-file: /home/nonroot/.cloudflared/abc123def-456-789-ghi-jkl012mno345.json
metrics: 0.0.0.0:2000

ingress:
  # DSM 관리 인터페이스
  - hostname: nas.yourdomain.com
    service: https://localhost:5001
    originRequest:
      noTLSVerify: true
      httpHostHeader: localhost
  
  # Synology Drive (개인 클라우드)
  - hostname: drive.yourdomain.com
    service: https://localhost:6690
    originRequest:
      noTLSVerify: true
  
  # n8n 자동화 플랫폼
  - hostname: n8n.yourdomain.com
    service: http://localhost:5678
  
  # Grafana 모니터링
  - hostname: grafana.yourdomain.com
    service: http://localhost:3000
  
  # Portainer (Docker 관리)
  - hostname: portainer.yourdomain.com
    service: https://localhost:9443
    originRequest:
      noTLSVerify: true
  
  - service: http_status:404

 

모든 서브도메인의 DNS 레코드를 생성합니다.

# DNS 레코드 일괄 생성 스크립트
#!/bin/bash
TUNNEL_NAME="nas-home"
DOMAINS=(
  "nas"
  "drive"
  "n8n"
  "grafana"
  "portainer"
)

for domain in "${DOMAINS[@]}"; do
  echo "Creating DNS record for $domain.yourdomain.com"
  cloudflared tunnel route dns $TUNNEL_NAME $domain.yourdomain.com
done

 

컨테이너를 재시작하여 새 설정을 적용합니다.

cd /volume1/docker/cloudflared
docker compose restart

 

각 서비스가 정상적으로 접근되는지 테스트합니다. 브라우저에서 각 URL을 차례로 확인하며, 로그인 화면이나 서비스 페이지가 표시되는지 검증합니다.


9. n8n과 PostgreSQL 안정적인 운영

NAS에서 24시간 가동되는 자동화 환경을 구축하려면 n8n과 PostgreSQL을 Docker로 운영하는 것이 좋습니다. Mac에서는 컴퓨터를 끄면 워크플로우가 중단되지만, NAS는 항상 켜져 있어 안정적인 자동화가 가능합니다.

n8n과 PostgreSQL Docker Compose 설정

별도의 폴더를 만들어 n8n 스택을 구성합니다.

# NAS SSH에서
sudo mkdir -p /volume1/docker/n8n-stack
cd /volume1/docker/n8n-stack
nano docker-compose.yml

 

docker-compose.yml 내용: compose.yaml

version: '3.8'

services:
  postgres:
    image: postgres:16
    container_name: n8n-postgres
    restart: unless-stopped
    environment:
      - POSTGRES_DB=n8n
      - POSTGRES_USER=n8n
      - POSTGRES_PASSWORD=your_strong_password
    volumes:
      - /volume1/docker/n8n-stack/postgres-data:/var/lib/postgresql/data
    networks:
      - n8n-network
  
  n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    ports:
      - "5678:5678"
    environment:
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=n8n
      - DB_POSTGRESDB_USER=n8n
      - DB_POSTGRESDB_PASSWORD=your_strong_password
      - N8N_HOST=n8n.yourdomain.com
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://n8n.yourdomain.com/
      - N8N_ENCRYPTION_KEY=your_32_character_encryption_key
    volumes:
      - /volume1/docker/n8n-stack/n8n-data:/home/node/.n8n
    depends_on:
      - postgres
    networks:
      - n8n-network

networks:
  n8n-network:
    driver: bridge

 

Container Manager에서 프로젝트를 생성합니다. "프로젝트" 탭 → "생성" → 프로젝트 이름: "n8n-stack" → 경로: /volume1/docker/n8n-stack → "완료"를 클릭하면 PostgreSQL과 n8n이 함께 시작됩니다.

 

n8n의 WEBHOOK_URL 설정이 매우 중요합니다. 이 값이 Cloudflare 도메인으로 설정되어 있어야 외부 서비스(Telegram, Stripe, GitHub 등)에서 올바른 Webhook URL을 받을 수 있습니다. Webhook을 사용하는 워크플로우를 만들 때 n8n이 자동으로 https://n8n.yourdomain.com/webhook/... 형식의 URL을 생성합니다.

 

cloudflared의 config.yml에 n8n을 추가했다면 외부에서 https://n8n.yourdomain.com으로 접근할 수 있습니다. 최초 접속 시 계정 생성 화면이 나타나며, 이메일과 비밀번호를 설정하여 관리자 계정을 만듭니다.

PostgreSQL 직접 접근 (선택사항)

일반적으로 n8n이 PostgreSQL을 사용하므로 직접 접근할 필요는 없지만, pgAdmin 같은 관리 도구를 사용하고 싶다면 추가 컨테이너를 배포할 수 있습니다.

 

docker-compose.yml에 pgadmin 서비스 추가:

  pgadmin:
    image: dpage/pgadmin4:latest
    container_name: pgadmin
    restart: unless-stopped
    ports:
      - "5050:80"
    environment:
      - PGADMIN_DEFAULT_EMAIL=admin@example.com
      - PGADMIN_DEFAULT_PASSWORD=admin_password
    networks:
      - n8n-network

 

cloudflared config.yml에 추가:

  - hostname: pgadmin.yourdomain.com
    service: http://localhost:5050

 

이렇게 하면 웹 브라우저에서 PostgreSQL을 관리할 수 있습니다.


10. 보안 강화 및 방화벽 설정

NAS를 외부에 노출할 때는 보안 설정이 매우 중요합니다. Cloudflare Tunnel 자체가 보안 계층을 제공하지만, DSM의 추가 보안 기능을 활용하면 더욱 안전합니다.

DSM 방화벽 설정

제어판 → 보안 → 방화벽으로 이동하여 방화벽을 활성화합니다. 규칙을 추가하여 로컬 네트워크에서만 특정 포트에 접근하도록 제한합니다.

 

권장 방화벽 규칙:

포트 프로토콜 소스 IP 허용/거부 설명
5001 TCP 192.168.0.0/16 허용 DSM HTTPS (로컬만)
22 TCP 192.168.0.0/16 허용 SSH (로컬만)
모든 포트 모든 모든 IP 허용 Cloudflared outbound

 

중요한 점은 Cloudflared는 아웃바운드 연결만 사용하므로 방화벽에서 특별한 설정이 필요 없다는 것입니다. DSM의 5001 포트를 로컬 네트워크로만 제한해도 Cloudflare Tunnel을 통한 외부 접근은 정상적으로 작동합니다.

Zero Trust Access 적용

제1편에서 다룬 Zero Trust Access를 NAS 서비스에도 적용할 수 있습니다. cloudflared의 config.yml에 다음과 같이 추가합니다.

ingress:
  - hostname: nas.yourdomain.com
    service: https://localhost:5001
    originRequest:
      access:
        required: true
        teamName: your-team-name
        audTag: your-aud-tag
      noTLSVerify: true
      httpHostHeader: localhost

 

Cloudflare Zero Trust 대시보드에서 Application을 생성하고 Policy를 설정합니다. 특정 이메일 주소만 허용하거나, IP 주소 범위를 제한할 수 있습니다.

Application: NAS Admin
Domain: nas.yourdomain.com
Session Duration: 24 hours

Policy:
  Action: Allow
  Include:
    - Emails: admin@example.com
  Require:
    - IP ranges: 집IP/32, 회사IP/32

 

이렇게 하면 DSM 로그인 전에 Cloudflare Access 인증을 먼저 거치게 되어 이중 보안이 적용됩니다.

DSM 2단계 인증

제어판 → 사용자 및 그룹 → 고급 탭으로 이동하여 2단계 인증을 활성화합니다. Google Authenticator나 Microsoft Authenticator 앱을 사용하여 OTP 코드를 생성할 수 있습니다. admin 계정뿐만 아니라 모든 사용자 계정에 2단계 인증을 적용하는 것이 안전합니다.

자동 업데이트 설정

cloudflared와 다른 Docker 이미지를 자동으로 업데이트하려면 Watchtower를 사용할 수 있습니다.

# Watchtower 컨테이너 실행
docker run -d \
  --name watchtower \
  --restart unless-stopped \
  -v /var/run/docker.sock:/var/run/docker.sock \
  containrrr/watchtower \
  --cleanup --interval 86400

# 86400초 = 24시간마다 체크

 

Watchtower는 모든 컨테이너의 이미지를 확인하여 업데이트가 있으면 자동으로 새 버전으로 교체합니다. 중요한 서비스는 수동 업데이트를 권장하지만, cloudflared 같은 경우는 자동 업데이트가 편리합니다.


11. 모니터링 및 알림 시스템 구축

24시간 운영되는 홈 서버에는 모니터링과 알림이 필수입니다. 서비스 중단을 즉시 감지하고 대응할 수 있어야 합니다.

Cloudflared 메트릭 수집

cloudflared의 config.yml에 이미 metrics: 0.0.0.0:2000 설정이 있다면 Prometheus 형식의 메트릭을 제공합니다.

# 메트릭 확인
curl http://localhost:2000/metrics

 

주요 메트릭:

  • cloudflared_tunnel_total_requests: 총 요청 수
  • cloudflared_tunnel_request_errors: 오류 수
  • cloudflared_tunnel_response_by_code: HTTP 상태 코드별 응답 수
  • cloudflared_tunnel_server_locations: 연결된 Cloudflare 엣지 위치

Prometheus와 Grafana로 시각화

NAS에 Prometheus와 Grafana를 설치하여 메트릭을 시각화할 수 있습니다.

 

docker-compose.yml (모니터링 스택):

version: '3.8'

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: unless-stopped
    ports:
      - "9090:9090"
    volumes:
      - /volume1/docker/monitoring/prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - /volume1/docker/monitoring/prometheus-data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
  
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: unless-stopped
    ports:
      - "3000:3000"
    volumes:
      - /volume1/docker/monitoring/grafana-data:/var/lib/grafana
    environment:
      - GF_SERVER_ROOT_URL=https://grafana.yourdomain.com
      - GF_SECURITY_ADMIN_PASSWORD=admin_password

 

prometheus.yml 설정:

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'cloudflared'
    static_configs:
      - targets: ['host.docker.internal:2000']
  
  - job_name: 'node-exporter'
    static_configs:
      - targets: ['host.docker.internal:9100']

 

Grafana 대시보드는 Cloudflare Tunnel 커뮤니티 대시보드(ID: 17798)를 임포트하여 사용할 수 있습니다.

DSM 알림 설정

제어판 → 알림 설정에서 이메일, SMS, 또는 푸시 알림을 설정할 수 있습니다. Docker 컨테이너가 중지되거나 시스템 리소스가 임계치를 초과하면 자동으로 알림이 발송됩니다.

 

권장 알림 설정:

  • Docker 컨테이너 중지: 즉시 알림
  • CPU 사용률 80% 이상: 15분 지속 시 알림
  • 메모리 사용률 90% 이상: 10분 지속 시 알림
  • 디스크 공간 90% 사용: 즉시 알림

외부 Uptime 모니터링

UptimeRobot이나 Healthchecks.io 같은 무료 서비스를 사용하여 외부에서 서비스 가동 상태를 모니터링할 수 있습니다.

 

UptimeRobot 설정:

  1. https://uptimerobot.com 가입
  2. New Monitor 생성
  3. Monitor Type: HTTPS
  4. URL: https://nas.yourdomain.com
  5. Monitoring Interval: 5분
  6. Alert Contacts: 이메일 추가

서비스가 다운되면 즉시 이메일로 알림을 받을 수 있습니다.


12. 자동 백업 및 복구 전략

NAS에서 가장 중요한 것은 데이터 보호입니다. Cloudflare Tunnel 설정 파일과 Docker 데이터를 정기적으로 백업해야 합니다.

설정 파일 백업 스크립트

# /volume1/docker/cloudflared/backup.sh
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR="/volume1/Backups/cloudflared"

mkdir -p $BACKUP_DIR

# 설정 파일 백업
tar -czf $BACKUP_DIR/cloudflared-$DATE.tar.gz \
  /volume1/docker/cloudflared/*.json \
  /volume1/docker/cloudflared/config.yml \
  /volume1/docker/cloudflared/docker-compose.yml

# 30일 이상 된 백업 삭제
find $BACKUP_DIR -name "cloudflared-*.tar.gz" -mtime +30 -delete

echo "Backup completed: cloudflared-$DATE.tar.gz"

 

스크립트에 실행 권한을 부여합니다.

chmod +x /volume1/docker/cloudflared/backup.sh

DSM 작업 스케줄러 등록

제어판 → 작업 스케줄러 → 생성 → 예약된 작업 → 사용자 정의 스크립트를 선택합니다.

 

설정:

  • 작업: Cloudflared 백업
  • 사용자: root
  • 일정: 매일 새벽 2시
  • 스크립트: /volume1/docker/cloudflared/backup.sh

이렇게 설정하면 매일 자동으로 백업이 생성됩니다.

Hyper Backup으로 클라우드 백업

Synology의 Hyper Backup 패키지를 사용하면 백업을 외부 클라우드에 저장할 수 있습니다.

  1. 패키지 센터에서 Hyper Backup 설치
  2. Hyper Backup 열기 → 데이터 백업 작업 생성
  3. 대상: Google Drive, Dropbox, OneDrive, C2 등 선택
  4. 백업 폴더: /docker/cloudflared 선택
  5. 일정: 주간 또는 일간

이렇게 하면 로컬 백업과 클라우드 백업을 모두 확보할 수 있어 이중 안전장치가 됩니다.

복구 절차

백업에서 복구하는 과정입니다.

# 백업 파일 압축 해제
cd /volume1/docker/cloudflared
tar -xzf /volume1/Backups/cloudflared/cloudflared-20240120.tar.gz

# 권한 재설정
sudo chown -R 65532:65532 /volume1/docker/cloudflared
sudo chmod 600 /volume1/docker/cloudflared/*.json

# 컨테이너 재시작
docker compose restart

 

복구 후 로그를 확인하여 정상 작동하는지 검증합니다.


13. 고급 설정 및 최적화

NAS 환경에서 더 나은 성능과 안정성을 위한 고급 설정을 살펴보겠습니다.

여러 Replica로 고가용성 확보

cloudflared를 여러 인스턴스로 실행하면 한 컨테이너가 중단되어도 다른 컨테이너가 자동으로 트래픽을 처리합니다.

version: '3.8'

services:
  cloudflared-1:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared-1
    restart: unless-stopped
    command: tunnel --no-autoupdate run
    volumes:
      - /volume1/docker/cloudflared:/home/nonroot/.cloudflared:ro
    network_mode: host
  
  cloudflared-2:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared-2
    restart: unless-stopped
    command: tunnel --no-autoupdate run
    volumes:
      - /volume1/docker/cloudflared:/home/nonroot/.cloudflared:ro
    network_mode: host

 

Cloudflare는 자동으로 두 인스턴스 간 부하를 분산하며, 한쪽이 다운되면 나머지로 자동 전환합니다.

환경별 설정 분리

개발과 프로덕션 환경을 분리하려면 config 파일을 여러 개 만들 수 있습니다.

/volume1/docker/cloudflared/
├── config.yml              # 공통 설정
├── config.dev.yml          # 개발용
├── config.prod.yml         # 프로덕션
└── docker-compose.yml

 

docker-compose.yml에서 환경 변수로 선택:

services:
  cloudflared:
    command: tunnel --config /home/nonroot/.cloudflared/${CONFIG_FILE:-config.yml} run

 

실행 시 환경 변수로 선택:

CONFIG_FILE=config.prod.yml docker compose up -d

성능 최적화

config.yml에서 연결 파라미터를 조정하여 성능을 개선할 수 있습니다.

ingress:
  - hostname: nas.yourdomain.com
    service: https://localhost:5001
    originRequest:
      connectTimeout: 30s
      tlsTimeout: 10s
      keepAliveConnections: 100
      keepAliveTimeout: 90s
      noTLSVerify: true

 

keepAliveConnections를 늘리면 연결 재사용이 증가하여 응답 속도가 빨라집니다. 단, 메모리 사용량도 함께 증가하므로 NAS 사양에 맞게 조정해야 합니다.


14. 문제 해결 및 트러블슈팅

NAS 환경에서 발생할 수 있는 일반적인 문제와 해결 방법입니다.

컨테이너가 시작되지 않음

증상: cloudflared 컨테이너가 계속 재시작되거나 중지됨

 

원인 및 해결:

# 1. 로그 확인
docker logs cloudflared

# 2. 권한 문제 확인 및 수정
cd /volume1/docker/cloudflared
sudo chown -R 65532:65532 .
sudo chmod 600 *.json

# 3. 설정 파일 검증
docker run --rm \
  -v /volume1/docker/cloudflared:/home/nonroot/.cloudflared \
  cloudflare/cloudflared:latest \
  tunnel ingress validate

# 4. 메트릭 포트 충돌 확인
netstat -tuln | grep 2000

DSM 접근 시 502 Bad Gateway

증상: https://nas.yourdomain.com 접속 시 502 오류

 

원인 및 해결:

config.yml 확인:

ingress:
  - hostname: nas.yourdomain.com
    service: https://localhost:5001  # HTTP가 아닌 HTTPS
    originRequest:
      noTLSVerify: true              # 필수!
      httpHostHeader: localhost

 

DSM이 5001 포트에서 실행 중인지 확인:

netstat -tuln | grep 5001

Docker 컨테이너 간 통신 실패

증상: n8n이 PostgreSQL에 연결하지 못함

 

원인 및 해결:

# 1. 네트워크 생성
docker network create n8n-network

# 2. docker-compose.yml에서 네트워크 설정 확인
networks:
  n8n-network:
    external: true

# 3. 컨테이너들이 같은 네트워크에 있는지 확인
docker network inspect n8n-network

성능 저하 및 느린 응답

증상: 외부에서 접근 시 응답이 매우 느림

 

해결:

# config.yml 최적화
warp-routing:
  enabled: false  # 사용하지 않으면 비활성화

ingress:
  - hostname: nas.yourdomain.com
    service: https://localhost:5001
    originRequest:
      connectTimeout: 30s
      tlsTimeout: 10s
      keepAliveConnections: 100
      keepAliveTimeout: 90s

 

NAS 리소스 확인:

# CPU 사용률 확인
top

# 메모리 사용률 확인
free -h

# 디스크 I/O 확인
iostat -x 1

마무리

이번 제3편에서는 Synology NAS에서 Cloudflare Tunnel을 Docker로 운영하여 24시간 안정적인 홈 서버를 구축하는 방법을 알아보았습니다. Mac 환경과 달리 NAS는 항상 켜져 있어 진정한 의미의 홈 클라우드 서비스를 제공할 수 있으며, 저전력으로 운영되므로 전기료 부담도 적습니다. DSM 웹 인터페이스를 외부에서 안전하게 접근할 수 있고, n8n이나 PostgreSQL 같은 Docker 서비스를 통합 관리할 수 있습니다.

 

Container Manager를 활용하면 웹 GUI에서 Docker 컨테이너를 쉽게 관리할 수 있으며, Docker Compose 프로젝트 기능으로 복잡한 멀티 컨테이너 환경도 간편하게 배포할 수 있습니다. Zero Trust Access와 DSM 방화벽을 결합하면 이중 보안 체계를 구축할 수 있으며, Prometheus와 Grafana로 실시간 모니터링도 가능합니다. 자동 백업과 알림 시스템을 설정하면 서비스 중단을 즉시 감지하고 대응할 수 있습니다.

 

제1편에서 제3편까지의 시리즈를 통해 Mac 환경의 기본 설정부터 실전 활용, 그리고 NAS를 활용한 안정적인 홈 서버 구축까지 모든 과정을 살펴보았습니다. Cloudflare Tunnel은 포트포워딩 없이도 안전하게 홈 네트워크의 서비스를 외부에 노출할 수 있는 강력한 도구이며, 무료로 사용할 수 있다는 점이 큰 장점입니다. 여러분의 홈 서버 환경에 맞게 응용하여 개인 클라우드, 자동화 플랫폼, 미디어 서버 등 다양한 서비스를 안전하고 효율적으로 운영하시기 바랍니다.


참고 자료