feat: 배포 구성
This commit is contained in:
parent
c9d4ef99af
commit
1a2a29aaf2
22
.dockerignore
Normal file
22
.dockerignore
Normal 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
7
.env.example
Normal 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
|
||||
@ -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
14
.github/workflows/build.yaml
vendored
Normal 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
89
DEPLOYMENT.md
Normal 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
23
Dockerfile
Normal 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
151
README.md
@ -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
45
deploy.sh
Executable 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
21
docker-compose.yml
Normal 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
|
||||
Loading…
x
Reference in New Issue
Block a user