2026-08-04 세션 — 생산현황 메모 변경 텔레그램 즉시 알림 (운영배포)
페페 지시: "pfs 생산현황 메모 내용 수정,변경 되는 경우 내게 텔레그램 알람 주게 해줘. 수정,변경에 신호발신을 달아서 매번 바로 알람오게 설정해. 운영배포 승인. 앞으로 pfs 사이트맵에도 변경사항에 대해 반영하는 것 기본규칙으로 한다."
무엇
생산현황 메모(field/list 「생산 메모」 모달 → print/status 메모창)가 저장될 때마다 페페 폰으로 즉시 텔레그램.
- 신규
common/utils/telegram_notify.py—send()/send_async()/enabled()/env_label() field_memo_service.save_field_memo()에 신호 1곳. 저장 경로가 여기 하나로 모인다(모든 화면이POST /api/field/memo) → 화면·컨트롤러마다 달지 않는다.- 컨트롤러는
session["user_name"]만 넘긴다(저장 자체엔 안 쓰고 알림 본문의 "누가"에만 쓴다). - 본문 =
📝 PFS 생산현황 메모 변경 [운영|테스트] / 작성자·시각 / ■변경 후 / ■변경 전, 각 700자에서 절단.
배포 = master cf6d117+4904f30 → deploy-live 44ece4b(선별 포워드 4파일, AL 미반영분 무유입 확인).
🔑 알림 경로 — broker 가 아니다
EC2 → api.telegram.org 직결. 코디 PC 의 broker(127.0.0.1:7777)는 EC2 에서 못 닿는다.
키는 /home/ubuntu/env/pfs-{live,test}.env 에 주입(PFS_TELEGRAM_TOKEN·PFS_TELEGRAM_CHAT_ID,
백업 .bak-memo-notify). wsgi.py 가 읽는 <repo>/.env.production 이 이 파일로 심볼릭 링크돼 있어
env 파일에 넣고 재시작하면 앱에 들어간다(uwsgi ini 의 env= 2줄과는 별개 경로).
봇은 broker 와 같은 봇·같은 chat 을 재사용 — 페페가 보는 창구가 하나로 유지된다(sendMessage 만 쓰므로
broker 의 getUpdates 폴링과 충돌 없음).
끄는 법 = env 에서 TOKEN 줄 삭제 후 재시작. 코드 수정 불요(토큰 없으면 조용히 no-op).
설계 원칙 — 알림이 업무를 막지 않는다
별도 데몬 스레드 + 전량 예외 삼킴(_quiet). 텔레그램이 죽어도 저장은 이미 확정이고 응답도 안 늦는다.
알림 실패로 저장이 실패하면 그게 더 큰 사고다 — 자체검사 5번 항목이 이걸 강제로 재현해서 지킨다.
검증
- 자체검사
scripts/test_memo_notify.py21항목 ALL PASS(네트워크 0·실저장 0) — 미설정 no-op · 본문 구성 · 4096자 한도 · 최초 저장(변경 전 없음) · 🔴전송을 강제로 터뜨려도 저장 2건 성공. - 서버 배선 실측 = 테스트/운영 각각
enabled: True·env_label= 테스트/운영 ·send ok: True(실왕복). - 테스트 실서버 E2E
_memo_notify_e2e.py10항목 ALL PASS — 비로그인 401(P0 게이트 회귀) · 로그인 · 저장 200 · current/previous 밀림 · 원복 확인. 저장 2건에 대해 텔레그램 2통 발신. - 운영 = HEAD
44ece4b· uwsgi active ·/login200 · 비로그인/api/field/memo/401 · 훅 포함 확인 · 실전송 성공. ⚠운영은 저장 E2E 를 하지 않았다 — 운영 메모는 사람이 보는 실데이터라previous슬롯이 밀린다. 코드·env 는 테스트와 동일하고 배선을 실왕복으로 증명했으므로, 최종 확인은 페페가 실제로 메모를 한 번 고치는 것이 가장 정확하다. - 사이트맵 재빌드(새 기본규칙 첫 적용) — 두 서버 HEAD 갱신 반영,
/field/list= same(배포 완료), 주황은 여전히 AL 2건뿐, 「화면 밖 미반영」 24→28(늘어난 4건 = 사이트맵 도구 자신, 서버 무관).
🆕 신규 기본규칙 (페페 지시)
pfs를 고치면 사이트맵 재빌드까지가 한 작업이다. CLAUDE.md §4 + projects/pfs/rules.md 에 등록.
테스트 push 후 한 번, 운영배포 후 또 한 번 돌리고 둘 다 보고에 적는다.
함정
- 서버에서
python3 -c로wsgi.py를exec하면__file__이 없어 NameError — env 확인은.env파일을 직접 읽어os.environ.setdefault하는 쪽이 안전하다. scripts/_*는.gitignore대상(26.8.32a55ca7)이라 자체검사를_로 시작하는 이름으로 두면 리포에 안 남는다 → 남길 검사는test_*로 짓는다(선례scripts/test_kakao_board.py).
안 한 것
- 메모 삭제/이력 조회 알림 — 현재 API 에 삭제가 없다(저장이 유일한 변경 경로).
- 테스트 서버 알림 끄지 않았다 —
[테스트]라벨로 구분되고, 테스트 저장은 사실상 코디 검증 때뿐이다. 거슬리면pfs-test.env의 TOKEN 줄만 지우면 된다.