From 27056073da017cdfa082737de1607c2a3ea17d6f Mon Sep 17 00:00:00 2001 From: Macbook Date: Tue, 11 Aug 2026 22:30:48 +0900 Subject: [PATCH] Deploy: exdev sync 2026-08-11 22:30:48 --- git_fetch_all.sh | 29 ++++++++++++++++++++++++++--- server-dev/README.md | 5 ++++- server-dev/oracle/README.md | 5 ++++- server-dev/start-all-server.sh | 24 ++++++++++++++++++++++-- 4 files changed, 56 insertions(+), 7 deletions(-) diff --git a/git_fetch_all.sh b/git_fetch_all.sh index 4505fac..2f1f178 100755 --- a/git_fetch_all.sh +++ b/git_fetch_all.sh @@ -11,8 +11,9 @@ # ./git_fetch_all.sh --no-commit # fetch/merge만 (commit·push 생략) # # ★ 운영(GitHub) push 전용 — 개발서버(exdev) 주소를 커밋/push 하지 않는다. -# start-all-server.sh 가 런타임 ENV 로만 exdev(127.0.0.1 / host.docker.internal)를 적용한다. -# 이 스크립트는 commit 직전에 운영 기본값(172.16.180.130)을 파일에 복원한 뒤 push 한다. +# start-all-server.sh 가 런타임 ENV 로만 exdev(127.0.0.1 Mongo / localhost Oracle TROAD / +# host.docker.internal RAG)를 적용한다. +# 이 스크립트는 commit 직전에 운영 기본값(172.16.*)을 파일에 복원한 뒤 push 한다. # (.env / EXDEV_LOCAL / server-dev 오버레이는 GitHub 대상이 아님) # # 대상 (.gitmodules) — 모두 branch=chatbot2.0-agent (main 사용 안 함): @@ -122,6 +123,10 @@ PROD_WAS_HOST="172.16.180.130" PROD_WAS_API="http://${PROD_WAS_HOST}:8086/api" PROD_RAG_CHAT="http://${PROD_WAS_HOST}:28012/agent/chat" PROD_MONGO_URI="mongodb://exDev:ehfhrhdtk!!@${PROD_WAS_HOST}:27017/chatbot?heartbeatFrequencyMS=30000&minPoolSize=8&maxIdleTimeMS=18000000" +# 운영 TROAD Oracle (start-all 은 SPRING_DATASOURCE_TROAD_* ENV 로 localhost 오버라이드) +PROD_TROAD_JDBC_URL="jdbc:oracle:thin:@172.16.163.76:1522/TROAD" +PROD_TROAD_USERNAME="TROAD_APP" +PROD_TROAD_PASSWORD='!ryxhdapp2025' restore_production_endpoints_before_commit() { local path="$1" @@ -135,6 +140,15 @@ restore_production_endpoints_before_commit() { # URI 의 @ 는 perl 치환부 배열 보간을 피하기 위해 ENV 로 전달 PROD_MONGO_URI="${PROD_MONGO_URI}" perl -i -pe \ 's|uri:\s*mongodb://\S+|uri: $ENV{PROD_MONGO_URI}|g' "${yml}" + # troad datasource 를 로컬 Oracle 로 바꿔 둔 경우 운영값 복원 + PROD_TROAD_JDBC_URL="${PROD_TROAD_JDBC_URL}" \ + PROD_TROAD_USERNAME="${PROD_TROAD_USERNAME}" \ + PROD_TROAD_PASSWORD="${PROD_TROAD_PASSWORD}" \ + perl -i -0pe ' + s|(troad:\s*\n(?:[ \t]+[^\n]*\n)*?[ \t]+url:\s*)\S+|$1$ENV{PROD_TROAD_JDBC_URL}|g; + s|(troad:\s*\n(?:[ \t]+[^\n]*\n)*?[ \t]+username:\s*)\S+|$1$ENV{PROD_TROAD_USERNAME}|g; + s|(troad:\s*\n(?:[ \t]+[^\n]*\n)*?[ \t]+password:\s*).*|$1"$ENV{PROD_TROAD_PASSWORD}"|g; + ' "${yml}" fi ;; kakaoChatbotSkill-chatbot2.0-agent) @@ -189,8 +203,17 @@ assert_no_exdev_endpoints_for_push() { case "${path}" in chatbotApi-chatbot2.0-agent) - hits="$(grep -nE 'mongodb://(127\.0\.0\.1|localhost)|host\.docker\.internal' \ + hits="$(grep -nE 'mongodb://(127\.0\.0\.1|localhost)|host\.docker\.internal|jdbc:oracle:thin:@(127\.0\.0\.1|localhost)' \ "${dir}/src/main/resources/application.yml" 2>/dev/null || true)" + # troad 블록이 로컬 계정(OPR_MAIN)으로 바뀌었는지도 차단 + if awk ' + /^[[:space:]]*troad:[[:space:]]*$/ { in_troad=1; next } + in_troad && /^[[:space:]]*[a-zA-Z0-9_-]+:[[:space:]]*$/ && $0 !~ /^[[:space:]]*troad:/ { in_troad=0 } + in_troad && /username:[[:space:]]*OPR_MAIN/ { found=1 } + END { exit found ? 0 : 1 } + ' "${dir}/src/main/resources/application.yml" 2>/dev/null; then + hits+=$'\n'"troad.username=OPR_MAIN (exdev local Oracle — must not commit)" + fi ;; kakaoChatbotSkill-chatbot2.0-agent) hits="$(grep -nE '127\.0\.0\.1:(8086|28012)|host\.docker\.internal:(8086|28012)' \ diff --git a/server-dev/README.md b/server-dev/README.md index 719a99d..115d779 100644 --- a/server-dev/README.md +++ b/server-dev/README.md @@ -127,7 +127,10 @@ cd /Users/aidev/dev/exAichatbot_agent - Docker Compose: `server-dev/docker-compose.oracle.yml` (`gvenzl/oracle-free:23-slim`, arm64 지원) - 상세: [`server-dev/oracle/README.md`](oracle/README.md) -- `start-all-server.sh` 기동 시 자동 시작, `stop-all-server.sh` 중지 시 자동 중지(데이터 볼륨 유지) +- `start-all-server.sh` 기동 시 Oracle 컨테이너 자동 시작 + WAS에 + `SPRING_DATASOURCE_TROAD_URL/USERNAME/PASSWORD` 를 **localhost** 로 ENV 주입 + (`application.yml` 운영 172.16.163.76 값은 파일에 그대로 둠 — `git_fetch_all.sh` push 시 복원·검증) +- `stop-all-server.sh` 중지 시 자동 중지(데이터 볼륨 유지) - 업무 객체는 `server-dev/oracle/sql/*.sql` — 기동 후 비어 있으면 `oracle/apply-sql.sh` 가 자동 적용 - `OPR_MAIN.V_INCIDENT_FTMS` (돌발/정체 교통정보, 샘플 124건) - `TROAD_APP.V_ROUTE_NEW_NM` / `V_ROUTE_TRFC_VER001` / `TLISDEV.T_TRMB_CD_INFO01M1` (노선별 혼잡 — **기존 chatbotApi 조회 SQL 그대로**) diff --git a/server-dev/oracle/README.md b/server-dev/oracle/README.md index ee5458e..b830c15 100644 --- a/server-dev/oracle/README.md +++ b/server-dev/oracle/README.md @@ -13,7 +13,10 @@ | Container | `exaichatbot-agent-oracle-troad` | | Volume | `exaichatbot-agent-oracle-troad-data` | -`chatbotApi-chatbot2.0-agent/src/main/resources/application.yml` 의 `spring.datasource.troad` 설정과 일치합니다. +`application.yml` 의 기본값은 운영 TROAD(`172.16.163.76`)를 유지합니다. +개발서버에서는 `start-all-server.sh` 가 아래 ENV 로만 localhost Oracle 을 주입합니다 +(`SPRING_DATASOURCE_TROAD_URL` / `_USERNAME` / `_PASSWORD`). +`git_fetch_all.sh` 는 커밋 전 yml 을 운영값으로 되돌리므로 exdev 설정이 GitHub에 반영되지 않습니다. 개발서버가 Apple Silicon(arm64) 이므로 amd64 전용인 `gvenzl/oracle-xe:21` 대신 arm64 를 지원하는 `gvenzl/oracle-free:23-slim` 을 사용합니다. diff --git a/server-dev/start-all-server.sh b/server-dev/start-all-server.sh index df73ab1..02ab116 100755 --- a/server-dev/start-all-server.sh +++ b/server-dev/start-all-server.sh @@ -13,9 +13,10 @@ # # ★ 개발서버(exdev) 주소/설정은 이 스크립트가 런타임 ENV 로만 적용한다. # - WAS Mongo → 127.0.0.1 (SPRING_DATA_MONGODB_URI) +# - WAS TROAD Oracle → 127.0.0.1:1521/ORCL2 (SPRING_DATASOURCE_TROAD_*) # - Skill → 로컬 WAS/RAG (CHATBOT_API_BASE_URL, RAG_AGENT_CHAT_URL) # - RAG .env → host.docker.internal + EXDEV_LOCAL=true -# application.yml 등 커밋 파일은 운영 기본값(172.16.180.130)을 유지한다. +# application.yml 등 커밋 파일은 운영 기본값(172.16.*)을 유지한다. # 공식 GitHub 반영은 ./git_fetch_all.sh 전용 (exdev 주소를 push 하지 않음). # # 로컬 Mac 실행 시: Gitea(exdev) 최신 merge → 현재 소스 commit/push → 원격 배포. @@ -50,6 +51,10 @@ INTERNAL_TOOL_API_KEY="${INTERNAL_TOOL_API_KEY:-exdev-agent-tool-key}" PUBLIC_BASE_URL="${PUBLIC_BASE_URL:-https://chatbot.exdev.co.kr}" # exdev 전용 — 소스(application.yml)를 수정하지 않고 ENV 로만 주입 EXDEV_MONGO_URI="${EXDEV_MONGO_URI:-mongodb://127.0.0.1:27017/chatbot?heartbeatFrequencyMS=30000&minPoolSize=8&maxIdleTimeMS=18000000}" +# Docker Oracle (server-dev/docker-compose.oracle.yml) — 운영 172.16.163.76 대신 로컬 +EXDEV_TROAD_JDBC_URL="${EXDEV_TROAD_JDBC_URL:-jdbc:oracle:thin:@127.0.0.1:1521/ORCL2}" +EXDEV_TROAD_USERNAME="${EXDEV_TROAD_USERNAME:-OPR_MAIN}" +EXDEV_TROAD_PASSWORD="${EXDEV_TROAD_PASSWORD:-${ORACLE_TROAD_PASSWORD:-test}}" LLM_PORT="${LLM_PORT:-16000}" EMBED_PORT="${EMBED_PORT:-16001}" @@ -688,6 +693,18 @@ verify_stack() { else log "✅ chatbotApi domain tools OK" fi + # TROAD Oracle 은 반드시 로컬 Docker(127.0.0.1:1521) — 운영 172.16.163.76 타임아웃 방지 + if ! $SKIP_ORACLE && ! $SKIP_JAVA; then + local cong_code + cong_code="$(curl -sS -m 25 -o /tmp/exdev-cong.json -w '%{http_code}' \ + "http://127.0.0.1:${WAS_PORT}/api/troad/congestion?routeName=%EA%B2%BD%EB%B6%80%EC%84%A0" 2>/dev/null || echo 000)" + if [[ "${cong_code}" != "200" ]] || ! grep -q '"status"[[:space:]]*:[[:space:]]*true' /tmp/exdev-cong.json 2>/dev/null; then + log "❌ TROAD 정체 조회 실패 (http=${cong_code}) — WAS 가 localhost Oracle 을 보는지 확인" + ok=false + else + log "✅ TROAD Oracle(localhost) congestion OK" + fi + fi if $ok; then log "✅ 전체 스택 정상"; return 0; fi log "⚠️ 일부 서비스 미응답 — ${LOG_DIR}/ 확인" return 1 @@ -723,7 +740,7 @@ start_rag if ! $SKIP_JAVA; then ensure_java # Skill 먼저 (WAS WEB tool 이 Skill data-portal 을 역호출) - log "exdev Java ENV: Skill→127.0.0.1 WAS/RAG, WAS Mongo→127.0.0.1 (소스 yml 미변경)" + log "exdev Java ENV: Skill→127.0.0.1 WAS/RAG, WAS Mongo/TROAD Oracle→127.0.0.1 (소스 yml 미변경)" start_java_service "kakaoChatbotSkill" "${SKILL_DIR}" \ "${RUN_DIR}/kakao-skill.pid" "${LOG_DIR}/kakao-skill.log" \ "EXDEV_LOCAL=true" \ @@ -741,6 +758,9 @@ if ! $SKIP_JAVA; then "RAG_SERVER_HOST=127.0.0.1" \ "RAG_SERVER_PORT=${RAG_PORT}" \ "SPRING_DATA_MONGODB_URI=${EXDEV_MONGO_URI}" \ + "SPRING_DATASOURCE_TROAD_URL=${EXDEV_TROAD_JDBC_URL}" \ + "SPRING_DATASOURCE_TROAD_USERNAME=${EXDEV_TROAD_USERNAME}" \ + "SPRING_DATASOURCE_TROAD_PASSWORD=${EXDEV_TROAD_PASSWORD}" \ || warn "chatbotApi 기동 실패" fi