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: false→true변경agents.defaults.subagents.allowAgentsdeprecated 키 제거
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 Truthwebhook/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-2 | DB 비밀번호 하드코딩 | board/index.js, erp/index.js | process.env.DB_* |
| 3-4 | CORS 와일드카드 * | board/index.js, erp/index.js | allowedOrigins 배열 |
| 5 | 뉴런 GET 인증 없음 | neuron.js | Bearer token 검증 |
| 6 | exec() 인젝션 | neuron.js | fs.mkdirSync + fs.writeFileSync |
| 7 | 게시물 소유권 미검증 | board/index.js | author_id 또는 admin 체크 |
| 8-9 | 에러 메시지 노출 | board, erp | 일반 에러 메시지 |
| 10 | 하드코딩 기본 토큰 | config.js | 폴백 제거, 시작 시 검증 |
| 11 | 패스워드 고정 솔트 | auth.js | 유저별 랜덤 솔트 + 레거시 호환 |
| 12 | 에이전트 등록 검증 없음 | registry.js | ID 포맷 + 예약어 검증 |
| 13 | Rate limiting 부재 | board, erp | 로그인 5회/분, API 60회/분 |
| 14 | 입력 크기 제한 없음 | claude-bridge.js | 1MB 제한 |
| 15 | 일일 한도 휘발성 | hooks.js | daily-counts.json 영속화 |
| 16-17 | 세션 토큰 만료 없음 | board, erp | 24시간 TTL |
| 18-19 | 타이밍 공격 | board, erp | dummyHash + bcrypt 항상 실행 |
Step 2: Electron 앱 수정 (9개) — GitHub 푸시 완료 07dc20a
| # | 취약점 | 파일 | 수정 |
|---|---|---|---|
| 20 | 텔레그램 토큰 하드코딩 | database.js | 빈 값 초기화 → Settings UI 입력 |
| 21 | API 토큰 하드코딩 | api-server.js | crypto.randomBytes |
| 22 | 기본 admin 비밀번호 | database.js | force_pw_change 플래그 |
| 23 | IPC 역할 검증 없음 | main.js | adminOnly() 래퍼 |
| 24 | CORS 와일드카드 | api-server.js | localhost만 |
| 25 | 0.0.0.0 바인딩 | api-server.js | 127.0.0.1 |
| 26 | CSP 미설정 | main.js | CSP 헤더 추가 |
| 27 | 텔레그램 콜백 인증 없음 | telegram.js | allowed_approvers 화이트리스트 |
| 28 | bcrypt 라운드 10 | database.js | 12로 변경 |
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)