From 78d549194c5b0e392e13f55e12b0111654620cb5 Mon Sep 17 00:00:00 2001 From: bkyungee Date: Thu, 13 Aug 2026 15:07:36 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EC=9B=90=EA=B2=A9=20=EB=B0=B0=ED=8F=AC?= =?UTF-8?q?=20rsync=20=EC=A0=9C=EC=99=B8=20=ED=8C=A8=ED=84=B4=EC=9D=B4=20?= =?UTF-8?q?=EC=86=8C=EC=8A=A4=EB=A5=BC=20=EC=9E=98=EB=AA=BB=20=EA=B1=B8?= =?UTF-8?q?=EB=9F=AC=EB=82=B4=EB=8D=98=20=EB=AC=B8=EC=A0=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit tar 기반 rsync 대체 스크립트가 rsync 의 'node_modules/' 문법을 매칭하지 못해 node_modules 를 통째로 전송하다 메모리 부족으로 죽었다. 반대로 슬래시만 떼면 'build' 가 자바 패키지 kakao.response.build 까지 제외해 kakaoChatbotSkill 컴파일이 깨졌다. 선행 슬래시를 전송 루트 기준 고정으로 해석하도록 구분해 둘 다 해결한다. 배포 중 자동 커밋에 딸려 들어갔던 일회용 진단 스크립트도 함께 제거한다. --- local-dev/_diag.sh | 16 ---------------- local-dev/bin/rsync | 8 +++++++- local-dev/fix_and_start.sh | 19 ------------------- server-dev/sync-submodules-rsync.sh | 10 ++++++---- 4 files changed, 13 insertions(+), 40 deletions(-) delete mode 100755 local-dev/_diag.sh delete mode 100755 local-dev/fix_and_start.sh diff --git a/local-dev/_diag.sh b/local-dev/_diag.sh deleted file mode 100755 index bfcbcb8..0000000 --- a/local-dev/_diag.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash -ssh -o BatchMode=yes -o ConnectTimeout=15 aidev@chatbot.exdev.co.kr 'bash -s' <<'EOSSH' -export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/Applications/Docker.app/Contents/Resources/bin:$PATH" -echo "=== listening ports ===" -for p in 16000 16001 16002 27017 1521 28012 28013 8086 8083 8092 443; do - if lsof -iTCP:$p -sTCP:LISTEN >/dev/null 2>&1; then echo "UP :$p"; else echo "DOWN :$p"; fi -done -echo "=== docker ps ===" -docker ps --format '{{.Names}}\t{{.Status}}' 2>&1 | head -20 -echo "=== docker compose plugin ===" -docker compose version 2>&1 | head -2 -echo "=== public-ai timestamp ===" -ls -la /Users/aidev/dev/exAichatbot_agent/chatbotApp-chatbot2.0-agent/public-ai/index.html 2>/dev/null || echo "(missing)" -echo "=== HTTPS UI ===" -curl -s -o /dev/null -w 'https=%{http_code}\n' -m 10 https://chatbot.exdev.co.kr/chatbot/ai/ 2>&1 -EOSSH diff --git a/local-dev/bin/rsync b/local-dev/bin/rsync index 7fe4620..f94a604 100755 --- a/local-dev/bin/rsync +++ b/local-dev/bin/rsync @@ -105,7 +105,13 @@ TAR_EXCLUDES=() for pat in "${EXCLUDES[@]}"; do # tar 의 --exclude 는 'node_modules/' 처럼 슬래시로 끝나면 디렉터리에 매칭되지 않는다. # (rsync 문법 그대로 넘기면 node_modules 가 통째로 전송돼 메모리 부족으로 죽는다) - TAR_EXCLUDES+=(--exclude "${pat%/}") + pat="${pat%/}" + if [[ "${pat}" == /* ]]; then + # rsync 의 선행 슬래시 = 전송 루트 기준 고정. tar 멤버명은 './' 로 시작한다. + TAR_EXCLUDES+=(--anchored --exclude ".${pat}") + else + TAR_EXCLUDES+=(--no-anchored --exclude "${pat}") + fi done ssh -o BatchMode=yes "${HOST}" "mkdir -p '${REMOTE_PATH}'" diff --git a/local-dev/fix_and_start.sh b/local-dev/fix_and_start.sh deleted file mode 100755 index bd8faac..0000000 --- a/local-dev/fix_and_start.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash -export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/Applications/Docker.app/Contents/Resources/bin:/usr/bin:/bin:/usr/sbin:/sbin" -cd /Users/aidev/dev/exAichatbot_agent - -git config core.autocrlf false -git config core.eol lf - -python3 - << 'PYEOF' -import os -for d in ['kakaoChatbotSkill-chatbot2.0-agent','chatbotApi-chatbot2.0-agent']: - f = d+'/gradlew' - if os.path.exists(f): - data=open(f,'rb').read().replace(b'\r\n',b'\n').replace(b'\r',b'\n') - open(f,'wb').write(data) - os.chmod(f,0o755) - print('fixed:', f) -PYEOF - -bash server-dev/start-all-server.sh --no-pull --no-push --skip-desktop diff --git a/server-dev/sync-submodules-rsync.sh b/server-dev/sync-submodules-rsync.sh index ef41693..21f0e7b 100755 --- a/server-dev/sync-submodules-rsync.sh +++ b/server-dev/sync-submodules-rsync.sh @@ -23,16 +23,18 @@ for path in "${SUBMODULES[@]}"; do local_src="${ROOT_DIR}/${path}" [[ -d "${local_src}" ]] || { echo "ERROR: ${local_src} 없음"; exit 1; } log ">>> rsync ${path}" + # build/dist/logs 는 자바 패키지명(예: kakao.response.build)과 충돌하므로 + # 선행 슬래시로 프로젝트 최상위에만 적용한다. rsync -az --delete \ --exclude 'node_modules/' \ - --exclude 'build/' \ - --exclude 'dist/' \ --exclude '.gradle/' \ --exclude 'qdrant_data/' \ - --exclude 'logs/' \ --exclude '.next/' \ - --exclude 'web/out/' \ --exclude '.git/' \ + --exclude '/build/' \ + --exclude '/dist/' \ + --exclude '/logs/' \ + --exclude '/web/out/' \ "${local_src}/" "${EXDEV_SSH}:${REMOTE_WT}/${path}/" done