협력사와 파일을 메일로 주고받고 있었다. 용량이 커져서 다른 방법을 찾아야 했다.
Table of contents
Open Table of contents
메일로는 안 되게 됐다
주고받는 파일이 이만큼이었다.
일별 정산 파일 8MB
월별 상품 파일 42MB
SMTP 쪽 첨부 한도를 넘었다. 나눠 보내다가 순서가 섞이는 일이 있었다.
받는 쪽에서 조각을 다시 붙이는 것도 사람 손이었다. 한 조각이 빠진 것을 그날 못 알아채면 다음 날 정산이 어긋난다.
선택지 — 방법마다 딸려 오는 것
방법을 나열했다.
1. 파일 서버(FTP)를 둔다
2. 웹으로 올리고 내려받는 화면을 만든다
3. 외부 저장 서비스를 쓴다
4. 상대 서버에 직접 넣어 준다
각각 딸려 오는 것이 달랐다.
1. 서버가 필요하다. 계정 관리가 필요하다
2. 만들 것이 있다. 인증은 기존 것을 쓴다
3. 밖에 데이터가 나간다. 승인이 필요하다
4. 상대 규격을 따라야 한다. 상대가 바뀌면 우리도 바뀐다
1번은 FTP 라 협력사 쪽에서 스크립트로 자동화하기 좋았다. 다만 그 서버를 어디에 둘지가 또 문제였다.
사내망에 둔다 협력사가 못 붙는다. VPN 이 필요하다
IDC 에 둔다 붙을 수 있다. 방화벽을 열어야 한다
운영 서버에 같이 서비스와 같은 자리라 위험하다
주고받는 방법을 바꾸는 것이 어디에 둘지를 같이 정하는 일이었다. 처음에는 방법만 고르면 되는 줄 알았다.
무엇이 오가는지 확인했다
정하기 전에 파일 안에 무엇이 있는지 봤다.
정산 파일 주문번호, 금액, 결제수단
상품 파일 상품코드, 이름, 가격, 재고
정산 파일에는 order_no 와 금액과 결제수단만 있고 회원 정보는 없었다. 있었으면 밖에 두는 3번은 못 썼다.
무엇이 오가는지에 따라 쓸 수 있는 방법이 달라졌다. 내용을 안 보고 방법부터 골랐으면 승인 단계에서 다시 정해야 했을 것이다.
IDC에 따로 두기로 했다
2번이 만들 것이 적어 보였지만 협력사가 자동으로 받아 가야 해서 화면은 안 맞았다. vsftpd 를 IDC 에 따로 두고 운영 서버와 분리했다.
운영 서버 서비스
파일 서버 주고받기
파일 서버가 뚫려도 서비스에 바로 닿지 않게 막았다.
# 파일 서버에서 운영 DB 로 못 붙게
iptables -A OUTPUT -d <운영서버> -p tcp --dport 3306 -j DROP
계정은 협력사마다 따로 줬다.
/home/partner_a/in 협력사가 올리는 곳
/home/partner_a/out 우리가 놓는 곳
/home/partner_b/...
자기 폴더 밖으로 못 나가게 vsftpd 설정을 걸었다.
chroot_local_user=YES
in 과 out 을 나눈 것은 누가 놓은 것인지 헷갈리지 않기 위해서였다. 한 폴더에 다 두면 우리가 놓은 것을 상대가 지우는 일이 생긴다.
파일을 놓기만 하면 상대가 언제 가져갈지 모른다.
$files = glob('/home/partner_a/out/*.csv');
foreach ($files as $f) {
if (filemtime($f) > $lastNotified) {
mail($partnerMail, '파일 등록: ' . basename($f), '...');
}
}
filemtime 으로 새로 놓인 것만 골라 알린다. 가져갔는지도 봤다.
$ grep "RETR" /var/log/vsftpd.log | tail
vsftpd.log 의 RETR 이 그 파일에 대해 없으면 안 가져간 것이다. 일주일이 넘으면 알림이 가게 했다. 놓는 것과 가져가는 것은 다른 일이다.
보관 기간도 정했다.
in 처리한 뒤 30일 보관, 그 뒤 삭제
out 90일 보관, 그 뒤 삭제
안 정하면 계속 쌓인다. 오래된 정산 파일이 계속 밖에서 닿는 자리에 있는 것도 좋지 않았다.
정리
- 주고받는 방법을 바꾸면 어디에 둘지가 같이 걸린다
- 방법마다 딸려 오는 것이 다르다. 서버와 계정과 인증과 승인
- 정하기 전에 무엇이 오가는지 확인한다. 내용에 따라 쓸 수 있는 방법이 달라진다
- 주고받는 자리를 서비스와 분리한다. 뚫려도 바로 안 닿게 한다
- 상대마다 계정과 폴더를 나누고
chroot_local_user로 밖에 못 나가게 한다 - 올리는 곳과 놓는 곳을 나눈다. 한 곳에 두면 서로 지운다
- 놓은 뒤 알리고 가져갔는지도 본다. 둘은 다른 일이다
- 언제 지울지 정한다. 오래된 파일이 밖에서 닿는 자리에 남지 않게 한다