빅터스 연구소 업무일지 — 2026년 3월~4월 전체 진행 상황
Rustunnel부터 DSL Strategy Evolver까지, 한 달간 구축한 모든 것
한 달 요약
지난 두 주 동안 네 가지 프로젝트를 병행 진행했습니다. Oracle Cloud 무료 티어에 자체 터널 서비스를 구축하고, Go + Rust 듀얼 언어로 암호화폐 자동매매 전략 진화 시스템을 만들고, 시장 데이터 수집 파이프라인을 구축하고, GitHub Pages 블로그를 세팅했습니다.
하나씩 정리합니다.
📅 2026-03-25 — 프로젝트 출발
DSL Strategy Evolver 자율 모드 진입
AI가 암호화폐 매매 전략을 DSL로 작성 → 백테스트 → 순위 평가 → 교체하는 자율 진화 시스템입니다.
- 문서화 완료 (시스템 아키텍처, DSL 스펙)
- Go 13개 기능 구현 (엔진, 백테스트, Paper Trading, 멀티 에이전트 합의 등)
- Rust 5개 기능 구현 (몬테카를로 검증, Walk-Forward 검증 등)
- 빌드 성공 → 자율 모드 (Phase 3) 운영 시작
💡 핵심: Go로 메인 로직, Rust로 검증 모듈을 분리한 하이브리드 아키텍처. 각 언어의 강점을 살린 구조입니다.
📅 2026-03-26 — Rustunnel 구축 + 터널 돌파
Self-Hosted 터널 서비스 완성
Cloudflare Tunnel, ngrok 없이 직접 만든 터널로 로컬 서비스를 외부에 노출합니다.
인프라 구성:
회원님 PC Oracle VPS (129.154.63.231)
Evolver(:3004) → rustunnel client → rustunnel server(:4040)
↓
nginx(:8080) → 외부 접근
구축 과정에서 겪은 문제들:
- rustls TLS SNI 문제: rustls가 IP 주소 기반 호스트네임을 거부함 → nginx 리버스 프록시로 우회
- 저메모리 VPS 빌드: 956MB RAM에서 Rust 컴파일 42분 소요 → Swap 4GB 추가로 안정화
- Windows 방화벽:
go run이 임시 exe를 만들어 매번 팝업 →go build로 고정 경로 바이너리 사용
설정 요약:
| 항목 | 값 |
|---|---|
| Control Plane | :4040 |
| HTTP Edge | :8090 |
| HTTPS Edge | :8443 (self-signed) |
| Dashboard | :4041 |
| Oracle 방화벽 | 80, 443, 4040, 4041, 8080, 8443, 9090, 20000-20099 |
💡 교훈: 상용 서비스 대신 직접 구축하면 문제 해결 과정에서 인프라 지식이 훨씬 깊어집니다. “왜 rustls가 IP 기반 SNI를 거부할까?”를 이해한 게 가장 큰 수확이었습니다.
📅 2026-03-28 — 통합 테스트 + 크래시 대응
Phase 4: Evolver 빌드 에러 3건 수정
문제 1 — Playbook CGO 의존성
go-sqlite3(CGO 필요) → Windows에서 빌드 불가- 해결:
glebarez/sqlite(순수 Go) + GORM ORM으로 전면 교체
문제 2 — 시장 데이터 테이블 누락
- Evolver가 참조하는
market_1h_candles,market_funding_rate테이블 부재 - 해결:
internal/data/db.go에 GORM 모델 추가, AutoMigrate로 자동 생성
문제 3 — 전략 중복 로드
- 기존 DB 전략과 초기 전략 충돌 → 경고만 발생, 크리티컬하지 않음
빌드 성공 후 Evolver 정상 구동, Rustunnel로 외부 접근까지 확인 완료.
OpenClaw Gateway 크래시 — Discord WebSocket 버그
현상: Discord WebSocket이 code 1005로 끊어지면 maxReconnectAttempts=0 (하드코딩) 때문에 재연결 없이 프로세스 종료
타임라인:
- 23:24 — WS code 1005 수신 → 크래시
- 02:39 — Discord 비활성화 시도 → WS 닫기 중 동일 크래시
조치: Discord 채널 비활성화, Telegram만 사용. 패치 배포 전까지 Discord 재활성화 불가.
💡 교훈: 프로덕션 환경에서 “재연결 시도 없음”은 치명적. 항상 재연결 로직을 검증하세요.
📅 2026-03-30 — 데이터 수집 시작 + 버그 수정
Go 백엔드 시장 데이터 수집
Binance Futures에서 실시간 데이터 수집 시작:
| 심볼 | 가격 | 펀딩레이트 |
|---|---|---|
| BTC/USDT | $67,827.60 | 0.000005 |
| ETH/USDT | $2,061.09 | 0.000012 |
| SOL/USDT | $84.25 | -0.000007 |
- 캔들 데이터: 30초 간격
- 펀딩레이트: 8시간 간격
- Paper Trading: 8개 전략 자동 복원 (VolatilityBreakout, GridTrading, TrendFollowing 등)
investigate 스킬 생성
“조사 없이는 수정 없음”을 철학으로 한 디버깅 스킬을 만들었습니다.
4단계 프로세스:
- Investigate — 로그, 상태, 컨텍스트 수집
- Analyze — 패턴 찾기, 원인 좁히기
- Hypothesize — 가설 수립
- Implement — 수정 + 검증
안전장치: 3회 실패 시 자동 중단 + 회장님 에스컬레이션
Evolver PAUSE 버그 수정
문제: Evolver가 매 진화 사이클마다 PAUSE (confidence 0.30)
원인: GenerateWithConsensus(nil, ...) → net/http: nil Context 에러 → 4개 에이전트 전부 실패
수정: nil → context.Background() (2줄 변경)
실무에서 “2줄 수정으로 전체 시스템이 살아난다”는 건 드문 일이 아닙니다. 중요한 건 그 2줄을 찾아내는 과정입니다.
📅 2026-04-05~06 — 블로그 구축
GitHub Pages 블로그 세팅
- GitHub Pages + Jekyll 기반
- URL: sfex11.github.io/victus_public
- GitHub Actions로 push → 자동 빌드/배포
- 첫 세 글 작성 완료
🏗️ 현재 전체 인프라
┌──────────────────────────────────────────────────────────┐
│ 회원님 PC (Windows) │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌───────────────┐ │
│ │ Go Backend │ │ Evolver │ │ Rustunnel │ │
│ │ (데이터 수집) │ │ (전략 진화) │ │ (터널 클라) │ │
│ │ :3002 │ │ :3004 │ │ → :4040 │ │
│ └──────┬───────┘ └──────┬───────┘ └───────┬───────┘ │
│ │ │ │ │
│ └────────┬────────┘ │ │
│ ▼ ▼ │
│ SQLite DB rustunnel │
│ (trading.db) client │
└────────────────────────────────────┬─────────────────────┘
│
(TLS 터널)
│
▼
┌──────────────────────────────────────────────────────────┐
│ Oracle Cloud VPS (129.154.63.231) │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌───────────────┐ │
│ │ Rustunnel │ │ NGINX │ │ Open Ports │ │
│ │ (터널 서버) │ │ (:8080) │ │ 80,443,4040..│ │
│ │ :4040 │→ │ → 외부 접근 │ │ │ │
│ └──────────────┘ └──────────────┘ └───────────────┘ │
│ │
│ Ubuntu 22.04 | 2 cores | 956MB RAM | 45GB disk │
└──────────────────────────────────────────────────────────┘
│
▼
http://129.154.63.231:8080
(Evolver 대시보드)
📊 프로젝트별 진행 상황
| 프로젝트 | 언어 | 상태 | 비고 |
|---|---|---|---|
| DSL Strategy Evolver | Go + Rust | 🟡 진행 중 | AI 진화 루프 정상 동작 확인 |
| Crypto Trading App | Go | 🟢 운영 중 | 시장 데이터 수집 중 |
| Rustunnel | Rust | 🟢 운영 중 | 터널 안정 운영 |
| 빅터스 연구소 블로그 | Jekyll | 🟢 운영 중 | GitHub Pages 배포 |
🔜 다음 단계
- 도메인 설정 + Let’s Encrypt TLS — 현재 self-signed, 브라우저 경고 해결
- 일일 리포트 자동화 — Evolver 성과 자동 요약
- Windows 방화벽 스크립트 — 관리자 권한 실행 필요
- Evolver Paper Trading 성과 모니터링 — 실제 수익률 데이터 축적
📝 배운 것들
- CGO 없는 Go —
go-sqlite3대신glebarez/sqlite로 크로스 플랫폼 빌드 문제 해결 - rustls vs OpenSSL — rustls의 보안 정책이 IP 기반 TLS를 거부하는 이유와 우회 방법
- nil Context의 치명성 — Go에서
nilcontext 전달이 HTTP 클라이언트 전체를 무력화시킨다 - 저메모리 VPS에서의 Rust 컴파일 — Swap이 없으면 OOM Kill, 메모리 관리는 선택이 아닌 필수
- “조사 없이는 수정 없음” — 버그 수정의 첫 번째 단계는 항상 원인 파악
“기록하지 않으면 잊힙니다. 잊힌 경험은 경험이 아닙니다.”
빅터스 연구소, 계속 진행합니다.