← /log
2026-04-02

작업 로그

1,661 words·raw from wai-vault/02-DevLog

2026-04-02 작업 로그

오늘 한 일

1. GitHub 정리

  • 불필요 파일 5개 삭제 (-825줄)
    • DEPLOY-TODO.md (완료된 임시 체크리스트)
    • RESEARCH_TOOLS_API_2026.md (docs/에 중복)
    • webhook/create-neurons.sh (v2로 대체)
    • webhook/test-telegram.js (일회성 + 토큰 하드코딩)
    • webhook/set-opus.py (일회성 설정)
  • webhook/package.json 추가 (의존성 관리: mysql2, bcryptjs, dotenv)
  • 커밋: 72ad566

2. 서버 정상화

  • mysql2 미설치 발견 → npm install → Board API + ERP API 로드 성공
  • 에이전트 프로필(SOUL.md 등) 서버 미배포 → 22개 전체 /root/.openclaw/agents/*/agent/에 복사
  • 텔레그램 Webhook URL 비어있음 → 설정 (단, OpenClaw polling과 충돌해서 polling 모드 유지)

3. OpenClaw auth 포맷 변경 (핵심 이슈)

  • OpenClaw 2026.4.1이 auth-profiles.json 포맷을 변경
  • 이전: {"openrouter":{"apiKey":"..."}} ← 인식 안 됨
  • 새 포맷: {"version":1,"profiles":{"openrouter:manual":{"type":"token","provider":"openrouter","token":"...","expires":...}}}
  • openclaw models auth paste-token --provider openrouter 명령으로 ceo-vision에 적용
  • 해당 포맷을 22개 에이전트 + main 전체에 복사
  • 결과: 텔레그램 에이전트 응답 정상화

4. MCP 서버 정리

  • @anthropic/mcp-mysql → npm에서 삭제됨 (404)
  • @modelcontextprotocol/server-fetch → npm에서 삭제됨 (404)
  • paljalab-db, marketing-db → @liangshanli/mcp-server-mysql로 교체
  • meta-ads → 삭제 (대표님이 Meta API 삭제)
  • fetch → 삭제 (패키지 없음)

5. 로컬 환경 수정

  • ~/.openclaw/openclaw.json 첫 줄에 "REMOVED" 문자열 삽입되어 JSON 깨짐 → 제거
  • telegram.enabled: falsetrue 변경
  • agents.defaults.subagents.allowAgents deprecated 키 제거

6. 서버 인프라

  • systemctl enable openclaw (재부팅 시 자동시작)
  • test-auth 에이전트 삭제
  • 텔레그램 5개 토픽에 공지 등록

복기

왜 잘 되는가

  • auth-profiles.json 포맷 하나가 핵심
  • ceo-vision이 default 에이전트 → 텔레그램 메시지 라우팅 대상
  • auth 포맷 맞추니 OpenRouter API 호출 가능 → 응답 정상화
  • 같은 포맷을 전체 에이전트에 복사 → 유기적으로 전부 동작

잘된 점

  • mysql2 미설치, 프로필 미배포, MCP 404 — 빠르게 발견+수정
  • 로컬+서버 동시 점검으로 연결된 문제 파악
  • 전체 시스템 health check 체계적으로 수행

못한 점

  • auth 포맷 삽질 1시간+ (3가지 포맷 시도, config set 시도 후 paste-token이 정답)
  • 중복 프로세스 반복 발생 (kill 후 sleep 부족)
  • webhook vs polling 동시 사용 불가 늦게 파악

서버 재시작 절차

systemctl start claude-bridge && systemctl start openclaw
sleep 20
curl -s http://127.0.0.1:18789/health  # OpenClaw
curl -s http://127.0.0.1:18790/health  # Bridge

현재 상태

  • OpenClaw Gateway: 18789 ✅ (auth 정상, 텔레그램 polling)
  • Claude Bridge: 18790 ✅ (Board API + ERP API 로드)
  • Staging Bridge: 18791 ✅
  • 텔레그램 에이전트: 응답 정상 (👑 CEO-Vision)
  • OpenRouter: $43.71 사용, 정상
  • SSL: watone 279일, paljalab 81일, marketing-factory 32일

Nexus 제품 재설계 (Phase 0~4 완료)

아키텍처: 모듈러 모놀리스

단일 프로세스 유지, 모듈 경계만 분리. 기존 w-ai-agents 레포에서 진행.

완료된 Phase

Phase내용커밋
0안전장치 (v1.0-stable 태그 + 스모크 테스트)b35b71b
1에이전트 레지스트리 — 4파일→JSON 1개, admin/client 권한 분리7d58fd8
2플러그인 시스템 — board/erp 분리, manifest 기반 자동 로드4f714a9
3에이전트 동적 등록 API — UI에서 클릭 추가, 프로필 자동 생성f46efe9
4뉴런→에이전트 제안 파이프라인 — 패턴 분석→제안→승인→자동 생성021f71f

핵심 변경

  • config/agent-registry.json — 22개 에이전트 Single Source of Truth
  • webhook/agents/registry.js — 레지스트리 모듈 (CRUD + HTTP API + 동적 등록)
  • webhook/plugins/loader.js — 플러그인 로더 (디렉토리 스캔 → 자동 마운트)
  • webhook/plugins/board/ + webhook/plugins/erp/ — 플러그인화
  • webhook/modules/neuron.js — 에이전트 제안 파이프라인 추가
  • webhook/modules/router.js — registry 연동 (하드코딩 폴백 유지)
  • webhook/modules/hooks.js — registry 연동

검증 결과

  • 로컬: 26 passed, 0 failed
  • 스테이징: 29 passed, 0 failed
  • 프로덕션: 29 passed, 0 failed, 배포 완료

admin/client 권한 체계

  • admin: 에이전트 추가/삭제/수정, 시스템 설정, 뉴런 관리 (22개 전체 조회)
  • client: 업무 요청/확인, 납품물 수락/재작업 (4개 에이전트만 조회)

보안 하드닝 (Step 1~2 완료)

전체 코드 보안 감사 → 30개 취약점 발견 → 28개 수정 완료. 고객사가 Nexus 앱을 역공학하거나 API 직접 호출해서 악용할 수 있는 모든 벡터 차단.

Step 1: 서버 수정 (19개) — 프로덕션 배포 완료

#취약점파일수정
1-2DB 비밀번호 하드코딩board/index.js, erp/index.jsprocess.env.DB_*
3-4CORS 와일드카드 *board/index.js, erp/index.jsallowedOrigins 배열
5뉴런 GET 인증 없음neuron.jsBearer token 검증
6exec() 인젝션neuron.jsfs.mkdirSync + fs.writeFileSync
7게시물 소유권 미검증board/index.jsauthor_id 또는 admin 체크
8-9에러 메시지 노출board, erp일반 에러 메시지
10하드코딩 기본 토큰config.js폴백 제거, 시작 시 검증
11패스워드 고정 솔트auth.js유저별 랜덤 솔트 + 레거시 호환
12에이전트 등록 검증 없음registry.jsID 포맷 + 예약어 검증
13Rate limiting 부재board, erp로그인 5회/분, API 60회/분
14입력 크기 제한 없음claude-bridge.js1MB 제한
15일일 한도 휘발성hooks.jsdaily-counts.json 영속화
16-17세션 토큰 만료 없음board, erp24시간 TTL
18-19타이밍 공격board, erpdummyHash + bcrypt 항상 실행

Step 2: Electron 앱 수정 (9개) — GitHub 푸시 완료 07dc20a

#취약점파일수정
20텔레그램 토큰 하드코딩database.js빈 값 초기화 → Settings UI 입력
21API 토큰 하드코딩api-server.jscrypto.randomBytes
22기본 admin 비밀번호database.jsforce_pw_change 플래그
23IPC 역할 검증 없음main.jsadminOnly() 래퍼
24CORS 와일드카드api-server.jslocalhost만
250.0.0.0 바인딩api-server.js127.0.0.1
26CSP 미설정main.jsCSP 헤더 추가
27텔레그램 콜백 인증 없음telegram.jsallowed_approvers 화이트리스트
28bcrypt 라운드 10database.js12로 변경

Step 3: 멀티테넌트 격리 (미완료)

  • users/posts 테이블에 company_id 추가 필요 (DB 마이그레이션)
  • 전체 쿼리에 WHERE company_id=? 필터링
  • DB 스키마 변경이라 별도 계획 필요

침투 테스트 결과

패치 전 (취약):

  • CORS * → 아무 origin에서 API 호출 가능 ❌
  • 로그인 brute force → 무제한 시도 가능 ❌
  • 에러 메시지 → DB 스키마 정보 노출 ❌

패치 후 (차단):

  • CORS → 허용 origin만 통과 ✅
  • Rate limit → 6번째 시도에서 429 차단 ✅
  • 에러 → "Internal server error"만 반환 ✅
  • 뉴런 API → 토큰 없이 401 ✅

Phase 5: Nexus UX/UI 리디자인 (야간 세션, 21:00~23:30)

서버 복구

  • MySQL 서버 재설치 (서버 재설치 때 누락)
  • wai_board DB + 7개 테이블 생성 (users, posts, comments, attachments, notifications, approval_logs, deliveries)
  • admin 계정 생성 (bcrypt hash, bridge webhook 경로에서 생성)
  • Board API 로그인 정상화 확인

VPS 인프라 점검 + 자동복구 체계

  • 근본 원인 발견: system-level과 user-level OpenClaw 게이트웨이 이중 등록 → 포트 충돌 → crash loop → 고아 프로세스 → 승인 소켓 미생성
  • system-level openclaw.service 제거, user-level만 사용으로 확정
  • claude-bridge-staging.service 제거
  • user-level 서비스에 OPENROUTER_API_KEY 환경변수 추가
  • RAM 946MB → 461MB (444MB 확보)
  • watchdog.sh 생성 + cron 등록 (3분마다): bridge/gateway/shift-manager/nginx 자동복구, 고아 프로세스 정리, 메모리/디스크 감시

Nexus Phase 5 구현 (커밋: 6efc77b, 52022cb)

디자인 시스템:

  • Apple HIG + Linear 하이브리드 (AI 티 제거)
  • 다크/라이트 모드 (시스템 감지 + 수동 토글)
  • Apple iOS 컬러 팔레트, -apple-system 폰트 스택
  • segmented-control, modal-overlay, section-card 등 Apple 컴포넌트

디렉토리 재구성 (설계도 기준):

src/components/
  board/         (5) PostList, PostForm, PostDetail, ApprovalPending, ApprovalLog
  agents/        (4) AgentList, AgentDetail, AgentForm, AgentProposals
  dashboard/     (1) Dashboard (4단 레이아웃)
  neurons/       (2) NeuronBrowser, NeuronPromote
  Login.jsx, Sidebar.jsx, Settings.jsx (3섹션 리디자인)
electron/
  demo-data.js (오프라인 데모 22개 에이전트)

신규 컴포넌트 (15개 파일, 2,129줄):

  • Dashboard: 핵심지표 4카드, 요청상태분포 바차트, 에이전트 성과 Top5, 최근완료 8건, 에이전트 활동 피드, 뉴런 제안 배너
  • AgentList: 22개 에이전트 테이블, 모델 필터 (segmented), 스코어 바
  • AgentDetail: 프로필+설정+스코어이력+폴백체인+키워드
  • AgentForm: 등록/수정 폼 (ID, Name, Group, Model, Permission, DailyLimit, Visibility, Keywords)
  • AgentProposals: 뉴런→에이전트 제안 승인/거부
  • NeuronBrowser: 7개 brain region 탐색, CRUD, 카운터 +/-, bomb/dopamine 시그널
  • NeuronPromote: 승격/삭제 워크플로우

API 연동:

  • Bridge API: 4 IPC (getAgents, getAgentScores, getBridgeStatus, getBridgeHealth) — adminOnly
  • Neuron API: 6 IPC (getNeurons, neuronAdd/Delete/Signal/Counter/Compile) — adminOnly
  • 기존 Board API 36채널 변경 없음 → 총 46 IPC 채널

i18n: ~80개 신규 키 (ko + ja), ApprovalLog 하드코딩 한국어 전부 수정

보안: CSP dev 모드 완화 (Vite HMR용), 신규 IPC 전부 adminOnly 래퍼, 기존 보안 패턴 100% 유지

미해결

  • nginx에서 /api/agents 프록시 404 — Bridge API로 프록시 추가 필요
  • Neuron api.php nginx PHP 연동 확인
  • 에이전트 등록/수정 Bridge API 실제 연동 (현재 UI만)
  • 멀티테넌트 DB 격리 (company_id)
  • Electron exe 빌드 테스트

미완료 / 다음 작업

  • Phase 5: Nexus UX/UI 리디자인 (구조 + 디자인 + 컴포넌트 완료, API 연동 일부 남음)
  • Phase 5 나머지: nginx 프록시 수정, API 실연동, exe 빌드
  • Step 3: 멀티테넌트 DB 격리 (company_id)
  • paljalab-db, marketing-db MCP 실제 연결 테스트
  • Vault 투두 51개 우선순위 정리

이전 세션 작업 (오전~오후)

Nexus 앱 마무리

  • 다크/라이트 텍스트 47곳 전면 분리
  • 먹통 버그 수정 (Promise.all 에러 핸들링)
  • 관리자 전체 게시글 삭제 권한
  • 프리미엄 UI v2 (네이비 다크, 웜 화이트, 촌티 제거)

Nexus ERP v1.0.0 (레퍼런스)

  • 다지점 오프라인 점포 관리 프로그램 (NX 어패럴 레퍼런스)
  • 10개 모듈 + 18 테이블 + 40+ API 엔드포인트
  • GitHub: 1or4/nexus-erp (Private)

서버 재설치 + 전체 재배포

  • 카페24 VPS Ubuntu 22.04 재설치
  • Node 22 + OpenClaw 3.31 + 22개 에이전트 배포
  • NeuronFS 크로스 빌드 + 78뉴런 컴파일
  • SSL 재발급 + Bridge systemd 등록
  • GPT 코드 리뷰 반영 (5건)
  • 미완료 4건 처리 (healthFailCounts 영속화, sendTelegram 이스케이프, graceful shutdown, auto-evolution fallback)
  • 스테이징 환경 구축 (:18791 + :8080)