# Hugging Face Spaces 데이터 영속성 해결 방법 ## 문제 원인 Hugging Face Spaces는 Docker 컨테이너 기반으로 동작하므로, **컨테이너가 재시작되거나 업데이트되면 모든 데이터가 사라집니다.** 현재 저장되는 데이터: - 데이터베이스: `instance/finance_analysis.db` - 업로드 파일: `uploads/` 폴더 - 벡터 DB: `vector_db/` 폴더 - 로그: `logs/` 폴더 ## 해결 방법 ### 방법 1: 외부 데이터베이스 사용 (권장) PostgreSQL, MySQL 등 외부 데이터베이스를 사용하면 데이터가 영구적으로 보존됩니다. #### PostgreSQL 사용 예시 1. **Supabase, Neon, 또는 Railway에서 무료 PostgreSQL 데이터베이스 생성** 2. **환경 변수 설정** (Hugging Face Spaces Settings > Repository secrets): ``` DATABASE_URL=postgresql://user:password@host:port/database ``` 3. **requirements.txt에 PostgreSQL 드라이버 추가**: ``` psycopg2-binary ``` 4. **코드 수정** (`app/core/config.py`): ```python SQLALCHEMY_DATABASE_URI: str = os.getenv( 'DATABASE_URL', f'sqlite:///{PROJECT_ROOT / "instance" / "finance_analysis.db"}' ) ``` 이미 환경 변수를 사용하고 있으므로, `DATABASE_URL`만 설정하면 자동으로 PostgreSQL을 사용합니다. ### 방법 2: 외부 스토리지 사용 (파일 저장용) 업로드된 파일과 벡터 DB를 외부 스토리지에 저장합니다. #### AWS S3 사용 예시 1. **boto3 설치**: ``` pip install boto3 ``` 2. **환경 변수 설정**: ``` AWS_ACCESS_KEY_ID=your_access_key AWS_SECRET_ACCESS_KEY=your_secret_key AWS_S3_BUCKET=your_bucket_name ``` 3. **코드 수정**: 파일 업로드/다운로드 로직을 S3를 사용하도록 변경 #### Google Cloud Storage 사용 예시 1. **google-cloud-storage 설치**: ``` pip install google-cloud-storage ``` 2. **환경 변수 설정**: ``` GCS_BUCKET_NAME=your_bucket_name GOOGLE_APPLICATION_CREDENTIALS=/path/to/credentials.json ``` ### 방법 3: Hugging Face Dataset 사용 (간단한 방법) Hugging Face의 Dataset API를 사용하여 데이터를 저장할 수 있습니다. 1. **datasets 라이브러리 설치**: ``` pip install datasets ``` 2. **코드 예시**: ```python from datasets import Dataset import json # 데이터 저장 def save_to_hf_dataset(data, dataset_name): dataset = Dataset.from_dict(data) dataset.push_to_hub(dataset_name, token=HF_TOKEN) # 데이터 로드 def load_from_hf_dataset(dataset_name): dataset = Dataset.from_hub(dataset_name, token=HF_TOKEN) return dataset.to_dict() ``` ### 방법 4: 정기적인 백업 시스템 스케줄러를 사용하여 정기적으로 데이터를 백업합니다. 1. **백업 스크립트 생성** (`backup_data.py`): ```python import shutil import os from datetime import datetime from huggingface_hub import HfApi def backup_to_hf(): # 데이터베이스 백업 if os.path.exists('instance/finance_analysis.db'): timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') backup_name = f'backup_{timestamp}.db' shutil.copy('instance/finance_analysis.db', backup_name) # Hugging Face Hub에 업로드 api = HfApi() api.upload_file( path_or_fileobj=backup_name, path_in_repo=f'backups/{backup_name}', repo_id='your-username/your-repo', token=os.getenv('HF_TOKEN') ) ``` 2. **스케줄러 설정**: GitHub Actions 또는 외부 스케줄러 사용 ## 즉시 적용 가능한 임시 해결책 ### 환경 변수로 데이터베이스 경로 변경 Hugging Face Spaces의 영속성 스토리지(있는 경우)를 사용: ```python # app/core/config.py 수정 SQLALCHEMY_DATABASE_URI: str = os.getenv( 'DATABASE_URL', f'sqlite:///{os.getenv("HF_HOME", str(PROJECT_ROOT / "instance"))}/finance_analysis.db' ) ``` ## 권장 사항 1. **프로덕션 환경**: 방법 1 (외부 데이터베이스) + 방법 2 (외부 스토리지) 2. **개발/테스트 환경**: 방법 3 (Hugging Face Dataset) 또는 방법 4 (정기 백업) 3. **중요한 데이터**: 항상 외부 데이터베이스 사용 ## 참고 - [Hugging Face Spaces 문서](https://huggingface.co/docs/hub/spaces) - [Supabase (무료 PostgreSQL)](https://supabase.com/) - [Neon (서버리스 PostgreSQL)](https://neon.tech/) - [Railway (PostgreSQL)](https://railway.app/)