Loading...
Loading...
Compare original and translation side by side
| Project Type | Platform | Reason |
|---|---|---|
| Next.js frontend | Vercel | Native support, edge functions |
| Python backend | Railway | Nixpacks, health checks |
| ML/GPU workloads | RunPod | GPU access, vLLM |
| Local development | Docker | Consistent environment |
| 项目类型 | 平台 | 选择理由 |
|---|---|---|
| Next.js 前端 | Vercel | 原生支持、边缘函数 |
| Python 后端 | Railway | Nixpacks支持、健康检查 |
| 机器学习/GPU工作负载 | RunPod | GPU访问、vLLM支持 |
| 本地开发 | Docker | 一致的开发环境 |
{
"framework": "nextjs",
"installCommand": "cd frontend && npm install",
"buildCommand": "cd frontend && npm run build",
"outputDirectory": "frontend/.next"
}{
"framework": "nextjs",
"installCommand": "cd frontend && npm install",
"buildCommand": "cd frontend && npm run build",
"outputDirectory": "frontend/.next"
}vercel env add VITE_SUPABASE_URL production
vercel env add VITE_SUPABASE_ANON_KEY productionpreviewvercel env add VITE_SUPABASE_URL production
vercel env add VITE_SUPABASE_ANON_KEY productionpreviewfrontend/vercel.json{
"rewrites": [
{ "source": "/(.*)", "destination": "/" }
]
}frontend/vercel.json{
"rewrites": [
{ "source": "/(.*)", "destination": "/" }
]
}undefinedundefinedundefinedundefined{
"$schema": "https://railway.com/railway.schema.json",
"build": {
"builder": "NIXPACKS",
"buildCommand": "poetry install --no-dev"
},
"deploy": {
"startCommand": "poetry run python -m src.vozlux.main",
"healthcheckPath": "/health",
"healthcheckTimeout": 300,
"restartPolicyType": "ON_FAILURE",
"restartPolicyMaxRetries": 3
}
}{
"$schema": "https://railway.com/railway.schema.json",
"build": {
"builder": "NIXPACKS",
"buildCommand": "poetry install --no-dev"
},
"deploy": {
"startCommand": "poetry run python -m src.vozlux.main",
"healthcheckPath": "/health",
"healthcheckTimeout": 300,
"restartPolicyType": "ON_FAILURE",
"restartPolicyMaxRetries": 3
}
}SUPABASE_URL
SUPABASE_SERVICE_KEY
ANTHROPIC_API_KEY
GOOGLE_API_KEY
DEEPSEEK_API_KEY
TWILIO_ACCOUNT_SID
TWILIO_AUTH_TOKENSUPABASE_URL
SUPABASE_SERVICE_KEY
ANTHROPIC_API_KEY
GOOGLE_API_KEY
DEEPSEEK_API_KEY
TWILIO_ACCOUNT_SID
TWILIO_AUTH_TOKEN/health@app.get("/health")
async def health():
return {"status": "healthy", "timestamp": datetime.utcnow().isoformat()}/health@app.get("/health")
async def health():
return {"status": "healthy", "timestamp": datetime.utcnow().isoformat()}undefinedundefinedundefinedundefinedversion: '3.8'
services:
app:
build: .
ports:
- "8000:8000"
env_file:
- .env
volumes:
- ./src:/app/srcversion: '3.8'
services:
app:
build: .
ports:
- "8000:8000"
env_file:
- .env
volumes:
- ./src:/app/srcnpm testpytest.env.examplenpm run buildpoetry buildnpm testpytest.env.examplenpm run buildpoetry buildvercel logsvercel logshealthcheckTimeouthealthcheckTimeoutdocker build -t test .docker run -it testdocker build -t test .docker run -it testname: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: amondnet/vercel-action@v25
with:
vercel-token: ${{ secrets.VERCEL_TOKEN }}
vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
vercel-args: '--prod'name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: amondnet/vercel-action@v25
with:
vercel-token: ${{ secrets.VERCEL_TOKEN }}
vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
vercel-args: '--prod'