🚨 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.sh → inspec.sh auto.
스킵 정책:
- 일요일 (DOW=7) → 즉시
SUNDAY_SKIP 종료 (조용)
- 현장휴무 → 스케줄 API(
:8081/schedule) memo 에 현장휴무 포함 시 HOLIDAY_SKIP
📞 호출 체인 (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 cron | Hermes job a76874689911 · 50 16 * * 1-6 · script=run_inspec_fullauto.sh · no_agent=true |
| 1 entry | run_inspec_fullauto.sh | 11 | export PATH; exec inspec.sh auto |
| 2 wrapper | inspec.sh | 95 | SUN/HOLIDAY skip → STEP 0 → exec python |
| 3 sync | ins_trigger.sh | 65 | flock + rclone lsf/copy (MMDD 폴더) |
| 4 parse | inspec_server.py | 86 | collect_photo_pairs() |
| 5 template | inspec_server.py | 223 | update_sheet1() / replace_v_only() |
| 6 photo | inspec_server.py | 664 | build_document() · set_input_files() |
| 7 render+TG | inspec_server.py | 794 | render_pngs() + send_photo() |
| 8 print | inspec_print_server.sh | 28 | lp -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/9 | v2 갱신: 자동 cron 16:50 반영, last_no=290 | Hermes cron a76874689911 도입 (7/8) |
| 7/8 | Hermes cron a76874689911 등록, 290호 생성 OK | trigger_20260708-165024.log |
| 7/8 | _tg.json 토큰 마스킹(*) → 정상 복구 | TG 발송 실패 → 정상 |
| 7/4 | 일요일/현장휴무 skip 정책 추가 (inspec.sh) | TBM과 동일 패턴 |
| 7/4 | 자동 인쇄 추가 (print_via_shell + inspec_print_server.sh) | 소장님 요청 |
| 7/4 | v1 매뉴얼 작성 (수동 SSH 실행 기준) | 마지막 검증 289호 TBM_OK+인쇄 |