집에서 ISO 저장용 NAS 만들기: Proxmox + Rocky Linux + Copyparty + Cloudflare + Gmail SMTP 자동 알림까지

집에 구축한 Proxmox 기반 미니PC 서버에 ISO 파일 백업용 NAS가 필요해져서 간단한 파일 서버를 구성하기로 했다.
웹 UI 기반이며 인증/권한 관리가 가능한 copyparty를 선택했고, 외부에서도 접속할 수 있도록 Cloudflare Tunnel을 이용해 임시 URL을 자동 발급 받도록 설정하였다.
Gmail SMTP를 이용해 URL을 메일로 전달하는 자동화까지 완료하였다.


1. LXC 템플릿 다운로드 및 컨테이너 생성

Proxmox의 LXC 템플릿 다운로드 화면에서 rockylinux-9-default 이미지를 선택하고 다운로드한다.

그 다음, Proxmox 웹 UI에서 "Create CT" 버튼을 눌러 컨테이너를 생성한다. 이때 hostname, root password, 네트워크 설정 등을 입력한다.


2. Copyparty 설치 및 설정

컨테이너 안에서 copyparty를 pip로 설치한다

pip3 install --user copyparty

설정 파일 /root/copyparty.conf에 다음 내용을 작성한다

[accounts]
  admin: <password>       # 전체 권한
  guest: <password>       # 읽기 전용

[/]                       # 루트 URL로 접근
  /home/copyparty/data    # 공유 디렉토리
  accs:
    A: admin              # admin은 전체 권한
    r: guest              # guest는 읽기만 가능
  • [accounts]: 사용자 계정과 비밀번호를 설정함
    • admin: 모든 파일 업로드, 삭제 등 전체 권한
    • guest: 파일 다운로드만 가능한 읽기 전용 권한
  • [/]: 웹에서 접근할 수 있는 루트 경로 설정
  • /home/copyparty/data: 실제 서버에서 공유하고자 하는 디렉토리 위치
  • accs 아래의 A, r은 각각 쓰기/읽기 권한 부여를 의미함

copyparty를 실행해 정상적으로 동작하는지 확인한다 ( <copyparty 서버 IP>:3923 접속 )

/root/.local/bin/copyparty -c /root/copyparty.conf --xff-hdr cf-connecting-ip
  • --xff-hdr cf-connecting-ip: Cloudflare 터널을 통해 들어오는 외부 접속자의 실제 IP 주소를 확인하기 위한 설정


3. cloudflared 설치 및 Cloudflare Tunnel 구성

cloudflared 바이너리를 다운로드하고 /usr/local/bin에 설치한다. 그 다음 copyparty에 대한 터널을 생성한다

# cloudflared 바이너리 다운로드
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o cloudflared

# 실행 권한 부여
chmod +x cloudflared

# /usr/local/bin으로 이동
mv cloudflared /usr/local/bin/cloudflared

# 설치 확인
cloudflared --version
cloudflared tunnel --url http://127.0.0.1:3923 --logfile /var/log/cloudflared.log

터널이 열리면 로그에 임시 URL이 생성된다


4. Gmail SMTP(msmtp) 설정

파일서버가 외부 URL을 발급받았을 때 이를 이메일로 자동 전송하기 위해 msmtp를 사용한다.

msmtp 설치

dnf install -y msmtp

~/.msmtprc 설정

defaults
auth           on
tls            on
tls_trust_file /etc/ssl/certs/ca-bundle.crt
logfile        /var/log/msmtp.log

account        gmail
host           smtp.gmail.com
port           587
from           <이메일>@gmail.com
user           <이메일>@gmail.com
password       <앱 비밀번호>

account default : gmail

🔐 Gmail 앱 비밀번호는 myaccount.google.com/apppasswords에서 2단계 인증을 설정한 후 발급받아야 한다.


5. 터널 URL 자동 추출 및 메일 전송

터널이 열리면 로그에서 URL을 추출해 파일에 저장하고, 이 URL을 Gmail SMTP를 통해 메일로 전송하도록 다음 스크립트를 작성한다.

① URL 추출 스크립트 /usr/local/bin/save-cloudflared-url.sh

#!/bin/bash

LOG_FILE="/var/log/cloudflared.log"
OUT_FILE="/var/log/cloudflared-url.txt"

URL=""
# 최대 10초 동안 URL이 로그에 찍히기를 기다림
for i in {1..10}; do
        URL=$(grep -oP 'https://[a-z0-9-]+\.trycloudflare\.com' "$LOG_FILE" | tail -1)
        if [[ -n "$URL" ]]; then
                break
        fi
        sleep 1
done

if [[ -n "$URL" ]]; then
        echo "$URL" > "$OUT_FILE"
else
        echo "[❌  URL not found]" > "$OUT_FILE"
fi

② 메일 전송 스크립트 /usr/local/bin/send-url.sh

#!/bin/bash

TO="<이메일>@gmail.com"  # 수신자 이메일
SUBJECT="🔗  Copyparty Tunnel URL"
BODY_FILE="/var/log/cloudflared-url.txt"
BODY=$(cat "$BODY_FILE")

/usr/bin/msmtp "$TO" <<EOF
Subject: $SUBJECT
From: Copyparty NAS <<이메일>@gmail.com>
To: $TO
Content-Type: text/plain; charset=UTF-8

안녕하세요,

Copyparty 서버가 실행되었습니다.
아래는 외부 접속 주소입니다:

$BODY

- 이 메일은 시스템에 의해 자동 발송되었습니다.
EOF


6. Systemd 서비스 등록

① Copyparty 서비스 파일 /etc/systemd/system/copyparty.service

[Unit]
Description=Copyparty File Server
After=network.target

[Service]
User=root
ExecStart=/root/.local/bin/copyparty -c /root/copyparty.conf --xff-hdr cf-connecting-ip
Restart=always
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/bin:/root/.local/bin

[Install]
WantedBy=multi-user.target

② Cloudflared 서비스 파일 /etc/systemd/system/cloudflared.service

[Unit]
Description=Cloudflare Tunnel (Quick URL)
After=network-online.target
Wants=network-online.target
Requires=copyparty.service

[Service]
ExecStartPre=/usr/bin/truncate -s 0 /var/log/cloudflared.log
ExecStart=/usr/local/bin/cloudflared tunnel --url http://127.0.0.1:3923 --logfile /var/log/cloudflared.log
ExecStartPost=/usr/local/bin/save-cloudflared-url.sh
ExecStartPost=/usr/local/bin/send-url.sh
Restart=always
User=root

[Install]
WantedBy=multi-user.target

서비스 실행 및 상태 확인

systemctl enable copyparty --now
systemctl enable cloudflared --now

systemctl status copyparty
systemctl status cloudflared


 

이로써 NAS처럼 동작하는 웹 기반 파일서버가 간단하게 구축되었다.

Cloudflare를 통해 생성된 임시 URL을 통해 외부에서도 접근 가능하며, 필요시 SSH 포트포워딩 없이 메일로 자동 전달받을 수 있는 구조로 구성하였다.


향후 계획

최근 집 전원이 불규칙하게 차단되는 문제가 발생하고 있으며, 특히 미니PC는 BIOS 설정에 자동부팅 기능이 없어 문제가 크다.

이를 해결하기 위해 라즈베리파이를 활용한 임시 HA 구성을 계획하고 있다. 구체적으로는 다음과 같다.

  • 전력 차단 시에도 최소한의 가용성을 유지하기 위해 라즈베리파이에 Proxmox를 구성하고,
    기존 미니PC Proxmox와 연동하여 corosync 기반 quorum 클러스터를 구성할 예정이다.
  • 이를 통해 미니PC의 전원이 꺼졌을 경우, 클러스터 quorum을 감지하고 라즈베리파이가 일시적으로 NAS 역할을 대신 수행할 수 있도록 구성하고자 한다.
  • 클러스터 구성 시 중요한 VM만 복제 또는 스냅샷 형태로 유지하며, 감시 및 failover 시 복구 가능한 최소한의 환경만 넘기는 방식을 고려 중이다.
  • 이를 위해 라즈베리파이 전용 SSD를 별도로 주문하였으며, 성능 테스트 및 연동 구성은 추후 진행할 예정이다.
  • 다만, 라즈베리파이의 성능이 일시적인 VM 운영을 감당할 수 있을지는 아직 확실하지 않다.