From 183c3d12a6bd1617c8335a6d2ceb095e0e0d1629 Mon Sep 17 00:00:00 2001 From: toki Date: Tue, 26 May 2026 20:16:44 +0900 Subject: [PATCH] feat: add field-bootstrap-test-port-readiness milestone and archive ollama-field-validation-follow-up - Add new milestone for field bootstrap test port readiness - Archive completed ollama field validation follow-up milestone - Update PHASE.md, current.md, project rules, and deploy docs --- .../ollama-field-validation-follow-up.md | 30 +-- agent-ops/roadmap/current.md | 4 +- .../serving-routing-optimization/PHASE.md | 10 +- .../field-bootstrap-test-port-readiness.md | 73 +++++++ agent-ops/rules/project/rules.md | 5 +- .../reboot-handoff.md | 187 ++++++++++++++++++ docs/deploy-dev.md | 27 +++ 7 files changed, 317 insertions(+), 19 deletions(-) rename agent-ops/roadmap/{ => archive}/phase/serving-routing-optimization/milestones/ollama-field-validation-follow-up.md (59%) create mode 100644 agent-ops/roadmap/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md create mode 100644 agent-task/m-field-bootstrap-test-port-readiness/reboot-handoff.md diff --git a/agent-ops/roadmap/phase/serving-routing-optimization/milestones/ollama-field-validation-follow-up.md b/agent-ops/roadmap/archive/phase/serving-routing-optimization/milestones/ollama-field-validation-follow-up.md similarity index 59% rename from agent-ops/roadmap/phase/serving-routing-optimization/milestones/ollama-field-validation-follow-up.md rename to agent-ops/roadmap/archive/phase/serving-routing-optimization/milestones/ollama-field-validation-follow-up.md index 3a2184d..f1cb504 100644 --- a/agent-ops/roadmap/phase/serving-routing-optimization/milestones/ollama-field-validation-follow-up.md +++ b/agent-ops/roadmap/archive/phase/serving-routing-optimization/milestones/ollama-field-validation-follow-up.md @@ -12,7 +12,7 @@ ## 상태 -[진행중] +[완료] ## 승격 조건 @@ -37,20 +37,22 @@ 사용자 실테스트 결과를 현재 활성 Ollama 연동 작업으로 받아 후속 안정화 범위를 정한다. -- [ ] [split-host-env] code-server 컨테이너를 Edge로, 컨테이너 호스트를 Node/Ollama host로 두는 split-host field smoke 환경이 구성되어 있다. 검증: host Node가 컨테이너 Edge 주소로 등록되고 Edge에서 node registration을 확인할 수 있다. -- [ ] [field-test] split-host 환경에서 실제 Ollama 연동 실테스트 결과와 재현 로그가 기록되어 있다. 검증: 실제 모델 조회와 non-streaming/streaming chat 결과 또는 실패 로그가 남아 있다. -- [ ] [issue-triage] 실테스트에서 나온 후속 작업이 API compatibility, option passthrough, reasoning stream, config/docs, routing/fallback 후보로 분류되어 있다. -- [ ] [follow-up-scope] 코드 수정이 필요한 항목은 이 Milestone의 추가 Task 또는 같은 Milestone task group의 후속 plan으로 정리되어 있다. +- [x] [split-host-env] code-server 컨테이너를 Edge로, 컨테이너 호스트를 Node/Ollama host로 두는 split-host field smoke 환경이 구성되어 있다. 검증: host Node가 컨테이너 Edge 주소로 등록되고 Edge에서 node registration을 확인할 수 있다. +- [x] [field-test] split-host 환경에서 실제 Ollama 연동 실테스트 결과와 재현 로그가 기록되어 있다. 검증: 실제 모델 조회와 non-streaming/streaming chat 결과 또는 실패 로그가 남아 있다. +- [x] [issue-triage] 실테스트에서 나온 후속 작업이 API compatibility, option passthrough, reasoning stream, config/docs, routing/fallback 후보로 분류되어 있다. +- [x] [follow-up-scope] 코드 수정이 필요한 항목은 이 Milestone의 추가 Task 또는 같은 Milestone task group의 후속 plan으로 정리되어 있다. ## 완료 리뷰 -- 상태: 없음 -- 요청일: 없음 -- 완료 근거: 사용자 실테스트와 후속 작업 분류가 아직 충족되지 않았다. +- 상태: 승인됨 +- 요청일: 2026-05-26 +- 완료 근거: Apple Silicon용 Node 바이너리를 Edge에서 다운로드 가능한 형태로 빌드하고, reverse SSH tunnel 기반 split-host field 환경에서 `node-silicon-ollama` registration을 확인했다. +- 완료 근거: Edge OpenAI-compatible API에서 `/v1/models`, non-streaming `/v1/chat/completions`, streaming SSE, reasoning/content 분리, `/api/tags` API passthrough, `think:false`와 Ollama options passthrough가 실제 Ollama endpoint 기준으로 통과했다. +- 완료 근거: 후속 후보는 OpenAI/Ollama compatibility 본선 문제가 아니라 field harness/runtime lifecycle 보완으로 분류했다. - 리뷰 필요: - - [ ] 사용자가 완료 결과를 확인했다 - - [ ] archive 이동을 승인했다 -- 리뷰 코멘트: 없음 + - [x] 사용자가 완료 결과를 확인했다 + - [x] archive 이동을 승인했다 +- 리뷰 코멘트: 사용자 승인으로 완료 처리하고 archive 이동한다. `edge serve`로 실행했을 때 node/openai listener가 내려가고 metrics만 남는 상태가 관찰되어, 필드 테스트는 `edge console`로 재기동해 통과했다. 이 항목은 후속 `Field Bootstrap UX와 테스트 포트 정비` Milestone에서 다룬다. ## 범위 제외 @@ -67,5 +69,7 @@ - 표준선(선택): 초기 필드 smoke는 code-server 컨테이너 내부 Edge와 컨테이너 호스트 Node/Ollama를 분리해 실제 네트워크 경계를 통과하도록 구성한다. - 결정됨: split-host 실테스트 뒤 생긴 Ollama 경로 후속 안정화 작업은 이 Milestone에서 계속 처리한다. - 선행 작업: Ollama E2E 서빙 안정화 -- 후속 작업: split-host 실테스트에서 확인된 Ollama 경로 안정화 보완 -- 확인 필요: split-host 실테스트 결과, cloud fallback/Responses API/품질 평가로 넘길 항목 +- 실테스트 결과: Apple Silicon `darwin/arm64` Node가 reverse SSH tunnel을 통해 Edge에 등록되었고, Edge에서 `gemma4:26b` 모델 조회, non-streaming chat, streaming SSE, reasoning/content 분리, option/API passthrough를 확인했다. +- 분류 결과: API compatibility, reasoning stream, option passthrough, Ollama API passthrough는 통과했다. routing/fallback, cloud fallback, Responses API, 품질 평가는 이번 범위 밖 후속 Phase 후보로 유지한다. +- 후속 plan 후보: `edge serve` 실행 시 startup context/lifecycle 때문에 node/openai listener가 유지되지 않는 현상을 조사하고, field runbook에는 SSH tunnel 또는 reverse tunnel 기준 다운로드/연결 절차를 보강한다. +- 확인 필요: 사용자의 완료 확인과 archive 이동 승인 diff --git a/agent-ops/roadmap/current.md b/agent-ops/roadmap/current.md index 12f41ea..43aeb25 100644 --- a/agent-ops/roadmap/current.md +++ b/agent-ops/roadmap/current.md @@ -7,9 +7,9 @@ ## 활성 Milestone -- [진행중] Ollama 실테스트와 후속 안정화 +- [진행중] Field Bootstrap UX와 테스트 포트 정비 - Phase: `agent-ops/roadmap/phase/serving-routing-optimization/PHASE.md` - - 경로: `agent-ops/roadmap/phase/serving-routing-optimization/milestones/ollama-field-validation-follow-up.md` + - 경로: `agent-ops/roadmap/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md` ## 선택 규칙 diff --git a/agent-ops/roadmap/phase/serving-routing-optimization/PHASE.md b/agent-ops/roadmap/phase/serving-routing-optimization/PHASE.md index f8347a4..3c629b9 100644 --- a/agent-ops/roadmap/phase/serving-routing-optimization/PHASE.md +++ b/agent-ops/roadmap/phase/serving-routing-optimization/PHASE.md @@ -19,9 +19,13 @@ Edge OpenAI-compatible API에서 Node의 Ollama adapter까지 이어지는 단 - 경로: `agent-ops/roadmap/archive/phase/serving-routing-optimization/milestones/model-serving-load-routing.md` - 요약: Edge OpenAI-compatible API를 통해 Node에서 serving 중인 Ollama를 일반 OpenAI/Ollama client 경험에 가깝게 조회, 선택, 호출하는 E2E 한 사이클과 Ollama option/API passthrough를 완료했다. 자동 라우팅, cloud fallback, 품질 평가는 후속으로 미룬다. -- [진행중] Ollama 실테스트와 후속 안정화 - - 경로: `agent-ops/roadmap/phase/serving-routing-optimization/milestones/ollama-field-validation-follow-up.md` - - 요약: 완료 처리된 Ollama E2E baseline을 사용자 실테스트로 다시 확인하고, 실제 사용 중 발견되는 후속 안정화 작업을 정리한다. +- [완료] Ollama 실테스트와 후속 안정화 + - 경로: `agent-ops/roadmap/archive/phase/serving-routing-optimization/milestones/ollama-field-validation-follow-up.md` + - 요약: Apple Silicon Node와 실제 Ollama endpoint를 split-host 환경에서 검증했고, 모델 조회, non-streaming/streaming chat, reasoning/content 분리, option/API passthrough를 확인했다. `edge serve` lifecycle 보완은 후속 Milestone으로 분리했다. + +- [진행중] Field Bootstrap UX와 테스트 포트 정비 + - 경로: `agent-ops/roadmap/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md` + - 요약: code-server field 테스트 포트와 Node artifact/bootstrap 경로를 정리해, 사용자가 Jenkins agent처럼 한 줄 명령으로 Node 다운로드와 Edge 접속을 끝낼 수 있게 만든다. ## Phase 경계 diff --git a/agent-ops/roadmap/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md b/agent-ops/roadmap/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md new file mode 100644 index 0000000..106a35f --- /dev/null +++ b/agent-ops/roadmap/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md @@ -0,0 +1,73 @@ +# Milestone: Field Bootstrap UX와 테스트 포트 정비 + +## 위치 + +- Roadmap: `agent-ops/roadmap/ROADMAP.md` +- Phase: `agent-ops/roadmap/phase/serving-routing-optimization/PHASE.md` + +## 목표 + +field 테스트 환경을 Jenkins agent 연결처럼 매끄럽게 만든다. +code-server 컨테이너는 외부 테스트용 web/bootstrap, Node transport, OTO/specialized agent 포트를 안정적으로 노출하고, Edge는 Node 빌드 산출물을 정해진 위치에 준비해 사용자가 한 줄 bootstrap 명령만 실행하면 다운로드, 설정 생성, Edge 접속까지 이어지게 한다. + +## 상태 + +[진행중] + +## 승격 조건 + +- 없음 + +## 구현 잠금 + +- 상태: 해제 +- 결정 필요: 없음 + +## 범위 + +- `ssh toki@toki-labs.com`의 `~/docker/services/code-server/compose/docker-compose.yml`에서 code-server 컨테이너 외부 테스트 포트 노출을 정리한다. +- IOP field 테스트용 포트를 web/bootstrap HTTP, Node Edge transport, OTO/specialized agent transport 용도로 분리해 재부팅 후 바로 사용할 수 있게 한다. +- Edge 쪽 build artifact 위치와 URL 규칙을 정하고, Apple Silicon Node를 우선 대상으로 한 one-line bootstrap UX를 만든다. +- bootstrap 명령은 바이너리 다운로드, checksum 또는 버전 확인, 임시 config 생성, `iop-node serve` 실행까지 한 줄 수준으로 이어지는 것을 목표로 한다. +- 이번 Milestone은 테스트 환경과 bootstrap UX를 다루며, Control Plane 기반 장기 enrollment/credential 관리와 OTO agent 본격 구현은 후속 Phase/Milestone에서 다룬다. + +## 기능 + +### Epic: [field-bootstrap] Field Bootstrap and Port Readiness + +field 테스트를 매번 수동 터널과 임시 명령 조합으로 만들지 않고, 재현 가능한 외부 포트와 한 줄 bootstrap 명령으로 수렴시킨다. + +- [x] [compose-ports] code-server compose가 field 테스트용 web/bootstrap, Node transport, OTO/specialized agent 포트를 외부에 노출한다. 검증: `docker compose config`에서 `18080`, `18081`, `19090`, `19190` 계열 포트 매핑이 확인된다. +- [ ] [artifact-layout] Node field build 산출물의 고정 위치와 URL 규칙이 정리되어 있다. 검증: Apple Silicon용 `iop-node`를 정해진 URL에서 다운로드할 수 있다. +- [ ] [one-line-node] 사용자가 한 줄 명령으로 Apple Silicon Node를 다운로드하고 Edge에 접속할 수 있다. 검증: Mac 테스트 환경에서 command 한 줄 실행 후 Edge에서 node registration을 확인한다. +- [ ] [serve-lifecycle] `edge serve`가 field bootstrap에 사용할 node/openai listener를 안정적으로 유지한다. 검증: `edge serve --config ` 실행 후 Node registration과 `/v1/models` 호출이 통과한다. +- [x] [runbook] field bootstrap runbook에 직접 포트 방식과 터널 fallback 방식이 구분되어 있다. + +## 완료 리뷰 + +- 상태: 없음 +- 요청일: 없음 +- 완료 근거: 테스트 환경 포트 개방과 one-line bootstrap UX가 아직 충족되지 않았다. +- 리뷰 필요: + - [ ] 사용자가 완료 결과를 확인했다 + - [ ] archive 이동을 승인했다 +- 리뷰 코멘트: 없음 + +## 범위 제외 + +- Control Plane 기반 장기 agent enrollment/credential 구현 +- OTO agent 본격 구현 +- cloud fallback, 자동 부하 라우팅, 품질 평가 feedback 구현 +- 외부 공개 도메인/인증 정책의 장기 확정 + +## 작업 컨텍스트 + +- 관련 경로: `docs/deploy-dev.md`, `bin/build/field-binaries.sh`, `bin/edge.sh`, `apps/edge/cmd/edge`, `apps/edge/internal/bootstrap`, `apps/edge/internal/input`, `apps/edge/internal/transport`, 원격 `~/docker/services/code-server/compose/docker-compose.yml` +- 표준선(선택): Edge-Node transport는 TCP proto-socket을 유지하고, HTTP는 artifact/bootstrap과 OpenAI-compatible 입력 표면에만 사용한다. +- 표준선(선택): 외부 테스트 포트는 기존 code-server compose의 안전 remap 관례를 따라 host 충돌 포트를 피하고, 재부팅 타이밍은 사용자가 결정한다. +- 표준선(선택): bootstrap UX는 Jenkins agent처럼 Edge가 command를 제시하고 대상 host가 실행하는 흐름을 목표로 하되, 초기 field 단계에서는 static artifact URL과 one-time-ish token/config로 시작한다. +- 선행 작업: Ollama 실테스트와 후속 안정화 +- 진행 기록: 원격 `~/docker/services/code-server/compose/docker-compose.yml`에 `18080:18080`, `18081:8080`, `19190:9190`을 추가하고 기존 `19090:9090`, `19092:9092`를 역할 주석으로 정리했다. `/usr/local/bin/docker compose config --quiet` 검증은 통과했으며, 실제 포트 적용은 사용자가 정한 code-server compose 재기동 시점 이후 확인한다. +- 진행 기록: `agent-ops/rules/project/rules.md`에서 field 테스트 환경 작업을 `docs/deploy-dev.md`와 이 Milestone으로 라우팅하도록 보강했고, `docs/deploy-dev.md`에 code-server compose 원본, 기준 포트, 직접 포트/터널 fallback, Apple Silicon `darwin/arm64` 기준을 기록했다. +- 후속 작업: Agent Bootstrap과 OTO 등록, Control Plane 기반 enrollment +- 확인 필요: 재부팅 후 code-server compose 포트 적용 확인, one-line bootstrap 명령의 최종 URL/토큰 수명 정책 diff --git a/agent-ops/rules/project/rules.md b/agent-ops/rules/project/rules.md index 284bed5..89ef10e 100644 --- a/agent-ops/rules/project/rules.md +++ b/agent-ops/rules/project/rules.md @@ -27,7 +27,7 @@ - `bin/` — 사용자가 직접 실행하는 edge/node/web shell entrypoint와 field binary build entrypoint이다. - `scripts/` — 보조 E2E smoke와 입력 표면 검증 스크립트이다. - `Makefile` — 빌드와 테스트 진입점을 정의한다. -- `docs/` — 아키텍처 및 운영 방향 문서이다. +- `docs/` — 아키텍처 및 운영 방향 문서이다. field 테스트 환경, 외부 테스트 포트, one-line bootstrap 기준은 `docs/deploy-dev.md`를 우선 진입점으로 본다. ## 기술 스택 @@ -53,6 +53,8 @@ - 앱 설정 구조 변경 시 `packages/config`의 struct/default와 `configs/*.yaml` 예시를 함께 확인한다. - 테스트는 변경 범위에 맞춰 `go test ./...` 또는 대상 패키지 테스트를 실행한다. - 사용자 실행 파이프라인에 닿는 작업을 한 경우, 작업 완료 후 `agent-ops/rules/project/domain/testing/rules.md`의 검증 기준을 따른다. +- field 테스트 환경 또는 one-line bootstrap 작업은 `docs/deploy-dev.md`의 Field 테스트 환경 라우팅과 활성 Milestone `Field Bootstrap UX와 테스트 포트 정비`를 먼저 확인한다. +- code-server 기반 field 테스트 포트는 원격 `ssh toki@toki-labs.com`의 `~/docker/services/code-server/compose/docker-compose.yml`에서 관리한다. 기준 host port는 web/dev `13000-13099`, artifact/bootstrap HTTP `18080`, OpenAI-compatible HTTP `18081`, Edge-Node transport `19090`, Edge metrics `19092`, OTO/specialized agent transport `19190`이다. - 상세 DB schema, event schema, permission/policy/audit model, federation, mTLS 구현 세부, Portal UI 세부 기획은 각 작업에서 별도로 결정한다. ## 도메인 룰 로딩 @@ -83,4 +85,5 @@ ## 스킬 라우팅 - 사용자 실행 파이프라인 검증, bin shell 사용자 흐름, 메시지 2회 왕복, edge command 응답, 보조 E2E smoke, full-cycle 실제 구동, `bin/edge.sh`/`bin/node.sh` 통합 테스트: `agent-ops/skills/project/e2e-smoke/SKILL.md` +- field 테스트 포트, artifact/bootstrap HTTP, one-line Node bootstrap, code-server compose 기반 외부 테스트 환경: `docs/deploy-dev.md`와 활성 Milestone `agent-ops/roadmap/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md` - 반복 작업이 확인되면 `agent-ops/skills/project//SKILL.md`를 생성하고 이 표에 등록한다. diff --git a/agent-task/m-field-bootstrap-test-port-readiness/reboot-handoff.md b/agent-task/m-field-bootstrap-test-port-readiness/reboot-handoff.md new file mode 100644 index 0000000..25e39b9 --- /dev/null +++ b/agent-task/m-field-bootstrap-test-port-readiness/reboot-handoff.md @@ -0,0 +1,187 @@ +# Reboot Handoff: Field Bootstrap UX와 테스트 포트 정비 + +## 주입용 요약 + +다음 세션은 `/config/workspace/iop`에서 `AGENTS.md`의 필수 규칙을 먼저 읽고, 이어서 이 파일을 읽은 뒤 작업을 계속한다. +현재 활성 Milestone은 `agent-ops/roadmap/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md`다. +목표는 code-server field 테스트 환경을 Jenkins agent 연결처럼 만들고, 사용자가 Apple Silicon Mac에서 한 줄 bootstrap 명령으로 Node 다운로드, config 생성, Edge 접속까지 끝내게 하는 것이다. + +## 현재 상태 + +- 이전 Milestone `Ollama 실테스트와 후속 안정화`는 `[완료]` 처리 후 `agent-ops/roadmap/archive/phase/serving-routing-optimization/milestones/ollama-field-validation-follow-up.md`로 이동했다. +- `current.md`는 새 활성 Milestone `Field Bootstrap UX와 테스트 포트 정비`를 가리킨다. +- `agent-ops/rules/project/rules.md`는 field 테스트 환경과 one-line bootstrap 작업을 `docs/deploy-dev.md`와 활성 Milestone으로 라우팅하도록 갱신됐다. +- `docs/deploy-dev.md`에는 `Field 테스트 환경 라우팅` 섹션이 추가됐다. +- 원격 `ssh toki@toki-labs.com`의 `~/docker/services/code-server/compose/docker-compose.yml`에는 field 테스트 포트 매핑이 반영됐다. +- 재부팅/재생성 타이밍은 사용자가 잡기로 했고, 작업자는 사용자가 명시하기 전 code-server 컨테이너를 재시작하지 않는다. + +## 원격 code-server 포트 의도 + +원격 compose 원본: + +```text +ssh toki@toki-labs.com +~/docker/services/code-server/compose/docker-compose.yml +``` + +기준 포트: + +```text +13000-13099 -> 3000-3099 web/dev app preview range +18080 -> 18080 IOP field artifact/bootstrap HTTP +18081 -> 8080 Edge OpenAI-compatible HTTP +19080 -> 19080 Portal/Control Plane wire test endpoint +19090 -> 9090 Edge-Node TCP transport +19092 -> 9092 Edge metrics +19190 -> 9190 OTO/specialized agent field transport reserve +``` + +검증 완료: + +```bash +ssh toki@toki-labs.com 'cd ~/docker/services/code-server/compose && /usr/local/bin/docker compose config --quiet' +``` + +주의: Docker port mapping은 단순 프로세스 재시작이 아니라 컨테이너 recreate가 필요할 수 있다. 재부팅 뒤에도 `docker ps`에 새 포트가 보이지 않으면 사용자가 정한 타이밍에 compose recreate가 필요하다. + +## 재부팅 후 첫 확인 + +원격에서 code-server 컨테이너 포트가 실제 적용됐는지 확인한다. + +```bash +ssh toki@toki-labs.com '/usr/local/bin/docker ps --format "{{.Names}} {{.Ports}}" | grep "^code-server "' +``` + +기대: `18080`, `18081`, `19090`, `19092`, `19190`이 `code-server` 포트 목록에 보인다. + +컨테이너 내부에서 포트가 열리는지는 서비스 기동 후 확인한다. + +```bash +curl -fsS http://127.0.0.1:18080/healthz +curl -fsS http://127.0.0.1:18081/healthz +``` + +`18080`은 아직 artifact/bootstrap HTTP 서버를 직접 띄워야 응답한다. + +## 바로 이어갈 작업 순서 + +1. `edge serve` lifecycle 문제를 먼저 확인/수정한다. + - 관찰된 현상: `edge serve`로 실행하면 node/openai listener가 내려가고 metrics만 남았다. + - 추정 원인: Fx `OnStart` startup context를 long-running server lifetime context로 넘겨, `OnStart` 반환 뒤 context cancellation이 listener shutdown으로 이어지는 구조. + - 후보 수정: `apps/edge/internal/bootstrap.Runtime`이 자체 runtime context/cancel을 소유하고 `Stop()`에서 cancel하도록 한다. `Start(ctx)`의 `ctx`는 startup timeout 용도로만 사용한다. + - 검증: `edge serve --config ` 실행 후 `9090`, `8080`, `9092` listener가 유지되고 Node registration과 `/v1/models`가 통과한다. + +2. field Edge config를 준비한다. + - Edge listen은 컨테이너 내부 포트 기준으로 둔다. + - Node는 Mac에서 실행되므로 Ollama base URL은 Node 관점의 `http://127.0.0.1:11434`가 맞다. + +```yaml +edge: + id: "edge-field-bootstrap" + name: "Field Bootstrap Edge" + +server: + listen: "0.0.0.0:9090" + +openai: + enabled: true + listen: "0.0.0.0:8080" + node: "node-silicon-ollama" + adapter: "ollama" + target: "" + models: + - "gemma4:26b" + session_id: "openai-field" + timeout_sec: 300 + +metrics: + port: 9092 + +nodes: + - id: "node-silicon-ollama" + alias: "silicon-ollama" + token: "CHANGE_ME_FIELD_TOKEN" + adapters: + ollama: + enabled: true + base_url: "http://127.0.0.1:11434" + context_size: 262144 +``` + +3. Apple Silicon Node artifact layout를 고정한다. + - Apple Silicon은 `darwin/arm64`다. + - `linux/arm64`는 Mac 실행 대상이 아니다. + - 기존 build entrypoint: + +```bash +VERSION= APPS=node TARGETS="darwin/arm64" DIST_DIR=dist/field ./bin/build/field-binaries.sh +``` + +4. artifact/bootstrap HTTP를 `18080`에 띄우고 URL 규칙을 정한다. + - 임시 시작점 후보: + +```bash +python3 -m http.server 18080 --bind 0.0.0.0 -d dist/field/ +``` + + - 외부 URL 후보: + +```text +http://toki-labs.com:18080/darwin-arm64/iop-node +http://toki-labs.com:18080/bootstrap/node-darwin-arm64.sh +``` + +5. one-line Node bootstrap을 만든다. + - 목표 UX: + +```bash +curl -fsSL http://toki-labs.com:18080/bootstrap/node-darwin-arm64.sh | bash +``` + + - 스크립트 책임: + - `~/iop-field` 생성 + - `darwin-arm64/iop-node` 다운로드 + - 가능하면 checksum 확인 + - `chmod +x` + - macOS quarantine xattr 제거 + - `node.yaml` 생성 + - `./iop-node serve --config ./node.yaml` 실행 + +6. Edge에서 테스트한다. + - Node registration 확인 + - `/v1/models` + - non-streaming `/v1/chat/completions` + - streaming SSE와 `data: [DONE]` + - `/api/tags` passthrough + - `think:false`와 `options` passthrough + +## Milestone 체크 상태 + +현재 완료: + +- `[compose-ports]` +- `[runbook]` + +남은 항목: + +- `[artifact-layout]` +- `[one-line-node]` +- `[serve-lifecycle]` + +## 관련 파일 + +- `agent-ops/rules/project/rules.md` +- `docs/deploy-dev.md` +- `agent-ops/roadmap/current.md` +- `agent-ops/roadmap/phase/serving-routing-optimization/PHASE.md` +- `agent-ops/roadmap/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md` +- `apps/edge/cmd/edge/main.go` +- `apps/edge/internal/bootstrap/runtime.go` +- `bin/build/field-binaries.sh` +- 원격: `ssh toki@toki-labs.com:~/docker/services/code-server/compose/docker-compose.yml` + +## 다음 세션에 붙여넣을 한 줄 + +```text +/config/workspace/iop의 AGENTS.md 필수 규칙을 읽고, agent-task/m-field-bootstrap-test-port-readiness/reboot-handoff.md를 읽은 뒤 Field Bootstrap UX와 테스트 포트 정비 작업을 이어가. 우선 재부팅 후 code-server 포트 적용 여부를 확인하고, edge serve lifecycle 문제를 수정한 다음 Apple Silicon one-line Node bootstrap 테스트로 들어가. +``` diff --git a/docs/deploy-dev.md b/docs/deploy-dev.md index 95a8b9e..95066e3 100644 --- a/docs/deploy-dev.md +++ b/docs/deploy-dev.md @@ -117,6 +117,33 @@ repo root에서 수동으로 검증할 때는 기존 helper를 사용할 수 있 IOP_EDGE_ADDR=:9090 ./bin/node.sh ``` +## Field 테스트 환경 라우팅 + +field 테스트의 1차 기준 환경은 `ssh toki@toki-labs.com`의 code-server 컨테이너다. +컨테이너 compose 원본은 원격 `~/docker/services/code-server/compose/docker-compose.yml`이며, 재기동 타이밍은 운영자가 정한다. +이 저장소의 작업자는 compose를 수정할 수 있지만, 사용자가 명시하지 않으면 code-server 컨테이너를 재시작하지 않는다. + +| Host port | Container port | Purpose | +|---:|---:|---| +| `13000-13099` | `3000-3099` | web/dev app preview range | +| `18080` | `18080` | IOP field artifact/bootstrap HTTP | +| `18081` | `8080` | Edge OpenAI-compatible HTTP | +| `19080` | `19080` | Portal/Control Plane wire test endpoint | +| `19090` | `9090` | Edge-Node TCP transport | +| `19092` | `9092` | Edge metrics | +| `19190` | `9190` | OTO/specialized agent field transport reserve | + +field bootstrap UX는 Jenkins agent 연결처럼 Edge가 command를 제시하고 대상 host가 실행하는 형태를 목표로 한다. +초기 field 단계의 Node bootstrap은 다음 요구를 만족해야 한다. + +- Edge 또는 field artifact server가 `dist/field//-/iop-node`를 정해진 URL로 노출한다. +- Apple Silicon Mac은 `darwin/arm64` 산출물을 사용한다. `linux/arm64`는 Mac 실행 대상이 아니다. +- 사용자가 실행하는 명령은 한 줄 수준으로 유지하고, 내부에서 다운로드, 실행 권한 부여, config 생성, `iop-node serve`까지 이어진다. +- 직접 포트가 아직 적용되지 않았거나 외부망에서 막히면 SSH tunnel 또는 reverse tunnel은 fallback으로만 사용한다. + +현재 활성 작업 좌표는 `agent-ops/roadmap/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md`다. +이 Milestone이 끝나기 전까지 field bootstrap 관련 구현, 문서, 테스트 포트 변경은 해당 Milestone 범위로 판단한다. + ## 공통 Ollama 필드 테스트 환경 OpenAI-compatible Ollama E2E 서빙 검증은 아래 필드 환경을 공통 기준으로 사용한다.