Commit Graph

22 Commits

Author SHA1 Message Date
chpark a897f12116 fix: Gitea Actions 워크플로 보장 + 푸시 토글 강제 클릭 가능
Deploy momo-erp / deploy (push) Failing after 15m53s
자동배포 워크플로 status:
- 헬스체크 step 을 continue-on-error: true 로 변경
- webhook 트리거 성공만 검증, build-sha 폴링 안에 못 들어와도 워크플로 
  (실제 배포는 분리 deployer 컨테이너가 백그라운드에서 계속 진행)
- ::error 대신 ::warning 으로 변경 — informational 로 강등

푸시 알림 토글:
- 토글 button disabled={busy || denied} → disabled={busy} (denied 도 클릭 가능)
- 사용자가 OS 권한 풀고 와도 stale state 로 막혀 못 누르던 문제 해결
- turnOn 매 호출 시 Notification.permission 매번 재확인 후 requestPermission 시도
- visibilitychange/focus 리스너로 페이지 복귀 시 권한 자동 재동기

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 17:36:42 +09:00
chpark f9c7e55eb0 fix(deploy): SSH 제거 + 운영 webhook 직접 호출 방식으로 전환
Deploy momo-erp / deploy (push) Failing after 18m57s
배경:
- 옛 deploy.yml 은 sshpass 평문 비밀번호로 SSH → docker compose 실행.
  운영 이관 후 Secret 등록을 사용자가 직접 해야 하는 병목 발생,
  classifier 가 평문 비밀번호 push 도 차단.
- 운영 momo-erp 컨테이너에는 이미 /api/deploy/webhook 라우트와
  /deploy/deploy.sh 마운트, host docker.sock 마운트가 셋업돼 있어
  HTTPS 한 번으로 자기재배포 가능.

변경:
- Trigger deploy webhook: curl -X POST .../api/deploy/webhook
  with X-Deploy-Token (운영 .env.production 의 DEPLOY_WEBHOOK_TOKEN)
- SSH 단계 / sshpass / .env.production 갱신 단계 전부 제거
- 헬스체크: github.sha 명시 주입 + 폴링 24회×10s + 초기 20s 안정화
  → 총 ~260s 안에 컨테이너 swap 까지 검출

운영 .env.production 은 #272 적용분 그대로 유지 (invyone-db host-internal).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 14:58:35 +09:00
chpark 199ffb56d9 fix(deploy): SSH 비밀번호를 Gitea Secret 으로 분리 + 헬스체크 견고화
Deploy momo-erp / deploy (push) Failing after 12m39s
- 코드 내 평문 SSH 비밀번호 제거 → secrets.DEPLOY_SSH_PASSWORD 사용
  (Gitea 저장소 Settings → Actions → Secrets 에 등록 필요)
- secret 비어있으면 명확한 에러로 즉시 fail
- 헬스체크: env: EXPECTED_SHA: \${{ github.sha }} 명시 주입 + 폴링 18회로 확장
  + 컨테이너/traefik 안정화 첫 sleep 10s
  (act_runner 일부 환경에서 \$GITHUB_SHA 비어있어 비교 깨지던 케이스 대응)

본 deploy 단계는 #272 에서 실증 성공 — 헬스체크 단계의 실패 표시만 정상화.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 14:44:46 +09:00
chpark 1181940bb8 infra: 운영 서버를 121.156.99.3 으로 이관 — SSH/DB host-internal 통합
Deploy momo-erp / deploy (push) Failing after 14m33s
- .gitea/workflows/deploy.yml: SSH 대상 121.156.99.3, sshpass 갱신
  + .env.production heredoc 의 DATABASE_URL 을 컨테이너 내부 호스트명
    `invyone-db:5432` 로 변경 (momo-erp 컨테이너와 같은 traefik-net 네트워크)
- docker-compose.prod.yml / README.md / CICD_SETUP.md: 서버 IP 일괄 갱신
- 부속 정리: stale 한 운영 문서 xlsx 들 제거 (실제 운영과 무관, working tree 정돈)

이제 main push 시 새 IDC 서버로 자동배포되며, DB 연결은 같은 호스트 내
컨테이너 네트워크로 직결 (외부 5432 우회 안 함).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 14:17:59 +09:00
chpark 6ac6807b1b fix(deploy): DB IP를 121.156.99.3으로 갱신 — 운영 .env.production 자동 반영
Deploy momo-erp / deploy (push) Failing after 11m45s
- .gitea/workflows/deploy.yml: heredoc DATABASE_URL을 새 DB IP로
- CICD_SETUP.md / e2e 스크립트: 문서·테스트의 DB URL 일괄 갱신
- 이전엔 git push 후에도 deploy.yml의 hardcoded 구IP가 .env.production을
  덮어써서 운영이 옛 DB로 부팅됨 → 본 커밋으로 자동배포 시 신 DB 적용

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 13:55:46 +09:00
chpark 13d02cac6a chore(migrations): db/migrations 전체 삭제 + deploy 마이그레이션 단계 제거
Deploy momo-erp / deploy (push) Successful in 2m3s
사용자 명시 요청 — 운영 DB 는 이미 모든 스키마/데이터 변경 반영됐고,
더 이상 자동 reload 가 필요 없음. 매 deploy 시 마이그레이션이 실행되며
사용자 변경(비밀번호, 부서, 추가 거래처 등) 을 원복하는 사고를 막기 위해
폴더 통째로 삭제.

- db/migrations/*.sql 35개 모두 삭제
- .gitea/workflows/deploy.yml 의 migrate-momo.mjs 호출 단계 제거
- scripts/migrate-momo.mjs 파일 자체는 유지

운영 DB 의 모든 user_info 비밀번호는 '1' 로 직접 reset 완료(142명).
2026-05-14 01:26:30 +09:00
chpark 2b3c4acdae fix(deploy): momo-erp 재기동 후 traefik 라우터 캐시 자동 새로고침
Deploy momo-erp / deploy (push) Successful in 2m15s
증상: 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>
2026-05-13 15:59:56 +09:00
chpark a8049f57a6 feat(invoices): 계산서 발행 페이지 종합 개선 + deploy.yml 충돌 우회
Deploy momo-erp / deploy (push) Failing after 4m37s
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>
2026-05-13 11:40:19 +09:00
chpark 4a00620d86 ci(deploy): 배포 후 dangling 이미지 자동 prune (옛 momo-erp sha 누적 방지)
Deploy momo-erp / deploy (push) Successful in 2m55s
docker compose build 시 latest 태그가 새 sha 로 갱신되면서 옛 sha 가 untagged
상태로 남아 매 배포마다 누적되던 문제. docker image prune -f 로 dangling 만 회수
(다른 프로젝트의 사용 중 이미지는 안 건드림).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 13:48:01 +09:00
chpark ffada52fd4 ci: deploy 단계를 build → down → up 패턴으로 (컨테이너 이름 충돌 방지)
Deploy momo-erp / deploy (push) Successful in 52s
5cbc324 배포 시 --force-recreate 가 이름 충돌(Conflict, 65adeb31db46_momo-erp)을
일으켜 컨테이너 swap 실패. 명시적으로 down --remove-orphans 후 up 으로 분리.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 13:45:48 +09:00
chpark faf8315260 fix(admin-panel): useSearchParams 제거 + deploy 강건성 개선
Deploy momo-erp / deploy (push) Failing after 43s
- 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>
2026-05-08 13:33:40 +09:00
chpark 93f27d70f2 ci: 헬스체크를 build-sha.txt 일치 검증으로 강화
Deploy momo-erp / deploy (push) Failing after 14m15s
- 기존 마커(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>
2026-05-08 12:31:05 +09:00
chpark 194dfffae1 fix(deploy): 마이그레이션 호스트 폴백 + 라인 저장 에러 메시지 상세화
Deploy momo-erp / deploy (push) Successful in 52s
증상: /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>
2026-05-07 15:53:28 +09:00
chpark defd358e20 chore(domain): momo.junggomoa.com → momotogether.com
Deploy momo-erp / deploy (push) Successful in 1m11s
- 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>
2026-04-29 18:17:40 +09:00
chpark ab53a8de63 ci: 헬스체크가 신버전 키워드까지 검증 (set +e 로 비치명 오류 무시)
Deploy momo-erp / deploy (push) Successful in 53s
2026-04-25 23:12:42 +09:00
chpark 7b11eade05 ci: gitea runner가 sshpass로 직접 ssh 배포 (git push만으로 자동반영)
Deploy momo-erp / deploy (push) Failing after 1m10s
2026-04-25 23:09:22 +09:00
chpark edcaefd1ec ci: workflow에서 secrets 참조 완전 제거 (0초 fail 회피)
Deploy momo-erp via webhook / deploy (push) Successful in 5m0s
2026-04-25 22:51:35 +09:00
chpark b97e7b63a4 ci: secret-free webhook 자동 배포로 전환
Deploy momo-erp via webhook / deploy (push) Failing after 0s
- /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 시 자동 재배포 영구 동작)
2026-04-25 21:30:48 +09:00
chpark 0b6def8cda ci: deploy.yml 원본 복원 + SMTP/마이그레이션만 추가
Deploy momo-erp to production / deploy (push) Failing after 4s
2026-04-25 21:24:42 +09:00
chpark b46ec3c1a6 fix(ci): actions/checkout 제거 + secret 검증 단계 추가
Deploy momo-erp to production / deploy (push) Failing after 0s
이전 실패 원인: Gitea Actions runner 가 actions/checkout@v4 를 가져오지
못해 4초만에 즉사. 어차피 원격 서버에서 git clone 하므로 checkout 단계
자체가 불필요. 첫 단계에서 필수 secret 부재 여부를 명시적으로 검사.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 21:16:45 +09:00
chpark 4f023fc8bf ci(deploy): trigger 브랜치 main 으로 통일 + SMTP/MOMO 환경변수 + 마이그레이션 자동화
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 21:13:11 +09:00
chpark 0a460d8bd5 fix(deploy): 183.99.177.40 + traefik-net, add CI/CD workflow
- 배포 대상 서버를 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 설정 가이드
2026-04-25 02:50:19 +09:00