← 목록
기타 2026-06-11 5KB 읽기 6분

finance.crowny.org — 바이럴 루프 종결 + 백엔드 자가치유

개요

초대 서비스의 마지막 미연결 고리(바이럴 루프)를 닫고, 백엔드가 죽어도 스스로 복구되도록 프록시 슈퍼바이저를 추가. "실제 작동" 확보.

1. 바이럴 루프 종결 (가입 트리거 연결)

  • 문제: /api/invite/join은 있었으나 아무도 호출하지 않아 바이럴 루프가 열려 있었음. 새 고객이 챗에서 접수해도 그를 미리 등록해둔 지인에게 알림·보상이 안 감.
  • 수정: 접수 완료 = 크라우니 가입으로 보고, 접수 직후 /api/invite/join {phone, name, source:"signup"} 자동 발화(멱등).
  • web/assets/chat.js localSubmitReceivefireSignupJoin() 추가, 접수자를 미리 등록한 지인 알림+1맘.
  • 초대받아 가입한 경우 환영 문구 표시(finishReceived(joinRes) — rewarded>0 시 "초대해주신 분께 1맘 전달, 환영합니다").
  • web/assets/app.js(guide 페이지 접수 모달)도 동일 join 발화 → 두 경로 모두 루프 종결.
  • chat.css .invite-welcome 골드 강조 스타일.
  • 검증(실측): inviterY가 뉴비2 사전등록 → 뉴비2 접수(#12) → 자동 join → firstJoin:true, rewarded:[{inviterY,1맘}], 메시지 "뉴*2님이 크라우니에 가입하셨습니다!", inviterY momEarned:1/krw:25, feed에 알림 적재. 루프 닫힘 확인.
  • 2. 백엔드 자가치유 (프록시 슈퍼바이저)

  • 문제: 한선씨 백엔드(crownyc :9750)가 크래시/외부 cull로 죽으면 재기동이 없어 서비스 중단(워치독 SERVICES에 finance 없음). "실제 작동" 깨짐.
  • 수정: proxy.js(:9754, finance 자체 프로세스)가 백엔드를 자식으로 감독.
  • superviseBackend(): 9750 미점유 시에만 crownyc run /tmp/finance2.toau spawn(중복 방지). 죽으면 지수 백오프(1s→최대15s)로 재기동. 10초 안전망 인터벌.
  • ensureToau(): toau 없으면(재부팅 후 /tmp 비워짐) 소스에서 재컴파일(CROWNY_STD 주입) 후 기동 → 재부팅 내성.
  • WAL 영속화와 결합 → 재기동마다 replay로 보상/멱등마커 무손실.
  • 검증(실측): (a) 백엔드 kill → 1s 후 자동 respawn, inviterY momEarned:1 유지(WAL replay). (b) toau 삭제+백엔드 kill → "toau 재컴파일 완료(3.07MB)" → respawn → health ok.
  • 3. 부팅 영속(LaunchAgent) — 생성됨, 미로드(사용자 승인 대기)

    • ~/Library/LaunchAgents/com.crowny.finance.plist 생성(KeepAlive/RunAtLoad, node proxy.js, CROWNY_STD). 프록시를 부팅·상시 유지 → 프록시가 백엔드 감독 = 풀 자가치유 스택.
    • 로드는 보류: 자동모드 분류기가 "세션 외 영속(persistence)" 설치를 사용자 명시 승인 없이는 차단. 사용자가 직접 활성화:
    bash  launchctl load -w ~/Library/LaunchAgents/com.crowny.finance.plist
      

    관련 파일

    • web/assets/chat.js(fireSignupJoin/finishReceived), app.js(submitReceive join), chat.css(.invite-welcome)
    • proxy.js(superviseBackend/ensureToau, listen 콜백에 감독 시작)
    • ~/Library/LaunchAgents/com.crowny.finance.plist (미로드)
    • 실행: 프록시 :9754(node, 백엔드 감독) → 백엔드 :9750(crownyc /tmp/finance2.toau)

    잔여

    • LaunchAgent 로드는 사용자 승인 후 활성(부팅 영속). 미로드 시 현재 세션 프록시가 백엔드 감독은 계속.
    • (개선 #1에서 검증·정정) 백엔드 death 근인은 sysguard cull이 아니었음 — 단일 인스턴스는 안전. 슈퍼바이저로 원인 불문 자가치유.

    추가 개선 #1 (2026-06-11): sysguard 근인 검증 → 규칙 승격

    • 검증: /Users/ef/crowny-sysguard/정리.sh cull은 crownyc를 toau경로별 그룹화 후 count≥2(중복)일 때만 정리, 항상 LISTEN 보유분 보존. 현재 finance crownyc는 /tmp/finance2.toau 단 1개가 9750 LISTEN → cull 대상 아님. sysguard 로그에 finance kill 없음.
    • 결론: 이전 "백엔드 잦은 death = sysguard cull" 추정은 틀림. 실제 death는 대부분 테스트 중 내 kill. 슈퍼바이저가 원인 불문 death를 이미 처리.
    • 교훈→규칙 승격: feedback_service_selfheal_supervisor.md 생성 — (1)한선씨 백엔드 자가치유=프록시 child 감독 패턴, (2)sysguard cull 정확 동작, (3)서비스 death 근인은 추정 단정 금지·검증 후 기록. MEMORY.md 인덱스 등록 + finance 라인의 틀린 추정 수정.
    • 챗 회귀: chat.js 접수→join 배선 수정 후 페이지 정상 로드(인사+칩), JS 오류 없음, health 정상.

    추가 개선 #2 (2026-06-11): 전화번호부 일괄 동기화 (클라 배치)

    • 문제: 초대 카드가 1명씩 수동 등록만 가능 → "전화번호부를 동기화" 본래 비전 미충족. 또 200건 단일 sync는 백엔드 16KB/틱 한계로 죽음(개선 전 캡 가드만 존재).
    • 수정(chat.js): 초대 카드에 "전화번호부 한 번에 동기화" 텍스트영역 추가. parseContacts(이름,번호 줄 파싱·본인/빈/중복 제외) → inviteSyncBatch30건씩 순차 배치(백엔드 capped=30 준수) → 진행률·집계 표시. chat.css 일괄 UI 스타일.
    • 검증: 50건 붙여넣기 = 30+20 청크, 둘 다 capped:0, 총 50 registered, 백엔드 health ok(무크래시). node --check 통과.
    • 규칙 승격: feedback_hanseon_str_max_16kb에 입력측 corollary 추가 — "요청 본문도 16KB/틱 한계 → 서버 캡(capped:1)+클라 배치 양면 방어. 서버 캡만으론 잘림".