증상: momo-erp container 가 force-recreate 될 때 traefik docker provider 가
새 컨테이너의 라벨을 재인식 못 해 momotogether.com 요청이 Gitea 라우터로
fallback 되는 사고 (사용자 화면에 Gitea 500 에러 페이지 노출).
deploy.yml 의 docker compose up 직후 `docker restart traefik` 1회 추가.
1~2초 다른 도메인 잠시 down 되지만 라우터 정합성 보장됨.
병행: cron watchdog (/usr/local/bin/momo-traefik-watchdog.sh, 3분 간격)이
production HTML 의 "모모유통" 문자열 검증해 비정상 시 traefik 자동 재시작.
deploy 외 임의 시점 사고에도 최대 3분 안에 자동 복구.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
invoices(계산서 발행) page:
- 조회조건 추가: 거래처(SearchableSelect) / 날짜 from~to / 상태
- 조회 버튼 제거 — 입력하면 즉시 클라이언트사이드 필터 적용
- "조회 결과 합계" 카드: 면세 / 과세(공급+세액) / 합계 분리 표시
- "선택 합산" 카드: 체크박스로 고른 건들의 면세/과세/합계 실시간 합산
- 표 행마다 면세/과세 컬럼 추가
- 전체 선택 체크박스 (헤더)
deploy.yml:
- docker compose up 흐름 강화: down --remove-orphans 후 docker rm -f momo-erp 로 잔존 컨테이너 강제 제거 + --force-recreate
- 수동 SSH 배포 + 자동 배포 겹쳤을 때 "container name already in use" 충돌 자동 해소
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
docker compose build 시 latest 태그가 새 sha 로 갱신되면서 옛 sha 가 untagged
상태로 남아 매 배포마다 누적되던 문제. docker image prune -f 로 dangling 만 회수
(다른 프로젝트의 사용 중 이미지는 안 건드림).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5cbc324 배포 시 --force-recreate 가 이름 충돌(Conflict, 65adeb31db46_momo-erp)을
일으켜 컨테이너 swap 실패. 명시적으로 down --remove-orphans 후 up 으로 분리.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- useSearchParams 가 Next.js 15 prerender 단계에서 Suspense 경계를 강제해
/admin-panel 빌드 자체가 실패 → docker image 재빌드 안 됨 →
컨테이너 swap 누락(2시간째 옛 이미지). window.location.search 직접 읽기로 대체
- deploy.yml: set +e 제거 (빌드 실패가 워크플로우 success 로 묻히는 문제 차단)
- docker compose 에 --force-recreate 추가 (이미지가 같아도 컨테이너 강제 재생성)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- 기존 마커(WORKFLOW/매입 발주/SCREEN PREVIEW)는 옛 빌드에도 들어있어
배포가 실패해도 success로 묻혔음 (사용자: 사이드바 변경이 운영에 안 반영됨)
- SSH 단계에서 git rev-parse HEAD → public/build-sha.txt 에 기록 후 빌드
- 헬스체크가 운영의 /build-sha.txt 를 GITHUB_SHA 와 비교 → 불일치면 워크플로우 fail
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
증상: /m/admin/orders 거래명세표에서 [+ 택배/용차 추가] 클릭 시 "라인 저장 중 오류" 500.
원인: 마이그레이션 010 (momo_order_items.kind/extra_label, momo_orders.total_delivery/charter)이
운영 DB에 적용되지 않음. deploy.yml 의 docker compose exec 가 silent fail 했을 가능성.
[deploy.yml]
- 컨테이너 안 마이그레이션 실패 시 → 호스트에서 docker run node:20 + pg 임시 컨테이너 폴백
- 호스트는 source 디렉토리를 /work 로 마운트해서 db/migrations 와 scripts/migrate-momo.mjs 직접 실행
- 모두 실패하면 ::error:: 로 명확히 표시 (warning 무시 방지)
[lines/save]
- catch 블록에서 실제 PG 에러 메시지 노출
- 'column does not exist'(42703) 감지 시 마이그레이션 미적용 힌트 추가
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- docker-compose.prod.yml: Traefik Host 라벨 (apex + www)
- .gitea/workflows/deploy.yml: NEXTAUTH_URL + 헬스체크 URL
- CICD_SETUP.md, docs/proposal.html, docs/MOMO_DISTRIBUTION_SPEC.md 도메인 표기 수정
DNS 입력 (가비아):
A @ 183.99.177.40
A www 183.99.177.40
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- /api/deploy/webhook: X-Deploy-Token 검증 후 백그라운드로 deploy.sh spawn
- scripts/deploy.sh: git pull + docker compose up --build + migrate
- docker-compose.prod.yml: docker.sock + 소스 디렉토리 마운트
- deploy.yml: webhook 호출 + 헬스체크 폴링 (시크릿 의존성 제거)
- 미들웨어 공개 경로에 /api/deploy/webhook 추가
서버 1회 셋업 (docker-compose.prod.yml 갱신본을 한 번 배포하기만 하면
이후 push 시 자동 재배포 영구 동작)
이전 실패 원인: Gitea Actions runner 가 actions/checkout@v4 를 가져오지
못해 4초만에 즉사. 어차피 원격 서버에서 git clone 하므로 checkout 단계
자체가 불필요. 첫 단계에서 필수 secret 부재 여부를 명시적으로 검사.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- 배포 대상 서버를 183.99.177.40로 확정 (DNS가 가리키는 서버, DB도 같은 곳)
- docker-compose.prod.yml: external network를 traefik-net으로 변경
(toktork_server_default는 211 서버용이라 DNS와 불일치)
- traefik.docker.network=traefik-net 라벨 추가
- .gitea/workflows/deploy.yml: main push 시 자동 배포
- CICD_SETUP.md: 시크릿 등록 및 Runner 설정 가이드