서버 배포
24시간 자동매매를 위해 클라우드 서버에 배포하는 가이드입니다.
추천 환경
Oracle Cloud Always Free — 영구 무료
| 플랫폼 | 스펙 | 비용 | 비고 |
|---|---|---|---|
| Oracle Cloud | AMD 1vCPU / 1GB 또는 ARM A1 | 영구 무료 | 추천 |
| Google Cloud | e2-micro 0.25vCPU / 1GB | 영구 무료 | 스펙 낮음 |
| AWS | t2.micro 1vCPU / 1GB | 12개월 무료 | 이후 유료 |
| 개인 서버 | 자유 | 전기세 | 관리 필요 |
트레이딩 봇은 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 가용성도 서울/도쿄보다 양호합니다. 실시간 거래 시 레이턴시를 고려하면 아시아 리전이 유리합니다.
가입 절차
- cloud.oracle.com 접속
- 계정 생성 (카드 등록 필요, Always Free 범위 내 과금 없음)
- Home Region 선택
- 계정 활성화 확인 (수 분 소요)
무료 계정 제한
무료 계정은 Home Region 1개만 사용 가능합니다. 다른 리전에 리소스를 생성할 수 없으므로 Home Region 선택이 중요합니다.
SSH 키 준비
Oracle Cloud Shell 또는 로컬에서 SSH 키를 생성합니다.
Cloud Shell에서 생성
Cloud Shell은 FIPS 모드로 작동하여 ed25519를 지원하지 않습니다. RSA를 사용하세요:
ssh-keygen -t rsa -b 4096 -f ~/.ssh/oracle_moneymax -N ""로컬에서 생성 (Linux/Mac/Windows)
ssh-keygen -t ed25519 -f ~/.ssh/oracle_moneymax공개키를 복사해둡니다:
cat ~/.ssh/oracle_moneymax.pubCloud Shell + ed25519
Cloud Shell에서 ssh-keygen -t ed25519를 실행하면 Key type not supported in FIPS mode 에러가 발생합니다. 반드시 RSA를 사용하세요.
VM 인스턴스 생성
1. 인스턴스 설정
Compute → Instances → Create Instance
| 항목 | 설정값 |
|---|---|
| Name | moneymax |
| Image | Ubuntu 22.04 또는 24.04 |
| Shape | VM.Standard.E2.1.Micro (AMD) 또는 VM.Standard.A1.Flex (ARM) |
| Networking | Public subnet |
| Public IPv4 | Assign a public IPv4 address 반드시 체크 |
| SSH Key | Paste public keys → 위에서 복사한 키 붙여넣기 |
| Capacity type | On-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" 에러가 나오면:
- 다른 Availability Domain 선택 시도
- 안 되면 VM.Standard.E2.1.Micro (AMD)로 생성
AMD 1 vCPU / 1GB는 트레이딩 봇 운영에 충분합니다.
Public IP가 없는 경우
인스턴스 생성 시 Public IP를 할당하지 않았다면:
- 인스턴스 상세 → Attached VNICs → VNIC 클릭
- IPv4 Addresses → Private IP 옆 ... 메뉴 → Edit
- Public IP Type → Ephemeral public IP 선택 → Update
4. 방화벽
기본 Security List 설정으로 충분합니다:
- SSH (22): 기본 허용됨
- 인바운드 추가 불필요 (봇은 아웃바운드 API 호출만 사용)
서버 환경 설정
SSH 접속
# 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 + 프로젝트 설치
# 시스템 업데이트
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 syncuv sync
uv sync는 pyproject.toml을 읽고 적절한 Python 버전 설치, 가상환경 생성, 의존성 설치를 한 번에 처리합니다. pip, venv, pyenv 등을 별도 설치할 필요가 없습니다.
Oracle Linux 사용 시
Oracle Linux는 apt 대신 dnf를 사용합니다:
sudo dnf update -y
sudo dnf install -y git
curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env나머지 절차는 동일합니다.
환경변수 설정
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 .envBinance API 키가 아직 없으면 빈 값으로 두세요. Paper 모드에서는 API 키 없이도 가격 데이터를 조회할 수 있습니다.
더미 값 금지
BINANCE_API_KEY=your_key_here 같은 더미 문자열을 넣으면 Binance API 인증 에러가 발생합니다. 키가 없으면 값을 비워두세요 (BINANCE_API_KEY=).
테스트 실행
uv run python scripts/auto_trader.py --paper --balance 10000
# Telegram에 시작 알림 확인
# 콘솔에 포트폴리오 상태 표시 확인
# Ctrl+C로 종료systemd 서비스 등록
서비스 파일 생성
# uv 경로 확인
which uv
# 보통 /home/ubuntu/.local/bin/uv
# 프로젝트 경로 확인
pwd
# 보통 /home/ubuntu/moneymax확인한 경로로 서비스 파일을 생성합니다:
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를 수정하세요.
서비스 시작
sudo systemctl daemon-reload
sudo systemctl enable moneymax
sudo systemctl start moneymax서비스 관리
# 상태 확인
sudo systemctl status moneymax
# 재시작
sudo systemctl restart moneymax
# 중지
sudo systemctl stop moneymax
# 실시간 로그
journalctl -u moneymax -f
# 최근 1시간 로그
journalctl -u moneymax --since "1 hour ago"코드 업데이트 후 재시작
cd ~/moneymax && git pull && uv sync && sudo systemctl restart moneymaxLive 모드 전환
Paper Trading에서 성과를 확인한 후 Live로 전환합니다.
1. Binance API 키 발급
- Binance 로그인
- Account → API Management → Create API
- API 제한 설정:
| 항목 | 설정 |
|---|---|
| Enable Spot & Margin Trading | 활성화 (필수) |
| Enable Reading | 활성화 |
| Enable Withdrawals | 비활성화 (안전) |
| Enable Internal Transfer | 비활성화 |
| Enable Futures | 비활성화 |
| Restrict access to trusted IPs only | Oracle VM의 Public IP 입력 (강력 추천) |
API 보안
- 출금 권한은 절대 활성화하지 마세요
- IP 제한을 반드시 설정하세요 (VM의 Public IP만 허용)
- API 키와 Secret은
.env파일에만 저장하고 절대 커밋하지 마세요
2. 환경변수 업데이트
nano ~/moneymax/.envBINANCE_API_KEY=실제_API_키
BINANCE_API_SECRET=실제_API_시크릿3. 서비스 파일 수정
sudo nano /etc/systemd/system/moneymax.service
# ExecStart 줄에서 --paper를 --live로 변경sudo systemctl daemon-reload
sudo systemctl restart moneymax실거래 체크리스트
- [ ] Paper Trading 최소 2주 이상 운영
- [ ] 수익률이 안정적인지 확인
- [ ] Binance API에 IP 제한 설정
- [ ] 출금 권한 비활성화
- [ ] 초기 자본은 감당 가능한 금액으로 시작
- [ ] Telegram 알림으로 모니터링 가능한 상태
자동 업데이트 (선택)
crontab -e# 매일 새벽 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 | 명령어 목록 |
서버 로그 확인
ssh -i ~/.ssh/oracle_moneymax ubuntu@<PUBLIC_IP>
sudo systemctl status moneymax
journalctl -u moneymax --since "today"트러블슈팅
SSH 접속 불가
| 증상 | 원인 | 해결 |
|---|---|---|
| Connection refused | Public IP 미할당 | VNIC에서 Ephemeral Public IP 추가 |
| Permission denied | SSH 키 불일치 | 인스턴스 생성 시 등록한 키 확인 |
| Connection timed out | Security List | SSH(22) 인바운드 규칙 확인 |
봇 실행 오류
| 증상 | 원인 | 해결 |
|---|---|---|
Invalid Api-Key ID | .env에 더미 값 | API 키를 비우거나 실제 키 입력 |
chat not found | 잘못된 Chat ID | /start 후 getUpdates에서 확인 |
uv: command not found | PATH 미설정 | source $HOME/.local/bin/env 실행 |
No module named | 의존성 미설치 | uv sync 재실행 |
Telegram Chat ID 확인 방법
- 봇에게
/start메시지 전송 - 브라우저에서 확인:
https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates- 응답 JSON에서
chat.id확인:
{
"result": [{
"message": {
"chat": { "id": 123456789 }
}
}]
}개인 vs 그룹
개인 Chat ID는 양수, 그룹 Chat ID는 음수입니다.