iop/agent-task/m-field-bootstrap-test-port-readiness/reboot-handoff.md
toki 183c3d12a6 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
2026-05-26 20:16:44 +09:00

6.9 KiB

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 원본:

ssh toki@toki-labs.com
~/docker/services/code-server/compose/docker-compose.yml

기준 포트:

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

검증 완료:

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 컨테이너 포트가 실제 적용됐는지 확인한다.

ssh toki@toki-labs.com '/usr/local/bin/docker ps --format "{{.Names}} {{.Ports}}" | grep "^code-server "'

기대: 18080, 18081, 19090, 19092, 19190code-server 포트 목록에 보인다.

컨테이너 내부에서 포트가 열리는지는 서비스 기동 후 확인한다.

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 <field-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가 맞다.
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
  1. Apple Silicon Node artifact layout를 고정한다.
    • Apple Silicon은 darwin/arm64다.
    • linux/arm64는 Mac 실행 대상이 아니다.
    • 기존 build entrypoint:
VERSION=<field-version> APPS=node TARGETS="darwin/arm64" DIST_DIR=dist/field ./bin/build/field-binaries.sh
  1. artifact/bootstrap HTTP를 18080에 띄우고 URL 규칙을 정한다.
    • 임시 시작점 후보:
python3 -m http.server 18080 --bind 0.0.0.0 -d dist/field/<field-version>
  • 외부 URL 후보:
http://toki-labs.com:18080/darwin-arm64/iop-node
http://toki-labs.com:18080/bootstrap/node-darwin-arm64.sh
  1. one-line Node bootstrap을 만든다.
    • 목표 UX:
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 실행
  1. Edge에서 테스트한다.
    • Node registration 확인
    • /v1/models
    • non-streaming /v1/chat/completions
    • streaming SSE와 data: [DONE]
    • /api/tags passthrough
    • think:falseoptions 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

다음 세션에 붙여넣을 한 줄

/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 테스트로 들어가.