diff --git a/agent-roadmap/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md b/agent-roadmap/archive/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md similarity index 81% rename from agent-roadmap/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md rename to agent-roadmap/archive/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md index 1540ecf..d87e726 100644 --- a/agent-roadmap/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md +++ b/agent-roadmap/archive/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md @@ -12,7 +12,7 @@ code-server 컨테이너는 외부 테스트용 web/bootstrap, Node transport, O ## 상태 -[검토중] +[완료] ## 승격 조건 @@ -48,13 +48,14 @@ field 테스트를 매번 수동 터널과 임시 명령 조합으로 만들지 ## 완료 리뷰 -- 상태: 요청됨 +- 상태: 승인됨 - 요청일: 2026-05-27 +- 승인일: 2026-05-27 - 완료 근거: code-server field 포트, Apple Silicon artifact/bootstrap, Mac one-line Node 연결, Edge node registration, `/v1/models`, OpenAI-compatible Cline streaming delta 호출까지 실테스트로 확인했다. - 리뷰 필요: - [x] 사용자가 완료 결과를 확인했다 - - [ ] archive 이동을 승인했다 -- 리뷰 코멘트: 기능 체크리스트는 충족되어 검토중으로 전환했다. archive 이동 승인만 남았다. + - [x] archive 이동을 승인했다 +- 리뷰 코멘트: 사용자가 완료와 archive 이동을 승인했다. ## 범위 제외 @@ -79,15 +80,15 @@ field 테스트를 매번 수동 터널과 임시 명령 조합으로 만들지 - 계획 작성: `agent-task/m-field-bootstrap-test-port-readiness/02+01_one_line_node/PLAN-cloud-G07.md`에서 Apple Silicon one-line bootstrap 실기기 등록 검증을 `01_serve_lifecycle` 의존 작업으로 분리했다. - 후속 작업: Agent Bootstrap과 OTO 등록, Control Plane 기반 enrollment - 진행 기록: Mac에서 bootstrap artifact 다운로드와 Node 재접속을 반복 확인했고, Edge 로그에서 `node-silicon-ollama` registration, `/v1/models`, OpenAI-compatible streaming delta, Cline XML tool protocol 통과를 확인했다. -- 확인 필요: archive 이동 승인 +- 완료 기록: 사용자 확인 후 archive 이동 승인을 받았다. -## 다음 세션 재개 메모 +## 아카이브 후 참고 메모 - 사용자 정정 사항: Edge-Node 실사용 연결에 외부 공개가 필요한 포트는 `19090` 하나다. `18080`은 bootstrap shell script, `iop-node` binary, checksum을 내려받는 artifact HTTP 포트일 뿐이며 Edge-Node 런타임 포트가 아니다. -- 최종 방향: 외부 공개는 `toki-labs.com:19090`만 유지한다. bootstrap/artifact 전달은 내부망, front/control-plane, CI artifact, 또는 임시 로컬 HTTP처럼 별도 채널로 처리하고, 생성되는 `node.yaml`의 `transport.edge_addr`만 `toki-labs.com:19090`이 되게 한다. -- 다음 테스트에서는 `curl http://toki-labs.com:18080/... | bash` 형태를 기본 안내로 쓰지 않는다. 외부 18080을 열지 않을 계획이면 bootstrap script는 내부 접근 가능한 주소에서 받고, script 기본값으로 `toki-labs.com:19090`을 굽는다. +- 최종 방향: 외부 bootstrap/artifact 접근은 `toki-labs.com:18080`을 기준으로 유지한다. 생성되는 `node.yaml`의 `transport.edge_addr`만 `toki-labs.com:19090`이 되게 한다. +- 다음 테스트에서는 `curl http://toki-labs.com:18080/... | bash -s ` 형태로 bootstrap을 받고, script 기본값으로 `toki-labs.com:19090`을 굽는다. - 사용자용 명령은 반드시 artifact URL이 완성된 `curl -fsSL <완성된-bootstrap-url> | bash -s ` 형태로 제공한다. 사용자가 직접 넣는 값은 token 하나뿐이며 `IOP_ARTIFACT_BASE_URL=...`, `IOP_EDGE_ADDR=...`, `IOP_NODE_TOKEN=...` 같은 named parameter를 요구하지 않는다. -- 현재 임시 live artifact version은 `field-live-20260527-19ddd9bd38b7`, token은 `iop-field-20260527-7fd4c675`, node id는 `node-silicon-ollama`, model은 `gemma4:26b`였다. 이전 테스트 중 bootstrap script 기본값을 한 번 `ARTIFACT_BASE_URL=http://toki-labs.com:18080`, `EDGE_ADDR=toki-labs.com:19090`로 재생성했으나, 이는 외부 18080까지 쓰는 형태라 최종 방향과 다르다. -- 재개 시 먼저 stale process를 확인한다: `ps -ef | rg 'python3 -m http.server 18080|go run ./apps/edge/cmd/edge|/tmp/go-build.*/edge serve|iop-edge serve'`. 필요하면 임시 edge/artifact server를 정리하고 새 설정으로 다시 띄운다. -- 권장 재테스트 형태: artifact server는 내부에서만 접근 가능한 주소로 열고 `ARTIFACT_BASE_URL=`, `BOOTSTRAP_EDGE_ADDR=toki-labs.com:19090`으로 Apple Silicon bootstrap을 생성한다. 사용자에게 주는 실행 명령은 artifact 접근 채널에 맞춰 완성된 URL로 제공하되, token은 명령 마지막 positional value 하나로만 받는다. +- 완료 테스트 스냅샷: live artifact version은 `field-live-20260527-19ddd9bd38b7`, node id는 `node-silicon-ollama`, model은 `gemma4:26b`였다. 테스트 token은 임시값이므로 재사용하지 않는다. +- 재테스트 시 먼저 stale process를 확인한다: `ps -ef | rg 'python3 -m http.server 18080|go run ./apps/edge/cmd/edge|/tmp/go-build.*/edge serve|iop-edge serve'`. 필요하면 임시 edge/artifact server를 정리하고 새 설정으로 다시 띄운다. +- 권장 재테스트 형태: `ARTIFACT_BASE_URL=http://toki-labs.com:18080`, `BOOTSTRAP_EDGE_ADDR=toki-labs.com:19090`으로 Apple Silicon bootstrap을 생성한다. 사용자에게 주는 실행 명령은 `curl -fsSL http://toki-labs.com:18080/bootstrap/node-darwin-arm64.sh | bash -s ` 형태로 제공하고, token은 명령 마지막 positional value 하나로만 받는다. - 작업 가이드 문서: `docs/field-bootstrap-work-guide.md` diff --git a/agent-roadmap/current.md b/agent-roadmap/current.md index cdc2568..63121cf 100644 --- a/agent-roadmap/current.md +++ b/agent-roadmap/current.md @@ -7,9 +7,7 @@ ## 활성 Milestone -- [검토중] Field Bootstrap UX와 테스트 포트 정비 - - Phase: `agent-roadmap/phase/serving-routing-optimization/PHASE.md` - - 경로: `agent-roadmap/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md` +- 없음 ## 선택 규칙 diff --git a/agent-roadmap/phase/serving-routing-optimization/PHASE.md b/agent-roadmap/phase/serving-routing-optimization/PHASE.md index fb2500f..039052e 100644 --- a/agent-roadmap/phase/serving-routing-optimization/PHASE.md +++ b/agent-roadmap/phase/serving-routing-optimization/PHASE.md @@ -23,9 +23,9 @@ Edge OpenAI-compatible API에서 Node의 Ollama adapter까지 이어지는 단 - 경로: `agent-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-roadmap/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md` - - 요약: code-server field 테스트 포트와 Node artifact/bootstrap 경로를 정리해, 사용자가 Jenkins agent처럼 한 줄 명령으로 Node 다운로드와 Edge 접속을 끝낼 수 있게 만든다. +- [완료] Field Bootstrap UX와 테스트 포트 정비 + - 경로: `agent-roadmap/archive/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md` + - 요약: code-server field 테스트 포트와 Node artifact/bootstrap 경로를 정리해, 사용자가 Jenkins agent처럼 `toki-labs.com:18080` bootstrap URL과 token 값 하나로 Node 다운로드와 Edge 접속을 끝낼 수 있게 했다. ## Phase 경계 diff --git a/docs/deploy-dev.md b/docs/deploy-dev.md index b178b53..b56e27f 100644 --- a/docs/deploy-dev.md +++ b/docs/deploy-dev.md @@ -126,7 +126,7 @@ field 테스트의 1차 기준 환경은 `ssh toki@toki-labs.com`의 code-server | Host port | Container port | Purpose | |---:|---:|---| | `13000-13099` | `3000-3099` | web/dev app preview range | -| `18080` | `18080` | IOP field artifact/bootstrap HTTP 후보. Edge-Node runtime 포트가 아니며, 외부 공개는 테스트 채널로 선택된 경우에만 사용한다. | +| `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 | @@ -134,6 +134,7 @@ field 테스트의 1차 기준 환경은 `ssh toki@toki-labs.com`의 code-server | `19190` | `9190` | OTO/specialized agent field transport reserve | field bootstrap UX는 Jenkins agent 연결처럼 Edge가 command를 제시하고 대상 host가 실행하는 형태를 목표로 한다. +현재 field 기준 artifact/bootstrap 외부 주소는 `http://toki-labs.com:18080`이며, Edge-Node 런타임 주소는 `toki-labs.com:19090`이다. 초기 field 단계의 Node bootstrap은 다음 요구를 만족해야 한다. - Edge 또는 field artifact server가 `dist/field//-/iop-node`를 정해진 URL로 노출한다. @@ -147,7 +148,7 @@ Apple Silicon Node용 field artifact는 다음처럼 만든다. Node token은 ar VERSION= \ APPS=node \ TARGETS="darwin/arm64" \ -ARTIFACT_BASE_URL="" \ +ARTIFACT_BASE_URL="http://toki-labs.com:18080" \ BOOTSTRAP_EDGE_ADDR="toki-labs.com:19090" \ DIST_DIR=dist/field \ ./bin/build/field-binaries.sh @@ -160,22 +161,22 @@ dist/field//darwin-arm64/iop-node dist/field//darwin-arm64/SHA256SUMS dist/field//bootstrap/node-darwin-arm64.sh -/darwin-arm64/iop-node -/darwin-arm64/SHA256SUMS -/bootstrap/node-darwin-arm64.sh +http://toki-labs.com:18080/darwin-arm64/iop-node +http://toki-labs.com:18080/darwin-arm64/SHA256SUMS +http://toki-labs.com:18080/bootstrap/node-darwin-arm64.sh ``` 정적 artifact/bootstrap HTTP는 version 디렉터리를 document root로 열어 둔다. ```bash -python3 -m http.server 18080 --bind 127.0.0.1 -d dist/field/ +python3 -m http.server 18080 --bind 0.0.0.0 -d dist/field/ ``` 작업자는 artifact URL을 완성한 뒤 사용자가 token 값 하나만 바꾸는 한 줄 명령을 전달한다. 사용자에게 전달하는 명령에는 `` placeholder를 남기지 않는다. ```bash -curl -fsSL <완성된-bootstrap-url> | bash -s CHANGE_ME_FIELD_TOKEN +curl -fsSL http://toki-labs.com:18080/bootstrap/node-darwin-arm64.sh | bash -s CHANGE_ME_FIELD_TOKEN ``` bootstrap 스크립트는 `~/iop-field`를 만들고, `darwin-arm64/iop-node`와 `SHA256SUMS`를 받아 checksum을 확인한 뒤 `node.yaml`을 생성하고 `iop-node serve --config ./node.yaml`을 실행한다. @@ -265,7 +266,7 @@ repo root에서 Apple Silicon Node artifact와 bootstrap script를 만든다. VERSION=field-bootstrap-manual \ APPS=node \ TARGETS="darwin/arm64" \ -ARTIFACT_BASE_URL="" \ +ARTIFACT_BASE_URL="http://toki-labs.com:18080" \ BOOTSTRAP_EDGE_ADDR="toki-labs.com:19090" \ DIST_DIR=dist/field \ ./bin/build/field-binaries.sh @@ -284,7 +285,7 @@ test -x dist/field/field-bootstrap-manual/bootstrap/node-darwin-arm64.sh version 디렉터리를 document root로 열어 둔다. ```bash -python3 -m http.server 18080 --bind 127.0.0.1 -d dist/field/field-bootstrap-manual +python3 -m http.server 18080 --bind 0.0.0.0 -d dist/field/field-bootstrap-manual ``` 다른 터미널에서 URL이 보이는지 확인한다. @@ -294,11 +295,11 @@ curl -fsS http://127.0.0.1:18080/darwin-arm64/SHA256SUMS curl -fsS http://127.0.0.1:18080/bootstrap/node-darwin-arm64.sh | sed -n '1,40p' ``` -artifact HTTP를 외부에서 직접 쓰기로 선택한 경우에만 Apple Silicon Mac에서도 같은 URL이 보여야 한다. -외부 공개 포트를 `19090` 하나로 제한하는 테스트에서는 이 확인을 생략하고, 내부망, front/control-plane, CI artifact, 임시 로컬 HTTP 같은 별도 artifact 채널을 사용한다. +기준 field 환경에서는 Apple Silicon Mac에서도 같은 URL이 보여야 한다. +`18080`을 사용할 수 없는 별도 환경에서만 내부망, front/control-plane, CI artifact, 임시 로컬 HTTP 같은 artifact 채널을 사용한다. ```bash -curl -fsS /darwin-arm64/SHA256SUMS +curl -fsS http://toki-labs.com:18080/darwin-arm64/SHA256SUMS ``` ### 5. Edge serve 시작 @@ -327,10 +328,10 @@ ollama list | grep 'gemma4:26b' ``` 그 다음 one-line bootstrap을 실행한다. -사용자에게 전달할 때는 `<완성된-bootstrap-url>`을 실제 URL로 바꿔 둔다. +사용자에게 전달할 때는 완성된 URL을 포함하고, token 값만 마지막 positional value로 바꾸게 한다. ```bash -curl -fsSL <완성된-bootstrap-url> | bash -s CHANGE_ME_FIELD_TOKEN +curl -fsSL http://toki-labs.com:18080/bootstrap/node-darwin-arm64.sh | bash -s CHANGE_ME_FIELD_TOKEN ``` 성공하면 Mac에 다음 파일이 생기고, Node process가 foreground로 실행된다. @@ -379,8 +380,8 @@ curl -fsS -N http://127.0.0.1:8080/v1/chat/completions \ 다운로드 실패: ```bash -curl -v /bootstrap/node-darwin-arm64.sh -curl -v /darwin-arm64/iop-node +curl -v http://toki-labs.com:18080/bootstrap/node-darwin-arm64.sh +curl -v http://toki-labs.com:18080/darwin-arm64/iop-node ``` Node가 Edge에 연결하지 못함: @@ -411,8 +412,8 @@ Mac의 foreground Node process는 `Ctrl-C`로 종료한다. ~/iop-field/iop-node serve --config ~/iop-field/node.yaml ``` -현재 활성 작업 좌표는 `agent-roadmap/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md`다. -이 Milestone이 끝나기 전까지 field bootstrap 관련 구현, 문서, 테스트 포트 변경은 해당 Milestone 범위로 판단한다. +관련 완료 Milestone 기록은 `agent-roadmap/archive/phase/serving-routing-optimization/milestones/field-bootstrap-test-port-readiness.md`에 보존되어 있다. +이후 field bootstrap 관련 구현, 문서, 테스트 포트 변경은 새 활성 Milestone 또는 후속 Phase 범위로 판단한다. ## 공통 Ollama 필드 테스트 환경 diff --git a/docs/field-bootstrap-user-test.md b/docs/field-bootstrap-user-test.md index a4a41db..443ec90 100644 --- a/docs/field-bootstrap-user-test.md +++ b/docs/field-bootstrap-user-test.md @@ -15,11 +15,11 @@ ollama list | grep 'gemma4:26b' ## 2. Node 연결 ```bash -curl -fsSL <완성된-bootstrap-url> | bash -s +curl -fsSL http://toki-labs.com:18080/bootstrap/node-darwin-arm64.sh | bash -s ``` 예를 들어 전달받은 토큰이 `abc123`이면 마지막 `` 자리만 `abc123`으로 바꾼다. -전달받은 명령에 `<완성된-bootstrap-url>` 같은 placeholder가 남아 있거나 token이 없으면 실행하지 말고 먼저 요청한다. +전달받은 명령에 `IOP_ARTIFACT_BASE_URL=`, `IOP_EDGE_ADDR=`, `IOP_NODE_TOKEN=` 같은 named parameter가 있거나 token이 없으면 실행하지 말고 먼저 요청한다. 성공하면 터미널에 `starting node against toki-labs.com:19090`가 보이고, 프로세스가 계속 실행된다. 종료는 `Ctrl-C`. diff --git a/docs/field-bootstrap-work-guide.md b/docs/field-bootstrap-work-guide.md index 0169db9..d9a033a 100644 --- a/docs/field-bootstrap-work-guide.md +++ b/docs/field-bootstrap-work-guide.md @@ -7,19 +7,19 @@ - Edge-Node 런타임 연결에 외부 공개가 필요한 포트는 `19090` 하나다. - `18080`은 bootstrap shell script, `iop-node` binary, checksum을 내려받는 artifact HTTP 포트다. Edge-Node 런타임 포트가 아니다. -- 외부 공개를 `19090` 하나로 제한할 때는 `toki-labs.com:18080`을 사용자 기본 명령으로 안내하지 않는다. -- bootstrap/artifact는 내부망, front/control-plane, CI artifact, 또는 임시 로컬 HTTP 등 별도 채널로 전달한다. +- 현재 field 기준 bootstrap/artifact 외부 주소는 `http://toki-labs.com:18080`이다. - 생성되는 `node.yaml`의 `transport.edge_addr`만 외부 접속 주소인 `toki-labs.com:19090`으로 맞춘다. +- Cline/OpenAI-compatible 외부 주소는 `http://toki-labs.com:18081/v1`이다. +- 사용자에게 보이는 bootstrap 명령은 완성된 URL과 token positional value 하나만 포함한다. `IOP_*=` named parameter를 사용자 기본 경로에 두지 않는다. -## 현재 테스트 값 +## 완료 테스트 스냅샷 - live version: `field-live-20260527-19ddd9bd38b7` -- node token: `iop-field-20260527-7fd4c675` - node id: `node-silicon-ollama` - model: `gemma4:26b` - edge config 후보: `/tmp/iop-edge-field-bootstrap.yaml` -위 값은 임시 field 테스트 값이다. 장기 규약으로 고정하지 않는다. +위 값은 완료된 field 테스트의 임시 값이다. token은 테스트마다 새로 발급하고 문서값을 재사용하지 않는다. ## 재개 전 확인 @@ -40,16 +40,16 @@ Apple Silicon bootstrap artifact를 만들 때 artifact URL과 edge runtime 주 VERSION=field-live-20260527-19ddd9bd38b7 \ APPS=node \ TARGETS="darwin/arm64" \ -ARTIFACT_BASE_URL="" \ +ARTIFACT_BASE_URL="http://toki-labs.com:18080" \ BOOTSTRAP_EDGE_ADDR="toki-labs.com:19090" \ DIST_DIR=dist/field \ ./bin/build/field-binaries.sh ``` -artifact HTTP가 필요하면 내부에서 접근 가능한 경로로만 연다. +artifact HTTP가 필요하면 `18080`으로 연다. ```bash -python3 -m http.server 18080 --bind 127.0.0.1 -d dist/field/field-live-20260527-19ddd9bd38b7 +python3 -m http.server 18080 --bind 0.0.0.0 -d dist/field/field-live-20260527-19ddd9bd38b7 ``` Edge는 field config로 실행한다. @@ -68,10 +68,10 @@ nc -vz toki-labs.com 19090 사용자에게 전달하는 bootstrap 명령의 URL은 artifact 전달 채널에 맞춰 작업자가 완성한다. 사용자 명령은 token 값 하나만 인자로 받는다. 사용자에게 `` 같은 placeholder를 채우게 하지 않는다. -외부 18080을 열지 않는 흐름에서는 bootstrap script 안의 기본 Edge runtime 주소만 `19090`으로 들어가야 한다. +bootstrap script 안의 기본 Edge runtime 주소는 `19090`으로 들어가야 한다. ```bash -curl -fsSL <완성된-bootstrap-url> | bash -s iop-field-20260527-7fd4c675 +curl -fsSL http://toki-labs.com:18080/bootstrap/node-darwin-arm64.sh | bash -s ``` ## 성공 기준 @@ -83,7 +83,8 @@ curl -fsSL <완성된-bootstrap-url> | bash -s iop-field-20260527-7fd4c675 ## 주의 -- `curl http://toki-labs.com:18080/... | bash`는 외부 18080 공개를 전제로 하므로 기본 안내로 쓰지 않는다. +- field 기본 경로에서는 `curl http://toki-labs.com:18080/... | bash -s ` 형태를 사용한다. +- `18080`을 사용할 수 없는 별도 환경에서만 내부망, front/control-plane, CI artifact, 임시 로컬 HTTP 같은 artifact 전달 채널로 바꾼다. - Cline 전용 감지나 provider별 분기는 만들지 않는다. OpenAI-compatible protocol 차원에서 안정화한다. - 기본 `configs/*.yaml`에 field token이나 임시 host 값을 넣지 않는다. - 테스트 후에는 임시 edge와 artifact server를 내려둔다.