서효다배포 실측

다 만들었는데 못 띄운다면,
막히는 자리는 대개 정해져 있습니다.

하루 동안 실제로 배포하면서 막힌 자리와, 그것을 어떻게 알았는지 적었습니다. 가장 위험했던 것은 실패한 배포가 아니라 «성공한 것처럼 보인» 배포였습니다. 남의 사례가 아니라 제 것이라, 수치는 전부 그날 잰 값입니다.

01 방향

서버가 로컬보다 앞서 있었습니다

「로컬이 작업 사본」이라는 말은 「로컬이 최신」을 뜻하지 않습니다. 배포 직전에 파일을 전수로 대조했습니다.

122대조한 파일
9내용이 다른 것
7로컬이 앞선 것
2서버가 앞선 것 — 덮으면 사라진다

그 두 파일에는 홈 화면 전면 개편과 사이트 타이틀 리브랜딩이 들어 있었습니다. 배포 방식은 트리 전체를 덮는 것이었고, 그 서버에는 git 이 없습니다 — 그대로 올렸으면 되돌릴 곳이 없었습니다.

서버에 git 이 없다는 것은 「이력이 없다」가 아니라 「누가 언제 고쳤는지 알 방법이 mtime 뿐」이라는 뜻입니다. 그래서 배포 전 대조를 절차에 넣었습니다. 기억이 아니라 절차여야 합니다.

02 게이트

「실패 문구가 없다」는 「성공했다」가 아닙니다

빌드가 성공했는지 판정하는 흔한 방식은 로그에서 실패 문구를 찾는 것입니다. 그러면 실패 문구를 남기지 않는 종류의 실패가 전부 통과합니다 — 깨진 런타임, 잘못된 경로, 애초에 실행되지 않은 명령.

그래서 양방향으로 봅니다. 실패 문구가 없고 동시에 성공 문구가 있어야 합니다. 그런데 그날 그 게이트가 한 번 뚫릴 뻔했습니다.

30줄내가 잘라 받은 로그
88줄실제 로그 전문
0 · 0잘라 받은 구간의 성공 문구 · 실패 문구

성공 문구는 로그 앞부분에 있었고, 저는 뒷부분만 받았습니다. 실패 문구도 0이라 「통과」로 읽힐 뻔했습니다. 전문을 다시 받아 성공 문구를 확인하고 나서야 재시작했습니다.

게이트를 양방향으로 만들어도, 게이트에 넣는 입력이 잘려 있으면 소용없습니다. 판정에 쓰는 자료는 자르지 않습니다.

03 시차

「안 먹었다」가 아니라 「아직 안 퍼졌다」였습니다

서버 설정 세 줄을 반영하고 곧바로 확인했더니 하나만 적용돼 있었습니다. 나머지 둘은 그대로였습니다. 「안 먹었다」로 적을 뻔했습니다.

잠시 뒤 다시 재니 셋 다 적용돼 있었습니다. 전파 전에 잰 것이었습니다. 한 번 재고 결론 내리는 것이 위험한 자리가 있습니다 — 재시작·리로드 직후가 그중 하나입니다.

브라우저로 화면을 잴 때도 같은 일이 있었습니다. 색 전환이 0.14초에 걸쳐 일어나는데 그 전에 읽어서, 멀쩡한 버튼이 대비 1.04로 나왔습니다. 고칠 것이 없는데 고치러 갈 뻔했습니다.

04 절반

지시자 하나를 덜 적용했습니다

없는 주소에 안내 페이지를 주도록 고치는 작업은 지시자 이 한 쌍입니다. 하나만 넣으면 안내 페이지가 직접 열립니다.

162B고치기 전 — 기본 404
16,108B고친 뒤 — 우리 안내 페이지
200그 문서를 직접 열었을 때의 응답 — 404 여야 한다

「그 주소에는 아무것도 없습니다」라고 적힌 페이지가 정상 페이지로 색인될 수 있는 상태가 됐습니다. 발견을 늘리려고 한 일이 반대로 갔습니다.

검사가 못 잡은 게 아닙니다 — 404 를 아예 안 보고 있었습니다. 지금은 «없는 주소가 404 인가» 와 «404 문서가 직접 열리지 않는가» 를 따로 봅니다. 둘은 다른 질문입니다.

05 잔여물

백업 파일이 실제로 로드되고 있었습니다

설정을 고치다 nginx -t 가 경고 셋을 냈습니다. 문법은 통과였고 경고는 잡음처럼 보였습니다. 열어보니 한 파일에서 나왔습니다.

30활성 설정 항목
1그중 심볼릭이 아닌 실파일 — 엿새 전 백업

활성 디렉토리에 백업이 실파일로 들어 있었고, 서버가 그것을 읽고 있었습니다. 지금은 진짜 설정이 먼저 로드돼 무시되지만, 그 안에는 이미 고친 옛 내용이 그대로 있었습니다. 심볼릭이 지워지거나 이름이 바뀌면 조용히 그것이 뜹니다.

경고는 「무해한 잡음」처럼 보였지만 되돌아올 준비가 된 옛 설정이었습니다. 치운 뒤 경고 3 → 0. 경고를 읽는 것과 무시하는 것의 차이가 여기 있습니다.

06 순서

되돌릴 수 있게 만들고 나서 바꿉니다

위의 것들을 겪고 남은 절차는 짧습니다. 특별하지 않고, 순서가 전부입니다.

1백업 — 그날은 1.3GB. 지우기 전에 만든다
2대조 — 어느 쪽이 앞섰는지 파일 단위로 본다
3전송 — 덮는 방식이면 무엇이 사라지는지 먼저 안다
4빌드 — 로그 전문으로, 양방향 게이트
5문법 검사 — 통과해야만 다음
6적용 — 그리고 잠시 뒤 다시 잰다

설정 파일은 문자열 치환으로 고치지 않습니다. 파일을 만들어 통째로 올리고 문법 검사를 돌립니다. 한 줄만 바꾸는 편집은 옆줄을 안 보게 만들고, 옆줄이 다른 블록에 속해 있으면 그때 사고가 납니다.

07 요지

실패한 배포보다 성공해 보이는 배포가 위험합니다

여섯 자리 중 넷은 아무 오류도 내지 않았습니다. 서버가 앞선 것도, 잘린 로그도, 전파 시차도, 활성 디렉토리의 백업도 전부 조용했습니다. 시끄럽게 실패한 것은 오히려 쉬웠습니다.

띄우는 데서 막힌다면 도구를 바꾸기 전에 이것부터 보시면 됩니다 — 지금 무엇을 덮고 있는지 아는가, 성공을 무엇으로 판정하는가, 판정에 쓰는 자료가 잘려 있지 않은가. 도구는 그다음 문제입니다.

이 문제 한 장으로 /lp/deploy 발견 쪽 기록 /found
사람이 읽는 것지금방법증거할 수 있는 것과 없는 것
깊이 보는 것숙박 운영을 시스템으로기록이 남는 곳발견되지 않는 이유띄우는 데서 막히는 자리지식이 흩어지는 자리없어도 돌아가게 만드는 자리AI가 실제 일에 붙는 자리기대던 것이 사라졌을 때
이런 게 막혀 있다면했던 걸 또 하고 있습니다제가 없으면 안 돌아갑니다다 만들었는데 띄우지를 못합니다잘 만들었는데 아무도 모릅니다AI를 배웠는데 정작 일에는 안 씁니다
다른 언어Seo Hyoda
AI·검색이 읽는 곳기계가 읽는 것

이 지도는 실제로 배포된 페이지에서 생성됩니다. 손으로 든 목록이 아닙니다.