diff --git a/5_django_backend/README.md b/5_django_backend/README.md index 19b6a2d..c0265ce 100644 --- a/5_django_backend/README.md +++ b/5_django_backend/README.md @@ -140,3 +140,15 @@ curl -s http://127.0.0.1:4096/config 2>/dev/null | grep -o abap_index_[a-z]* | s - 인덱스 서버가 없으면 툴이 "인덱스 조회 실패"를 돌려주고 에이전트는 생성 코드로 답함. 앱은 안 죽음. - `opencode/.opencode/package.json`(`@opencode-ai/plugin` 의존)은 그 폴더 `.gitignore` 에 걸려 git 에 없음. 고객사엔 `.opencode/` 폴더째(node_modules 포함, 약 수 MB) 같이 옮겨야 툴이 로드됨. 없으면 OpenCode 가 툴 파일을 import 못 해 조용히 빠짐 — `/experimental/tool/ids` 로 확인. - 고객사(-12): ABAP_INDEXING 을 -12 에 같이 올리고(`data/index.db` 포함, 약 14MB) 8100 으로 띄움. 오프라인 wheels 는 fastapi·uvicorn 이 이미 있어 재활용 가능. + +## 고객사 배포 한 방 — `deploy.sh` + +고객사 GHE 저장소의 `code-assistant/` 폴더로 관리(브랜치 아님 — -12·-13 이 각자 폴더만 씀). PC 에서 push → -12 에서: + +```bash +cd /www/repo && git pull +cd code-assistant/5_django_backend && bash deploy.sh +``` + +`deploy.sh` = `.env` 새 키 채움(있으면 유지) → `migrate` → `seed/snippets.db` 있으면 import → OpenCode 설정 렌더 → OpenCode·Django 재시작 → health·모델·툴 확인. +처음 한 번은 `.venv`·`.env`·`opencode/.opencode/node_modules` 를 옛 폴더(`/www/ABAP_CODE_ASSISTANT/5_django_backend`)에서 복사해 온 뒤 실행. diff --git a/5_django_backend/deploy.sh b/5_django_backend/deploy.sh new file mode 100644 index 0000000..116c1af --- /dev/null +++ b/5_django_backend/deploy.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +# 고객사 -12 배포 — git pull 뒤 이 폴더에서: bash deploy.sh +# .env 새 키 채움 → migrate → 시드 import(seed/snippets.db 있을 때) → OpenCode 설정 렌더 → 재시작 → 확인 +set -euo pipefail +cd "$(dirname "$0")" +export PYTHONUTF8=1 +# .env 에 새 키 없으면 추가(있으면 그대로) +grep -q '^AAF_FABRIX_VISION_MODEL_ID=' .env || echo 'AAF_FABRIX_VISION_MODEL_ID=605' >> .env +grep -q '^DB_SSLMODE=' .env || echo 'DB_SSLMODE=disable' >> .env +grep -q '^STREAM_FIRST_EVENT_TIMEOUT_S=' .env || echo 'STREAM_FIRST_EVENT_TIMEOUT_S=300' >> .env +grep -q '^AAF_FABRIX_READ_TIMEOUT_S=' .env || echo 'AAF_FABRIX_READ_TIMEOUT_S=300' >> .env +grep -q '^ABAP_INDEX_URL=' .env || echo 'ABAP_INDEX_URL=http://127.0.0.1:8100' >> .env +sed -i 's/^AAF_FABRIX_MODEL_ID=.*/AAF_FABRIX_MODEL_ID=339/; s/^AAF_FABRIX_MODELS=.*/AAF_FABRIX_MODELS=339:GaussO Flash,581:GaussO Think,605:Gemma4/' .env +.venv/bin/python manage.py migrate --noinput +[ -f seed/snippets.db ] && .venv/bin/python manage.py import_snippets seed/snippets.db +.venv/bin/python opencode/render_opencode.py +pkill -f "opencode-bin serve" || true; pkill -f "uvicorn config.asgi" || true; sleep 1 +mkdir -p logs +(cd opencode && nohup /www/opencode-bin serve --hostname 127.0.0.1 --port 4096 > ../logs/opencode.log 2>&1 &) +nohup .venv/bin/uvicorn config.asgi:application --host 0.0.0.0 --port 8080 > logs/django.log 2>&1 & +sleep 4 +echo "--- health"; curl -s http://127.0.0.1:8080/api/v1/health | head -c 80; echo +echo "--- models"; curl -s http://127.0.0.1:8080/api/ito/models | head -c 120; echo +echo "--- tools (abap_index 3개면 OK)"; curl -s "http://127.0.0.1:4096/experimental/tool/ids?directory=$(pwd)/opencode" | tr ',' '\n' | grep -c abap_index || true