← 목록
기타 2026-07-24 9KB 읽기 10분

tele.crowny.org 크라우니메신저 — dc 앱 실서버 브릿지 배선 완료

개요

dc 핸드오프 메신저 앱(pc/mobile/tablet/bar 4변종)을 데모에서 실서버 데이터로 전환. 순수 한선씨 서버(텔레서버.한선 1671줄) + 브라우저 주입 브릿지(tele-bridge.js 741줄+) 구조. 공개 라이브: https://tele.crowny.org (게이트웨이 :9619, 와일드카드 cert 커버).

무엇을 했는지

  1. 텔레서버.한선 STRICT 컴파일·종단검증 — EXIT=0 경고0, 34,316큐브. API 24라우트 전부 curl 실측 PASS:
인증(signup/login/me/logout/verify/members/role, 첫 회원 admin), 방(dm/create/list), 메시지(send/list/ack, PSV 왕복, 영수증 ✓→✓✓/✓ n/m), 지갑(조회/send + DM방 kind:tx 자동삽입), 집사(status/backup/wallet/snapshot/restart + nl 자연어 키워드 라우팅), 노드, RTC 시그널링.
  1. 브릿지 주입 배선_정적서빙이 text/html 서빙 시 <script src="/tele-bridge.js">를 append (HTML 원본 무수정).
  2. tele-bridge.js (sonnet 위임 구현, public/) — 브릿지계획.md(395줄, docs/) 기반:
- 로그인/가입 오버레이(#dc-root 독립 형제노드) + localStorage 토큰 + /api/auth/me 자동로그인 - React 파이버 역추적으로 StreamableComponent.logic 인스턴스 획득(§8) — 브라우저 실동작 확인 - 데모킬: clearInterval(_demo)+_timers 정리(_ck 시계 유지) - 실방 재구성: room/list+members로 CHATS/CONVO 배열째 교체+AV/STORE/REPL 기본값+forceUpdate, peerId 저장 - send/payGo/brain 분기별 완전 재작성(origSend 미호출 — 데모 부작용 차단) - 폴링 3s 메시지(seq 커서+seen 셋 dedup, 타인 push+자동 ack)/10s 지갑/15s 방목록 - 영수증: pendingOwn seq 추적 → since 하향 재관찰 → r:2 직접 setState(✓ n/m n==m 일반화)
  1. 브라우저 E2E (Chrome 실검증) — 오버레이 로그인→브릿지 초기화(mode=pc)→UI 송신(서버 seq 저장)→실시간 수신
(tester2 발신이 3s 내 렌더)→자동 ACK(✓✓ 전환)→집사 실API 카드(실잔액)→payGo 서버확정 송금(txid 실물·잔액 동기) →영수증 r:1→2 실전환("✓✓ 양측 저장" 육안). 결함 1건(자기 영수증 미갱신) 발견→수리→재검증 PASS.
  1. 상주화·공개 — LaunchAgent org.crowny.tele(CROWNY_TCP_LOOPBACK=1·RCVTIMEO 1500ms 스톨처방 포함) 로드,
서버 재기동 후 세션 파일영속으로 자동 로그인 유지 확인. 공개 https 3경로(/, /api/health, /tele-bridge.js) 200.

관련 파일

  • /Users/ef/crowny-tele/텔레서버.한선 (+ .toau) — 서버 SSOT
  • /Users/ef/crowny-tele/public/tele-bridge.js — 브릿지(플랫폼락 JS, 동반 제외 판정)
  • /Users/ef/crowny-tele/docs/브릿지계획.md — dc 앱 내부구조 실측 SSOT
  • /Users/ef/crowny-tele/public/{pc,mobile,tablet,bar}.html — dc 번들(무수정)
  • ~/Library/LaunchAgents/org.crowny.tele.plist

잔여 이슈

  • mobile.html 브라우저 실검증 미실시(PC만 완료 — mobile은 코드 경로 동일 구현, props 채널 부재 제약은 계획 §리스크5)
  • 과거 자기 메시지 히스토리 미표시(커서 설계 — 방 진입 시 신규분만), 타 세션 발신 자기 메시지 동일
  • attach(파일첨부)는 데모 로직 잔존(서버 연동 스코프 외)
  • 통화(WebRTC)는 로컬 데모 유지 — /api/rtc/ 시그널링 라우트는 서버에 준비됨
  • 집사 nl 라우팅=키워드 5종(상태/백업/지갑/스냅샷/재시작) — 확장 여지

2차: 4목표 완성도 파이프라인 (2026-07-24 같은 날 완료)

파이프라인 (연구→분해→분업→병렬구현→결선→운영)

  • 연구 웨이브1(3기 병렬): docs/학습/ 3본 — 전통메신저(Telegram/Signal/Matrix: dedup UUID·커서 원자교체·unread 서버계산)·P2P통화(Briar/Syncthing/WebRTC: 비-trickle SDP·델타복제)·지갑집사봇(TON/Toss사고/BotFather: 멱등키·위험명령 2단계·서킷브레이커)
  • 작업분해: docs/작업분해-분업계획.md — 26 최소단위(B1~6/P1~5/W1~5/M1~7/O1~3) + 선고정 API 계약
  • 구현 웨이브2(4기 병렬, 파일소유 분리): S1 텔레서버.한선(1679→2505줄, 신규 라우트 6종·집사 명령 8종·2단계 확인·멱등키·unread·before/limit·cid dedup·파일첨부·노드비트) / S2 복제기.한선(델타 복제→replica/·복제상태.psv — REPL 2/2 실데이터) / BR tele-bridge.js(818→1624줄, 히스토리·unread배지·방생성UI·집사칩·내역패널·WebRTC 비-trickle·파일함) / TH 운영하네스 시나리오.sh(24항목 채점)
  • 결선: STRICT 0경고 재컴파일·라이브 재기동·복제기 LaunchAgent(org.crowny.tele-repl, 60s) 배선
  • 운영 4라운드: R1 20P/4SKIP(하네스 오탐)→판정 엄격화, R2 23/1(unread 커서없음=0 결함)→1줄 수리, R3 24/24, R4 24/24 — 연속 2라운드 무결함 종료
  • 브라우저 통합검증: 히스토리 복원(11건+영수증)·unread 5→0·REPL[2,2] 실값·방생성 종단·집사칩 8종/도움말/재시작 2단계·지갑내역·파일 수신카드·계정간 정합(1,055 CRD) 전부 PASS. WebRTC=배선 완료·자동화 환경 마이크 부재로 성립 미확인(우아한 실패 확인, 실기기 검증 항목).

발견·완화된 함정 (신규)

  • 요청 전체 65535B 하드캡: 대형 업로드 무음 절단 → 첨부 b64 50000자 클램프+400 too_large(서버)·36KB 사전 차단(브릿지). 200KB+ 필요 시 청크 업로드 프로토콜 요망.
  • 대형 JSON 필드 O(n²) 추출: 65KB 필드 15-20s 단일스레드 블록 → _JSON값빠름(포함+부분 1회) 0.6s.
  • 하네스 판정 느슨/오탐: 필드부재=SKIP 판정이 실배선을 가림 → 실값 assert로 강화.

잔여

  • WebRTC 통화 실기기(마이크) 검증 · TURN 서버(실사용자 15~30% 직결 실패 대비) 로드맵
  • 원격 VPS read-replica(현재 로컬 replica/ 1곳) · mobile.html 실검증
  • 200KB+ 첨부 청크 업로드 · ops 테스트 계정 정리 스크립트

3차: 잔여 소화 (2026-07-24 저녁)

  • 청크 업로드: 서버 /api/file/part(40000자/파트·1MB 총·seq 검증·고아 스윕) + 다운로드 파일소켓전송 스트리밍 전환(64KB 초과 무음절단 선제 수리) + 브릿지 직렬 청크·fid dedup. 라이브 종단: 3파트 100,000바이트 diff 0.
  • mobile.html 실검증: mode=mobile 초기화·CONVO 재구성(DM→p2p/그룹→msg 탭)·집사 실카드·txs 3건·송수신 왕복·히스토리 15건 전부 PASS. 소결함(모바일 칩 미교체) 발견→CHIPS.butler 8종 교체 수리.
  • 운영 라운드5: 하네스 24/24.
  • 테스트 데이터 정리: 정리.sh --apply(계정 49·방 14·파일 45 제거, tester 혼합 방 보존) → 사고 1건: 잔액 줄 제거로 audit 불일치 49계정 → .bak 복원으로 일치(55계정) 회복, 정리.sh는 "지갑(원장+잔액) 세트 보존" 기본으로 수정.
  • ★신규 함정(메모리 등재): crownyc 힙 144MB 캡 — 장기 구동+3s 폴링 누적으로 [MAP] 힙 부족→[ARRAY] OOM 크래시(프레시 정상=누적성). 처방=KeepAlive+새벽 04:30 예방 kickstart(org.crowny.tele-daily 배선 완료).
  • 최종 상태: 공개 https 200, LaunchAgent 3종(tele/tele-repl/tele-daily), 감사 일치.

4차: 잔여 인프라 (2026-07-26) — WebRTC/TURN·원격 read-replica

  • TURN 서버: coturn 설치→3479 상주(org.crowny.tele-turn, 3478은 기존 STUN 점유). turnutils 릴레이 전단계(ALLOCATE·CREATE_PERMISSION·CHANNEL_BIND·REFRESH) 전부 success, 실전송 16msg/1600B 손실 0% 실측. 브릿지 iceServers=STUN+TURN(location.hostname 동적, 도달불가 TURN은 ICE 자동무시라 STUN-only 무손상).
  • RTC 시그널링: 서버 /api/rtc/ join→listeners→offer→조회→answer→조회→leave curl 종단 PASS(SDP b64 왕복 무결).
  • 원격 read-replica: 서버 /api/repl/pull·/api/repl/rooms(노드키 인증·seq 델타·500줄 페이지네이션) + /api/nodes/beat 노드키 인증 병행 + /api/room/repl 살아있는 원격노드(replica·60s) 가산. 복제수신.한선(310줄)+복제수신.sh(195줄 bash 폴백, crownyc 없는 VPS용) 더블. 라이브 실측: 복제수신→6방 byte-identical·멱등(당김줄 0)→beat→/api/nodes에 replica-remote status:g→REPL copies 3/3 반영. 60s 스케줄 상주(org.crowny.tele-replrecv).
  • LaunchAgent 5종: tele(서버)·tele-turn·tele-repl(로컬복제기)·tele-replrecv(원격수신 60s)·tele-daily(04:30 예방재기동).
  • 인프라 제약(정직): code.crowny.org SSH=헤어핀 자기자신 → 이 세션 접근가능 실원격 VPS 없음. 원격 replica는 로컬 제2노드로 완전검증, 실 VPS는 접속정보 시 복제수신.sh를 VPS cron 배치로 즉시. TURN 실릴레이 효과(대칭NAT 관통)는 공인IP VPS에서만 — 로컬은 메커니즘 검증. WebRTC 브라우저 ICE·실기기 마이크 오디오는 Chrome 확장 끊김으로 보류(시그널링·TURN는 CLI 검증 완료).
  • 하네스 최종 회귀 24/24, 공개 https 200.