자리를 비운 사이 뭘 했는지 브리핑해보라고 시킨 게 12시 8분이었다. 퇴사하고 AI로 회사를 만드는 중이고, 굴리는 것 중 하나가 업비트에서 30만원으로 도는 실거래 매매 봇이다. 맥의 예약 실행 목록에 걸어두고 자는 동안 돌게 해뒀다.
프로세스는 죽어 있지 않았다. 거기까지만 보고 잘 돌고 있다고 보고받을 뻔했다.
실패는 다른 파일에 쌓이고 있었다
같은 폴더의 에러 로그를 열었더니 이 줄이 있었다.
RuntimeError: POST /v1/orders -> 401
주문을 넣는 호출이 401로 떨어지고 있었다. 에러 로그를 따로 열기 전까지는 이게 안 보였다. 무인으로 돌리는 것의 실패 모양이 이렇다. 아예 죽으면 알아차리는데, 반쯤 살아 있으면 알아차릴 창구가 없다.
원인은 허용 ip 목록이었다
원인을 찾는 데는 grep 한 번이면 됐다. 에러 로그에서 no_authorization_ip를 찾으니 401이 처음 난 줄이 거기 있었다.
업비트 키는 요청이 어느 ip에서 오는지를 본다. 등록해둔 허용 목록에 지금 이 맥의 주소가 없으면 막힌다. 업비트 설정 화면에 주소 한 줄을 넣는 일이었다. 코드는 건드리지 않았다.
프로세스 목록 말고 25초
등록을 마치고 나서가 더 문제였다. 다시 401이 나는지 확인해야 하는데, 하루 두고 아침에 로그를 열어 보는 건 실거래 계좌를 열어둔 채로 하기에는 마음이 편하지 않았다.
그래서 파일 크기를 두 번 쟀다. stat -f%z로 에러 로그의 바이트 수를 재고, 25초 쉬고, 다시 잰다. 두 값이 같으면 그 25초 동안 새 실패가 없었다는 뜻이고, 커졌으면 아직 쌓이는 중이다. 마지막 줄을 꺼내 보는 것으로는 이게 안 된다. 그 줄이 어제 것인지 방금 것인지가 화면에서는 똑같이 보이기 때문이다.
무인으로 도는 매매 봇이 있다면, 살아 있는지 볼 때 프로세스 목록이 아니라 에러 로그가 지금도 커지는지를 재세요. 프로세스는 주문이 전부 막혀도 계속 떠 있습니다.
217원
캡처를 열어보니 누적 손익은 217원이었다. 한 번에 1만원씩 주문을 넣는 설정이라 401이 얼마나 갔든 잃은 돈은 없었다.
100만원으로 굴리는 봇을 기획하자는 얘기가 같은 날 나왔는데, 30만원짜리를 마무리한 뒤로 미뤘다.