# BizCare 서버 배포 가이드 (exdev.co.kr + Jenkins) ## 개요 | 트랙 | 트리거 | 동작 | |------|--------|------| | Track A | `git push origin main` | `post-receive` → `deploy-bizcare.sh` | | Track B | Jenkins `BizCare-Pipeline` | `deploy-bizcare.sh` | ## 경로 | 항목 | 경로 | |------|------| | bare repo | `/Volumes/ADATA/git/BizCare.git` (또는 기존 `BillCare.git`) | | work-tree | `/Users/aidev/apps/BizCare` (또는 기존 `BillCare`) | | 배포 스크립트 | `/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 | ## 호스트 포트 | 서비스 | 포트 | |--------|------| | frontend (Caddy upstream) | **83** | | backend (직접 헬스체크) | **18082** | | mysql | **3308** | ## 로컬 push ```bash cd /Users/macbook/dev/billCare git push origin main ``` ## HTTPS / TLS — bizcare.exdev.co.kr 활성화 ### 1) DNS `bizcare.exdev.co.kr` A(또는 CNAME) 레코드를 `billcare.exdev.co.kr` 과 **동일 서버 IP**로 추가합니다. ### 2) 인증서 발급 ```bash # 서버에서 (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` 영구 리다이렉트 ```bash 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 를 강제 재생성해야 합니다. ```bash 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가 마운트되어 있어야 갱신이 됩니다.