基於 2025 年最新資訊和最佳實踐
根據線上檢索的最新教學,這是針對您的 Node.js + Express + TypeScript 專案的詳細部署步驟。
本指南基於以下最新資源:
- Render 官方文檔 - Deploy Node Express App
- Render Blueprint YAML 規範
- DEV Community - TypeScript Express API 部署 (2025年10月)
- Medium - TypeScript Node.js API 部署 (2024年11月)
- Render 免費方案說明
- Render 環境變數設定
根據 Stack Overflow 和 DEV Community 的最新討論:
-
不要在 Build 時設定
NODE_ENV=production- ❌ 錯誤:會導致 TypeScript 不安裝,
tsc編譯失敗 - ✅ 正確:只在 Start 後設定為 production
- ❌ 錯誤:會導致 TypeScript 不安裝,
-
必須使用
0.0.0.0而非localhost- Render 需要綁定到
0.0.0.0 - 使用
process.env.PORT而非固定端口
- Render 需要綁定到
-
Build 和 Start 命令必須明確
- Build: 編譯 TypeScript (
npm run build) - Start: 執行編譯後的 JS (
node dist/server.js)
- Build: 編譯 TypeScript (
檢查 server/package.json 是否正確配置:
{
"name": "intergen-hsinchu-image-mcp-server",
"version": "0.1.0",
"type": "module",
"scripts": {
"dev": "tsx src/server.ts",
"build": "tsc", // ✅ 編譯 TypeScript
"start": "node dist/server.js" // ✅ 執行編譯後的檔案
},
"engines": {
"node": ">=20.0.0", // ⚠️ 重要!指定 Node.js 版本
"npm": ">=10.0.0"
}
}目前狀態:讓我檢查您的 package.json
✅ 您的 package.json 狀態:良好
- ✅
buildscript 存在:tsc -p tsconfig.json - ✅
startscript 存在:node dist/server.js - ✅ 已新增
engines欄位指定 Node.js 版本
根據 最新教學,必須綁定到 0.0.0.0:
當前配置:server/src/server.ts:210
const PORT = process.env.PORT || 3001;
app.listen(PORT, () => {
console.log(`[server] listening on http://localhost:${PORT}`);
});✅ 已使用 process.env.PORT - 符合 Render 要求
根據 Render Blueprint 規範,您的 render.yaml 需要修正:
當前問題:
buildCommand: cd server && npm install && npm run build
startCommand: cd server && node dist/server.jscd server 會有路徑問題
✅ 修正後的配置:
services:
- type: web
name: hsinchu-intergen-app
env: node
region: singapore
plan: free
# ⚠️ 重要:設定正確的根目錄
rootDir: ./server
# 建置命令:安裝依賴並編譯 TypeScript
buildCommand: npm install && npm run build
# 啟動命令:執行編譯後的 JS
startCommand: node dist/server.js
envVars:
- key: NODE_ENV
value: production
- key: PORT
value: 3001
- key: PEXELS_API_KEY
sync: false # ✅ 不在 YAML 中硬編碼,稍後在 Dashboard 設定
healthCheckPath: /api/images
autoDeploy: true
branch: main執行以下命令更新配置:
```bash cat > render.yaml << 'YAML_EOF' services:
- type: web
name: hsinchu-intergen-app
env: node
region: singapore
plan: free
rootDir: ./server
buildCommand: npm install && npm run build
startCommand: node dist/server.js
envVars:
- key: NODE_ENV value: production
- key: PORT value: 3001
- key: PEXELS_API_KEY sync: false healthCheckPath: /api/images autoDeploy: true branch: main YAML_EOF ```
```bash git add server/package.json render.yaml git commit -m "fix: 優化 Render 部署配置" git push origin main ```
-
連接 GitHub:
- 授權 Render 訪問您的 GitHub
- 選擇 repository:
32iterations/intergenerate-learning-AI-Matching-system
-
Render 自動讀取
render.yaml- 系統會顯示即將建立的資源
- 檢查配置是否正確
-
設定環境變數:
- Render 會提示輸入
PEXELS_API_KEY - 貼上:
3MIg8LdMhGoI049BwKKVmXHxp8alh7h6NSGHS8jALUqiNU4ImNLmdvTU
- Render 會提示輸入
-
點擊 "Apply"
- Render 開始建置和部署
- 預計 5-10 分鐘完成
如果 Blueprint 不work,可以手動設定:
訪問:https://dashboard.render.com/
點擊 New → Web Service
- 選擇
32iterations/intergenerate-learning-AI-Matching-system - 點擊 Connect
| 欄位 | 設定值 |
|---|---|
| Name | hsinchu-intergen-app |
| Region | Singapore (離台灣最近) |
| Branch | main |
| Root Directory | server |
| Runtime | Node |
| Build Command | npm install && npm run build |
| Start Command | node dist/server.js |
| Plan | Free |
點擊 Advanced → Add Environment Variable
新增以下變數:
| Key | Value |
|---|---|
NODE_ENV |
production |
PORT |
3001 |
PEXELS_API_KEY |
3MIg8LdMhGoI049BwKKVmXHxp8alh7h6NSGHS8jALUqiNU4ImNLmdvTU |
點擊 Create Web Service
Render 開始建置...
``` ==> Cloning from https://github.com/32iterations/intergenerate-learning-AI-Matching-system... ==> Checking out commit 89f1be7 in branch main ==> Using Node version 20.x.x (from package.json) ==> Running build command 'npm install && npm run build'... npm install added 234 packages in 15s
npm run build
> intergen-hsinchu-image-mcp-server@0.1.0 build
> tsc -p tsconfig.json
✓ TypeScript compilation successful
==> Build successful! 🎉 ==> Deploying... ==> Running start command 'node dist/server.js'... [server] listening on http://0.0.0.0:10000 ==> Service is live! 🚀 ```
常見錯誤和解決方案:
原因:TypeScript 未安裝
解決:
確認 typescript 在 devDependencies 中(✅ 您已有)
原因:依賴未正確安裝
解決:
檢查 package.json 中的 dependencies(✅ 您已有)
原因:端口衝突
解決:
確認使用 process.env.PORT(✅ 您已設定)
Render 部署成功後會顯示: ``` https://hsinchu-intergen-app.onrender.com ```
```bash curl https://hsinchu-intergen-app.onrender.com/api/images?q=taiwan | jq '.' ```
應返回: ```json { "images": [ { "id": 260566, "url": "https://images.pexels.com/photos/260566/...", "alt": "Taipei 101...", "photographer": "Pixabay", "source": "pexels" } ] } ```
``` https://hsinchu-intergen-app.onrender.com ```
應看到完整的網頁,包括:
- ✅ CSS 樣式正常
- ✅ 圖片可以顯示
- ✅ Puter.js 載入成功
訪問 Pitch Coach: ``` https://hsinchu-intergen-app.onrender.com#pitch-coach ```
測試生成簡報稿(需首次授權 Puter.js)
```bash ./scripts/deploy-check.sh https://hsinchu-intergen-app.onrender.com ```
根據 Render 官方文檔:
- 📊 15 分鐘無活動會休眠
- ⏱️ 首次訪問需要 30-60 秒喚醒
- 💰 750 小時/月免費時數(休眠不計時)
解決方案:
- 展示前 30 分鐘先訪問網站
- 使用 UptimeRobot 每 5 分鐘 ping 一次
- 📦 每個 workspace 只能有 1 個免費 PostgreSQL
- 💾 1 GB 儲存空間
- ⏰ 30 天後過期(我們不使用資料庫,無影響)
- 🌐 100 GB 月流量(足夠黑客松使用)
- 📤 無限入站流量
-
喚醒服務 ```bash
curl https://hsinchu-intergen-app.onrender.com
```
-
測試所有功能
- ✅ 主頁載入
- ✅ 圖片自動配圖
- ✅ Pitch Coach
- ✅ 管理儀表板
-
準備本地備案 ```bash
cd server && npm run dev ```
- URL 分享:提前寫在簡報上
- 網路測試:用手機測試是否可訪問
- 備案:如果 Render 慢,切換到本地 + Cloudflare Tunnel
只要推送到 GitHub,Render 就會自動重新部署:
```bash git add . git commit -m "feat: 新功能" git push origin main ```
Render 會自動:
- Clone 最新代碼
- 執行 build 命令
- 重新部署
在 Render Dashboard:
- 選擇您的 service
- 點擊 Manual Deploy → Deploy latest commit
在 Render Dashboard:
- 選擇您的 service
- 點擊 Logs
- 即時查看伺服器日誌
```javascript // server.ts 優化啟動時間 import { config } from 'dotenv'; config(); // 儘早載入環境變數
// 延遲載入非關鍵模組 const loadMCP = async () => { const { Server } = await import("@modelcontextprotocol/sdk/server/index.js"); // ... }; ```
如果需要快取: ```yaml
services:
- type: web
- type: redis name: redis plan: free ```
已在 render.yaml 設定:
```yaml
healthCheckPath: /api/images
```
Render 會定期檢查,確保服務正常。
症狀:Build failed
檢查清單:
-
rootDir設定為./server -
buildCommand正確:npm install && npm run build -
package.json有buildscript - TypeScript 在
devDependencies
症狀:網站無法訪問
檢查清單:
- 伺服器使用
process.env.PORT -
startCommand正確:node dist/server.js - 檢查 Render logs
症狀:PEXELS_API_KEY undefined
檢查清單:
- 在 Render Dashboard 設定環境變數
- 變數名稱拼寫正確
- 重新部署服務
部署成功後,確認:
- ✅ 網站可以訪問
- ✅ API 返回正確的 JSON
- ✅ 圖片可以載入(Pexels API 運作)
- ✅ Puter.js 腳本載入
- ✅ Pitch Coach 可以使用
- ✅ 管理儀表板可訪問
- ✅ 所有樣式正常顯示
- ✅ 手機可以訪問
- ✅ 複製並保存了 URL
- DEV - TypeScript Express API 部署
- Medium - TypeScript Node.js API 部署
- Stack Overflow - TypeScript Render 部署討論
QUICK_START.md- 5 分鐘快速啟動AUTO_DEPLOY.md- 一鍵部署教學DEPLOYMENT.md- 完整部署指南CLOUDFLARE_TUNNEL.md- Cloudflare Tunnel 使用
🎊 現在您可以信心滿滿地部署到 Render 了!
選擇方法 A (Blueprint) 或 方法 B (手動),5-10 分鐘內完成部署!
祝黑客松順利!🚀