알짜게시판

Cloudflare R2 자동 업로드 구성하기. 특정 폴더에 파일만 넣으면 R2로 전송되는 환경 만들기

서버에서 생성되는 파일을 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에 자동 업로드할 수 있다.

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

제목 글쓴이 조회 날짜
리눅스 Cloudflare R2 자동 업로드 구성하기. 특정 폴더에 파일만 넣으면 R2… 10 49분 전
워드프레스 워드프레스 7.0 관리자 링크 색상 변경 후 이전 색상으로 되돌리는 방법 901 26-06-04
워드프레스 캐시 환경에서 AJAX 댓글(코멘트) 분리로 서버 응답시간 속도 향상 986 26-04-29
리눅스 아파치 일반 계정 파일 접근 권한 설정과 mod-ruid2 적용 방법 1,074 26-04-26
델파이 Delphi IDE 메인 폼 안열림 dproj 설정으로 해결 988 26-04-26
개발팁 VSCode 한국어 설정법, Configure Display Language로 … 1,526 26-04-24
기타 RustDesk 자체 서버 구축으로 공용 서버 로그인 문제 해결 2,209 26-04-16
리눅스 Dante SOCKS5 프록시 서버 구축 및 설정 910 26-04-10
윈도우 윈도우 실행파일(exe) 서비스 등록 자동화 쉽게 하는 방법 - NSSM 1,166 26-04-05
기타 CLIProxyAPI Windows 설치 가이드 3,058 26-04-04
워드프레스 그누보드7 데이터를 WordPress WXR로 변환하기 985 26-04-01
기타 Ollama 설치 경로 C드라이브 고정 문제 해결 및 드라이브 변경 방법 1,346 26-03-31
개발팁 Apache Access Log 기반 도메인별 방문자 카운터 구현 884 26-03-31
윈도우 ZImage AI 이미지 생성 환경 구축 방법 1,082 26-03-26
윈도우 파일 복사 후 실행 배치파일 - 에러 감지 포함 1,118 26-03-10
개발팁 네이버 검색 Open API 1,596 26-02-10
개발팁 네이버 검색광고 키워드 도구 API 검색 2,406 26-02-10
개발팁 MariaDB column_stats 테이블 오류 해결 방법 1,600 25-12-06
개발팁 PHP-FPM 에러 로그 실시간 모니터링 1,426 25-12-03
윈도우 윈도우11 업데이트 후 네트워크 드라이브 접근 불가 문제 해결 방법 2,877 25-11-24
개발팁 다국어 번역 함수 구현 방법 3,939 25-11-08
워드프레스 "치명적인 오류가 발생했습니다" 디버깅 가이드 14,682 25-10-31
리눅스 Apache 웹 로그 분석하기 – awk와 GoAccess 활용 19,246 25-10-28
길호넷 칼무리 - 외부 명령으로 캡처 자동화하기 1 41,180 25-10-14
윈도우 윈도11 강제업데이트 피하고 윈도10 계속 쓰기 42,366 25-10-12
리눅스 PHP 파일 업로드 용량 늘리기 57,353 25-10-03
개발팁 애드센스 충돌 문제 해결하기 75,299 25-09-20
파이썬 Python Playwright로 Edge 브라우저 제어하기 77,526 25-09-12
델파이 TDirectory.Delete 대신 CMD 으로 폴더 삭제 75,729 25-09-10
윈도우 Chrome 및 Edge를 TLS 1.2 모드로 실행 75,255 25-08-30

웹툰인사이트방수의신주점닷컴의료건강웹프로그래밍