버전: v0.8.1 | 최종 업데이트: 2026-02-07
# 모든 컨테이너 상태 확인
docker compose ps
# 디스크 사용량 확인
df -h
# Docker 볼륨 사용량
docker system df -v# Liveness 체크
curl -s http://localhost:3000/health | jq응답:
{
"status": "healthy",
"timestamp": "2026-01-31T12:00:00Z"
}# Readiness 체크 (모든 컴포넌트 상태)
curl -s http://localhost:3000/health/ready | jq응답:
{
"status": "healthy",
"components": {
"database": { "status": "healthy", "latency_ms": 5 },
"redis": { "status": "healthy", "latency_ms": 2 },
"exchange": { "status": "healthy" }
},
"timestamp": "2026-01-31T12:00:00Z"
}#!/bin/bash
# scripts/healthcheck.sh
ENDPOINT="http://localhost:3000/health/ready"
TIMEOUT=5
response=$(curl -s -w "\n%{http_code}" --max-time $TIMEOUT $ENDPOINT)
http_code=$(echo "$response" | tail -n1)
body=$(echo "$response" | head -n -1)
if [ "$http_code" -eq 200 ]; then
echo "✅ API healthy"
exit 0
else
echo "❌ API unhealthy (HTTP $http_code)"
echo "$body"
exit 1
fi환경변수 RUST_LOG로 로그 레벨을 제어합니다:
# 기본 (프로덕션 권장)
RUST_LOG=info,trader_api=info
# 디버깅
RUST_LOG=debug,trader_api=debug
# 상세 추적
RUST_LOG=trace,trader_api=trace
# 특정 모듈만 상세 로깅
RUST_LOG=info,trader_strategy=debug,trader_exchange=debug로그 레벨 기준:
error: 즉시 대응 필요 (주문 실패, DB 연결 끊김)warn: 주의 필요 (API 재시도, 비정상 데이터)info: 주요 이벤트 (주문 체결, 전략 시작/중지)debug: 디버깅 정보 (파라미터 값, 중간 계산)trace: 상세 추적 (루프 내부, 모든 함수 호출)
# API 서버 로그 (로컬 실행 시 터미널에 직접 출력)
# 에러만 필터링
cargo run --bin trader-api 2>&1 | grep -i error
# Docker로 실행 시
docker compose logs -f trader-api
docker compose logs --tail=100 trader-api
docker compose logs --since="2025-01-28T10:00:00" trader-api
# 모든 서비스 로그
docker compose logs -f
# 로그 파일로 저장
docker compose logs trader-api > logs/trader-api-$(date +%Y%m%d).log
# 로그를 파일로 리다이렉트 (로컬 실행)
cargo run --bin trader-api --release 2>&1 | tee -a logs/trader-api.logtracing 라이브러리를 사용하여 구조화된 로그를 생성합니다:
2026-01-31T12:00:00.123Z INFO trader_api::routes::backtest: Backtest started strategy_id="rsi_mean_reversion" symbol="005930"
2026-01-31T12:00:01.456Z INFO trader_api::routes::backtest: Backtest completed trades=15 total_return=2.5%
docker-compose.yml에 로깅 옵션 추가:
trader-api:
logging:
driver: "json-file"
options:
max-size: "100m"
max-file: "5"# 에러 로그만 필터링
docker compose logs trader-api | grep -i error
# 특정 전략 로그
docker compose logs trader-api | grep "strategy_id="
# 주문 관련 로그
docker compose logs trader-api | grep -E "order|trade|fill"
# Rate limit 초과 확인
docker compose logs trader-api | grep "Rate limit exceeded"모든 알림 설정은 웹 UI를 통해 관리됩니다. API 키는 AES-256-GCM으로 암호화되어 데이터베이스에 저장됩니다.
- Telegram에서 @BotFather에게
/newbot명령 - 봇 이름과 username 설정
- 발급된 API 토큰 복사
Chat ID 확인:
# 봇에게 메시지 전송 후
curl "https://api.telegram.org/bot<TOKEN>/getUpdates"UI에서 설정:
- 웹 대시보드 접속 → Settings 페이지
- Notifications 섹션에서 Telegram 설정
- Bot Token과 Chat ID 입력
- "저장" 버튼 클릭 (자동 암호화 저장)
테스트:
curl -X POST http://localhost:3000/api/v1/notifications/telegram/test웹 UI의 Settings → Notifications 섹션에서 Discord 웹훅 URL을 설정할 수 있습니다.
| 이벤트 | 알림 | 설명 |
|---|---|---|
| 주문 체결 | ✅ | 매수/매도 체결 시 |
| 손절/익절 | ✅ | SL/TP 발동 시 |
| 일일 손실 한도 | ✅ | 한도 도달 시 경고 |
| 전략 시작/중지 | ✅ | 상태 변경 시 |
| API 오류 | ✅ | 거래소 연결 실패 등 |
# 인프라 서비스 시작 (TimescaleDB, Redis)
docker compose up -d timescaledb redis
# API 서버 시작 (별도 터미널)
export DATABASE_URL=postgresql://trader:trader_secret@localhost:5432/trader
export REDIS_URL=redis://localhost:6379
cargo run --bin trader-api --features ml --release
# 프론트엔드 시작 (별도 터미널)
cd frontend && npm run dev# API 서버 중지: Ctrl+C로 graceful shutdown
# 인프라 서비스 중지 (데이터 유지)
docker compose down
# 특정 서비스만 중지
docker compose stop timescaledb
docker compose stop redis# API 서버 재시작: Ctrl+C 후 다시 실행
cargo run --bin trader-api --features ml --release
# 인프라 서비스 재시작
docker compose restart timescaledb redisTrader API는 SIGTERM/SIGINT 신호를 받으면 graceful shutdown을 수행합니다:
- 새로운 요청 거부
- 진행 중인 요청 완료 대기
- WebSocket 연결 종료
- 리소스 정리
# 로컬 실행 시: Ctrl+C로 graceful shutdown
# 최대 30초 대기 후 종료# 환경변수 변경 시: API 서버 재시작
# 코드 변경 시: 재빌드 후 실행
cargo build --bin trader-api --features ml --release
./target/release/trader-api
# API 키/알림 설정: 웹 UI에서 변경 (재시작 불필요)# 연결 상태
docker compose exec timescaledb pg_isready -U trader
# 활성 쿼리 확인
docker compose exec timescaledb psql -U trader -d trader -c "
SELECT pid, now() - pg_stat_activity.query_start AS duration, query
FROM pg_stat_activity
WHERE state = 'active' AND query NOT LIKE '%pg_stat_activity%'
ORDER BY duration DESC
LIMIT 10;
"
# 테이블 크기
docker compose exec timescaledb psql -U trader -d trader -c "
SELECT relname, pg_size_pretty(pg_total_relation_size(relid))
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 10;
"
# TimescaleDB 청크 정보
docker compose exec timescaledb psql -U trader -d trader -c "
SELECT hypertable_name, chunk_name, range_start, range_end
FROM timescaledb_information.chunks
ORDER BY range_end DESC
LIMIT 10;
"# Redis 상태 확인
docker compose exec redis redis-cli INFO
# 메모리 사용량
docker compose exec redis redis-cli INFO memory | grep used_memory_human
# 키 개수
docker compose exec redis redis-cli DBSIZE
# 연결 수
docker compose exec redis redis-cli INFO clients | grep connected_clients# Docker 컨테이너 리소스 사용량
docker stats --no-stream
# 디스크 사용량
df -h
# Docker 볼륨 사용량
docker system df -v#!/bin/bash
# scripts/diagnose.sh
echo "=== System Status ==="
echo ""
echo "1. API Health:"
curl -s http://localhost:3000/health | jq . || echo "API not responding"
echo ""
echo "2. Docker Containers:"
docker compose ps
echo ""
echo "3. Database:"
docker compose exec -T timescaledb pg_isready -U trader
echo ""
echo "4. Redis:"
docker compose exec -T redis redis-cli ping
echo ""
echo "5. Disk Usage:"
df -h | head -5
echo ""
echo "6. Docker Stats:"
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"# 수동 백업 생성
docker compose exec timescaledb pg_dump -U trader -d trader > backups/trader_$(date +%Y%m%d_%H%M%S).sql
# 압축 백업
docker compose exec timescaledb pg_dump -U trader -d trader | gzip > backups/trader_$(date +%Y%m%d_%H%M%S).sql.gz
# 특정 테이블만 백업
docker compose exec timescaledb pg_dump -U trader -d trader -t orders -t positions > backups/orders_positions_$(date +%Y%m%d).sql# 서비스 중지 (데이터 무결성을 위해)
docker compose stop trader-api
# 백업 복원
cat backups/trader_20250128_100000.sql | docker compose exec -T timescaledb psql -U trader -d trader
# 압축 백업 복원
gunzip -c backups/trader_20250128_100000.sql.gz | docker compose exec -T timescaledb psql -U trader -d trader
# 서비스 재시작
docker compose start trader-api# RDB 스냅샷 생성
docker compose exec redis redis-cli BGSAVE
# 스냅샷 파일 복사
docker compose cp redis:/data/dump.rdb backups/redis_$(date +%Y%m%d).rdb# 서비스 중지
docker compose stop redis
# 스냅샷 복원
docker compose cp backups/redis_20250128.rdb redis:/data/dump.rdb
# 서비스 시작
docker compose start redisscripts/backup.sh:
#!/bin/bash
set -e
BACKUP_DIR="/var/backups/trader"
DATE=$(date +%Y%m%d_%H%M%S)
# 백업 디렉토리 생성
mkdir -p $BACKUP_DIR
# PostgreSQL 백업
docker compose exec -T timescaledb pg_dump -U trader -d trader | gzip > $BACKUP_DIR/db_$DATE.sql.gz
# Redis 백업
docker compose exec redis redis-cli BGSAVE
sleep 5
docker compose cp redis:/data/dump.rdb $BACKUP_DIR/redis_$DATE.rdb
# 30일 이상된 백업 삭제
find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete
find $BACKUP_DIR -name "*.rdb" -mtime +30 -delete
echo "Backup completed: $DATE"# 매일 새벽 3시 백업
0 3 * * * /opt/trader/scripts/backup.sh >> /var/log/trader-backup.log 2>&1# 1. Docker 이미지 업데이트 확인
docker compose pull
# 2. 사용하지 않는 이미지 정리
docker image prune -f
# 3. 볼륨 정리 (주의: 사용 중인 볼륨 확인)
docker volume prune -f
# 4. 네트워크 정리
docker network prune -f
# 5. 시스템 전체 정리
docker system prune -f# 1. 현재 상태 백업
./scripts/backup.sh
# 2. 새 버전 빌드
git pull origin main
docker compose build trader-api
# 3. 롤링 업데이트
docker compose up -d trader-api
# 4. 헬스체크 확인
curl http://localhost:3000/health
# 5. 문제 발생 시 롤백
docker compose down
docker tag trader-api:previous trader-api:latest
docker compose up -d# 압축 정책 확인
docker compose exec timescaledb psql -U trader -d trader -c "SELECT * FROM timescaledb_information.jobs;"
# 수동 압축 실행
docker compose exec timescaledb psql -U trader -d trader -c "CALL run_job(1000);"
# 오래된 데이터 삭제 (90일 이상)
docker compose exec timescaledb psql -U trader -d trader -c "SELECT drop_chunks('klines', interval '90 days');"docker-compose.yml에서 리소스 제한 설정:
trader-api:
deploy:
resources:
limits:
cpus: '2'
memory: 2G
reservations:
cpus: '1'
memory: 1G참고: 현재 구조에서 trader-api는 상태를 가지고 있어 복제 시 주의가 필요합니다.
# 복제본 수 조정 (로드밸런서 필요)
docker compose up -d --scale trader-api=3# 1. 베이스 이미지 업데이트
docker compose pull
# 2. 이미지 재빌드
docker compose build --no-cache
# 3. 서비스 재시작
docker compose up -d