feat: 배포 구성
Some checks failed
Docker Build and Deploy / build-and-push (push) Successful in 1m9s
Docker Build and Deploy / deploy (push) Failing after 8s

This commit is contained in:
Ayuriel 2025-03-31 12:35:54 +09:00
parent c9d4ef99af
commit 1a2a29aaf2
9 changed files with 304 additions and 122 deletions

22
.dockerignore Normal file
View File

@ -0,0 +1,22 @@
__pycache__/
*.py[cod]
*$py.class
*.so
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
.DS_Store
.git
.github
README.md.bak
*.swp
*.swo
node_modules/
deployment/
src/__pycache__/
src/*/\_\_pycache\_\_/
src/config/credentials.yaml

7
.env.example Normal file
View File

@ -0,0 +1,7 @@
# Gitea Registry Configuration
GITEA_REGISTRY_URL=gitea.example.com
GITEA_USERNAME=your-username
GITEA_PASSWORD=your-password
# Deployment path on server
DEPLOYMENT_PATH=/path/to/deployment

View File

@ -1,9 +1,49 @@
name: CI Build
on: [push]
name: Docker Build and Deploy
on:
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-22.04
build-and-push:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: echo "Building the project..."
- run: python -m unittest discover # 예: Python 테스트 실행
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to Container Registry
uses: docker/login-action@v2
with:
registry: ${{ secrets.MY_GITEA_REGISTRY_URL }}
username: ${{ secrets.MY_GITEA_USERNAME }}
password: ${{ secrets.MY_GITEA_PASSWORD }}
- name: Build and push
uses: docker/build-push-action@v3
with:
context: .
push: true
tags: |
${{ secrets.MY_GITEA_REGISTRY_URL }}/quant/make-quant-py:${{ gitea.sha }}
${{ secrets.MY_GITEA_REGISTRY_URL }}/quant/make-quant-py:latest
deploy:
needs: build-and-push
runs-on: ubuntu-latest
steps:
- name: Deploy to server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.DEPLOY_HOST }}
username: ${{ secrets.DEPLOY_USER }}
key: ${{ secrets.DEPLOY_SSH_KEY }}
script: |
cd ${{ secrets.DEPLOYMENT_PATH }}
echo "${{ secrets.MY_GITEA_PASSWORD }}" | docker login ${{ secrets.MY_GITEA_REGISTRY_URL }} -u ${{ secrets.MY_GITEA_USERNAME }} --password-stdin
docker pull ${{ secrets.MY_GITEA_REGISTRY_URL }}/quant/make-quant-py:latest
docker-compose down
docker-compose up -d

14
.github/workflows/build.yaml vendored Normal file
View File

@ -0,0 +1,14 @@
# This is a GitHub workflow file (NOT USED)
# For Gitea Actions, see .gitea/workflows/build.yaml
name: GitHub CI (INFO ONLY)
on:
push:
branches: [ master ]
jobs:
info:
runs-on: ubuntu-latest
steps:
- name: Info
run: echo "Actual CI configuration is in .gitea/workflows/build.yaml"

89
DEPLOYMENT.md Normal file
View File

@ -0,0 +1,89 @@
# 배포 가이드
이 문서는 Gitea 패키지 레지스트리를 사용하여 Docker 이미지를 배포하는 방법을 설명합니다.
## 1. Gitea 저장소 설정
### 저장소 시크릿 설정
Gitea 저장소 설정에서 다음 시크릿을 추가해야 합니다:
1. `GITEA_REGISTRY_URL` - Gitea 레지스트리 URL (예: `gitea.example.com`)
2. `GITEA_USERNAME` - Gitea 사용자 이름
3. `GITEA_PASSWORD` - Gitea 비밀번호 또는 액세스 토큰
4. `DEPLOY_HOST` - 배포 서버 호스트 (예: `123.456.789.0`)
5. `DEPLOY_USER` - 배포 서버 SSH 사용자 (예: `deployer`)
6. `DEPLOY_SSH_KEY` - 배포 서버 SSH 개인 키
7. `DEPLOYMENT_PATH` - 배포 서버의 프로젝트 경로 (예: `/home/deployer/quant-manager`)
시크릿 추가 방법:
1. Gitea에서 저장소로 이동
2. 설정 > 시크릿 메뉴 선택
3. "새 시크릿 추가" 버튼 클릭
4. 각 시크릿의 이름과 값 입력
## 2. 서버 설정
### 배포 서버 준비
배포 서버에서 다음 작업을 수행해야 합니다:
1. Docker 설치
```bash
sudo apt update
sudo apt install docker.io docker-compose -y
sudo systemctl enable docker
sudo systemctl start docker
```
2. 배포 디렉터리 생성
```bash
mkdir -p /path/to/deployment
cd /path/to/deployment
```
3. 환경 파일 생성
```bash
# .env 파일 생성
cat > .env << EOF
GITEA_REGISTRY_URL=gitea.example.com
GITEA_USERNAME=your-username
GITEA_PASSWORD=your-password
EOF
```
4. Docker Compose 파일 복사
프로젝트의 `docker-compose.yml` 파일을 서버의 배포 디렉터리에 복사합니다.
## 3. 배포 프로세스
### 자동 배포
1. `master` 브랜치에 변경 사항을 푸시하면 Gitea Actions 워크플로우가 트리거됩니다.
2. 워크플로우는 Docker 이미지를 빌드하고 레지스트리에 푸시합니다.
3. 그런 다음 SSH를 통해 서버에 연결하여 최신 이미지를 가져오고 배포합니다.
### 수동 배포
서버에서 직접 배포하려면:
1. 서버의 배포 디렉터리로 이동
```bash
cd /path/to/deployment
```
2. 배포 스크립트 실행
```bash
./deploy.sh
```
## 4. 문제 해결
### 일반적인 문제
1. **인증 오류**: Gitea 사용자 이름과 비밀번호가 올바른지 확인하세요.
2. **이미지 가져오기 실패**: 레지스트리 URL이 올바른지 확인하세요.
3. **배포 실패**: 서버에 Docker와 Docker Compose가 설치되어 있고 사용자에게 필요한 권한이 있는지 확인하세요.
로그를 확인하려면:
```bash
docker logs quant-manager
```

23
Dockerfile Normal file
View File

@ -0,0 +1,23 @@
FROM python:3.12-slim
WORKDIR /app
# Install dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy source code
COPY src/ /app/src/
COPY README.md /app/
# Make sure credentials directory exists
RUN mkdir -p /app/src/config
# Set environment variables
ENV PYTHONPATH=/app
# Expose port for Streamlit
EXPOSE 8501
# Command to run the application
CMD ["streamlit", "run", "src/app.py", "--server.port=8501", "--server.address=0.0.0.0"]

151
README.md
View File

@ -2,133 +2,54 @@
한국 주식 시장을 위한 퀀트 투자 도구입니다.
## 프로젝트 구조
## 기능
- 데이터 수집 및 관리
- 멀티 팩터 전략
- 슈퍼 퀄리티 전략
- 슈퍼 밸류 모멘텀 전략
```
make-quant-py/
├── data/ # 데이터 수집 관련 코드
│ ├── krx.py # 한국거래소 데이터 수집
│ ├── prices.py # 가격 데이터 수집
│ ├── financial.py # 재무제표 데이터 수집
│ └── crawling.py # 웹 크롤링 유틸리티
├── db/ # 데이터베이스 유틸리티
│ └── common.py # DB 연결 및 쿼리 공통 기능
├── strategies/ # 전략 구현
│ ├── factors/ # 개별 요소 모듈
│ │ ├── value.py # 가치 전략
│ │ ├── quality.py # 퀄리티 전략
│ │ ├── momentum.py # 모멘텀 전략
│ │ ├── f_score.py # F-Score 전략
│ │ └── all_value.py # 종합 가치 전략
│ ├── composite/ # 복합 전략 구현
│ │ ├── magic_formula.py # 마법공식 전략
│ │ ├── multi_factor.py # 멀티팩터 전략
│ │ ├── super_quality.py # 슈퍼 퀄리티 전략
│ │ └── super_value_momentum.py # 슈퍼 밸류 모멘텀 전략
│ └── utils.py # 전략 공통 유틸리티
├── backtest/ # 백테스트 도구
│ └── engine.py # 백테스트 구현
└── streamlit/ # Streamlit 웹 앱
├── app.py # 메인 앱
├── pages/ # 개별 페이지
│ ├── data_page.py # 데이터 수집 페이지
│ ├── quality_page.py # 슈퍼 퀄리티 전략 페이지
│ └── value_momentum_page.py # 밸류 모멘텀 전략 페이지
└── components/ # 재사용 가능한 UI 컴포넌트
└── charts.py # 시각화 컴포넌트
```
## 설치 및 실행 방법
## 설치 및 설정
### 필수 요구사항
- Python 3.8 이상
- MySQL 또는 MariaDB
Windows에서 필요한 빌드 도구:
- Visual Studio Build Tools 2017 이상
- Desktop development with C++ 워크로드 선택
- (선택사항) Python development 워크로드 선택
### 가상환경 설정
가상환경 생성:
```
python -m venv .venv
```
가상환경 활성화:
- Windows: `.venv\Scripts\activate`
- Linux/Mac: `. .venv/bin/activate`
패키지 설치:
```
### 로컬 개발 환경
```bash
# 의존성 설치
pip install -r requirements.txt
# 애플리케이션 실행
streamlit run src/app.py
```
가상환경 종료:
```
deactivate
### Docker 배포
Docker를 사용하여 애플리케이션을 쉽게 배포할 수 있습니다.
1. 환경 변수 설정
```bash
# .env.example 파일을 복사하여 .env 파일 생성
cp .env.example .env
# .env 파일 편집 - Gitea 레지스트리 정보 입력
```
### 환경 변수 설정
프로젝트 루트에 `.env` 파일을 생성하고 다음 환경 변수를 설정하세요:
```
DB_USER=your_db_user
DB_PW=your_db_password
DB_HOST=localhost
DB_PORT=3306
DB_DB=your_db_name
2. 배포 스크립트 실행
```bash
./deploy.sh
```
## 실행 방법
자세한 배포 방법은 [DEPLOYMENT.md](DEPLOYMENT.md) 문서를 참조하세요.
Streamlit 앱 실행:
```
streamlit run src/app.py --server.port=20000
## Docker 이미지 빌드 (수동)
```bash
docker build -t quant-manager .
```
### 인증 설정
## 개발 환경 설정
애플리케이션은 streamlit-authenticator를 사용하여 로그인 기능을 제공합니다. 기본 계정은 다음과 같습니다:
애플리케이션 실행 전에 인증 설정이 필요합니다.
- 관리자: 아이디 `admin`, 비밀번호 `adminpass`
- 일반 사용자: 아이디 `user`, 비밀번호 `userpass`
```bash
# 인증 설정 파일 생성 (최초 1회)
python src/config/generate_credentials.py
비밀번호 변경 또는 계정 추가를 위한 steps:
1. `src/config/generate_credentials.py` 파일을 수정하여 원하는 계정 정보 입력
2. 아래 명령어 실행:
```
cd src/config
python generate_credentials.py
```
3. 생성된 `credentials.yaml` 파일을 확인하여 적용
## 모듈
### 데이터 수집
- `data/krx.py`: 한국거래소(KRX)에서 주식 데이터를 수집합니다.
- `data/prices.py`: 네이버 금융에서 주가 데이터를 수집합니다.
- `data/financial.py`: FnGuide에서 재무제표 데이터를 수집합니다.
### 투자 전략
#### 개별 요소 전략
- `strategies/factors/value.py`: PER, PBR 등 가치 지표 기반 전략
- `strategies/factors/quality.py`: ROE, GPA 등 퀄리티 지표 기반 전략
- `strategies/factors/momentum.py`: 주가 모멘텀 기반 전략
- `strategies/factors/f_score.py`: Piotroski의 F-Score 계산 전략
#### 복합 전략
- `strategies/composite/magic_formula.py`: Joel Greenblatt의 마법공식 전략
- `strategies/composite/multi_factor.py`: 다중 요소 통합 전략
- `strategies/composite/super_quality.py`: F-Score와 GP/A를 결합한 슈퍼 퀄리티 전략
- `strategies/composite/super_value_momentum.py`: 가치와 모멘텀을 결합한 전략
### 백테스트
- `backtest/engine.py`: bt 패키지를 사용한 백테스트 기능 구현
# 사용자 비밀번호 변경
python src/config/update_password.py
```

45
deploy.sh Executable file
View File

@ -0,0 +1,45 @@
#!/bin/bash
# This script pulls the latest image and deploys the application
# Load environment variables from .env file if it exists
if [ -f .env ]; then
export $(cat .env | grep -v '^#' | xargs)
fi
# Check if required environment variables are set
if [ -z "$GITEA_REGISTRY_URL" ] || [ -z "$GITEA_USERNAME" ] || [ -z "$GITEA_PASSWORD" ]; then
echo "Error: Missing required environment variables. Please check your .env file."
echo "Required variables: GITEA_REGISTRY_URL, GITEA_USERNAME, GITEA_PASSWORD"
exit 1
fi
# Login to Gitea registry
echo "Logging in to Gitea registry..."
echo $GITEA_PASSWORD | docker login ${GITEA_REGISTRY_URL} -u ${GITEA_USERNAME} --password-stdin
if [ $? -ne 0 ]; then
echo "Error: Failed to login to Gitea registry. Please check your credentials."
exit 1
fi
# Pull the latest image
echo "Pulling the latest image..."
docker pull ${GITEA_REGISTRY_URL}/quant/make-quant-py:latest
if [ $? -ne 0 ]; then
echo "Error: Failed to pull the latest image."
exit 1
fi
# Deploy with docker-compose
echo "Deploying the application..."
docker-compose down
docker-compose up -d
if [ $? -ne 0 ]; then
echo "Error: Failed to deploy the application."
exit 1
fi
echo "Deployment completed successfully!"

21
docker-compose.yml Normal file
View File

@ -0,0 +1,21 @@
version: '3'
services:
quant-app:
image: ${GITEA_REGISTRY_URL}/quant/make-quant-py:latest
container_name: quant-manager
ports:
- "8501:8501"
volumes:
- ./src/config:/app/src/config
restart: unless-stopped
environment:
- STREAMLIT_SERVER_PORT=8501
- STREAMLIT_SERVER_ADDRESS=0.0.0.0
- STREAMLIT_BROWSER_GATHER_USAGE_STATS=false
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8501/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s