docs: 고객사 첫 배포 기록 — stage-2, 배포 트러블슈팅, FabriX 모델 속도 실측, 오늘 order

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
lee-hyeon-cheol
2026-09-17 16:34:59 +09:00
co-authored by Claude Fable 5.1
parent 435952f25c
commit 2b8c2d7742
5 changed files with 114 additions and 0 deletions
+19
View File
@@ -0,0 +1,19 @@
# 2026-09-17
진행 중 feature: **`specs/006-opencode-django-backend/`** — stage-2 까지. 고객사 -12 에 배포됨.
## 오늘 한 것
- [x] 로컬 실행 환경(OpenRouter) 구성, 실제 LLM 스트림 확인
- [x] UX — 버튼 커서, 가운데 스피너, 스니펫→챗 버튼, 스니펫 창 높이
- [x] 캡쳐 — 활성 창 통째 캡쳐, 캡쳐 후 창 앞으로, 목적지 새/마지막 대화, 드래그 번쩍임(복사본에서 이식)
- [x] 단축키 Ctrl+Alt+Q/W/A/S/Z/X (Eclipse·SAP GUI 목록 대조)
- [x] FabriX 게이트웨이 `apps/gateway` + 고객사 배포 + 설치본 빌드
- [x] 모델 3종 속도 실측
## 다음
- [ ] 이미지 있을 때만 Gemma4(605), 아니면 339 — 게이트웨이 자동 분기
- [ ] 고객사에서 캡쳐→vision 수동 확인
- [ ] 고객사 서버 자동 기동 스크립트
- [ ] `.gitattributes` 로 줄바꿈 통일 (prettier 가 CRLF 167개 파일 뒤집던 것)
+12
View File
@@ -0,0 +1,12 @@
# FabriX 모델 성능 실측 (고객사 -12, 2026-09-17)
같은 질문("Explain ABAP LOOP AT in 3 sentences.") 스트림, CodeAssist 게이트웨이 우회해서 FabriX 직접 호출.
| id | 모델 | 첫 토큰 | 전체 | 청크 |
|---|---|---|---|---|
| 605 | Gemma4 | 1.8s | 33.9s | 304 |
| 339 | GaussO Flash | 0.2s | 1.9s | 149 |
| 581 | GaussO Think | 0.5s | 8.0s | 158 |
- 세 모델 다 같은 client key 로 열려 있음. 토큰은 `Bearer ` 접두 필수(날것은 401), 클라이언트 헤더는 `x-generative-ai-client`·`x-fabrix-client` 둘 다 됨.
- Gemma4 는 토큰당 속도가 눈에 띄게 느림 → 텍스트 기본은 339, 이미지 있을 때만 605 로 보내는 게 맞음.
@@ -0,0 +1,35 @@
# 고객사 첫 배포에서 걸린 것들 (2026-09-17, -12 컨테이너)
한 번에 안 되고 순서대로 다섯 군데 걸림. 다음에 다른 컨테이너 갈 때 그대로 밟을 것.
| 증상 | 원인 | 조치 |
|---|---|---|
| `pip install` 실패 — pytest 없음 | 컨테이너 인터넷 없음. -13 의 offline wheels 에 테스트 패키지는 없음 | `grep -v pytest requirements.txt > req-run.txt` 로 설치 |
| OpenCode "cannot connect to API" | `render_opencode.py` 기본 `BACKEND_PORT=8001` 인데 Django 를 8080 에 띄움 | `.env``BACKEND_PORT=8080` 넣고 다시 렌더 |
| Django `UnicodeEncodeError: 'ascii'` | 컨테이너 로케일 ASCII | `PYTHONUTF8=1` 붙여서 uvicorn 기동 (ABAP_OPENCODE run.sh 도 같음) |
| FabriX 호출 시 httpx `_normalize_header_key` 에서 UnicodeEncodeError | `.env.example` 줄 끝 한글 주석을 파서가 값으로 읽어 HTTP 헤더에 실림 | 파서에서 ` #` 뒤 제거(`config/settings.py`), `.env.example` 주석 삭제 |
| FabriX 전부 401 | `.env` 에 붙여넣은 토큰 앞에 `'` 하나가 딸려 들어감(짝 안 맞아 파서가 못 뗌) + 토큰은 `Bearer ` 접두 필수 | 따옴표 sed 로 제거, `AAF_FABRIX_TOKEN_PREFIX=bearer` |
| 설치 exe 메일 반입 시 잘림(3,148KB→2,699KB) | 메일 시스템이 exe 를 자름. 압축·이름변경 무관 | msi 를 4조각 `.txt` 로 쪼개 보내고 `copy /b` 로 합침, MD5 대조 |
## 배포 절차 (정리본)
```bash
# PC: -13 부품 꺼내서 -12 로
scp -P 8916 -r root@10.196.81.34:/www/abap-ito/offline/wheels ./wheels
scp -P 8916 root@10.196.81.34:/www/abap-ito/bin/opencode ./opencode-bin
scp -P 8912 -r ABAP_CODE_ASSISTANT wheels opencode-bin root@10.196.81.34:/www/
# -12
cd /www/ABAP_CODE_ASSISTANT && python3 _*.py # 메일 zip 이면 이름 복원
cd 5_django_backend && python3 -m venv .venv
grep -v pytest requirements.txt > req-run.txt
.venv/bin/pip install --no-index --find-links /www/wheels -r req-run.txt
cp .env.example .env && vi .env # AAF_FABRIX_* 4개, BACKEND_PORT=8080. 따옴표·주석 없이
.venv/bin/python manage.py migrate
.venv/bin/python opencode/render_opencode.py
chmod +x /www/opencode-bin; mkdir -p logs
(cd opencode && nohup /www/opencode-bin serve --hostname 127.0.0.1 --port 4096 > ../logs/opencode.log 2>&1 &)
PYTHONUTF8=1 nohup .venv/bin/uvicorn config.asgi:application --host 0.0.0.0 --port 8080 > logs/django.log 2>&1 &
curl -s http://127.0.0.1:8080/api/ito/models
```
포트: -12 안 8080 → 바깥 8914. 앱은 `http://10.196.81.34:8914/api/v1` 로 빌드됨.