148 lines
4.3 KiB
Bash
Executable File
148 lines
4.3 KiB
Bash
Executable File
#!/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 "=========================================="
|
|
|