- Added MLFilter class to load and evaluate LightGBM model for trading signals. - Introduced retraining mechanism to update the model daily based on new data. - Created feature engineering and label building utilities for model training. - Updated bot logic to incorporate ML filter for signal validation. - Added scripts for data fetching and model training. Made-with: Cursor
6.3 KiB
Dockerfile & docker-compose.yml 작성 및 Gitea 업로드 구현 계획
For Claude: REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
Goal: cointrader 프로젝트에 Dockerfile과 docker-compose.yml을 추가하고, 변경사항을 커밋하여 Gitea(10.1.10.28:3000)에 push한다.
Architecture: Python 3.11 slim 이미지 기반의 멀티스테이지 없는 단일 Dockerfile을 작성하고, docker-compose.yml로 환경변수(.env)를 주입하여 컨테이너를 실행한다. 로그 디렉토리는 볼륨으로 마운트하여 컨테이너 재시작 시에도 보존한다.
Tech Stack: Docker, docker-compose v2, Python 3.11-slim, python-dotenv
Task 1: Dockerfile 작성
Files:
- Create:
Dockerfile
Step 1: Dockerfile 생성
/Users/gihyeon/github/cointrader/Dockerfile 파일을 아래 내용으로 생성한다:
FROM python:3.11-slim
WORKDIR /app
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc \
&& rm -rf /var/lib/apt/lists/*
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
RUN mkdir -p logs
ENV PYTHONUNBUFFERED=1
ENV PYTHONDONTWRITEBYTECODE=1
CMD ["python", "main.py"]
Step 2: Dockerfile 내용 확인
cat /Users/gihyeon/github/cointrader/Dockerfile
Expected: 위 내용이 그대로 출력됨
Step 3: Docker 빌드 테스트 (Docker가 설치된 경우)
cd /Users/gihyeon/github/cointrader
docker build -t cointrader:test .
Expected: Successfully built <image_id> 또는 Successfully tagged cointrader:test
Docker가 설치되지 않은 환경이라면 이 단계는 건너뛴다.
Task 2: docker-compose.yml 작성
Files:
- Create:
docker-compose.yml
Step 1: docker-compose.yml 생성
/Users/gihyeon/github/cointrader/docker-compose.yml 파일을 아래 내용으로 생성한다:
services:
cointrader:
build: .
container_name: cointrader
restart: unless-stopped
env_file:
- .env
volumes:
- ./logs:/app/logs
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "5"
Step 2: docker-compose.yml 내용 확인
cat /Users/gihyeon/github/cointrader/docker-compose.yml
Expected: 위 내용이 그대로 출력됨
Step 3: docker-compose 문법 검증 (docker compose가 설치된 경우)
cd /Users/gihyeon/github/cointrader
docker compose config
Expected: 파싱된 YAML 설정이 오류 없이 출력됨
Task 3: .dockerignore 작성
Files:
- Create:
.dockerignore
Step 1: .dockerignore 생성
/Users/gihyeon/github/cointrader/.dockerignore 파일을 아래 내용으로 생성한다:
.env
.venv
__pycache__
*.pyc
*.pyo
.pytest_cache
logs/
*.log
.git
docs/
tests/
.env를 반드시 포함시켜 빌드 컨텍스트에서 제외한다. 이미지에 API 키가 포함되는 것을 방지한다.
Step 2: .dockerignore 내용 확인
cat /Users/gihyeon/github/cointrader/.dockerignore
Expected: 위 내용이 그대로 출력됨
Task 4: git 커밋
Files:
- Modify:
Dockerfile(신규) - Modify:
docker-compose.yml(신규) - Modify:
.dockerignore(신규)
Step 1: git 상태 확인
cd /Users/gihyeon/github/cointrader
git status
Expected: Dockerfile, docker-compose.yml, .dockerignore가 untracked files로 표시됨
Step 2: 스테이징
cd /Users/gihyeon/github/cointrader
git add Dockerfile docker-compose.yml .dockerignore
Step 3: 스테이징 내용 검토 (.env 포함 여부 확인)
git diff --cached --name-only
Expected:
.dockerignore
Dockerfile
docker-compose.yml
.env가 목록에 없어야 한다. 만약 있다면 즉시 git reset HEAD .env 실행 후 중단.
Step 4: 커밋
git commit -m "chore: add Dockerfile, docker-compose.yml, .dockerignore"
Expected: main 브랜치에 새 커밋 생성
Step 5: 커밋 확인
git log --oneline -3
Expected: 방금 만든 커밋이 최상단에 표시됨
Task 5: Gitea push
이 Task는 Gitea 원격 저장소가 이미 설정되어 있다고 가정한다.
아직 설정하지 않았다면docs/plans/2026-03-01-upload-to-gitea.md의 Task 2~3을 먼저 완료한다.
Step 1: 현재 원격 저장소 확인
cd /Users/gihyeon/github/cointrader
git remote -v
Expected:
origin http://10.1.10.28:3000/<사용자명>/cointrader.git (fetch)
origin http://10.1.10.28:3000/<사용자명>/cointrader.git (push)
origin이 없다면 아래 명령으로 추가 (<사용자명> 교체 필요):
git remote add origin http://10.1.10.28:3000/<사용자명>/cointrader.git
Step 2: push
git push origin main
Gitea 계정의 사용자명과 비밀번호(또는 액세스 토큰)를 입력하라는 프롬프트가 나타남
Expected:
Enumerating objects: ...
Writing objects: 100% ...
Step 3: push 결과 확인
git log --oneline origin/main -3
Expected: 로컬 커밋 히스토리와 동일하게 표시됨
Step 4: Gitea 웹 UI에서 파일 확인
브라우저에서 http://10.1.10.28:3000/<사용자명>/cointrader 접속 후 다음 파일이 있는지 확인:
Dockerfiledocker-compose.yml.dockerignore
트러블슈팅
| 문제 | 원인 | 해결 |
|---|---|---|
docker build 시 gcc 설치 실패 |
네트워크 문제 | apt-get 단계를 제거하고 빌드 재시도 (pandas-ta가 gcc 없이 설치되는지 확인) |
docker compose config 오류 |
YAML 들여쓰기 오류 | 탭 대신 스페이스 2칸 사용 여부 확인 |
push 시 Authentication failed |
잘못된 계정 정보 | Gitea 웹 UI 로그인 테스트 후 동일 계정 사용 |
push 시 non-fast-forward |
원격에 이미 다른 커밋 존재 | git pull --rebase origin main 후 재시도 |
컨테이너 실행 시 .env 없음 오류 |
.env 파일 미생성 |
.env.example을 복사하여 .env 생성 후 값 입력 |
참고: 컨테이너 실행 방법
# .env 파일 준비
cp .env.example .env
# .env 파일에 실제 API 키와 Discord Webhook URL 입력
# 빌드 및 백그라운드 실행
docker compose up -d --build
# 로그 확인
docker compose logs -f
# 중지
docker compose down