Week8 dkisselev-zz update
This commit is contained in:
147
week8/community_contributions/dkisselev-zz/tuxedo_link/deploy.sh
Executable file
147
week8/community_contributions/dkisselev-zz/tuxedo_link/deploy.sh
Executable file
@@ -0,0 +1,147 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# Colors
|
||||
GREEN='\033[0;32m'
|
||||
BLUE='\033[0;34m'
|
||||
YELLOW='\033[1;33m'
|
||||
RED='\033[0;31m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
echo "=========================================="
|
||||
echo " Tuxedo Link - Modal Deployment"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
# Check Modal is installed
|
||||
if ! command -v modal &> /dev/null; then
|
||||
echo -e "${RED}Error: modal CLI not found${NC}"
|
||||
echo "Install with: pip install modal"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check Modal auth
|
||||
echo -e "${BLUE}Checking Modal authentication...${NC}"
|
||||
if ! uv run python -m modal app list &>/dev/null; then
|
||||
echo -e "${RED}Error: Modal authentication not configured${NC}"
|
||||
echo "Run: uv run python -m modal setup"
|
||||
exit 1
|
||||
fi
|
||||
echo -e "${GREEN}✓ Modal authenticated${NC}"
|
||||
echo ""
|
||||
|
||||
# Check config.yaml exists
|
||||
if [ ! -f "config.yaml" ]; then
|
||||
echo -e "${RED}Error: config.yaml not found${NC}"
|
||||
echo "Copy config.example.yaml to config.yaml and configure it"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${BLUE}Step 1: Validating configuration...${NC}"
|
||||
python -c "
|
||||
import yaml
|
||||
import sys
|
||||
try:
|
||||
config = yaml.safe_load(open('config.yaml'))
|
||||
if config['deployment']['mode'] != 'production':
|
||||
print('❌ Error: Set deployment.mode to \"production\" in config.yaml for deployment')
|
||||
sys.exit(1)
|
||||
print('✓ Configuration valid')
|
||||
except Exception as e:
|
||||
print(f'❌ Error reading config: {e}')
|
||||
sys.exit(1)
|
||||
"
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo -e "${BLUE}Step 2: Setting up Modal secrets...${NC}"
|
||||
|
||||
# Check if required environment variables are set
|
||||
if [ -z "$OPENAI_API_KEY" ] || [ -z "$PETFINDER_API_KEY" ] || [ -z "$MAILGUN_API_KEY" ]; then
|
||||
echo -e "${YELLOW}Warning: Some environment variables are not set.${NC}"
|
||||
echo "Make sure the following are set in your environment or .env file:"
|
||||
echo " - OPENAI_API_KEY"
|
||||
echo " - PETFINDER_API_KEY"
|
||||
echo " - PETFINDER_SECRET"
|
||||
echo " - RESCUEGROUPS_API_KEY"
|
||||
echo " - MAILGUN_API_KEY"
|
||||
echo " - SENDGRID_API_KEY (optional)"
|
||||
echo ""
|
||||
read -p "Continue anyway? (y/N) " -n 1 -r
|
||||
echo
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Load .env if it exists
|
||||
if [ -f ".env" ]; then
|
||||
export $(cat .env | grep -v '^#' | xargs)
|
||||
fi
|
||||
|
||||
modal secret create tuxedo-link-secrets \
|
||||
OPENAI_API_KEY="${OPENAI_API_KEY}" \
|
||||
PETFINDER_API_KEY="${PETFINDER_API_KEY}" \
|
||||
PETFINDER_SECRET="${PETFINDER_SECRET}" \
|
||||
RESCUEGROUPS_API_KEY="${RESCUEGROUPS_API_KEY}" \
|
||||
MAILGUN_API_KEY="${MAILGUN_API_KEY}" \
|
||||
SENDGRID_API_KEY="${SENDGRID_API_KEY:-}" \
|
||||
--force 2>/dev/null || echo -e "${GREEN}✓ Secrets updated${NC}"
|
||||
|
||||
echo ""
|
||||
echo -e "${BLUE}Step 3: Creating Modal volume...${NC}"
|
||||
modal volume create tuxedo-link-data 2>/dev/null && echo -e "${GREEN}✓ Volume created${NC}" || echo -e "${GREEN}✓ Volume already exists${NC}"
|
||||
|
||||
echo ""
|
||||
echo -e "${BLUE}Step 4: Copying config to Modal volume...${NC}"
|
||||
# Create scripts directory if it doesn't exist
|
||||
mkdir -p scripts
|
||||
|
||||
# Upload config.yaml to Modal volume
|
||||
python scripts/upload_config_to_modal.py
|
||||
|
||||
echo ""
|
||||
echo -e "${BLUE}Step 5: Deploying Modal API...${NC}"
|
||||
modal deploy modal_services/modal_api.py
|
||||
|
||||
echo ""
|
||||
echo -e "${BLUE}Step 6: Deploying scheduled search service...${NC}"
|
||||
modal deploy modal_services/scheduled_search.py
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo -e " ${GREEN}Deployment Complete!${NC}"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo "Deployed services:"
|
||||
echo ""
|
||||
echo "📡 Modal API (tuxedo-link-api):"
|
||||
echo " - search_cats()"
|
||||
echo " - extract_profile()"
|
||||
echo " - create_alert_and_notify()"
|
||||
echo " - get_alerts()"
|
||||
echo " - update_alert()"
|
||||
echo " - delete_alert()"
|
||||
echo " - health_check()"
|
||||
echo ""
|
||||
echo "⏰ Scheduled Jobs (tuxedo-link-scheduled-search):"
|
||||
echo " - daily_search_job (9 AM UTC daily)"
|
||||
echo " - weekly_search_job (Monday 9 AM UTC)"
|
||||
echo " - weekly_cleanup_job (Sunday 2 AM UTC)"
|
||||
echo ""
|
||||
echo "Useful commands:"
|
||||
echo " API logs: modal app logs tuxedo-link-api --follow"
|
||||
echo " Schedule logs: modal app logs tuxedo-link-scheduled-search --follow"
|
||||
echo " View apps: modal app list"
|
||||
echo " View volumes: modal volume list"
|
||||
echo " View secrets: modal secret list"
|
||||
echo ""
|
||||
echo "Next steps:"
|
||||
echo " 1. Run UI: ./run.sh"
|
||||
echo " 2. Go to: http://localhost:7860"
|
||||
echo " 3. Test search and alerts!"
|
||||
echo "=========================================="
|
||||
|
||||
Reference in New Issue
Block a user