시스템 구조도/03 — 07
사이트는 받고 보여주기만 하고, 읽기·엑셀·창고는 회사 공유폴더가 붙은 PC 한 대가 맡는다
(구버전: 구조도_v0.1 — 창고를 R2에 두는 안. 지시자 결정으로 폐기.)
부품과 책임
| 부품 | 책임 | 어디에 |
|---|---|---|
| 고객 (브라우저) | PDF 올리기, 엑셀 내려받기 | 고객 PC·폰 |
| 지시자·동생 (브라우저) | 확인 화면에서 자신 없는 칸 고치기, 질의응답에 답 적기 | 회사 PC |
| 폰 텔레그램 | 새 업로드·새 질문 알림 받기, 버튼·답장으로 답하기 | 지시자 폰 미확정 봇 토큰 |
| 사이트 kpf.dreamcustomsservice.com | 올리기 · 확인하기 · 받기 · 질의응답 · 기록 페이지 · 텔레그램 봇(웹훅) | Cloudflare Workers + 정적 자산 |
| 장부 (D1) | 올린 기록, 건 상태, 질문과 답, 사람이 고친 칸, 부품 기준표 | Cloudflare D1 (이미 생성: kpf) |
| Cloudflare Tunnel | 엔진 PC를 사이트에 연결. PDF 전달, 결과 회수 | 엔진 PC에 cloudflared 설치 (동생 담당) |
| 읽기 엔진 (Python) | 페이지 나누기 → 건별 쪼개 저장 → 읽기(OCR + AI 비전) → 검산 | 엔진 PC |
| 엑셀 제작기 (Python, openpyxl) | 고객사 엑셀 1개에 시트 추가. 줄 세워 하나씩. 이전 버전 보관 | 엔진 PC |
| 회사 공유폴더 = 창고 | 원본 덩어리 PDF, 건별 PDF, 고객사 엑셀(+이전 버전), 쪽 이미지, 판독 결과 | 회사 공유폴더 (경로 미확정) |
왜 이렇게 나누나
- Workers는 Python(OCR, openpyxl)을 못 돌린다. 그래서 읽기·엑셀은 PC에서 돈다.
- 클라우드 창고(R2)는 쓰지 않는다(지시자 결정, 2026-09-02). 회사 공유폴더가 창고다. 그래서 창고가 붙은 PC 한 대가 엔진도 맡는 게 가장 단순하다.
- 사이트와 PC 사이는 Cloudflare Tunnel(무료)로 잇는다. PC가 바깥에 포트를 열 필요가 없고, 사이트가 받은 PDF를 터널 너머 PC로 넘기면 PC가 공유폴더에 저장한다.
- 단점: 엔진 PC가 꺼져 있으면 업로드가 접수만 되고 처리는 밀린다. 사이트는 "접수됨 · 엔진 대기"로 보여준다.
공유폴더 구조 (초안, 동생이 경로만 정하면 된다)
<공유폴더>/kpf/ 원본/ YYYYMMDD/원본파일명.pdf 올린 그대로 건별/ YYYYMMDD/KPF_인보이스번호_수입자_#건번호.pdf 이미지/ 건별파일명/p01.png … 읽기용 쪽 이미지 판독/ 건별파일명.json 뽑은 값 · 신뢰도 · 검산 결과 엑셀/ KPF_쿠시업로드.xlsx 고객사 엑셀 1개 (현재본) 엑셀/이전/ KPF_쿠시업로드_YYYYMMDD_HHMM.xlsx 시트 추가 전 사본
워시존에서 승계하는 것
- 문서가 원본, 코드·화면은 산출물 (
docs/*.md→build_docs.py→public/). - 그림은 손으로 그리지 않는다 (
gen_kpf_diagrams.py). - 패스코드 인증(서명 쿠키 + 발급 패스는 매 요청 DB 재확인),
run_worker_first같은 "빠지면 인증 무력화" 항목은 코드지도 맨 위에. - 마이그레이션 = 스키마 + 재실행 가능한 시드. 정책 공백은 코드가 아니라 질의로.
- 발견 → 확인 → 조치, "고쳤다는 것은 주장이지 사실이 아니다"(재검증 목록).
배포
- 저장소: GitHub
kpf(비공개). 고객 서류 샘플(샘플/)은 저장소에 넣지 않는다. - 사이트:
npx wrangler deploy→ Workers → 커스텀 도메인 kpf.dreamcustomsservice.com. Cloudflare 계정은 customsshin@gmail.com (도메인 소유). D1kpf는 이 계정에 생성됨. - 엔진 PC: 공유폴더 마운트 + Python 3.11 + cloudflared 터널. 자세한 순서는 저장소 루트의 마스터 설계서.