영속 Docker 상태에서 실행되는 스케줄
작성자는 AppData를 RAID 1 풀에 매주 복사하고, 해당 풀에서 항상 연결된 USB 디스크로 두 번째 복사본을 만들고자 했습니다. 시스템 crontab과 커뮤니티 스케줄링 앱이 재부팅 후 작업을 안정적으로 유지하지 못했기 때문에, 영속적인 ZimaOS 데이터에 저장된 Portainer 관리 Ofelia 스택으로 스케줄링을 옮겼습니다.
그 결과 설계는 세 계층으로 나뉘었습니다. RAID 스토리지의 셸 스크립트, 스케줄을 제공하는 Ofelia 컨테이너, 그리고 각 복사를 수행하는 단기간 실행 rsync 컨테이너입니다.
영속 스토리지에 스크립트와 로그 저장
이 예시에서는 /media/RAID1/scripts와 같은 경로에 스크립트를 저장했습니다. 해당 디렉터리는 스케줄러에 /scripts로 읽기-쓰기 마운트되었습니다. 로그는 스크립트 옆에 저장되므로 작업이 완료된 후 Files 또는 네트워크 공유를 통해 확인할 수 있습니다.
예시에 사용된 모든 경로는 설치 환경에 따라 다릅니다. 실제 마운트 경로를 확인하지 않고 작성자의 RAID 이름을 그대로 복사하면 백업이 잘못된 위치로 전송되거나 작업이 아무런 표시 없이 실패할 수 있습니다.
Ofelia가 재부팅 후에도 유지되는 스케줄 제공
Portainer 스택은 Ofelia 이미지를 사용하고 restart: always를 설정했으며, 스크립트 디렉터리를 마운트하고 컨테이너에 스케줄 레이블을 저장했습니다. 이 예시에서는 매주 일요일 23시 30분에 AppData를, 23시 45분에 일반 NAS 데이터를 스케줄링했습니다.
ofelia.job-local.appdata.schedule: "0 30 23 * * 0"
ofelia.job-local.appdata.command: "/bin/sh /scripts/backup_appdata.sh"
ofelia.job-local.nas_home.schedule: "0 45 23 * * 0"
ofelia.job-local.nas_home.command: "/bin/sh /scripts/backup_nas_home.sh"
작성자에 따르면 SSH 세션을 다시 열 필요 없이, 재부팅 후 약 1분 이내에 스케줄러와 작업이 다시 실행되었습니다.
복사 전에 AppData 스크립트가 Plex 중지
변경 중인 Plex 데이터베이스를 복사할 가능성을 줄이기 위해 스크립트는 Plex를 중지하고, 읽기 전용 AppData 소스 마운트에서 rsync를 실행한 다음 Plex를 다시 시작했습니다. 스케줄러 컨테이너는 필요한 경우 Docker CLI를 설치하고 Docker 소켓을 통해 다른 컨테이너를 제어했습니다.
/var/run/docker.sock을 마운트하면 스케줄러가 Docker 호스트를 광범위하게 제어할 수 있습니다. 여기에 root 권한으로 실행하고 privileged 모드까지 사용하면 권한이 더욱 커집니다. 이 글에서는 이를 작성자가 실제로 사용한 설계로 소개할 뿐, 최소 권한 보안 모델로 제시하지는 않습니다.
rsync --delete는 버전 기록이 아닌 정확한 미러를 생성
이 예시에서는 rsync -avH --delete를 사용했습니다. --delete 옵션은 소스에 더 이상 존재하지 않는 대상 파일을 삭제합니다. 따라서 정확한 미러가 만들어지지만, 실수로 인한 삭제나 손상도 그대로 복제될 수 있습니다.
삭제 옵션 없이 먼저 테스트하고, 소스 및 대상 마운트를 확인한 다음, 무인 스케줄을 활성화하기 전에 로그를 검토하세요. 항상 연결된 USB 디스크에 만든 미러는 오프라인 백업이나 변경 불가능한 백업과도 동일하지 않습니다.
재부팅 후에도 USB 재연결 문제는 해결되지 않음
작성자는 연결된 USB 디스크가 재부팅 후 새 디스크로 계속 표시되는 문제도 별도로 해결하고자 했습니다. Ofelia는 작업 구성을 유지하지만, 마운트 경로가 변경되거나 사용할 수 없게 되면 백업 대상이 여전히 작동하지 않을 수 있습니다. 안정적인 스토리지 식별과 rsync 전에 마운트를 확인하는 작업은 별도로 필요합니다.
FAQ
이 스케줄은 왜 재부팅 후에도 유지되나요?
작업 정의가 재시작이 활성화된 Portainer 스택에 저장되고, 스크립트가 임시 시스템 crontab이 아닌 영속 스토리지에 저장되었기 때문입니다.
이렇게 하면 과거 백업 버전이 생성되나요?
아니요. 문서에 나온 rsync 명령은 미러를 생성하며 --delete를 사용합니다. 버전 보존에는 다른 설계가 필요합니다.
AppData를 복사하기 전에 Plex를 중지하는 이유는 무엇인가요?
데이터베이스가 수정되는 동안 복사될 위험을 줄이기 위해서입니다.
