Loading
Loading
We'll build a simple FastAPI app with Claude API and deploy it to the Internet.
| Platform | Difficulty | Cost | Best For | |----------|------------|------|----------| | Vercel | Very easy | Free | Next.js, Frontend | | Railway | Easy | Free (limited) | Backend, APIs | | Render | Easy | Free (limited) | Full-stack | | Cloud Run | Medium | Pay per use | Containers | | EC2 | Hard | Pay for server | Full control |
# Project structure
my-ai-api/
├── main.py
├── requirements.txt
└── Dockerfile
requirements.txt:
fastapi
uvicorn
anthropic
python-dotenv
# Install Railway CLI
npm install -g @railway/cli
# Login
railway login
# Link project
railway init
# Add environment variable
railway variables set ANTHROPIC_API_KEY=sk-ant-...
# Deploy
railway up
# Build and push the image
gcloud builds submit --tag gcr.io/my-project/ai-api
# Deploy to Cloud Run
gcloud run deploy ai-api \
--image gcr.io/my-project/ai-api \
--platform managed \
--region us-central1 \
--allow-unauthenticated
# Add environment variable
gcloud run services update ai-api \
--set-env-vars ANTHROPIC_API_KEY=sk-ant-...
# Test the API
curl https://ai-api-xxxx.run.app/
# Test Claude
curl -X POST https://ai-api-xxxx.run.app/chat \
-H "Content-Type: application/json" \
-d '{"message": "Hello!"}'
#!/usr/bin/env python3
"""
نشر أول تطبيق AI على الكلاود
First AI App Deployment Simulation
ملف: main.py — FastAPI App جاهز للنشر
"""
# ─── التطبيق الكامل الجاهز للنشر ─────────────────────────
MAIN_PY = '''
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import anthropic
import os
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
app = FastAPI(title="AI Chat API", version="1.0.0")
client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
class ChatRequest(BaseModel):
message: str
max_tokens: int = 500
class ChatResponse(BaseModel):
reply: str
model: str
tokens_used: int
@app.get("/")
def health_check():
return {"status": "ok", "service": "AI Chat API"}
@app.get("/health")
def health():
return {"healthy": True}
@app.post("/chat", response_model=ChatResponse)
def chat(req: ChatRequest):
try:
msg = client.messages.create(
model="claude-haiku-4-5-20251001",
max_tokens=req.max_tokens,
messages=[{"role": "user", "content": req.message}],
)
tokens = msg.usage.input_tokens + msg.usage.output_tokens
logger.info(f"Chat request: {tokens} tokens used")
return ChatResponse(
reply=msg.content[0].text,
model=msg.model,
tokens_used=tokens,
)
except Exception as e:
logger.error(f"Error: {e}")
raise HTTPException(status_code=500, detail=str(e))
'''
DOCKERFILE = '''
FROM python:3.11-slim
WORKDIR /app
# تثبيت المتطلبات أولاً (caching)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# نسخ الكود
COPY . .
# تشغيل التطبيق
EXPOSE 8080
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]
'''
REQUIREMENTS = """fastapi
uvicorn[standard]
anthropic
python-dotenv"""
# ─── محاكاة عملية النشر ───────────────────────────────────
import time
def step(num: int, title: str, cmds: list[str], wait: float = 0.25):
print(f"\n[{num}] {title}")
for cmd in cmds:
print(f" $ {cmd}")
time.sleep(wait)
print(f" ✅ مكتمل")
def deploy_railway():
"""النشر على Railway — الأسهل للمبتدئين"""
print("\n" + "="*55)
print("🚂 النشر على Railway")
print("="*55)
step(1, "تثبيت CLI",
["npm install -g @railway/cli", "railway --version"])
step(2, "تسجيل الدخول وربط المشروع",
["railway login", "railway init my-ai-api"])
step(3, "إضافة متغيرات البيئة",
["railway variables set ANTHROPIC_API_KEY=sk-ant-***"])
step(4, "النشر",
["railway up"])
print("\n🌐 التطبيق يعمل على:")
print(" https://my-ai-api.up.railway.app")
print(" https://my-ai-api.up.railway.app/docs ← Swagger UI")
def deploy_cloud_run():
"""النشر على Google Cloud Run"""
print("\n" + "="*55)
print("🔴 النشر على Google Cloud Run")
print("="*55)
step(1, "بناء Docker Image",
["docker build -t gcr.io/my-proj/ai-api ."])
step(2, "رفع الـ Image",
["docker push gcr.io/my-proj/ai-api"])
step(3, "النشر على Cloud Run",
["gcloud run deploy ai-api",
" --image gcr.io/my-proj/ai-api",
" --platform managed --region us-central1"])
step(4, "إضافة متغيرات البيئة",
["gcloud run services update ai-api",
" --set-env-vars ANTHROPIC_API_KEY=sk-ant-***"])
print("\n🌐 التطبيق يعمل على:")
print(" https://ai-api-xxxx-uc.a.run.app")
# ─── عرض ملفات المشروع ────────────────────────────────────
print("☁️ نشر أول تطبيق AI على الكلاود")
print("="*55)
print("\n📁 ملفات المشروع:")
print(" my-ai-api/")
print(" ├── main.py ← FastAPI Application")
print(" ├── requirements.txt ← Python Dependencies")
print(" └── Dockerfile ← Container Definition")
print("\n📝 requirements.txt:")
for line in REQUIREMENTS.strip().split("\n"):
print(f" {line}")
# ─── اختيار منصة النشر ────────────────────────────────────
print("\n\n📊 خيارات النشر:")
options = [
("Railway", "سهل جداً", "مجاني (500MB RAM)", "للمبتدئين"),
("Render", "سهل", "مجاني (sleep بعد 15d)", "Full-stack"),
("Cloud Run", "متوسط", "ادفع حسب الاستخدام", "Containers"),
("Fly.io", "متوسط", "مجاني (256MB RAM)", "Global edge"),
]
print(f"{'المنصة':<14} {'الصعوبة':<10} {'التكلفة':<22} {'مناسب لـ'}")
print("─"*60)
for o in options:
print(f"{o[0]:<14} {o[1]:<10} {o[2]:<22} {o[3]}")
# ─── محاكاة النشر ─────────────────────────────────────────
deploy_railway()
print("\n\n🎉 تطبيق AI يعمل على الإنترنت الآن!")
print("\n📮 اختبر التطبيق:")
print(' curl https://my-ai-api.up.railway.app/')
print(' # {"status": "ok", "service": "AI Chat API"}')
print()
print(' curl -X POST https://my-ai-api.up.railway.app/chat')
print(' -H "Content-Type: application/json"')
print(' -d {"message": "مرحباً! كيف يمكنك مساعدتي؟"}')