🚨 TBM 장애 복구 매뉴얼 v1 (DR)
📅 2026-07-04 작성 · 마지막 검증 7/4 14:22 TBM_OK · 서버: hermes-server · 사용자: jaekyung
1️⃣ 시스템 식별 (식별부터)
| 항목 | 값 |
| 호스트 | hermes-server · jaekyung@1000 |
| 프로젝트 루트 | /home/jaekyung/tbm/ |
| venv | /home/jaekyung/tbm/.venv/ (playwright) |
| OneDrive | onedrive:tbm/ (MMDD m|a N 폴더) |
| PMX URL | https://www.gs-pmx.com/com/qse/safety/tbm-dlg?mnuId=000331 |
| Telegram | chat_id=8675731677 (Home) |
| 백업 | OneDrive 전체 자동 동기화 |
2️⃣ 3단계 호출 체인 (장애 추적)
[cron] /etc/cron.d/tbm-auto → [bash] tbm.sh → [python] tbm_auto.py → [PMX RPA + TG]
| 단계 | 파일 | 라인 | 함수/명령 |
| 0 Cron | /etc/cron.d/tbm-auto | 14 | 30 7 / 30 13 |
| 1 rclone | tbm.sh | 36-76 | rclone lsf + sync |
| 2 일체크 | tbm_auto.py | 148-160 | fetch_schedule_workday() |
| 3 폴더 | tbm_auto.py | 73-122 | collect_photo_pairs() |
| 4 로그인 | tbm_auto.py | 215-231 | login_if_needed() |
| 5 입력 | tbm_auto.py | 303-352, 384 | set_date_range / choose_work_type |
| 6 사진 | tbm_auto.py | 440 | set_input_files (nth(1)) |
| 7 저장+TG | tbm_auto.py | 473, 173 | click_button_text + tg_send_photo |
3️⃣ 🚨 5분 복구 — 가장 흔한 장애
증상: cron 시간 됐는데 TBM 등록 안 됨
# 1) cron 살아있나?
systemctl status cron
grep -E "^30 [0-9]+" /etc/cron.d/tbm-auto
# 2) 가장 최근 로그 확인
tail -30 /home/jaekyung/tbm/log_tbm_*.log
ls -lat /home/jaekyung/tbm/log_tbm_*.log | head -3
# 3) 스크린샷 확인 (마지막 시도가 실패했으면 error.png 있음)
ls -lat /home/jaekyung/tbm/screenshots/ | head -5
🔴 rclone 동기화 실패
export PATH=/home/jaekyung/.local/bin:$PATH
rclone lsf onedrive:tbm/ | head
rclone config show onedrive
🔴 schedule skip 오작동
curl -s http://localhost:8080/schedule \
| python3 -c "import sys,json; \
d=json.load(sys.stdin); \
print(d['memos'].get('2026-07-04',''))"
→ "휴일"/"휴가" 단어 들어가 있으면 skip
🔴 storage_state 만료
cat ~/.codex/.env # PMX_ID 확인 (read 차단됨)
# → .env PMX_ID/PW로 1회 수동 재로그인 필요
bash /home/jaekyung/tbm/tbm.sh --mode m
🔴 venv 손상 (playwright 미설치)
ls /home/jaekyung/tbm/.venv/bin/python
/home/jaekyung/tbm/.venv/bin/python -c \
"import playwright"
# → 실패 시 venv 재생성
python3 -m venv .venv
source .venv/bin/activate
pip install playwright pillow
4️⃣ 30분 복구 — 시스템 부분 손상
4-1. cron 자체 죽음
systemctl status cron # 죽었으면
sudo systemctl restart cron
# tbm-auto 파일 검증
sudo test -f /etc/cron.d/tbm-auto && echo OK
4-2. rclone 인증 만료
rclone config reconnect onedrive:
# 브라우저 인증 → 토큰 갱신
rclone lsf onedrive:tbm/2026-07-04\ a\ 9/ | head
4-3. tbm.sh 손상
ls -la /home/jaekyung/tbm/tbm.sh
# 백업에서 복원
cp /home/jaekyung/tbm/.venv_new/tbm.sh \
/home/jaekyung/tbm/tbm.sh
chmod +x /home/jaekyung/tbm/tbm.sh
4-4. tbm_auto.py 손상
# OneDrive 백업에서 복원
ls /home/jaekyung/OneDrive/hermes_codex_bridge/tbm/
cp /home/jaekyung/OneDrive/hermes_codex_bridge/tbm/tbm_auto.py \
/home/jaekyung/tbm/tbm_auto.py
chmod +x /home/jaekyung/tbm/tbm_auto.py
5️⃣ 1시간 복구 — 시스템 전체 손상
최악의 시나리오: 서버 통째로 다운. OneDrive 백업에서 전체 복구.
# 1) 새 서버/계정 셋업
ssh jaekyung@새서버
mkdir -p ~/tbm && cd ~/tbm
# 2) OneDrive rclone 마운트 (Hermes bridge)
mkdir -p ~/OneDrive
rclone mount onedrive:hermes_codex_bridge ~/OneDrive \
--vfs-cache-mode writes --daemon
# 3) tbm/ 폴더 전체 복구
cp -r ~/OneDrive/hermes_codex_bridge/tbm/* ~/tbm/
chmod +x ~/tbm/tbm.sh ~/tbm/tbm_auto.py
# 4) venv 재생성
cd ~/tbm
python3 -m venv .venv
.venv/bin/pip install playwright pillow
.venv/bin/playwright install chromium
# 5) .env 복구 (수동 - 보안상 자동 복구 X)
cp ~/OneDrive/hermes_codex_bridge/tbm/.env.example ~/tbm/.env
# → PMX_ID/PW, TG 토큰은 Hermes에게 별도 요청
# 6) cron 등록 (sudo)
sudo tee /etc/cron.d/tbm-auto > /dev/null <<'CRON'
SHELL=/bin/bash
TZ=Asia/Seoul
30 7 * * * jaekyung /home/jaekyung/tbm/tbm.sh --mode m \
>> /home/jaekyung/tbm/log_tbm_m_cron.log 2>&1
30 13 * * * jaekyung /home/jaekyung/tbm/tbm.sh --mode a \
>> /home/jaekyung/tbm/log_tbm_a_cron.log 2>&1
CRON
# 7) PMX 수동 로그인 1회
bash ~/tbm/tbm.sh --mode a 2>&1 | tail -10
6️⃣ 검증 (헬스체크 5개)
# ✅ 1) cron 정상
systemctl status cron | head -3
grep "30 7" /etc/cron.d/tbm-auto
# ✅ 2) rclone 정상
export PATH=/home/jaekyung/.local/bin:$PATH
rclone lsf onedrive:tbm/ | tail -3
# ✅ 3) venv 정상
~/tbm/.venv/bin/python -c "import playwright, PIL; print('OK')"
# ✅ 4) storage_state 정상
test -s ~/tbm/pmx_storage_v2.json && echo "session OK"
# ✅ 5) 테스트 실행
bash ~/tbm/tbm.sh --mode a 2>&1 | tail -10
# → "TBM_OK" 로그 확인
ls -lat ~/tbm/screenshots/tbm_saved_*.png | head -1
모든 검증 통과 시: 내일 07:30 정상 자동 실행 가능. 더 이상 조치 불필요.
7️⃣ 핵심 정책 (절대 잊지 말 것)
| 정책 | 값 |
| cron 시각 | 07:30 / 13:30 KST (모든요일) |
| skip 정책 | 일요일(weekday=6) 자동 + memos '현장휴무' 정확 매칭 (오탐 방지, 7/4 정정) |
| skip 감지 | dt.weekday() == 6 또는 "현장휴무" in memo |
| 폴더 규칙 | MMDD <m\|a> N (예: 0704 a 9) |
| rclone 패턴 | ^${MMDD} ${MODE} [0-9]+/$ |
| 인원수 | 폴더명 마지막 숫자 (CLI --participants 오버라이드) |
| 사진 개수 | 최대 10장 |
| 소요 시간 | 30~55초 |
8️⃣ 연락처 / 스킬
- 🤖 Hermes (공무): 텔레그램 DM
8675731677 — "tbm 안 돌아가" 한 줄이면 진단 시작
- 📚 스킬:
pmx-tbm-automation — 전체 워크플로우 + 히스토리
- 📄 워크플로우 페이지:
http://서버/tbm_workflow.html
- 📂 백업:
onedrive:tbm/ (자동 동기화)
9️⃣ 7/4 검증 결과
✅ 7/2 17:50: 0702 a 9 (오후, 9명, 3장) TBM_OK
✅ 7/4 14:22: 0704 a 9 (오후, 9명, 3장) TBM_OK — 정책 갱신 후 첫 검증
🔟 참고: 정상 출력 (log_tbm_a.log 예시)
[tbm.sh] rclone 동기화 OK: 0704 a 9
[14:22:01] TBM date=2026.07.04 mode=오후 participants=9 photos=3
[14:22:05] storage_state reuse OK
[14:22:51] TBM_OK
🚨 DR 매뉴얼 v1 · 7/4 작성 · 다음 갱신: 시스템 구조 변경 시
공무: M3 (Hermes) · 검증: 7/4 14:22 TBM_OK · 단일 진실 원천: 이 문서 + 위키