기간 프로젝트 상태

한 달 요약

지난 두 주 동안 네 가지 프로젝트를 병행 진행했습니다. Oracle Cloud 무료 티어에 자체 터널 서비스를 구축하고, Go + Rust 듀얼 언어로 암호화폐 자동매매 전략 진화 시스템을 만들고, 시장 데이터 수집 파이프라인을 구축하고, GitHub Pages 블로그를 세팅했습니다.

하나씩 정리합니다.


📅 2026-03-25 — 프로젝트 출발

DSL Strategy Evolver 자율 모드 진입

Phase

AI가 암호화폐 매매 전략을 DSL로 작성 → 백테스트 → 순위 평가 → 교체하는 자율 진화 시스템입니다.

  • 문서화 완료 (시스템 아키텍처, DSL 스펙)
  • Go 13개 기능 구현 (엔진, 백테스트, Paper Trading, 멀티 에이전트 합의 등)
  • Rust 5개 기능 구현 (몬테카를로 검증, Walk-Forward 검증 등)
  • 빌드 성공 → 자율 모드 (Phase 3) 운영 시작

💡 핵심: Go로 메인 로직, Rust로 검증 모듈을 분리한 하이브리드 아키텍처. 각 언어의 강점을 살린 구조입니다.


📅 2026-03-26 — Rustunnel 구축 + 터널 돌파

Self-Hosted 터널 서비스 완성

Rust Oracle NGINX

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건 수정

Go

문제 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 버그

Bug

현상: Discord WebSocket이 code 1005로 끊어지면 maxReconnectAttempts=0 (하드코딩) 때문에 재연결 없이 프로세스 종료

타임라인:

  1. 23:24 — WS code 1005 수신 → 크래시
  2. 02:39 — Discord 비활성화 시도 → WS 닫기 중 동일 크래시

조치: Discord 채널 비활성화, Telegram만 사용. 패치 배포 전까지 Discord 재활성화 불가.

GitHub Issues: #55346, #56351, #56399

💡 교훈: 프로덕션 환경에서 “재연결 시도 없음”은 치명적. 항상 재연결 로직을 검증하세요.


📅 2026-03-30 — 데이터 수집 시작 + 버그 수정

Go 백엔드 시장 데이터 수집

Binance 데이터

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단계 프로세스:

  1. Investigate — 로그, 상태, 컨텍스트 수집
  2. Analyze — 패턴 찾기, 원인 좁히기
  3. Hypothesize — 가설 수립
  4. Implement — 수정 + 검증

안전장치: 3회 실패 시 자동 중단 + 회장님 에스컬레이션

Evolver PAUSE 버그 수정

Bugfix

문제: Evolver가 매 진화 사이클마다 PAUSE (confidence 0.30) 원인: GenerateWithConsensus(nil, ...)net/http: nil Context 에러 → 4개 에이전트 전부 실패

수정: nilcontext.Background() (2줄 변경)

실무에서 “2줄 수정으로 전체 시스템이 살아난다”는 건 드문 일이 아닙니다. 중요한 건 그 2줄을 찾아내는 과정입니다.


📅 2026-04-05~06 — 블로그 구축

GitHub Pages 블로그 세팅

Jekyll Blog


🏗️ 현재 전체 인프라

┌──────────────────────────────────────────────────────────┐
│                   회원님 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 성과 모니터링 — 실제 수익률 데이터 축적

📝 배운 것들

  1. CGO 없는 Gogo-sqlite3 대신 glebarez/sqlite로 크로스 플랫폼 빌드 문제 해결
  2. rustls vs OpenSSL — rustls의 보안 정책이 IP 기반 TLS를 거부하는 이유와 우회 방법
  3. nil Context의 치명성 — Go에서 nil context 전달이 HTTP 클라이언트 전체를 무력화시킨다
  4. 저메모리 VPS에서의 Rust 컴파일 — Swap이 없으면 OOM Kill, 메모리 관리는 선택이 아닌 필수
  5. “조사 없이는 수정 없음” — 버그 수정의 첫 번째 단계는 항상 원인 파악

“기록하지 않으면 잊힙니다. 잊힌 경험은 경험이 아닙니다.”

빅터스 연구소, 계속 진행합니다.