Files
BizCare/deploy_server_guide.md
2026-07-13 10:07:33 +09:00

4.3 KiB

BizCare 서버 배포 가이드 (exdev.co.kr + Jenkins)

개요

트랙 트리거 동작
Track A git push origin main post-receive → deploy-bizcare.sh
Track B Jenkins BizCare-Pipeline (구 BillCare-Pipeline 호환) deploy-bizcare.sh

경로

항목 경로
bare repo (정본) /Volumes/ADATA/git/BizCare.git
bare repo (구) /Volumes/ADATA/git/BillCare.git → BizCare 배포로 위임
work-tree /Users/aidev/apps/BizCare
배포 스크립트 /Volumes/ADATA/git/deploy-bizcare.sh
로그 /Volumes/ADATA/logs/deploy/bizcare-deploy.log
HTTPS (정본) https://bizcare.exdev.co.kr
HTTPS (구) https://billcare.exdev.co.kr → bizcare 로 301
Jenkins http://127.0.0.1:8090/ — Job BizCare-Pipeline

호스트 포트

서비스 포트
frontend (Caddy upstream) 83
backend (직접 헬스체크) 18082
mysql 3308

로컬 remote (필수)

cd /Users/macbook/dev/billCare
git remote set-url origin ssh://aidev@stock.exdev.co.kr/Volumes/ADATA/git/BizCare.git
git remote -v   # …/BizCare.git 이어야 함

로컬 push

cd /Users/macbook/dev/billCare
git push origin main

post-receive → deploy-bizcare.sh → /Users/aidev/apps/BizCare + bizcare-* 컨테이너.

Jenkins (Track B)

# 서버에서 Job 설치/갱신 (최초 1회 또는 경로 변경 시)
bash /Users/aidev/apps/BizCare/scripts/install-jenkins-bizcare-job.sh
  • 정본 Job: BizCare-Pipeline (SCM: file:///Volumes/ADATA/git/BizCare.git)
  • 구 Job: BillCare-Pipeline 도 동일하게 BizCare 경로로 배포
  • 배포 명령: GIT_DIR/WORK_TREE 지정 후 /Volumes/ADATA/git/deploy-bizcare.sh

일회 git 전환: scripts/migrate-billcare-to-bizcare.sh

HTTPS / TLS — bizcare.exdev.co.kr 활성화

1) DNS

bizcare.exdev.co.kr A(또는 CNAME) 레코드를 billcare.exdev.co.kr 과 동일 서버 IP로 추가합니다.

2) 인증서 발급

# 서버에서 (HTTP-01 webroot 준비된 상태)
chmod +x /Users/aidev/apps/BizCare/scripts/issue-bizcare-cert.sh
# 또는 work-tree 경로에 맞게
BIZCARE_DOMAIN=bizcare.exdev.co.kr \
ACME_WEBROOT=/var/www/certbot \
CERT_OUT=/Users/aidev/dev/exAIChatbot2.0/docker/nginx/certs/bizcare \
  ./scripts/issue-bizcare-cert.sh
항목 값
URL https://bizcare.exdev.co.kr
Caddy ex-chatbot-caddy → host :83
cert 경로 .../nginx/certs/bizcare/{fullchain,privkey}.pem
구 도메인 cert .../nginx/certs/billcare/ (리다이렉트용)

3) Caddy 스니펫 적용

scripts/caddy-bizcare.Caddyfile 내용을 ex-chatbot Caddyfile 에 import/반영합니다.

  • bizcare.exdev.co.kr → reverse_proxy host.docker.internal:83
  • billcare.exdev.co.kr → https://bizcare.exdev.co.kr 영구 리다이렉트
docker exec ex-chatbot-caddy caddy reload --config /etc/caddy/Caddyfile

4) CORS (로그인 403 / Invalid CORS request)

브라우저에서 https://bizcare.exdev.co.kr 로 로그인 시 Origin 이 bizcare 인데, 백엔드 컨테이너 env에 billcare만 있으면 Spring 이 403 Invalid CORS request 를 반환합니다.

배포 스크립트/APP_CORS_ORIGINS에 두 도메인이 포함되어 있어야 하고, 기존 컨테이너는 up -d만으로는 env가 갱신되지 않으므로 backend 를 강제 재생성해야 합니다.

cd /Users/aidev/apps/BizCare   # work-tree
export APP_CORS_ORIGINS="https://bizcare.exdev.co.kr,https://billcare.exdev.co.kr,http://bizcare.exdev.co.kr,http://billcare.exdev.co.kr,http://localhost:83,http://127.0.0.1:83"
docker compose up -d --force-recreate backend

# 확인 (200 + JSON 이어야 함, 403/Invalid CORS 이면 실패)
curl -sS -X POST 'https://bizcare.exdev.co.kr/api/auth/login' \
  -H 'Content-Type: application/json' \
  -H 'Origin: https://bizcare.exdev.co.kr' \
  -d '{"userid":"x","password":"x"}'

즉시 조치만 필요하면 위 명령만 실행하면 됩니다. 코드에 https://*.exdev.co.kr 패턴도 추가되어 이후 배포 시에도 동일 이슈를 막습니다.

공유 인증서(stock/chatbot) SAN에 bizcare가 없어 별도 발급이 필요합니다. gc-frontend에 acme-webroot가 마운트되어 있어야 갱신이 됩니다.