Skip to content
isdnetworks
Go back

설정 파일이 지워지는 자리에 있었다

배포하고 나니 결제가 안 됐다. 결제 설정 파일이 없어져 있었다.

Table of contents

Open Table of contents

배포가 지웠다

deploy.shrm -rf 로 폴더를 통째로 지우고 cp -r 로 새로 넣고 있었다.

rm -rf /app/current
cp -r /app/release /app/current

결제 설정 파일이 그 폴더 안에 있었으니 배포할 때마다 없어졌다. 그동안은 배포 뒤에 누가 손으로 다시 만들고 있었고 그 사람이 휴가를 간 날 배포가 나갔다. 사람이 매번 메우던 구멍이라 구멍인 줄 몰랐던 것이다.

지워지는 자리와 남는 자리

배포 대상 폴더와 그렇지 않은 폴더를 갈랐다. 설정과 업로드처럼 배포와 무관하게 살아야 하는 것은 shared/ 로 옮기고 ln -s 로 이었다.

$ mv /app/current/config/payment.php /app/shared/config/payment.php
$ ln -s /app/shared/config/payment.php /app/current/config/payment.php

deploy.sh 에서도 링크를 다시 걸게 했다. 폴더를 새로 만들면 그 안의 링크도 함께 사라지기 때문이다.

여기서 -n 을 빼면 안 된다. ln -sf 만 주고 대상이 이미 디렉터리를 가리키는 링크면 그것을 따라가 그 디렉터리 안에 새 링크를 만든다. 바깥 링크는 옛 자리를 그대로 가리키고 있어서 바뀐 줄 알고 넘어간다. readlink 로 되읽어 보면 그대로인 것이 나온다. -n 이 있어야 링크 자체를 바꾼다.

cp -r /app/release /app/current
ln -sfn /app/shared/config/payment.php /app/current/config/payment.php
ln -sfn /app/shared/upload /app/current/upload

무엇이 더 지워지는지 찾았다

설정 하나만의 문제인지 확인해야 했다. 시험 서버에서 배포를 한 번 돌리고 find -type f 목록을 sort 해서 comm -23 으로 비교했다.

$ find /app/current -type f | sort > before.txt
$ ./deploy.sh
$ find /app/current -type f | sort > after.txt
$ comm -23 before.txt after.txt
/app/current/config/payment.php
/app/current/upload/2015/01/a.jpg
/app/current/logs/app.log
/app/current/.htaccess

넷이 나왔고 업로드 파일이 지워지고 있던 것이 가장 컸다. .htaccess 가 사라지는 것도 거기 있었다. 시험 서버라 몇 개뿐이었지만 운영에는 수만 개가 있다. 운영은 배포 방식이 조금 달라 업로드 폴더가 살아 있었는데 그건 우연이었다.

링크가 해소되는지 확인했다

링크를 만드는 것과 그 링크가 가리키는 것이 있는 것은 다르다. ln -s 는 대상이 없어도 링크를 만들고 ls 목록에도 정상으로 나온다.

$ test -e /app/current/config/payment.php && echo OK || echo "대상 없음"

test -e 는 링크를 따라가므로 이걸로 봐야 진짜 있는지 안다. deploy.sh 끝에서 걸어야 할 링크를 전부 이렇게 확인하고 하나라도 안 풀리면 exit 1 로 끝내게 했다.

당장 없어진 설정은 결제사에 연락해 다시 받았고 그동안 결제가 두 시간 안 됐다. 그 뒤로 shared/config 를 백업 대상에 넣었다. svn 에는 넣을 수 없는 값이지만 백업에는 파일째 들어간다.

배포를 물릴 수 없다는 것도 이때 같이 고쳤다. rm -rf 로 지우고 넣는 방식이라 옛 판이 남지 않았다. releases/ 아래에 날짜별로 남기고 current 링크만 바꾸는 방식으로 옮겼다. 물릴 때 ln -sfn 으로 옛 판을 가리키면 몇 초에 끝난다. 옛 판은 다섯 개만 남기고 지우게 했다.

cp -r /app/release /app/releases/$(date +%Y%m%d_%H%M%S)
ln -sfn /app/releases/20150120_134806 /app/current

정리


Share this post on:

Previous Post
백업은 있었는데 복구를 해 본 적이 없었다
Next Post
넘겨받은 코드를 누가 볼지 정했다