|
|
#!/bin/bash |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
set -e |
|
|
|
|
|
|
|
|
GREEN='\033[0;32m' |
|
|
BLUE='\033[0;34m' |
|
|
YELLOW='\033[1;33m' |
|
|
NC='\033[0m' |
|
|
|
|
|
|
|
|
if [ -z "$1" ]; then |
|
|
echo -e "${YELLOW}Usage: bash deploy_to_hf.sh YOUR_HF_USERNAME${NC}" |
|
|
echo "" |
|
|
echo "Steps before running this script:" |
|
|
echo "1. Create HF account: https://huggingface.co/join" |
|
|
echo "2. Create HF Space:" |
|
|
echo " - Go to https://huggingface.co/spaces" |
|
|
echo " - Click 'Create new Space'" |
|
|
echo " - Name: chat-with-your-data" |
|
|
echo " - SDK: Docker" |
|
|
echo " - License: gpl-3.0" |
|
|
echo " - Visibility: Public" |
|
|
echo "3. Install HF CLI: pip install huggingface-hub" |
|
|
echo "4. Authenticate: huggingface-cli login" |
|
|
echo "" |
|
|
exit 1 |
|
|
fi |
|
|
|
|
|
HF_USERNAME=$1 |
|
|
SPACE_NAME="chat-with-your-data" |
|
|
SPACE_URL="https://huggingface.co/spaces/${HF_USERNAME}/${SPACE_NAME}" |
|
|
TEMP_DIR="/tmp/rag-hf-deploy-$$" |
|
|
|
|
|
|
|
|
SOURCE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
|
|
|
|
|
echo -e "${BLUE}βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ${NC}" |
|
|
echo -e "${BLUE} π Deploying Chat-with-your-datato Hugging Face Spaces${NC}" |
|
|
echo -e "${BLUE}βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ${NC}" |
|
|
echo "" |
|
|
|
|
|
|
|
|
echo -e "${YELLOW}[1/6] Checking prerequisites...${NC}" |
|
|
if ! command -v git &> /dev/null; then |
|
|
echo "β Git not found. Please install Git first." |
|
|
exit 1 |
|
|
fi |
|
|
|
|
|
if ! python3 -m pip show huggingface-hub &> /dev/null; then |
|
|
echo "β οΈ HF CLI not installed. Installing..." |
|
|
pip install huggingface-hub |
|
|
fi |
|
|
|
|
|
if ! huggingface-cli whoami &> /dev/null; then |
|
|
echo "β Not authenticated with Hugging Face. Run: huggingface-cli login" |
|
|
exit 1 |
|
|
fi |
|
|
|
|
|
echo -e "${GREEN}β Prerequisites met${NC}" |
|
|
echo "" |
|
|
|
|
|
|
|
|
echo -e "${YELLOW}[2/6] Configuring git authentication...${NC}" |
|
|
|
|
|
|
|
|
HF_TOKEN=$(python3 -c "from huggingface_hub import get_token; print(get_token())" 2>/dev/null) |
|
|
|
|
|
if [ -z "$HF_TOKEN" ]; then |
|
|
echo "β Could not retrieve HF token. Make sure you're authenticated with 'huggingface-cli login'" |
|
|
exit 1 |
|
|
fi |
|
|
|
|
|
|
|
|
git config --global credential.helper store |
|
|
git config --global credential."https://huggingface.co".username "$HF_USERNAME" |
|
|
|
|
|
echo -e "${GREEN}β Git configured${NC}" |
|
|
echo "" |
|
|
|
|
|
|
|
|
echo -e "${YELLOW}[3/6] Cloning HF Space repository...${NC}" |
|
|
mkdir -p "$TEMP_DIR" |
|
|
cd "$TEMP_DIR" |
|
|
|
|
|
|
|
|
git clone "https://${HF_USERNAME}:${HF_TOKEN}@huggingface.co/spaces/${HF_USERNAME}/${SPACE_NAME}" . 2>/dev/null || { |
|
|
echo "β Failed to clone space. Verify space was created at:" |
|
|
echo " https://huggingface.co/spaces/${HF_USERNAME}/${SPACE_NAME}" |
|
|
exit 1 |
|
|
} |
|
|
|
|
|
|
|
|
git config user.email "neetikasaxena@huggingface.co" |
|
|
git config user.name "$HF_USERNAME" |
|
|
git remote set-url origin "https://${HF_USERNAME}:${HF_TOKEN}@huggingface.co/spaces/${HF_USERNAME}/${SPACE_NAME}" |
|
|
|
|
|
echo -e "${GREEN}β Repository cloned${NC}" |
|
|
echo "" |
|
|
|
|
|
|
|
|
echo -e "${YELLOW}[4/6] Copying project files...${NC}" |
|
|
|
|
|
if [ ! -f "${SOURCE_DIR}/Dockerfile" ]; then |
|
|
echo "β Source directory not found. Expected Dockerfile at: ${SOURCE_DIR}" |
|
|
exit 1 |
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
cp -r "${SOURCE_DIR}"/* . 2>/dev/null || true |
|
|
cp -r "${SOURCE_DIR}"/.streamlit . 2>/dev/null || true |
|
|
|
|
|
|
|
|
echo " Cleaning up local files..." |
|
|
rm -rf venv venv\ 2 __pycache__ .env dump.rdb .github |
|
|
find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true |
|
|
find . -type f -name "*.pyc" -delete 2>/dev/null || true |
|
|
|
|
|
|
|
|
if [ -f "HF_README.md" ]; then |
|
|
rm -f README.md |
|
|
mv HF_README.md README.md |
|
|
fi |
|
|
|
|
|
echo -e "${GREEN}β Files copied and cleaned${NC}" |
|
|
echo "" |
|
|
|
|
|
|
|
|
echo -e "${YELLOW}[5/6] Verifying essential files...${NC}" |
|
|
REQUIRED_FILES=("Dockerfile" "docker-compose.yml" "requirements.txt" "app.py" "README.md" "LICENSE") |
|
|
MISSING_FILES=() |
|
|
|
|
|
for file in "${REQUIRED_FILES[@]}"; do |
|
|
if [ ! -f "$file" ]; then |
|
|
MISSING_FILES+=("$file") |
|
|
fi |
|
|
done |
|
|
|
|
|
if [ ${#MISSING_FILES[@]} -gt 0 ]; then |
|
|
echo "β Missing files:" |
|
|
for file in "${MISSING_FILES[@]}"; do |
|
|
echo " - $file" |
|
|
done |
|
|
exit 1 |
|
|
fi |
|
|
|
|
|
echo -e "${GREEN}β All essential files present${NC}" |
|
|
echo "" |
|
|
|
|
|
|
|
|
echo -e "${YELLOW}[5.5/6] Configuring Git LFS for binary files...${NC}" |
|
|
|
|
|
|
|
|
if ! command -v git-lfs &> /dev/null; then |
|
|
echo "β οΈ Git LFS not installed. Installing..." |
|
|
if [[ "$OSTYPE" == "darwin"* ]]; then |
|
|
brew install git-lfs |
|
|
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then |
|
|
sudo apt-get install -y git-lfs |
|
|
fi |
|
|
fi |
|
|
|
|
|
|
|
|
git lfs install --skip-repo |
|
|
git lfs track "*.png" "*.jpg" "*.jpeg" "*.gif" "*.pdf" "*.db" |
|
|
|
|
|
echo -e "${GREEN}β Git LFS configured${NC}" |
|
|
echo "" |
|
|
|
|
|
|
|
|
echo -e "${YELLOW}[6/6] Committing and pushing to Hugging Face...${NC}" |
|
|
|
|
|
git add -A |
|
|
|
|
|
|
|
|
if ! git diff --cached --quiet; then |
|
|
git commit -m "Initial deployment of RAG with Gemma-3 to Hugging Face Spaces |
|
|
|
|
|
- Added production-grade RAG system with Gemma-3 LLM |
|
|
- Intelligent query caching (700x performance improvement) |
|
|
- Multi-document support with semantic search |
|
|
- User authentication and session management |
|
|
- FastAPI backend with async streaming responses |
|
|
- Streamlit web interface |
|
|
- Qdrant vector database for embeddings |
|
|
- PostgreSQL for user data |
|
|
- Redis for cache and history |
|
|
- Comprehensive documentation and troubleshooting guides" |
|
|
|
|
|
|
|
|
if git push; then |
|
|
echo -e "${GREEN}β Changes pushed to Hugging Face${NC}" |
|
|
else |
|
|
echo -e "${YELLOW}β οΈ First push with Git LFS may take a moment...${NC}" |
|
|
git push |
|
|
echo -e "${GREEN}β Changes pushed to Hugging Face${NC}" |
|
|
fi |
|
|
else |
|
|
echo "βΉοΈ No changes to push (up to date)" |
|
|
fi |
|
|
|
|
|
echo "" |
|
|
|
|
|
|
|
|
echo -e "${BLUE}βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ${NC}" |
|
|
echo -e "${GREEN}β Deployment initiated successfully!${NC}" |
|
|
echo -e "${BLUE}βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ${NC}" |
|
|
echo "" |
|
|
echo "π Your Space URL:" |
|
|
echo -e " ${GREEN}${SPACE_URL}${NC}" |
|
|
echo "" |
|
|
echo "β±οΈ Build Status:" |
|
|
echo " Docker build in progress (10-15 minutes typical)" |
|
|
echo "" |
|
|
echo "π Next Steps:" |
|
|
echo " 1. Go to: ${SPACE_URL}" |
|
|
echo " 2. Click 'Build Logs' to monitor Docker build" |
|
|
echo " 3. Wait for 'Successfully built' message" |
|
|
echo " 4. Click 'App' tab when ready" |
|
|
echo " 5. Test the application:" |
|
|
echo " - Register a test account" |
|
|
echo " - Upload a sample document" |
|
|
echo " - Ask questions about it" |
|
|
echo " - Try same question twice to see cache speedup" |
|
|
echo "" |
|
|
echo "π‘ Tips:" |
|
|
echo " - Free tier uses CPU (slow, but works)" |
|
|
echo " - Upgrade to HF Pro for GPU (2-3x faster)" |
|
|
echo " - First response takes 60-90 seconds (LLM startup)" |
|
|
echo " - Repeated queries <100ms (cache hit)" |
|
|
echo "" |
|
|
echo "π Documentation:" |
|
|
echo " - Full guide: HUGGING_FACE_DEPLOYMENT.md" |
|
|
echo " - Quick checklist: HF_DEPLOYMENT_CHECKLIST.md" |
|
|
echo " - Project info: README.md" |
|
|
echo "" |
|
|
echo "π Share your project:" |
|
|
echo " Add to GitHub README:" |
|
|
echo " [](${SPACE_URL})" |
|
|
echo "" |
|
|
echo -e "${GREEN}Deployment directory: ${TEMP_DIR}${NC}" |
|
|
echo "" |
|
|
|