Skip to content

서버 배포

24시간 자동매매를 위해 클라우드 서버에 배포하는 가이드입니다.

추천 환경

Oracle Cloud Always Free — 영구 무료

플랫폼스펙비용비고
Oracle CloudAMD 1vCPU / 1GB 또는 ARM A1영구 무료추천
Google Cloude2-micro 0.25vCPU / 1GB영구 무료스펙 낮음
AWSt2.micro 1vCPU / 1GB12개월 무료이후 유료
개인 서버자유전기세관리 필요

트레이딩 봇은 CPU/메모리 사용량이 적어 1 vCPU / 1GB로 충분합니다. 단, FinBERT 감성 분석을 서버에서 실행하려면 최소 4GB RAM이 필요합니다 (현재는 미사용).

Oracle Cloud 계정 생성

Home Region 선택

홈 리전은 변경 불가

가입 시 선택한 Home Region은 이후 변경할 수 없습니다. 신중하게 선택하세요.

리전위치ARM A1 가용성Binance 서버 거리추천도
Japan Central (Osaka)오사카보통Binance 도쿄 서버 근접추천
South Korea North (춘천)춘천보통가까움추천
Japan East (Tokyo)도쿄품절 잦음가장 가까움가용 시
South Korea Central (Seoul)서울품절 잦음가까움가용 시
US West (Phoenix)피닉스양호멀음가용성 우선

오사카(Japan Central)를 추천합니다. Binance 도쿄 서버와 가깝고 ARM A1 가용성도 서울/도쿄보다 양호합니다. 실시간 거래 시 레이턴시를 고려하면 아시아 리전이 유리합니다.

가입 절차

  1. cloud.oracle.com 접속
  2. 계정 생성 (카드 등록 필요, Always Free 범위 내 과금 없음)
  3. Home Region 선택
  4. 계정 활성화 확인 (수 분 소요)

무료 계정 제한

무료 계정은 Home Region 1개만 사용 가능합니다. 다른 리전에 리소스를 생성할 수 없으므로 Home Region 선택이 중요합니다.

SSH 키 준비

Oracle Cloud Shell 또는 로컬에서 SSH 키를 생성합니다.

Cloud Shell에서 생성

Cloud Shell은 FIPS 모드로 작동하여 ed25519를 지원하지 않습니다. RSA를 사용하세요:

bash
ssh-keygen -t rsa -b 4096 -f ~/.ssh/oracle_moneymax -N ""

로컬에서 생성 (Linux/Mac/Windows)

bash
ssh-keygen -t ed25519 -f ~/.ssh/oracle_moneymax

공개키를 복사해둡니다:

bash
cat ~/.ssh/oracle_moneymax.pub

Cloud Shell + ed25519

Cloud Shell에서 ssh-keygen -t ed25519를 실행하면 Key type not supported in FIPS mode 에러가 발생합니다. 반드시 RSA를 사용하세요.

VM 인스턴스 생성

1. 인스턴스 설정

Compute → Instances → Create Instance

항목설정값
Namemoneymax
ImageUbuntu 22.04 또는 24.04
ShapeVM.Standard.E2.1.Micro (AMD) 또는 VM.Standard.A1.Flex (ARM)
NetworkingPublic subnet
Public IPv4Assign a public IPv4 address 반드시 체크
SSH KeyPaste public keys → 위에서 복사한 키 붙여넣기
Capacity typeOn-demand capacity (기본값)

Image 선택: Ubuntu를 추천합니다. Oracle Linux도 사용 가능하지만 이 가이드는 Ubuntu 기준입니다.

Shape 선택:

  • VM.Standard.E2.1.Micro (AMD 1 vCPU / 1GB) — 가용성 높음, 추천
  • VM.Standard.A1.Flex (ARM) — 성능 우수하나 품절 잦음

2. Networking 설정

Create new virtual cloud network + Create new public subnet을 선택하면 자동으로 네트워크가 구성됩니다.

Assign a public IPv4 address를 반드시 체크하세요. 체크하지 않으면 외부에서 SSH 접속이 불가합니다.

3. 생성 및 확인

Create 클릭 후 인스턴스가 Running 상태가 되면 Public IP를 확인합니다.

ARM A1 "Out of capacity"

"Out of capacity for shape VM.Standard.A1.Flex" 에러가 나오면:

  1. 다른 Availability Domain 선택 시도
  2. 안 되면 VM.Standard.E2.1.Micro (AMD)로 생성

AMD 1 vCPU / 1GB는 트레이딩 봇 운영에 충분합니다.

Public IP가 없는 경우

인스턴스 생성 시 Public IP를 할당하지 않았다면:

  1. 인스턴스 상세 → Attached VNICs → VNIC 클릭
  2. IPv4 Addresses → Private IP 옆 ... 메뉴 → Edit
  3. Public IP TypeEphemeral public IP 선택 → Update

4. 방화벽

기본 Security List 설정으로 충분합니다:

  • SSH (22): 기본 허용됨
  • 인바운드 추가 불필요 (봇은 아웃바운드 API 호출만 사용)

서버 환경 설정

SSH 접속

bash
# Ubuntu 이미지
ssh -i ~/.ssh/oracle_moneymax ubuntu@<PUBLIC_IP>

# Oracle Linux 이미지 (사용 시)
ssh -i ~/.ssh/oracle_moneymax opc@<PUBLIC_IP>

Cloud Shell에서 접속

Oracle Cloud Shell에서 접속할 경우 Cloud Shell 내부에서 생성한 SSH 키를 사용해야 합니다. 로컬에서 생성한 키와 Cloud Shell의 키는 별개입니다.

uv + 프로젝트 설치

bash
# 시스템 업데이트
sudo apt update && sudo apt upgrade -y
sudo apt install -y git

# uv 설치
curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env

# 프로젝트 클론
git clone https://github.com/geniuskey/moneymax.git
cd moneymax

# Python + 의존성 설치 (uv가 Python도 자동 설치)
uv sync

uv sync

uv sync는 pyproject.toml을 읽고 적절한 Python 버전 설치, 가상환경 생성, 의존성 설치를 한 번에 처리합니다. pip, venv, pyenv 등을 별도 설치할 필요가 없습니다.

Oracle Linux 사용 시

Oracle Linux는 apt 대신 dnf를 사용합니다:

bash
sudo dnf update -y
sudo dnf install -y git
curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env

나머지 절차는 동일합니다.

환경변수 설정

bash
cat > .env << 'EOF'
TELEGRAM_BOT_TOKEN=your_token_here
TELEGRAM_CHAT_ID=your_chat_id_here
BINANCE_API_KEY=
BINANCE_API_SECRET=
EOF

chmod 600 .env

Binance API 키가 아직 없으면 빈 값으로 두세요. Paper 모드에서는 API 키 없이도 가격 데이터를 조회할 수 있습니다.

더미 값 금지

BINANCE_API_KEY=your_key_here 같은 더미 문자열을 넣으면 Binance API 인증 에러가 발생합니다. 키가 없으면 값을 비워두세요 (BINANCE_API_KEY=).

테스트 실행

bash
uv run python scripts/auto_trader.py --paper --balance 10000
# Telegram에 시작 알림 확인
# 콘솔에 포트폴리오 상태 표시 확인
# Ctrl+C로 종료

systemd 서비스 등록

서비스 파일 생성

bash
# uv 경로 확인
which uv
# 보통 /home/ubuntu/.local/bin/uv

# 프로젝트 경로 확인
pwd
# 보통 /home/ubuntu/moneymax

확인한 경로로 서비스 파일을 생성합니다:

bash
sudo tee /etc/systemd/system/moneymax.service << EOF
[Unit]
Description=MoneyMax Auto-Trader
After=network.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/moneymax
ExecStart=/home/ubuntu/.local/bin/uv run python scripts/auto_trader.py --paper
Restart=always
RestartSec=30
Environment=PYTHONUNBUFFERED=1

[Install]
WantedBy=multi-user.target
EOF

경로 확인

which uv 결과가 /home/ubuntu/.cargo/bin/uv일 수도 있습니다. 실제 경로에 맞게 ExecStart를 수정하세요.

서비스 시작

bash
sudo systemctl daemon-reload
sudo systemctl enable moneymax
sudo systemctl start moneymax

서비스 관리

bash
# 상태 확인
sudo systemctl status moneymax

# 재시작
sudo systemctl restart moneymax

# 중지
sudo systemctl stop moneymax

# 실시간 로그
journalctl -u moneymax -f

# 최근 1시간 로그
journalctl -u moneymax --since "1 hour ago"

코드 업데이트 후 재시작

bash
cd ~/moneymax && git pull && uv sync && sudo systemctl restart moneymax

Live 모드 전환

Paper Trading에서 성과를 확인한 후 Live로 전환합니다.

1. Binance API 키 발급

  1. Binance 로그인
  2. Account → API Management → Create API
  3. API 제한 설정:
항목설정
Enable Spot & Margin Trading활성화 (필수)
Enable Reading활성화
Enable Withdrawals비활성화 (안전)
Enable Internal Transfer비활성화
Enable Futures비활성화
Restrict access to trusted IPs onlyOracle VM의 Public IP 입력 (강력 추천)

API 보안

  • 출금 권한은 절대 활성화하지 마세요
  • IP 제한을 반드시 설정하세요 (VM의 Public IP만 허용)
  • API 키와 Secret은 .env 파일에만 저장하고 절대 커밋하지 마세요

2. 환경변수 업데이트

bash
nano ~/moneymax/.env
ini
BINANCE_API_KEY=실제_API_키
BINANCE_API_SECRET=실제_API_시크릿

3. 서비스 파일 수정

bash
sudo nano /etc/systemd/system/moneymax.service
# ExecStart 줄에서 --paper를 --live로 변경
bash
sudo systemctl daemon-reload
sudo systemctl restart moneymax

실거래 체크리스트

  • [ ] Paper Trading 최소 2주 이상 운영
  • [ ] 수익률이 안정적인지 확인
  • [ ] Binance API에 IP 제한 설정
  • [ ] 출금 권한 비활성화
  • [ ] 초기 자본은 감당 가능한 금액으로 시작
  • [ ] Telegram 알림으로 모니터링 가능한 상태

자동 업데이트 (선택)

bash
crontab -e
cron
# 매일 새벽 4시에 업데이트 + 재시작
0 4 * * * cd /home/ubuntu/moneymax && git pull && uv sync && sudo systemctl restart moneymax

모니터링

Telegram 알림 + 봇 커맨드로 별도 모니터링 도구 없이 운영 가능합니다:

자동 알림

  • 시그널 생성 / 주문 체결
  • SL/TP 트리거 / 포지션 청산
  • 시장 환경(Regime) 변경
  • 정기 포트폴리오 요약 (기본 1시간)
  • 엔진 시작 / 종료

수동 조회 (Telegram 봇 커맨드)

명령어설명
/status포트폴리오 요약
/positions오픈 포지션
/signals최근 시그널
/regime시장 환경 및 적응형 파라미터
/help명령어 목록

서버 로그 확인

bash
ssh -i ~/.ssh/oracle_moneymax ubuntu@<PUBLIC_IP>
sudo systemctl status moneymax
journalctl -u moneymax --since "today"

트러블슈팅

SSH 접속 불가

증상원인해결
Connection refusedPublic IP 미할당VNIC에서 Ephemeral Public IP 추가
Permission deniedSSH 키 불일치인스턴스 생성 시 등록한 키 확인
Connection timed outSecurity ListSSH(22) 인바운드 규칙 확인

봇 실행 오류

증상원인해결
Invalid Api-Key ID.env에 더미 값API 키를 비우거나 실제 키 입력
chat not found잘못된 Chat ID/startgetUpdates에서 확인
uv: command not foundPATH 미설정source $HOME/.local/bin/env 실행
No module named의존성 미설치uv sync 재실행

Telegram Chat ID 확인 방법

  1. 봇에게 /start 메시지 전송
  2. 브라우저에서 확인:
https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates
  1. 응답 JSON에서 chat.id 확인:
json
{
  "result": [{
    "message": {
      "chat": { "id": 123456789 }
    }
  }]
}

개인 vs 그룹

개인 Chat ID는 양수, 그룹 Chat ID는 음수입니다.

MIT License