|
|
#!/bin/bash |
|
|
|
|
|
|
|
|
|
|
|
set -e |
|
|
|
|
|
echo "ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ" |
|
|
echo "β π DEPLOYMENT VERIFICATION SCRIPT β" |
|
|
echo "ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ" |
|
|
echo "" |
|
|
|
|
|
ERRORS=0 |
|
|
|
|
|
|
|
|
echo "π Check 1: Required files..." |
|
|
for file in requirements.txt Dockerfile api_server_extended.py provider_fetch_helper.py database.py; do |
|
|
if [ -f "$file" ]; then |
|
|
echo " β
$file exists" |
|
|
else |
|
|
echo " β $file missing" |
|
|
((ERRORS++)) |
|
|
fi |
|
|
done |
|
|
echo "" |
|
|
|
|
|
|
|
|
echo "π³ Check 2: Dockerfile configuration..." |
|
|
if grep -q "USE_MOCK_DATA=false" Dockerfile; then |
|
|
echo " β
USE_MOCK_DATA environment variable set" |
|
|
else |
|
|
echo " β USE_MOCK_DATA not found in Dockerfile" |
|
|
((ERRORS++)) |
|
|
fi |
|
|
|
|
|
if grep -q "mkdir -p logs data exports backups" Dockerfile; then |
|
|
echo " β
Directory creation configured" |
|
|
else |
|
|
echo " β Directory creation missing" |
|
|
((ERRORS++)) |
|
|
fi |
|
|
|
|
|
if grep -q "uvicorn api_server_extended:app" Dockerfile; then |
|
|
echo " β
Uvicorn startup command configured" |
|
|
else |
|
|
echo " β Uvicorn startup command missing" |
|
|
((ERRORS++)) |
|
|
fi |
|
|
echo "" |
|
|
|
|
|
|
|
|
echo "π¦ Check 3: Required dependencies..." |
|
|
for dep in fastapi uvicorn pydantic sqlalchemy aiohttp; do |
|
|
if grep -q "$dep" requirements.txt; then |
|
|
echo " β
$dep found in requirements.txt" |
|
|
else |
|
|
echo " β $dep missing from requirements.txt" |
|
|
((ERRORS++)) |
|
|
fi |
|
|
done |
|
|
echo "" |
|
|
|
|
|
|
|
|
echo "π§ Check 4: USE_MOCK_DATA flag implementation..." |
|
|
if grep -q 'USE_MOCK_DATA = os.getenv("USE_MOCK_DATA"' api_server_extended.py; then |
|
|
echo " β
USE_MOCK_DATA flag implemented" |
|
|
else |
|
|
echo " β USE_MOCK_DATA flag not found" |
|
|
((ERRORS++)) |
|
|
fi |
|
|
echo "" |
|
|
|
|
|
|
|
|
echo "π Check 5: Real data collector imports..." |
|
|
if grep -q "from collectors.sentiment import get_fear_greed_index" api_server_extended.py; then |
|
|
echo " β
Sentiment collector imported" |
|
|
else |
|
|
echo " β Sentiment collector import missing" |
|
|
((ERRORS++)) |
|
|
fi |
|
|
|
|
|
if grep -q "from collectors.market_data import get_coingecko_simple_price" api_server_extended.py; then |
|
|
echo " β
Market data collector imported" |
|
|
else |
|
|
echo " β Market data collector import missing" |
|
|
((ERRORS++)) |
|
|
fi |
|
|
|
|
|
if grep -q "from database import get_database" api_server_extended.py; then |
|
|
echo " β
Database import found" |
|
|
else |
|
|
echo " β Database import missing" |
|
|
((ERRORS++)) |
|
|
fi |
|
|
echo "" |
|
|
|
|
|
|
|
|
echo "π« Check 6: Mock data handling..." |
|
|
MOCK_COUNT=$(grep -c "if USE_MOCK_DATA:" api_server_extended.py || echo "0") |
|
|
if [ "$MOCK_COUNT" -ge 5 ]; then |
|
|
echo " β
USE_MOCK_DATA checks found in $MOCK_COUNT locations" |
|
|
else |
|
|
echo " β οΈ USE_MOCK_DATA checks found in only $MOCK_COUNT locations (expected 5+)" |
|
|
((ERRORS++)) |
|
|
fi |
|
|
echo "" |
|
|
|
|
|
|
|
|
echo "πΎ Check 7: Database integration..." |
|
|
if grep -q "db.save_price" api_server_extended.py; then |
|
|
echo " β
Database save_price integration found" |
|
|
else |
|
|
echo " β Database save_price integration missing" |
|
|
((ERRORS++)) |
|
|
fi |
|
|
|
|
|
if grep -q "db.get_price_history" api_server_extended.py; then |
|
|
echo " β
Database get_price_history integration found" |
|
|
else |
|
|
echo " β Database get_price_history integration missing" |
|
|
((ERRORS++)) |
|
|
fi |
|
|
echo "" |
|
|
|
|
|
|
|
|
echo "β οΈ Check 8: Proper error codes for unimplemented endpoints..." |
|
|
if grep -q "status_code=503" api_server_extended.py; then |
|
|
echo " β
HTTP 503 error handling found" |
|
|
else |
|
|
echo " β HTTP 503 error handling missing" |
|
|
((ERRORS++)) |
|
|
fi |
|
|
|
|
|
if grep -q "status_code=501" api_server_extended.py; then |
|
|
echo " β
HTTP 501 error handling found" |
|
|
else |
|
|
echo " β HTTP 501 error handling missing" |
|
|
((ERRORS++)) |
|
|
fi |
|
|
echo "" |
|
|
|
|
|
|
|
|
echo "π Check 9: Python syntax validation..." |
|
|
if python3 -m py_compile api_server_extended.py 2>/dev/null; then |
|
|
echo " β
api_server_extended.py syntax valid" |
|
|
else |
|
|
echo " β api_server_extended.py syntax errors" |
|
|
((ERRORS++)) |
|
|
fi |
|
|
|
|
|
if python3 -m py_compile provider_fetch_helper.py 2>/dev/null; then |
|
|
echo " β
provider_fetch_helper.py syntax valid" |
|
|
else |
|
|
echo " β provider_fetch_helper.py syntax errors" |
|
|
((ERRORS++)) |
|
|
fi |
|
|
echo "" |
|
|
|
|
|
|
|
|
echo "π Check 10: Documentation..." |
|
|
if [ -f "DEPLOYMENT_INSTRUCTIONS.md" ]; then |
|
|
echo " β
DEPLOYMENT_INSTRUCTIONS.md exists" |
|
|
else |
|
|
echo " β οΈ DEPLOYMENT_INSTRUCTIONS.md missing (recommended)" |
|
|
fi |
|
|
|
|
|
if [ -f "AUDIT_COMPLETION_REPORT.md" ]; then |
|
|
echo " β
AUDIT_COMPLETION_REPORT.md exists" |
|
|
else |
|
|
echo " β οΈ AUDIT_COMPLETION_REPORT.md missing (recommended)" |
|
|
fi |
|
|
echo "" |
|
|
|
|
|
|
|
|
echo "βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ" |
|
|
if [ $ERRORS -eq 0 ]; then |
|
|
echo "β β
ALL CHECKS PASSED β" |
|
|
echo "β STATUS: READY FOR HUGGINGFACE DEPLOYMENT β
β" |
|
|
echo "βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ" |
|
|
echo "" |
|
|
echo "π Next steps:" |
|
|
echo " 1. docker build -t crypto-monitor ." |
|
|
echo " 2. docker run -p 7860:7860 crypto-monitor" |
|
|
echo " 3. Test: curl http://localhost:7860/health" |
|
|
echo " 4. Deploy to HuggingFace Spaces" |
|
|
echo "" |
|
|
exit 0 |
|
|
else |
|
|
echo "β β FOUND $ERRORS ERROR(S) β" |
|
|
echo "β STATUS: NOT READY FOR DEPLOYMENT β β" |
|
|
echo "βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ" |
|
|
echo "" |
|
|
echo "β οΈ Please fix the errors above before deploying." |
|
|
echo "" |
|
|
exit 1 |
|
|
fi |
|
|
|