🚨 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)
OneDriveonedrive:tbm/ (MMDD m|a N 폴더)
PMX URLhttps://www.gs-pmx.com/com/qse/safety/tbm-dlg?mnuId=000331
Telegramchat_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-auto1430 7 / 30 13
1 rclonetbm.sh36-76rclone lsf + sync
2 일체크tbm_auto.py148-160fetch_schedule_workday()
3 폴더tbm_auto.py73-122collect_photo_pairs()
4 로그인tbm_auto.py215-231login_if_needed()
5 입력tbm_auto.py303-352, 384set_date_range / choose_work_type
6 사진tbm_auto.py440set_input_files (nth(1))
7 저장+TGtbm_auto.py473, 173click_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️⃣ 연락처 / 스킬

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 · 단일 진실 원천: 이 문서 + 위키