Hugging Face Spaces ๋ฐ์ดํฐ ์์์ฑ ํด๊ฒฐ ๋ฐฉ๋ฒ
๋ฌธ์ ์์ธ
Hugging Face Spaces๋ Docker ์ปจํ ์ด๋ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ฏ๋ก, ์ปจํ ์ด๋๊ฐ ์ฌ์์๋๊ฑฐ๋ ์ ๋ฐ์ดํธ๋๋ฉด ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง๋๋ค.
ํ์ฌ ์ ์ฅ๋๋ ๋ฐ์ดํฐ:
- ๋ฐ์ดํฐ๋ฒ ์ด์ค:
instance/finance_analysis.db - ์
๋ก๋ ํ์ผ:
uploads/ํด๋ - ๋ฒกํฐ DB:
vector_db/ํด๋ - ๋ก๊ทธ:
logs/ํด๋
ํด๊ฒฐ ๋ฐฉ๋ฒ
๋ฐฉ๋ฒ 1: ์ธ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ (๊ถ์ฅ)
PostgreSQL, MySQL ๋ฑ ์ธ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๊ฐ ์๊ตฌ์ ์ผ๋ก ๋ณด์กด๋ฉ๋๋ค.
PostgreSQL ์ฌ์ฉ ์์
Supabase, Neon, ๋๋ Railway์์ ๋ฌด๋ฃ PostgreSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ
ํ๊ฒฝ ๋ณ์ ์ค์ (Hugging Face Spaces Settings > Repository secrets):
DATABASE_URL=postgresql://user:password@host:port/databaserequirements.txt์ PostgreSQL ๋๋ผ์ด๋ฒ ์ถ๊ฐ:
psycopg2-binary์ฝ๋ ์์ (
app/core/config.py):SQLALCHEMY_DATABASE_URI: str = os.getenv( 'DATABASE_URL', f'sqlite:///{PROJECT_ROOT / "instance" / "finance_analysis.db"}' )์ด๋ฏธ ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก,
DATABASE_URL๋ง ์ค์ ํ๋ฉด ์๋์ผ๋ก PostgreSQL์ ์ฌ์ฉํฉ๋๋ค.
๋ฐฉ๋ฒ 2: ์ธ๋ถ ์คํ ๋ฆฌ์ง ์ฌ์ฉ (ํ์ผ ์ ์ฅ์ฉ)
์ ๋ก๋๋ ํ์ผ๊ณผ ๋ฒกํฐ DB๋ฅผ ์ธ๋ถ ์คํ ๋ฆฌ์ง์ ์ ์ฅํฉ๋๋ค.
AWS S3 ์ฌ์ฉ ์์
boto3 ์ค์น:
pip install boto3ํ๊ฒฝ ๋ณ์ ์ค์ :
AWS_ACCESS_KEY_ID=your_access_key AWS_SECRET_ACCESS_KEY=your_secret_key AWS_S3_BUCKET=your_bucket_name์ฝ๋ ์์ : ํ์ผ ์ ๋ก๋/๋ค์ด๋ก๋ ๋ก์ง์ S3๋ฅผ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝ
Google Cloud Storage ์ฌ์ฉ ์์
google-cloud-storage ์ค์น:
pip install google-cloud-storageํ๊ฒฝ ๋ณ์ ์ค์ :
GCS_BUCKET_NAME=your_bucket_name GOOGLE_APPLICATION_CREDENTIALS=/path/to/credentials.json
๋ฐฉ๋ฒ 3: Hugging Face Dataset ์ฌ์ฉ (๊ฐ๋จํ ๋ฐฉ๋ฒ)
Hugging Face์ Dataset API๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค.
datasets ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น:
pip install datasets์ฝ๋ ์์:
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: ์ ๊ธฐ์ ์ธ ๋ฐฑ์ ์์คํ
์ค์ผ์ค๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐฑ์ ํฉ๋๋ค.
๋ฐฑ์ ์คํฌ๋ฆฝํธ ์์ฑ (
backup_data.py):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') )์ค์ผ์ค๋ฌ ์ค์ : GitHub Actions ๋๋ ์ธ๋ถ ์ค์ผ์ค๋ฌ ์ฌ์ฉ
์ฆ์ ์ ์ฉ ๊ฐ๋ฅํ ์์ ํด๊ฒฐ์ฑ
ํ๊ฒฝ ๋ณ์๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฒฝ๋ก ๋ณ๊ฒฝ
Hugging Face Spaces์ ์์์ฑ ์คํ ๋ฆฌ์ง(์๋ ๊ฒฝ์ฐ)๋ฅผ ์ฌ์ฉ:
# 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 (์ธ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค) + ๋ฐฉ๋ฒ 2 (์ธ๋ถ ์คํ ๋ฆฌ์ง)
- ๊ฐ๋ฐ/ํ ์คํธ ํ๊ฒฝ: ๋ฐฉ๋ฒ 3 (Hugging Face Dataset) ๋๋ ๋ฐฉ๋ฒ 4 (์ ๊ธฐ ๋ฐฑ์ )
- ์ค์ํ ๋ฐ์ดํฐ: ํญ์ ์ธ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ