한 줄로
자동매매 v2를 실전으로 넘기기 전에 배포 스크립트 deploy-p8.sh를 점검했다. docker compose의 --project-directory 설정 때문에 운영 이미지가 배포할 소스가 아니라 main 체크아웃에서 빌드될 상태였다. 이 체크아웃은 221커밋 뒤처진 다른 브랜치였다. 빌드 소스를 배포 전용 폴더로 바꾸고, 빌드가 끝나면 이미지 안의 파일을 배포 SHA와 대조하는 검사를 넣었다. 같은 점검에서 스크립트를 멈추게 했을 결함 두 개를 고쳤고, 안전장치 두 개를 더 넣었다.
--project-directory가 정하는 것
docker compose는 compose 파일 안의 상대 경로를 「프로젝트 디렉터리」 기준으로 해석한다. build.context: . 같은 빌드 컨텍스트(이미지를 만들 때 Docker 에 넘기는 소스 폴더)도 여기에 포함된다. 기본값은 처음 지정한 compose 파일이 있는 폴더이고, --project-directory를 주면 기준이 그 폴더로 바뀐다.
그래서 이 옵션이 다른 체크아웃을 가리키면 빌드 컨텍스트도 그쪽 소스가 된다. 소스가 달라도 빌드 자체는 실패하지 않을 수 있으므로, 빌드 성공만으로는 소스가 맞는지 알 수 없다.
이 프로젝트의 배포 구조
운영 배포는 배포 전용 폴더 wt-deploy에서 한다. 전환 절차서에 적힌 compose 명령은 dc.sh가 실제 운영 방식(wt-deploy + op run)으로 감싸서 실행한다. op run은 1Password 참조를 환경변수로 풀어 넣은 뒤 명령을 실행하는 1Password CLI 명령이다.
같은 머신에는 main 체크아웃이 따로 있다. 문제는 deploy-p8.sh가 이 두 폴더 중 어느 쪽에서 빌드하느냐였다.
점검에서 나온 것
1. 배포 폴더가 git 폴더가 아니었다
wt-deploy가 git 폴더가 아니어서, 스크립트가 첫 git 명령에서 멈추는 상태였다. origin/main d7a1ed8로 다시 만들었다.
2. 되돌림 태그 검사가 fix16에 고정돼 있었다
되돌림용 이미지 태그를 확인하는 검사가 fix16이라는 특정 태그를 기준으로 하고 있었다. 그대로 두었다면 다음 배포부터 스크립트가 멈췄을 것이다. 이제는 배포할 때마다 atv2-app:roll-<월일시분>-<서비스> 형식의 태그를 새로 찍는다.
3. 운영 이미지가 엉뚱한 소스에서 빌드될 뻔했다
가장 위험한 결함이었다. --project-directory 때문에 운영 이미지가 main 체크아웃에서 빌드될 상태였다. 그 체크아웃은 221커밋 뒤처진 다른 브랜치였다.
두 가지를 고쳤다.
- 빌드 소스를
wt-deploy로 바꿨다. - 빌드 뒤에 이미지 안의 파일을 배포 SHA와 대조하는 검사를 넣었다. 나중에 경로 설정이 다시 어긋나더라도 이미지 내용이 배포하려던 커밋과 다르면 이 단계에서 걸린다.
4. 새 이미지가 전략을 불러오는지 확인한다 (S05)
활성 전략 묶음을 새 이미지에서 불러올 수 있는지 확인하는 S05 검사를 넣었다. 실패하면 이미지를 배포 전 것으로 되돌린다.
5. 실전 송신이 켜져 있으면 실행하지 않는다
실전 엔진이 ATV2_LIVE_SEND를 켠 채 돌고 있으면 deploy-p8.sh는 실행을 거부한다.
전환 뒤에 쓸 deploy-live.sh
실전 전환 뒤의 배포는 새로 만든 deploy-live.sh가 맡는다. 아래 조건이 맞지 않으면 진행하지 않는다.
-
손절 설정이 바뀌면 멈춘다. 의도한 변경이면
STOP_CHANGE_OK=1을 준다. - 평일 16:50 전에는 거부한다. 수능일처럼 장이 늦게 끝나는 날에 대비한 기준이다.
-
입출금이 있는 날에는
NO_CASHFLOW_TODAY=1을 줘야 실행된다. - 실계좌 ID는 최근 5분 동안의 하트비트로 DB와 대조한다. 이 대조는 아직 시험하지 않았다.
리허설 스크립트도 같은 방식으로 막는다
R1·R3 단계용 run-r1.sh, run-r3.sh(init/up/down)를 만들었다.
- 장중이거나, v1이 돌고 있거나,
ATV2_LIVE_SEND가 켜져 있으면 거부한다. - R3 실계좌 ID는
op-refs.env에 기록한다. -
down은 계좌를 정지한 뒤 하트비트 행을 지운다. 이 행을 남겨 두면 R3 이후 매일 헛경보가 온다.
남은 것
-
deploy-live.sh의 실계좌 ID 대조는 아직 시험하지 않았다. - 재부팅하면
/private/tmp가 지워진다. 그래서 작업 메모 폴더(scratchpad)의 사본을 홈 폴더에 두었고, 배포가 끝날 때sync-mirror.sh가 자동으로 갱신한다. - 절차는 RUNBOOK §6c~§6i에 정리했다.