🚨 INSPEC 장애 복구 매뉴얼 v2 (DR)

📅 2026-07-09 갱신 · 자동 cron 16:50 반영 · 마지막 검증 7/8 16:50 290호 생성 OK · 서버: hermes-server (192.168.0.70) · 사용자: jaekyung

1️⃣ 시스템 식별

항목
호스트hermes-server (192.168.0.70) · jaekyung@1000
프로젝트 루트/home/jaekyung/inspec/
venv/home/jaekyung/.pixelrag-venv/ (공유, openpyxl/pillow)
OneDrive 원격onedrive:ins/ (MMDD 동 층 S|W 폴더)
로컬 사진/home/jaekyung/inspec/pic/ (STEP 0 동기화 결과)
xlsx 출력/home/jaekyung/inspec/excel/ (성성자이-검측(통신)-*.xlsx)
PDF/PNG/home/jaekyung/inspec/_render/<호수 폴더>/
로그/home/jaekyung/inspec/_logs/inspec_cron_YYYYMMDD_HHMMSS.log
템플릿성성자이-검측(통신)-{last}호.xlsx (최신 호수 자동, latest_doc_info())
호수 채번excel/ 내 최대 호수 + 1 (현재 last_no=290)
Telegram_tg.json (bot_token + chat_id=8675731677, Home)
프린터company_printer (lp -d via inspec_print_server.sh)
홈페이지http://192.168.0.70:8080/ · 스케줄 API: :8081/schedule

2️⃣ 호출 체인 — 8단계 (자동 cron)

트리거 = Hermes cron 잡 a76874689911 · 50 16 * * 1-6 (월~토 16:50 KST) · 스크립트 모드 (no_agent). 자동 실행. run_inspec_fullauto.shinspec.sh auto.
스킵 정책:

📞 호출 체인 (8단계)

[Hermes cron] 16:50 평일  → job a76874689911 (no_agent)
   ↓
[ENTRY] run_inspec_fullauto.sh  (bash, 11 lines)  →  exec inspec.sh auto
   ↓
[WRAPPER] inspec.sh auto  (bash, 95 lines)  →  STEP 0 호출 → exec python
   ├─ DOW=7 → SUNDAY_SKIP (exit 0)
   ├─ :8081/schedule memos[오늘] == *"현장휴무"* → HOLIDAY_SKIP (exit 0)
   ├─ STEP 0: bash ins_trigger.sh (timeout 90s)
   └─ STEP 1~5: exec python inspec_server.py --render --telegram
   ↓
[STEP 0] ins_trigger.sh  (bash, 65 lines)
   ├─ flock _tmp/ins_trigger.lock (중복 방지)
   ├─ rclone lsf onedrive:ins/  →  "MMDD 동 층 S|W" 패턴만 추출
   ├─ 유효 폴더 없으면 silent exit 0
   └─ 각 폴더 rclone copy (timeout 25s, 실패해도 진행)
   ↓
[STEP 1] inspec_server.py --render --telegram  (Python, 953 lines, 49 defs)
   ├─ collect_photo_pairs() — pic/ 의 S/W 페어링
   ├─ latest_doc_info() — excel/ 최대 호수 +1
   ├─ W+S 페어 있는 동/층만 → build_document() (replace_v_only 패턴)
   ├─ --render → render_pngs(): soffice→PDF→pdftoppm 300dpi
   ├─ --telegram → send_photo() → TG chat_id=8675731677
   └─ print_via_shell() → inspec_print_server.sh → lp -d company_printer
   ↓
[출력] excel/ + _render/ + printer + Telegram Home
단계파일라인함수/명령
0 cronHermes job a76874689911 · 50 16 * * 1-6 · script=run_inspec_fullauto.sh · no_agent=true
1 entryrun_inspec_fullauto.sh11export PATH; exec inspec.sh auto
2 wrapperinspec.sh95SUN/HOLIDAY skip → STEP 0 → exec python
3 syncins_trigger.sh65flock + rclone lsf/copy (MMDD 폴더)
4 parseinspec_server.py86collect_photo_pairs()
5 templateinspec_server.py223update_sheet1() / replace_v_only()
6 photoinspec_server.py664build_document() · set_input_files()
7 render+TGinspec_server.py794render_pngs() + send_photo()
8 printinspec_print_server.sh28lp -d company_printer on rendered PDF

🟢 수동 트리거 (필요 시)

# SSH 접속 후 직접 실행
ssh jaekyung@hermes-server
bash /home/jaekyung/inspec/inspec.sh auto          # STEP 0 + render + telegram + print
bash /home/jaekyung/inspec/inspec.sh gen           # xlsx 만 생성
bash /home/jaekyung/inspec/inspec.sh render        # xlsx + render 만
bash /home/jaekyung/inspec/inspec.sh print         # 최신 PDF 인쇄

# 텔레그램 트리거 패턴은 더 이상 사용 안 함 (cron 자동, v1 잔재)
# 향후 "TG 메시지 → ins_trigger.sh" 패턴은 inspec_bot_listener.py 미구현 상태

3️⃣ 🚨 5분 복구 — 가장 흔한 장애

증상: 16:50 cron 실행 후 NO_NEW_DOCUMENT 만 나오거나 신규 호수가 안 생김
# 1) pic/ 폴더 사진 확인 (rclone 동기화 결과)
ls -la /home/jaekyung/inspec/pic/ | grep MMDD
# 형식: MMDD 동 층 {S|W}/  (예: 0708 102 24 W)

# 2) OneDrive 원격에 오늘 폴더 있나
export PATH=/home/jaekyung/.local/bin:$PATH
rclone lsf onedrive:ins/ | grep MMDD
# 폴더 없으면 STEP 0 silent skip → 정상 동작

# 3) 템플릿 + 호수 확인
ls /home/jaekyung/inspec/excel/*.xlsx | sort | tail -3
# last_no=290 기준, 291 안 나오면 pic/ S+W 페어 부족

# 4) venv 확인
/home/jaekyung/.pixelrag-venv/bin/python -c \
  "import openpyxl, PIL; print('OK')"

# 5) LibreOffice + pdftoppm 확인
which soffice libreoffice pdftoppm

# 6) 프린터 확인
lpstat -p company_printer
lpq -P company_printer

🔴 STEP 0 rclone 실패

export PATH=/home/jaekyung/.local/bin:$PATH
rclone lsf onedrive:ins/ | grep MMDD
# → 오늘자 폴더 없으면 silent exit
#   (조용히 종료, NO_NEW_DOCUMENT 정상)
# → 폴더 있는데 copy 실패하면
#   trigger_YYYYMMDD-HHMMSS.log 확인

🔴 템플릿 손상 (shift 누적)

ls /home/jaekyung/inspec/excel/*.xlsx | sort | tail -3
# 누적 shift → OneDrive 백업에서 복원
cp /home/jaekyung/OneDrive/hermes_codex_bridge/inspec/excel/성성자이-검측\(통신\)-290호*.xlsx \
   /home/jaekyung/inspec/excel/

🔴 <c> 통째 교체 사고 (7/3 사고)

# 절대 하면 안 됨!
# s="66" 스타일 유실 → 호수 시트 손상
# → ... 내용만 교체 (replace_v_only)
grep -n "replace_c_only\|

🔴 인쇄 큐 stuck

lpstat -p company_printer
lpq -P company_printer
# 큐 stuck → 재시작
sudo systemctl restart cups
# 그래도 안 되면 printer name 확인
lpstat -p -d

🟡 현장휴무인데 cron 실행됨

# :8081/schedule 응답에 오늘 날짜 memo 필요
curl -s http://211.106.147.183:8081/schedule \
  | python3 -c "import sys,json; \
print(json.load(sys.stdin).get('memos',{}))"
# memo 값에 '현장휴무' 4글자 포함 필수

🟡 Telegram 안 옴

cat /home/jaekyung/inspec/_tg.json
# bot_token + chat_id 확인 (마스킹 * 없어야)
bash /home/jaekyung/inspec/inspec.sh auto
# _logs/inspec_cron_*.log 의 TG_ERR 라인 확인

4️⃣ 30분 복구 — 시스템 부분 손상

4-1. inspec.sh 손상

ls -la /home/jaekyung/inspec/inspec.sh
# 백업에서 복원 (없으면 .venv_new/ 또는 OneDrive)
cp /home/jaekyung/OneDrive/hermes_codex_bridge/inspec/inspec.sh \
   /home/jaekyung/inspec/
chmod +x /home/jaekyung/inspec/inspec.sh

4-2. ins_trigger.sh 손상

ls -la /home/jaekyung/inspec/ins_trigger.sh
cp /home/jaekyung/OneDrive/hermes_codex_bridge/inspec/ins_trigger.sh \
   /home/jaekyung/inspec/
chmod +x /home/jaekyung/inspec/ins_trigger.sh

4-3. inspec_server.py 손상

cp /home/jaekyung/OneDrive/hermes_codex_bridge/inspec/inspec_server.py \
   /home/jaekyung/inspec/
chmod +x /home/jaekyung/inspec/inspec_server.py
# → openpyxl ZIP 직접 수정 로직 (49개 함수) 보존 확인
wc -l /home/jaekyung/inspec/inspec_server.py   # 953
grep -c "^def " /home/jaekyung/inspec/inspec_server.py  # 49

4-4. inspec_print_server.sh 손상

grep -n "inspec_print_server.sh\|print_via_shell" \
  /home/jaekyung/inspec/inspec_server.py
# 함수 살아있고 스크립트만 죽었으면
cp /home/jaekyung/OneDrive/hermes_codex_bridge/inspec/inspec_print_server.sh \
   /home/jaekyung/inspec/
chmod +x /home/jaekyung/inspec/inspec_print_server.sh

# 수동 인쇄 (1회)
bash /home/jaekyung/inspec/inspec_print_server.sh \
  /home/jaekyung/inspec/_render/성성자이-검측\(통신\)-290호*/성성자이-검측\(통신\)-290호*.pdf

4-5. _tg.json 손상

cat /home/jaekyung/inspec/_tg.json
# 형식:
# { "bot_token": "NNNN:AAAA...", "chat_id": "8675731677" }
# bot_token 마스킹(*) 금지 — 7/8 사고 사례
# 없으면 ~/OneDrive/hermes_codex_bridge/inspec/_tg.json 에서 복원

4-6. cron 잡 자체가 죽었을 때

hermes cron list | grep inspec
# job_id=a76874689911 expected
hermes cron run a76874689911  # 수동 즉시 실행
hermes cron pause a76874689911 / resume  # 일시정지
# 잡 자체를 재생성해야 하면:
hermes cron update a76874689911 \
  --schedule "50 16 * * 1-6" --script run_inspec_fullauto.sh \
  --no-agent true --deliver origin

5️⃣ 1시간 복구 — 시스템 전체 손상

최악의 시나리오: 서버 통째로 다운. OneDrive 백업에서 전체 복구.
# 1) 새 서버/계정 셋업
ssh jaekyung@새서버
mkdir -p ~/inspec && cd ~/inspec

# 2) OneDrive rclone 마운트
mkdir -p ~/OneDrive
rclone mount onedrive:hermes_codex_bridge ~/OneDrive \
  --vfs-cache-mode writes --daemon

# 3) inspec/ 폴더 전체 복구
cp -r ~/OneDrive/hermes_codex_bridge/inspec/* ~/inspec/
chmod +x ~/inspec/inspec.sh ~/inspec/ins_trigger.sh \
         ~/inspec/inspec_server.py ~/inspec/inspec_print_server.sh \
         ~/inspec/run_inspec_fullauto.sh

# 4) venv 재생성 (pixelrag-venv는 공유)
python3 -m venv ~/.pixelrag-venv
~/.pixelrag-venv/bin/pip install openpyxl pillow

# 5) LibreOffice (PDF 변환용)
sudo apt install libreoffice -y
sudo apt install poppler-utils -y  # pdftoppm
sudo apt install cups-client -y    # lp 인쇄

# 6) 템플릿 베이스 확인 (성성자이-검측(통신)-290호 102 24.xlsx)
ls -la ~/inspec/excel/성성자이-검측\(통신\)-290호*.xlsx

# 7) Telegram 설정 복원
cp ~/OneDrive/hermes_codex_bridge/inspec/_tg.json ~/inspec/

# 8) crontab 재등록 (Hermes cron)
hermes cron create \
  --name "inspec 풀오토 생성/렌더/텔레그램 (오후)" \
  --schedule "50 16 * * 1-6" \
  --script run_inspec_fullauto.sh \
  --no-agent true --deliver origin

# 9) 1회 검증 (수동)
bash ~/inspec/inspec.sh auto
# _logs/inspec_cron_*.log 확인 → INSPEC_OUTPUT=... 나오면 성공

6️⃣ 변경 이력

날짜변경근거
7/9v2 갱신: 자동 cron 16:50 반영, last_no=290Hermes cron a76874689911 도입 (7/8)
7/8Hermes cron a76874689911 등록, 290호 생성 OKtrigger_20260708-165024.log
7/8_tg.json 토큰 마스킹(*) → 정상 복구TG 발송 실패 → 정상
7/4일요일/현장휴무 skip 정책 추가 (inspec.sh)TBM과 동일 패턴
7/4자동 인쇄 추가 (print_via_shell + inspec_print_server.sh)소장님 요청
7/4v1 매뉴얼 작성 (수동 SSH 실행 기준)마지막 검증 289호 TBM_OK+인쇄