← 전체 글로 돌아가기

웹 개발

Ubuntu 임시 업로드 파일이 쌓인 뒤 tmpfiles로 정리한 설정 노트

처리 후 지우지 못한 임시 업로드 파일을 무작정 cron으로 삭제하지 않고 systemd-tmpfiles로 정리한 방법이다.

디스크 사용량보다 먼저 보인 신호

작은 VPS에서 이미지 업로드를 처리한 다음 임시 디렉터리를 비우도록 했다고 생각했다. 그런데 du를 확인하니 실패한 요청의 조각 파일이 계속 남아 있었다. 정상 흐름의 finally만 믿었고 프로세스가 강제 종료된 경우를 놓친 것이다.

du -sh /var/lib/myapp/uploads/tmp
find /var/lib/myapp/uploads/tmp -type f -printf '%TY-%Tm-%Td %TH:%TM %s %p\n' | sort | tail

보존 정책을 먼저 적었다

처음에는 rm -rf를 cron에 넣으려 했다. 그러면 업로드 중인 파일까지 지울 수 있다. 임시 파일은 24시간만 보존하고 작업 중 파일의 mtime은 갱신하지 않는다는 전제를 문서에 남긴 뒤 systemd-tmpfiles를 사용했다.

# /etc/tmpfiles.d/myapp-upload.conf
d /var/lib/myapp/uploads/tmp 0750 myapp myapp 1d
sudo systemd-tmpfiles --clean --prefix=/var/lib/myapp/uploads/tmp
sudo systemd-tmpfiles --cat-config | grep -A2 myapp-upload

--clean은 보존 기간을 넘긴 항목만 정리한다. 이틀 전 파일과 방금 만든 파일을 테스트 디렉터리에 두고 오래된 것만 사라지는지도 확인했다.

운영 체크리스트

  • 임시 파일과 영구 업로드 경로가 분리되어 있는가
  • 작업 중 파일과 정리 기준이 충돌하지 않는가
  • 권한과 소유자가 애플리케이션 계정에 맞는가
  • 적용 전에 --cat-config로 실제 설정을 확인했는가
  • 삭제 전후 디스크 사용량과 오류를 함께 보는가

정상 종료는 애플리케이션이 즉시 치우고, 비정상 종료의 잔재는 보존 정책이 맡는 두 겹의 구조를 기준으로 삼았다.