# Vercel 部署配置指南
## 前置準備
### 1. Vercel 帳號設置
1. 訪問 [Vercel](https://vercel.com)
2. 使用 GitHub 帳號登入
3. 授權 Vercel 訪問你的 GitHub repositories
### 2. 專案準備
確保專案已推送到 GitHub:
```bash
git add .
git commit -m "準備部署到 Vercel"
git push origin main
```
## 部署步驟
### Step 1: 導入專案
1. 在 Vercel Dashboard 點擊 "New Project"
2. 選擇 GitHub repository: `dramaling-vocab-learning`
3. 點擊 "Import"
### Step 2: 配置專案
```yaml
Framework Preset: Next.js
Root Directory: ./
Build Command: npm run build
Output Directory: .next
Install Command: npm install
```
### Step 3: 環境變數設置
在 "Environment Variables" 區域添加:
```env
# Supabase
NEXT_PUBLIC_SUPABASE_URL=your_supabase_url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key
SUPABASE_SERVICE_ROLE_KEY=your_service_role_key
# Gemini AI
GEMINI_API_KEY=your_gemini_api_key
# App Configuration
NEXT_PUBLIC_APP_URL=https://your-domain.vercel.app
NODE_ENV=production
```
### Step 4: 部署設置
點擊 "Deploy" 開始首次部署
## vercel.json 配置
```json
{
"framework": "nextjs",
"buildCommand": "npm run build",
"devCommand": "npm run dev",
"installCommand": "npm install",
"regions": ["sin1"],
"headers": [
{
"source": "/api/(.*)",
"headers": [
{
"key": "Cache-Control",
"value": "no-store, max-age=0"
}
]
},
{
"source": "/(.*)",
"headers": [
{
"key": "X-Content-Type-Options",
"value": "nosniff"
},
{
"key": "X-Frame-Options",
"value": "DENY"
},
{
"key": "X-XSS-Protection",
"value": "1; mode=block"
}
]
}
],
"rewrites": [
{
"source": "/api/:path*",
"destination": "/api/:path*"
}
],
"functions": {
"app/api/ai/generate-flashcard/route.ts": {
"maxDuration": 30
}
}
}
```
## 域名配置
### 1. 添加自定義域名
1. 在專案設置中選擇 "Domains"
2. 輸入你的域名 (例如: dramaling.com)
3. 選擇添加方式:
- 使用 Vercel DNS (推薦)
- 使用外部 DNS
### 2. DNS 配置
如果使用外部 DNS,添加以下記錄:
```
Type: A
Name: @
Value: 76.76.21.21
Type: CNAME
Name: www
Value: cname.vercel-dns.com
```
### 3. SSL 證書
Vercel 自動提供並更新 SSL 證書
## 性能優化配置
### 1. Edge Functions
```typescript
// app/api/edge/route.ts
export const runtime = 'edge'
export const dynamic = 'force-dynamic'
export async function GET() {
// Edge function 邏輯
}
```
### 2. ISR (增量靜態再生)
```typescript
// app/page.tsx
export const revalidate = 3600 // 1小時重新驗證
```
### 3. 圖片優化
```typescript
// next.config.mjs
module.exports = {
images: {
domains: ['your-supabase-url.supabase.co'],
formats: ['image/avif', 'image/webp'],
},
}
```
## 監控設置
### 1. Vercel Analytics
```bash
npm i @vercel/analytics
```
```typescript
// app/layout.tsx
import { Analytics } from '@vercel/analytics/react'
export default function RootLayout({ children }) {
return (
{children}
)
}
```
### 2. Speed Insights
```bash
npm i @vercel/speed-insights
```
```typescript
// app/layout.tsx
import { SpeedInsights } from '@vercel/speed-insights/next'
export default function RootLayout({ children }) {
return (
{children}
)
}
```
## CI/CD 配置
### 1. 自動部署
- **Production**: main 分支自動部署
- **Preview**: 所有 PR 自動生成預覽環境
### 2. 部署保護
```yaml
# 在 Vercel Dashboard 設置
Protection Rules:
- Deployment Protection: Enabled
- Password Protection: Optional
- Trusted IPs: Configure if needed
```
### 3. GitHub Actions 整合
```yaml
# .github/workflows/preview.yml
name: Vercel Preview Deployment
on:
pull_request:
types: [opened, synchronize]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: amondnet/vercel-action@v25
with:
vercel-token: ${{ secrets.VERCEL_TOKEN }}
vercel-args: '--prod'
vercel-org-id: ${{ secrets.ORG_ID}}
vercel-project-id: ${{ secrets.PROJECT_ID}}
```
## 環境管理
### 開發環境
```env
# .env.development
NEXT_PUBLIC_APP_URL=http://localhost:3000
NEXT_PUBLIC_API_ENDPOINT=http://localhost:3000/api
```
### 預覽環境
```env
# 在 Vercel Dashboard 設置
Environment: Preview
NEXT_PUBLIC_APP_URL=https://preview.dramaling.vercel.app
```
### 生產環境
```env
# 在 Vercel Dashboard 設置
Environment: Production
NEXT_PUBLIC_APP_URL=https://dramaling.com
```
## 故障排除
### 常見問題
#### 1. Build 失敗
```bash
# 檢查本地 build
npm run build
# 清理快取
rm -rf .next node_modules
npm install
npm run build
```
#### 2. 環境變數未生效
- 確認變數名稱以 `NEXT_PUBLIC_` 開頭(前端使用)
- 重新部署專案
- 檢查環境變數範圍(Development/Preview/Production)
#### 3. 函數超時
```json
// vercel.json
{
"functions": {
"app/api/slow-endpoint/route.ts": {
"maxDuration": 60
}
}
}
```
#### 4. CORS 錯誤
```typescript
// app/api/route.ts
export async function GET(request: Request) {
return new Response('Hello', {
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
},
})
}
```
## 效能監控
### Core Web Vitals
目標值:
- LCP (Largest Contentful Paint): < 2.5s
- FID (First Input Delay): < 100ms
- CLS (Cumulative Layout Shift): < 0.1
### 優化建議
1. 使用 `next/dynamic` 進行代碼分割
2. 優化圖片大小和格式
3. 實施適當的快取策略
4. 最小化 JavaScript bundle 大小
## 回滾策略
### 快速回滾
1. 在 Vercel Dashboard 選擇 "Deployments"
2. 找到之前的穩定版本
3. 點擊 "..." 選單
4. 選擇 "Promote to Production"
### Git 回滾
```bash
# 回滾到特定 commit
git revert
git push origin main
# 或重置到之前的 commit
git reset --hard
git push origin main --force
```
## 成本優化
### 免費方案限制
- 100GB 頻寬/月
- 100 小時 Build 時間/月
- 12 個團隊成員
### 優化建議
1. 使用 ISR 減少服務器負載
2. 實施邊緣快取
3. 優化圖片和資源
4. 監控函數執行時間
## 安全最佳實踐
1. **環境變數加密**: 所有敏感資料通過環境變數管理
2. **HTTPS 強制**: 自動重定向 HTTP 到 HTTPS
3. **安全標頭**: 配置適當的安全響應標頭
4. **訪問控制**: 使用 Vercel 的訪問控制功能
5. **日誌審計**: 定期審查部署和訪問日誌