Cloudflare R2 자동 업로드 구성하기. 특정 폴더에 파일만 넣으면 R2로 전송되는 환경 만들기
- 17:14
- 9 회
- 0 건
서버에서 생성되는 파일을 Cloudflare R2로 자동 업로드해야 하는 일이 있었다. 매번 직접 업로드하는 방식은 번거롭고, 파일이 자주 생성되는 환경에서는 빠뜨리기 쉽다.
이번에는 서버의 특정 폴더를 감시하다가 새 파일이 생기면 Cloudflare R2로 자동 업로드하는 환경을 구성했다. 웹 디렉터리와 분리된 업로드 전용 폴더를 사용해 관리하기도 편하게 만들었다.
rclone으로 Cloudflare R2 연결부터 확인한다
자동 업로드의 실제 전송은 rclone이 담당한다. 그래서 가장 먼저 해야 할 일은 Cloudflare R2와 정상적으로 연결되는지 확인하는 것이다.
설치가 끝났다면 rclone 설정 파일을 만든다. 여기에 Access Key와 Secret Key, Endpoint 등을 입력한다.
curl https://rclone.org/install.sh | sudo bash
mkdir -p ~/.config/rclone
vi ~/.config/rclone/rclone.conf
설정을 마쳤다면 실제 연결이 되는지 확인한다.
rclone lsd r2:
버킷 목록이 정상적으로 표시되면 이후 과정으로 넘어가면 된다. 여기에서 오류가 발생하면 자동 업로드도 동작하지 않는다.
웹 디렉터리 대신 업로드 전용 폴더를 사용하는 편이 관리하기 쉽다
처음에는 웹 서비스에서 사용하는 디렉터리를 그대로 감시할 생각이었다.
하지만 실제 운영에서는 업로드 전용 폴더를 따로 두는 편이 훨씬 편하다. 웹 서비스와 업로드 기능이 서로 영향을 주지 않기 때문이다.
예를 들어 다음과 같은 구조를 사용할 수 있다.
/home/www/r2-upload/
이 폴더는 단순히 업로드 대기 공간으로만 사용한다.
파일을 생성하거나 복사하는 프로그램도 이 폴더만 바라보면 된다.
inotify로 새 파일이 만들어지는 순간 감지한다
Linux에서는 inotify를 이용하면 파일 생성이나 수정 이벤트를 실시간으로 감지할 수 있다.
그래서 일정 시간마다 폴더를 확인하는 방식보다 반응이 빠르고 서버 자원도 적게 사용한다.
필요한 패키지는 다음과 같이 설치한다.
yum install -y inotify-tools p7zip
이후에는 감시 스크립트에서 업로드 전용 폴더를 바라보도록 설정한다.
WATCH_DIR="/home/www/r2-upload"
사용자는 이 폴더에 파일만 넣으면 된다.
cp sample.zip /home/www/r2-upload/
또는
mv movie.mp4 /home/www/r2-upload/
처럼 파일이 생성되는 순간 이벤트가 발생하고 업로드 절차가 이어진다.
r2.sh 스크립트가 감지한 파일을 Cloudflare R2로 전송한다
실제 업로드는 r2.sh가 수행한다.
systemd는 이 스크립트를 계속 실행하고 있고, 스크립트는 inotify 이벤트를 기다리는 구조다.
스크립트 내부에서는 감지된 파일을 rclone으로 Cloudflare R2에 업로드한다.
업로드가 끝나면 로그를 남기거나, 필요하다면 압축 또는 후처리도 이 스크립트에서 함께 수행할 수 있다.
이렇게 역할을 분리해 두면 나중에 업로드 경로나 버킷을 변경하더라도 스크립트만 수정하면 된다.
systemd 서비스로 등록하면 서버를 다시 시작해도 계속 동작한다
백그라운드에서 계속 실행되는 프로그램이라면 systemd로 관리하는 편이 안정적이다.
서비스 파일을 생성한다.
vi /etc/systemd/system/r2-watch.service
서비스 내용은 다음과 같이 구성했다.
[Unit]
Description=Watch files and upload to Cloudflare R2
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=www
Group=apache
ExecStart=/bin/bash /home/www/r2.sh
Restart=always
RestartSec=5
StandardOutput=append:/home/www/r2.log
StandardError=append:/home/www/r2.log
[Install]
WantedBy=multi-user.target
등록과 실행은 다음 순서로 진행한다.
systemctl daemon-reload
systemctl enable --now r2-watch.service
이후 서버가 재부팅되어도 자동으로 실행된다.
파일이 올라가지 않을 때는 서비스 상태와 로그를 먼저 확인한다
자동 업로드가 동작하지 않는다면 대부분 서비스 실행 상태나 rclone 연결에서 원인을 찾을 수 있다.
먼저 서비스가 실행 중인지 확인한다.
systemctl status r2-watch.service
로그도 함께 확인하면 어떤 단계에서 문제가 발생했는지 쉽게 알 수 있다.
tail -f /home/www/r2.log
테스트 파일도 하나 만들어 본다.
touch /home/www/r2-upload/test.txt
파일 생성 직후 로그에 업로드 과정이 나타난다면 정상적으로 이벤트를 감지하고 있는 것이다.
특정 폴더만 감시하는 구조가 운영하면서 수정하기 편하다
자동 업로드 기능은 복잡한 구성이 아니다.
전용 업로드 폴더 하나를 만들고, inotify가 파일 생성을 감지하면 rclone이 Cloudflare R2로 전송하는 흐름이다.
웹 서비스와 업로드 영역을 분리하면 운영 중 실수도 줄어든다. 감시 대상도 명확해지고, 다른 서비스에서 파일을 생성하더라도 같은 폴더만 사용하면 동일한 방식으로 Cloudflare R2에 자동 업로드할 수 있다.











로그인 후 댓글내용을 입력해주세요