크라우니 서비스서버 한선씨 마이그레이션 (2026-06-22)
개요
서비스서버.js (748줄, Node.js) → 서비스서버.한선 (한선씨 정통본) 섀도 파일럿 완료.작성 파일
/Users/ef/crowny-services/서비스서버.한선(새로 작성)- 컴파일:
/Users/ef/CrownyOS/crownyc/hanseonc_high 서비스서버.한선 > /tmp/ss.toau - 실행:
SERVICE=<이름> PORT=<포트> /Users/ef/CrownyOS/crownyc/crownyc run /tmp/ss.toau
섀도 검증 (beauti 서비스, 포트 19742 vs 라이브 9742)
| 엔드포인트 | 섀도 | 라이브 | 패리티 |
|---|---|---|---|
| /api/health | {"status":"ok","service":"beauti","domain":"beauti.crowny.org","port":19742,"engine":"hanseon"} | {"status":"ok",...,"ts":...} | 일치 (포트·ts 필드 차이만) |
| /health | 동일 | 동일 | 일치 |
| / | 정적 index.html 서빙 | 정적 index.html 서빙 | 일치 |
| /crowny-tokens.css | SSOT CSS 서빙 | SSOT CSS 서빙 | 일치 |
| /api/store (owner 없음) | {"error":"no owner"} | {"error":"no owner"} | 일치 |
| /unknown.html | 모노톤 랜딩 폴백 | 모노톤 랜딩 폴백 | 일치 |
핵심 발견 (VM 함정)
TCP읽기 2인자 필수: TCP읽기(연결, 4096) — 1인자만 넘기면 스택 오염으로 블락.
기존 통합서비스서버.한선도 동일 버그를 가지고 있었음 (이번에 수정됨).
미포팅 기능 (JS 원본 유지)
/api/storePOST — JSON 파싱 + 원자 rename(쓰기→이름변경) + 512KB 제한/api/anchor— SHA256 해시체인 앵커 append-only 저널/api/blob— 스트리밍 업로드/다운로드, SHA256 dedup, 쿼터, Range 응답/api/quota— 블롭 쿼터 집계/api/zip— 무압축 ZIP 스트리밍 (CRC32 순수 node 구현)/api/share— 공유 토큰 생성/조회/삭제/api/merge— 항목별 LWW CRDT 머지/api/access— 업로드/다운로드 접근 이력/api/구매확정— 크라우니코인 verse 호출/api/status(ecosystem) — 전체 서비스 상태 집계- 썸네일 생성 (sips 호출)
라이브 스왑 안전 절차 제안
1. 원자 스왑 (manage.sh 사용 금지 — 사용자/게이트웨이 세션이 결정)
- 섀도에서 해당 서비스의 정식 포트로 재컴파일 후 실행
- 기존 PID 확인: lsof -i :<포트> | awk 'NR>1{print $2}'
- 새 프로세스 시작 후 헬스 확인 완료 시 기존 PID kill
- 롤백: kill 새PID && SERVICE=<이름> PORT=<포트> node 서비스서버.js &
2. 1차 스왑 대상 (미포팅 API 없는 랜딩전용 서비스):
bible market edu insurance interior branding health care baraco government
price walk matching bm balance labor crew talk mail logo flexible kira
christian jirayer spirit yeseo mobile architect kps
3. 2차 스왑 (store GET 사용 서비스): cloud memo (POST store 미포팅 주의)
4. 불가 (blob/zip/anchor 필수): cloud memo (1차 제외 후 JS 원본 계속 사용)
잔여 이슈
- TCP읽기 2인자 수정을 통합서비스서버.한선에도 반영 필요
- /api/store POST 한선씨 포팅 (원자쓰기
이름변경()opcode 사용) - 썸네일 한선씨 포팅 (파일소켓전송 활용)