Skip to content
isdnetworks
Go back

배포가 업로드 폴더를 지웠다

배포하고 나서 상품 이미지가 전부 안 나왔다. 서버에 들어가 보니 업로드 폴더가 비어 있었다.

Table of contents

Open Table of contents

원인 — 삭제 옵션이 붙어 있었다

배포는 이렇게 돌고 있었다.

rsync -avz --delete ./ deploy@web01:/var/www/shop/

--delete 는 보내는 쪽에 없는 파일을 받는 쪽에서 지운다는 옵션이다. 업로드 폴더는 서버에만 있고 내 작업 사본에는 없으니 그 대상이 됐다.

이 옵션이 필요한 이유도 있었다. 소스에서 지운 파일이 서버에 남으면 옛 코드가 계속 돈다. 목적은 맞았고 --exclude 를 안 준 것이 문제였다.

제외 목록을 만들었다

지우면 안 되는 것을 목록으로 뺐다.

# .rsync-exclude
upload/
log/
cache/
config/db.conf
rsync -avz --delete --exclude-from=.rsync-exclude ./ deploy@web01:/var/www/shop/

이 목록에 무엇이 들어가야 하는지도 정리해 봤다. 사용자가 만든 업로드 파일과 서버가 만든 로그·캐시·세션과 서버마다 다른 설정 파일이다.

셋 다 소스에는 없고 서버에만 있다. 목록을 만들며 무엇이 서버에만 있는지 처음 정리해 봤다. 그전에는 그런 구분 자체가 없었다.

확인이 아무것도 안 봤다

목록을 만들고 나서 바로 돌리지 않고 확인 모드로 먼저 돌렸다.

rsync -avzn --delete --exclude-from=.rsync-exclude ./ deploy@web01:/var/www/shop/

-n 은 실제로는 안 하고 무엇을 할지만 보여 준다.

deleting old/product_v1.php
deleting tmp/test.php
sent 1,204 bytes  received 88 bytes

지울 목록에 업로드 파일이 없는 것을 확인하고 실제로 돌렸다.

여기서 하마터면 넘어갈 뻔했는데 처음에는 -v 없이 -n 만 줬기 때문이다. 아무것도 안 나왔고 종료 코드도 0 이었다. 지울 것이 없다고 읽었는데 그것이 아니었다.

-n 은 실제로 안 바꾸는 것이고 무엇을 할지 보여 주는 것은 -v 다. 둘은 별개 옵션이다.

일부러 지울 것이 있는 상태를 만들어 대조해 봤다. 받는 쪽에만 있는 파일을 하나 뒀다. rsync -an --delete 를 돌리니 출력이 0줄이고 종료 코드가 0이었다. 같은 상태에서 -v 를 붙이니 deleting uploads/photo.jpg 가 나왔다.

빈 출력은 지울 것이 없다는 뜻이 아니라 아무것도 측정하지 않았다는 뜻이었다. 통과처럼 보이는 빈 출력은 반드시 걸려야 하는 입력으로 한 번 더 돌려 봐야 한다.

백업과 되살릴 수 있는지

이미 지워진 것은 백업에서 되살렸다.

$ tar xzf /backup/upload-20141013.tar.gz -C /var/www/shop/

다행히 전날 백업이 있었지만 하루치가 없었다. 그날 올라온 이미지는 다시 받아야 했다. 백업 주기가 하루라 최대 하루를 잃는다.

백업 파일이 어디 있는지도 봤더니 같은 서버 안에 있었다. 디스크가 고장 나면 원본과 백업이 같이 사라진다. 이번은 파일만 지워져 살아남았는데 그건 운이었다.

scp /backup/upload-$(date +%Y%m%d).tar.gz backup@backup01:/data/shop/

다른 서버로 매일 옮기는 것을 넣었다. 사본이 같은 장소에 있으면 같이 사라지고 백업의 목적이 그 상황을 막는 것인데 같은 자리에 두면 목적을 못 채운다.

백업이 있다는 것과 되살릴 수 있다는 것도 달랐다. 압축 파일이 깨져 있거나 경로가 달라서 엉뚱한 데 풀리거나 권한이 안 맞을 수 있다.

$ mkdir /tmp/restore-test
$ tar xzf /backup/upload-20141013.tar.gz -C /tmp/restore-test
$ find /tmp/restore-test -type f | wc -l
    2841

시험 서버에서 한 번 풀어 파일 수가 원본과 비슷한지 보고 권한도 확인했다. 이걸 안 해 보고 백업이 있다고만 알고 있으면 정작 필요할 때 안 된다.

정리


Share this post on:

Previous Post
재시도가 실패를 가리고 있었다
Next Post
설정을 저장소 밖으로 뺐다