chore(backend): deploy.sh — 고객사 -12 배포 한 방(env 보강·migrate·시드 import·렌더·재시작·확인)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
lee-hyeon-cheol
2026-09-21 16:13:48 +09:00
co-authored by Claude Fable 5.1
parent 2e7bae4c06
commit 5c78edcaa5
2 changed files with 36 additions and 0 deletions
+12
View File
@@ -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` 로 확인. - `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 이 이미 있어 재활용 가능. - 고객사(-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`)에서 복사해 온 뒤 실행.
+24
View File
@@ -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