開啟建立 Repository 頁面
操作
- 登入 GitHub,點右上角
+→New repository,或直接開github.com/new。
為什麼這樣做
- Repository 是整套部署的起點:Vercel 會監看它,程式一更新就自動重新部署。
給第一次部署的新手:從零開始,把一個有資料庫、能接 LINE 與 AI 的網站後台放上網路。每一步都有實際操作截圖,並說明為什麼這樣選。
跟著這份教學做完,你會有一個這樣運作的系統:程式碼放在 GitHub,每次更新會自動部署到 Vercel 變成網站;資料存在 Neon 資料庫;客人從 LINE 傳訊息或填表單,資料進到你的後台;AI 交給 Dify 處理,定時工作交給 n8n。
| 服務 | 白話說明 | 這份教學用它做什麼 |
|---|---|---|
| GitHub | 放程式碼的雲端倉庫,記錄每一次修改 | 存放程式碼;更新程式時自動通知 Vercel |
| Vercel | 把程式碼變成網站的主機 | 執行你的網站與 API,保管密碼類設定 |
| Neon | 雲端資料庫(Postgres) | 存訂單、客戶等所有資料 |
| Google Cloud | Google 的開發者後台 | 讓使用者用 Google 帳號登入你的網站 |
| LINE Developers | LINE 的開發者後台 | 收發 LINE 訊息、在 LINE 裡開表單(LIFF) |
| Dify | 不寫程式也能組 AI 流程的平台 | 讓 AI 讀懂客人訊息、整理成資料 |
| n8n | 自動化排程工具 | 每天固定時間觸發工作(例如寄提醒) |
[GitHub] ──程式更新──> [Vercel 你的網站與 API] ──讀寫資料──> [Neon 資料庫]
▲ ▲ ▲
LINE 訊息 / LIFF 表單 ┘ │ └ n8n 定時呼叫
Dify 呼叫 API,網站也呼叫 Dify截圖怎麼看:本教學以一個新的空專案 tutorial-demo 示範,它的網址是 tutorial-demo.vercel.app。跟著做時,把 tutorial-demo 換成你自己的專案名稱即可。
| 名詞 | 白話解釋 |
|---|---|
| Repository(repo) | GitHub 上的一個專案資料夾 |
| 部署(Deploy) | 把程式碼變成可以連上的網站 |
| 環境變數 | 不寫在程式碼裡的設定值,例如資料庫密碼。存在 Vercel,網站執行時讀取 |
| Token/API Key | 一串長長的亂碼,當作「鑰匙」。誰拿到就能用你的服務,要當密碼保管 |
| Production/Preview | 正式站/測試站。Preview 讓你在不影響客人的情況下先試新功能 |
| Webhook | 對方系統有事時,主動打你的網址通知你(例如 LINE 收到訊息就通知你的網站) |
| API | 讓其他程式存取你網站功能的入口網址 |
| MCP | 讓 AI 助理(如 Claude)能直接操作你系統的標準接口 |
| 區域(Region) | 伺服器實際放在哪個國家的機房,越近越快 |
需要準備的帳號(全部有免費方案):
github.comvercel.com,建議直接用 GitHub 帳號登入neon.techdevelopers.line.bizcloud.dify.ain8n.io 雲端版,或自己架設需要安裝在電腦上的軟體:
nodejs.org。執行和測試網站程式用。git-scm.com。把程式碼推上 GitHub 用。不想打指令的話,改裝 GitHub Desktop:desktop.github.com。code.visualstudio.com。三個一開始就要決定的事:
tutorial-demo),只用英文小寫、數字、連字號。之後看到任何平台上的名稱,就知道是哪個專案。AWS Asia Pacific 1 (Singapore),Vercel 叫 sin1)。台灣到新加坡一趟約 40~60 毫秒,到美國東岸約 200 毫秒,一個頁面查五次資料就差將近一秒。後面每一章都會產生或貼上一堆「鑰匙」,新手最常卡住的不是按鈕在哪,而是搞不清楚這把鑰匙是誰發的、給誰用、要貼到哪裡。這一章先把觀念講清楚,後面照做就不會亂。
| 種類 | 像什麼 | 可以公開嗎 | 例子 |
|---|---|---|---|
| ID | 身分證字號:告訴對方「我是誰」 | 可以,寫在網頁前端也沒關係 | Google 的 Client ID、LINE 的 Channel ID、LIFF ID |
| Secret(密鑰) | 印鑑:證明「真的是我」 | 絕對不行,只能放在伺服器(Vercel 環境變數) | Google 的 Client Secret、LINE 的 Channel secret、AUTH_SECRET |
| Token/API Key(通行證) | 門禁卡:拿著它就能進門做事 | 絕對不行 | Dify 的 API Key、LINE 的 Channel access token、你網站發給 Dify 的 Token |
API 就是一個「專門給程式用的網址」。人用瀏覽器看網頁,程式用 API 拿資料或叫網站做事。一次 API 呼叫長這樣:
POST https://tutorial-demo.vercel.app/api/v1/orders ← ① 方法 + 網址:要做什麼、找誰
Authorization: Bearer tk_demo_3f9a7c21... ← ② 鑰匙:證明你有權限
Content-Type: application/json ← ③ 資料格式
Idempotency-Key: run-20261024-001 ← ④ 防重複:同一個值只會執行一次
{ "name": "王小明", "phone": "0912345678", "date": "2026-11-01" } ← ⑤ 內容| 方法 | 意思 | 例子 |
|---|---|---|
GET | 讀取 | 查訂單 |
POST | 新增/執行 | 建立訂單、觸發排程 |
PATCH/PUT | 修改 | 改訂單狀態 |
DELETE | 刪除 | 刪訂單 |
Bearer 是什麼:Authorization: Bearer <Token> 是業界最常見的帶鑰匙方式。Bearer 是固定的英文字,意思是「持有者」,後面空一格接 Token。整串放在 Header(請求的信封上),不放在網址裡,因為網址會被記錄在各種日誌中。
對方回應的狀態碼,看懂它就能自己排錯:
| 狀態碼 | 意思 | 通常是哪裡錯 |
|---|---|---|
200/201 | 成功 | — |
400 | 你送的資料格式不對 | 少了必填欄位、日期格式錯 |
401 | 沒帶鑰匙或鑰匙錯 | Token 貼錯、多了空白、Bearer 寫兩次、Token 過期 |
403 | 鑰匙對,但權限不夠 | 這把 Token 沒有勾這項權限 |
404 | 找不到 | 網址打錯、路徑少一段 |
429 | 呼叫太頻繁 | 超過每分鐘上限,等一下再試 |
500/502/503 | 對方伺服器出錯 | 看 Vercel 的 Runtime Logs,或環境變數沒設 |
API 是「你去問對方」;Webhook 是「對方有事主動打給你」。LINE 收到客人訊息時,會主動把訊息送到你網站的某個網址,這個網址就叫 Webhook URL。
| API | Webhook | |
|---|---|---|
| 誰發起 | 你(或 Dify、n8n)主動呼叫 | 對方平台(LINE)主動呼叫你 |
| 怎麼證明身分 | 呼叫的人帶 Token | 對方附上簽章,你用 Secret 驗證 |
| 例子 | Dify 呼叫 /api/v1/orders 建單 | LINE 呼叫 /api/line/webhook 送訊息 |
簽章怎麼運作:LINE 和你的網站都知道同一個 Channel secret。LINE 送訊息時,用這個 Secret 對內容算出一段簽章附在 Header;你的網站收到後用同一個 Secret 再算一次,兩邊一樣才相信是 LINE 送的。所以 Channel secret 填錯,Webhook 一定驗證失敗。
MCP(Model Context Protocol)可以想成「AI 專用的插座」。你的網站提供一個 MCP 網址,裡面列出一組「工具」(例如查訂單、建訂單),每個工具附上說明。Claude、Dify 這類 AI 連上後,會自己讀說明、判斷什麼時候該用哪個工具。
| API | MCP | |
|---|---|---|
| 給誰用 | 工程師寫的程式 | AI 助理 |
| 怎麼知道有哪些功能 | 看說明文件(OpenAPI),手動設定 | 連上後自動取得工具清單與說明 |
| 誰決定呼叫哪個功能 | 程式碼寫死 | AI 依對話內容自己判斷 |
| 認證 | Bearer Token | 一樣用 Bearer Token(或 OAuth 登入) |
兩個角色:提供工具的一方叫 MCP 伺服器(你的網站 /api/mcp、Vercel、Neon、GitHub 官方都有);使用工具的一方叫 MCP 客戶端(Claude、Claude Code、Dify)。
把所有鑰匙串起來看。客人在 LINE 傳「11/1 早上 4 個人去機場」,系統裡發生的事:
LINE_CHANNEL_SECRETDIFY_API_KEYDATABASE_URLLINE_CHANNEL_ACCESS_TOKEN| 容易搞混 | 差別 | 記法 |
|---|---|---|
| Client ID vs Client Secret(Google) | ID 可公開,填 Config;Secret 是密碼,填 Secret | ID 是名字,Secret 是密碼 |
| Channel ID vs Channel secret vs Channel access token(LINE) | ID 是編號;secret 用來驗證 LINE 送來的訊息;access token 用來發送訊息給客人 | 收訊息用 secret,發訊息用 token |
| Channel ID vs LIFF ID(LINE) | Channel ID 是一串數字;LIFF ID 是「Channel ID-一段英數字」 | LIFF ID 比較長,有連字號 |
| Messaging API vs LINE Login(LINE) | 前者收發聊天訊息;後者讓客人在網頁登入(LIFF 放在這裡) | 聊天 vs 表單 |
| Pooled vs Direct 連線(Neon) | Pooled 主機名稱有 -pooler,網站平常用;Direct 沒有,建資料表用 | 網站用 pooled,migration 用 direct |
| Production vs Preview(Vercel) | 正式站 vs 測試站,環境變數各自獨立 | 設變數時要勾對環境 |
| Secret vs Config(Vercel 環境變數類型) | Secret 存了就看不到;Config 之後還看得到 | 會讓人做壞事的值選 Secret |
| Dify API Key vs 你網站的 Token | 前者是 Dify 發給你、讓你呼叫 Dify;後者是你網站發給 Dify、讓 Dify 呼叫你 | 誰發的就是誰的門禁卡 |
| Swagger 工具的 Bearer vs MCP 的標題(Dify) | Swagger 工具會自動加 Bearer ,值只貼 Token;MCP 標題不會,值要自己寫 Bearer xxx | 兩邊相反,最容易 401 |
| Webhook URL vs Endpoint URL(LINE) | Webhook 是 LINE 送訊息到你網站的網址;LIFF 的 Endpoint 是客人打開的網頁網址 | 一個給 LINE 打,一個給人看 |
| 工作流 vs 聊天流(Dify) | 一問一答 vs 多輪對話,呼叫網址不同 | 整理資料用工作流 |
| API vs MCP | API 給程式用;MCP 給 AI 用(背後還是呼叫 API) | MCP 是 API 的 AI 版插座 |
+ → New repository,或直接開 github.com/new。Owner 保持自己的帳號。Repository name 輸入 tutorial-demo,下方出現綠色 is available 代表名稱可用。Description 寫一句這個專案在做什麼。Choose visibility 右側的 Public,改選 Private。Settings → General → 最下方 Danger Zone → Change visibility 改成 Private,不影響部署。Add .gitignore 搜尋 Node,選 Node。Add README、Add .gitignore、Add license 全部保持預設的「不加」,建立一個空的 repo。Add license 一律保持 No license。.gitignore 是一份「不要上傳的檔案清單」。Node 範本會排除 node_modules/(套件,動輒數百 MB)和 .env(密碼檔)。rejected 錯誤,因為雲端和電腦上的版本對不起來。新手最常卡在這一步。Private、.gitignore 的選擇、No license,按 Create repository。Private;清單裡有 .gitignore 和 .env.example;清單裡沒有 .env 或 .env.local。Public,就是需要改成 Private 的情況(下面示範)。.env 出現在清單裡,代表密碼已經外流,要立刻把裡面每一組密碼到各平台作廢重發,光刪檔沒用。Settings(在 More 裡)→ 左側 General → 拉到最下方 Danger Zone。Change repository visibility → Change visibility → Change to private。方法一:GitHub Desktop(不用打指令)
File → Add local repository,選你的專案資料夾。出現「不是 Git repository」的提示時,按 create a repository。Summary 填「第一次上傳」,按 Commit to main。Publish repository,勾選 Keep this code private,按 Publish。方法二:終端機指令(在專案資料夾內執行,把 <帳號> 換成你的 GitHub 帳號)
git init
git add .
git commit -m "第一次上傳"
git branch -M main
git remote add origin https://github.com/<帳號>/tutorial-demo.git
git push -u origin main.gitignore 檔案就能看到內容。這是一個 Next.js 專案的範例。.env*(第 34 行):排除所有以 .env 開頭的檔案,包括 .env、.env.local、.env.production。.vercel(第 37 行):Vercel 工具在你電腦上產生的連結設定,不該上傳。!.env.example(第 45 行):開頭的 ! 代表「例外,這個要上傳」。.env* 一次排除全部,比一個一個列安全:日後多了新的 env 檔也會自動被擋下。但這樣也會擋掉 .env.example,所以要再加一行 ! 例外。再建立一個 .env.example,列出網站需要的所有設定名稱,但值留空。這個檔案要上傳到 GitHub。
# .env.example(範例,實際名稱依你的程式而定)
DATABASE_URL=
DATABASE_URL_UNPOOLED=
AUTH_SECRET=
AUTH_GOOGLE_ID=
AUTH_GOOGLE_SECRET=
APP_BASE_URL=
LINE_CHANNEL_SECRET=
LINE_CHANNEL_ACCESS_TOKEN=
DIFY_API_KEY=
CRON_SECRET=main 分支 = 正式網站。main 一有更新,Vercel 就更新正式網站。feature-booking)在上面改。推上 GitHub 後,Vercel 會自動產生一個測試網址(Preview)。main。Settings → 左側 Rules → Rulesets → New ruleset → New branch ruleset。Ruleset Name:protect-main。Enforcement status:預設是 Disabled,要改成 Active。main 的歷史紀錄蓋掉,正式網站也跟著壞掉。Target branches → Add target → Include default branch。main。選這個,日後就算把預設分支改名,規則也會自動跟著走。Require a pull request before merging,否則你自己也無法直接推到 main。Create。console.neon.tech,右上角黑色 ⊕ 是建立專案。Project name 輸入 tutorial-demo。Region 預設是 AWS US East 2 (Ohio),一定要改成 AWS Asia Pacific 1 (Singapore)。Postgres database 保持開啟。展開後 Database name 可改成專案名稱,Postgres version 用預設。Object storage、Functions、AI gateway、Realtime、Better Auth 全部保持關閉。Create project。Branches。新專案會有一個預設分支,範例專案把它命名為 production,另外建了 preview。preview 分支,測試時新增、刪除資料都不會碰到正式資料。Branches 頁右上 ⊕。Auto-delete(自動刪除)預設是 After 1 day。這是給臨時測試用的,我們要長期使用,必須改掉。Name 輸入 preview。Auto-delete 改選 Never。Parent branch 選正式分支。Create。Branch & anonymize data,個資會被自動遮蔽。Computes。SUSPENDED 代表目前休眠中。Computes 頁點 Connect。Branch 確認是正式分支,Database、Role 用預設。Connection pooling 開啟(主機名稱會出現 -pooler),按 Copy snippet。DATABASE_URL。Connection pooling 關閉,再複製一次,標註「正式 direct」,之後填到 DATABASE_URL_UNPOOLED。Branch 切到 preview,同樣各複製一組。Tables 會看到資料表清單。Settings → General → Branch protection → 對正式分支按 Protect this branch。Settings → API keys。現在用不到可以先跳過,「MCP」章會用到。Create new API key。Key scope 改選 Project-scoped,Project 選 tutorial-demo。Key name 寫用途,例如 claude-tutorial-demo。Create。Key 只顯示這一次,立刻存進密碼管理器。Org-wide 能管理你所有的 Neon 專案,包括刪除。外流了,所有專案都有危險。vercel.com/new。Import Git Repository 左側確認是你的 GitHub 帳號,找到 tutorial-demo 按 Import。Adjust GitHub App Permissions,到 GitHub 頁面選 Only select repositories,把 tutorial-demo 加進去。Settings → 左側 Applications → Installed GitHub Apps → Vercel 右側 Configure,拉到 Repository access。All repositories:Vercel 可以讀寫你所有 repo,包括未來新建的。上方 Permissions 寫明它有程式碼的讀寫權限。Select repositories,把要部署的 repo 一個一個加進來。Save。Vercel Team 選自己的(免費方案顯示 Hobby)。Project Name:預設是 repo 名稱;如果名稱已被別人使用,Vercel 會自動加一段亂碼字尾,請改成你要的名稱。Root Directory 保持 ./;Application Preset 確認自動偵測到你的框架(範例是 Next.js)。<名稱>.vercel.app。這個網址之後要填到 Google、LINE 好幾個地方,帶亂碼很容易抄錯。Build and Output Settings,確認三個欄位都是灰色預設文字,右側開關都不要打開。Environment Variables。可以一筆一筆填,也可以按 Import .env 上傳整份。DATABASE_URL(正式 pooled)、DATABASE_URL_UNPOOLED(正式 direct)、AUTH_SECRET(產生方式見「環境變數總表」章)。Create Project / Deploy,等一兩分鐘。Settings → Environment Variables。T 是一般設定(看得到值);鎖頭是機密(存了就看不到);<> 是 Vercel 整合服務自動建的。Add Environment Variable。Key:名稱必須和程式碼裡讀取的一字不差,包含大小寫(例如 LINE_CHANNEL_SECRET)。Value:貼上值。注意前後不能有空白或換行。Note:寫這個值在哪個平台、哪一頁產生的,例如 LINE Developers > Messaging API > Basic settings。Environments 點開 → Environments。Save。然後到 Deployments 頁,對最新一筆按 ⋯ → Redeploy。Settings → Functions → Function Region。iad1,但標題旁邊有黃色 Overridden,表示實際值被其他設定蓋掉了,下兩步說明。Overridden 上,點 View Override。vercel.json 設定檔,優先權高於這個頁面。頁面上改了卻沒效果,多半是被這個檔案蓋掉。vercel.json,內容如下,推上 GitHub:{
"$schema": "https://openapi.vercel.sh/vercel.json",
"regions": ["sin1"]
}vercel.json 的話:展開 Asia Pacific,勾 Singapore (Southeast) - sin1,按 Save,再重新部署。Storage 頁。Public:網址外流任何人都能下載。存客人資料要用 Private,下面示範。Create Storage → 選 Blob → Continue。Region 預設是美國 iad1,畫面上寫明建立後不能改。Store Name:tutorial-demo-files。Region:Singapore (Southeast) – sin1。Access:Private。Add a read-write token env var to this connection。Create。BLOB_READ_WRITE_TOKEN 環境變數,不用自己複製。Settings → Git,確認連到正確的 repo,Pull Request Comments 與 Commit Status 保持開啟。Settings → Environments。main 分支;其他分支都是 Preview;Development 是你自己電腦上的開發環境。Settings → Domains。預設已經有 tutorial-demo.vercel.app。APP_BASE_URL、Google 登入的網址、LINE 的 Webhook 和 LIFF 網址。Add Existing → 輸入 preview.你的網域。Connect to an environment 下拉改為 Preview,再選要對應的分支。Add Domain,照畫面指示到網域商新增 DNS 紀錄。Settings → Cron Jobs。這裡是 Vercel 內建排程,在 vercel.json 設定。Deployments 頁,每一次部署都會留一筆紀錄。Build Logs,錯誤通常在最後幾行。⋯ → Promote to Production,幾秒內就退回舊版。npm i -g vercel
vercel login
vercel link # 在專案資料夾內執行,選擇對應的 Vercel 專案
vercel env pull .env.local這一章會拿到兩個值:AUTH_GOOGLE_ID 與 AUTH_GOOGLE_SECRET。你的網站程式需要有「使用 Google 登入」功能,現成的工具有 Auth.js、Better Auth 等。
redirect_uri_mismatch,就是下面的「重新導向 URI」沒填對。console.cloud.google.com。第一次使用時,左上角點專案選擇器 → 新增專案 → 名稱填 tutorial-demo → 建立。tutorial-demo。API 和服務 → 憑證。Google Auth Platform → 品牌塑造(或第一次會提示 開始)。應用程式名稱:填使用者認得的名字,例如公司名稱。使用者支援電子郵件:選你的信箱。目標對象:選 外部。聯絡資訊:填你的信箱 → 同意條款 → 建立。憑證 頁,點 + 建立憑證,選 OAuth 用戶端 ID。API 金鑰 只能代表你的專案,不能讓使用者登入。服務帳戶 是給程式和程式之間用的,也不是給人登入。應用程式類型 選 網頁應用程式。名稱:tutorial-demo Vercel(只有你看得到)。已授權的 JavaScript 來源 → + 新增 URI → https://tutorial-demo.vercel.app(只到網域,結尾不加斜線)。已授權的重新導向 URI → + 新增 URI → https://tutorial-demo.vercel.app/api/auth/callback/google。Use this client for an AI-powered agent 不勾。建立。彈出視窗會顯示「用戶端 ID」和「用戶端密鑰」。AUTH_GOOGLE_ID(Config);用戶端密鑰 → AUTH_GOOGLE_SECRET(Secret)。存好後重新部署。https、網域、路徑都要對,結尾不能多斜線。/api/auth/callback/google 是 Auth.js 的預設寫法。用其他登入工具時,請查該工具文件寫的回呼路徑。憑證 頁點用戶端名稱就能修改,改完按 儲存。Google Auth Platform → 目標對象。測試使用者 → + Add users,加入每一位要登入後台的人的 Gmail。API 和服務 → 程式庫,搜尋 Google Calendar API → 啟用。LINE 這邊要準備兩個東西(LINE 稱為 Channel),而且必須放在同一個 Provider(可以想成「品牌資料夾」)底下:
| Channel | 用途 | 會拿到的值 |
|---|---|---|
| Messaging API | 收客人的 LINE 訊息、主動推播通知 | LINE_CHANNEL_SECRET、LINE_CHANNEL_ACCESS_TOKEN |
| LINE Login | 在 LINE 裡開啟你的網頁表單(LIFF),並自動帶入客人身分 | LIFF ID、Channel ID |
developers.line.biz/console。Create,名稱填你的品牌名稱。已經有了就點進去。Create a new channel → Messaging API。Create a LINE Official Account 先建一個。manager.line.biz,點進你的官方帳號。設定 → 左側 Messaging API。狀態顯示 未使用。啟用。同意。developers.line.biz,你的 Provider 裡會多一個 Messaging API Channel,點進去。Basic settings 分頁 → Channel secret → 複製 → Vercel 的 LINE_CHANNEL_SECRET(Secret,只勾 Production)。Messaging API 分頁 → 拉到最下面 Channel access token (long-lived) → Issue → 複製 → LINE_CHANNEL_ACCESS_TOKEN(Secret,只勾 Production)。Messaging API 分頁 → Webhook settings → Webhook URL 填你網站接收 LINE 訊息的網址(例如 https://tutorial-demo.vercel.app/api/line/webhook,以你的程式為準)→ Update。Use webhook,按 Verify,出現 Success 才算接通。設定 → 回應設定,把 自動回應訊息 關掉。Basic settings 最下面的 Your user ID 是你自己的 LINE ID,想讓網站推播通知給你時會用到。Create a new channel → LINE Login,App types 勾 Web app。Basic settings 的 Channel ID 記下來。LIFF 分頁。範例已經有一個表單。NEXT_PUBLIC_LIFF_ID)或你網站的設定頁。LIFF URL(https://liff.line.me/...)是要放進 LINE 圖文選單或訊息按鈕的網址。客人點了,會在 LINE 裡打開你設定的網頁。Endpoint URL 是 LIFF 實際打開的網頁。網站搬家或改網址後,按 Edit 更新。Scopes 按 Edit,確認有勾 openid。openid,LIFF 就拿不到身分證明(ID Token),你的網站只能相信網頁自己回報的客人 ID,有心人可以冒充別人下單。LIFF 分頁按 Add。LIFF app name:例如 預約表單。Size:Full。Endpoint URL:你網站表單頁的完整網址(要先做好這個頁面)。Scopes:勾 openid、profile。chat_message.write 只有在「表單送出後要以客人身分在聊天室留一句話」時才勾。Add friend option:On (Normal)。Scan QR、Module mode 保持關閉。按 Add。openid 讓網站能驗證客人身分;profile 拿到名字和大頭貼,你在後台才認得出是誰。chat_message.write 打開後視窗不能縮小,沒需要就別勾。Basic settings 最下方 → Linked LINE Official Account → Edit → 選你的官方帳號。–(未連結),這時上一步的加好友提示不會出現。要先完成「啟用 Messaging API 並選同一個 Provider」,這裡的下拉選單才選得到官方帳號。Dify 和你的網站之間是雙向的,兩個方向各用一把不同的鑰匙:
| 方向 | 例子 | 鑰匙 | 存在哪裡 |
|---|---|---|---|
| 網站 → Dify | 網站把客人的 LINE 訊息送給 AI 整理 | Dify 應用的 API Key | Vercel 環境變數(例如 DIFY_API_KEY) |
| Dify → 網站 | AI 整理完,呼叫網站建立訂單 | 你的網站發給 Dify 的 Token | Dify 的工具設定裡 |
cloud.dify.ai → 工作室 → 建立 → 建立空白應用。匯入 DSL 檔案 可以載入別人做好的流程。新手建議先從空白開始,才看得懂每一個步驟在做什麼。選擇 App Type 選 工作流(預設是聊天流,要記得改)。/workflows/run。/chat-messages。應用名稱:寫清楚用途,例如 LINE 訊息整理。描述:寫輸入什麼、輸出什麼,例如「輸入 text;輸出日期、人數、上下車地點」。建立,接著在畫布上設計流程。存取點。後端服務 API 確認為 服務中,API Endpoint 是 https://api.dify.ai/v1。Web 應用程式:不打算讓別人直接使用這個 AI 頁面,就把開關關掉。API Endpoint 就是你網站要呼叫的 Dify 網址。用 Dify 雲端版都是這個;自己架設 Dify 才會不同。Web 應用程式 開著的話,任何人拿到網址都能直接用,消耗你的額度。MCP 伺服器 是把這個 AI 流程提供給 Claude 等 AI 助理使用,跟本章無關,保持停用。API 金鑰 → + 建立金鑰 → 複製。DIFY_KEY_LINE_PARSE、DIFY_KEY_FAQ。反方向(Dify 呼叫你的網站)需要你的網站自己發 Token。網站的管理頁應該要有一個「建立 Token」的表單,至少包含這些欄位:
| 欄位 | 用途 | 給 Dify 的建議值 |
|---|---|---|
| 名稱 | 看得出這把 Token 給誰用 | Dify |
| 權限範圍(scope) | 限制這把 Token 能做哪些事 | 只勾讀取訂單、建立訂單、產生報價草稿 |
| 有效天數 | 到期自動失效 | 90 天 |
| 每分鐘上限 | 防止被大量呼叫 | 60 次 |
| IP 白名單 | 只允許特定來源 | Dify 雲端版的 IP 不固定,留空 |
| 撤銷 | 出事時立刻停用 | 清單上每一把都要有停用按鈕 |
集成 → 工具 → Swagger API 作為工具 → 建立 Swagger API 作為工具。名稱:tutorial_demo(英文小寫、底線)。https://tutorial-demo.vercel.app/api/v1/openapi.json):按 + 從 URL 中匯入 貼上。Schema 欄位(畫面中是精簡範例)。可用工具 會列出解析到的功能,右側 測試 可以先試。鑑權方法 右側齒輪 → 鑑權型別 選 標題。鑑權頭部字首 預設是 Basic。大多數網站 API 用的是 Bearer,保留 Basic 會一直得到 401(未授權)錯誤。鑑權頭部字首 改選 Bearer。鍵 保持 Authorization。值 貼上你網站發給 Dify 的 Token(畫面中是示範值)。只貼 Token 本身,前面不要自己加 Bearer。儲存,再按工具表單的 儲存。Bearer 。值裡再寫一次就會變成 Bearer Bearer xxx,一樣得到 401。集成 → 工具 → MCP → 新增 MCP 伺服器 (HTTP)。身份驗證 分頁預設是 OAuth(動態客戶端註冊)。用固定 Token 的網站要把它關掉,改在 標題 分頁設定。伺服器 URL:你網站的 MCP 網址,例如 https://tutorial-demo.vercel.app/api/mcp。名稱與圖示:例如 我的後台。圖示會自動抓網站的 favicon。伺服器識別碼:tutorial-demo(建立後不能改)。使用動態客戶端註冊 關閉,下方兩欄留空。標題 分頁 → + 新增標題。標題名稱:Authorization。標題值:Bearer 加上 Token(這裡要自己寫 Bearer 和一個空格;畫面中是示範值)。新增並授權。Bearer;上面 Swagger 工具則會自動加。兩邊的寫法剛好相反。只有一個流程要用時,可以在工作流畫布上加一個 HTTP 請求 節點:
POST,網址填你網站的 API,例如 https://tutorial-demo.vercel.app/api/v1/orders。鑑權 → API-Key → 類型 Bearer → 貼 Token。Headers 加一筆 Idempotency-Key,值填 {{sys.workflow_run_id}}(你的網站要支援這個功能)。Body 選 JSON,欄位引用前面 AI 節點整理出來的變數。n8n 負責「時間」相關的工作,例如每天早上寄簡報、每 15 分鐘檢查有沒有逾期未處理的訂單。做法是:n8n 在指定時間,呼叫你網站上的一個網址。
你的網站要提供:一個專門給排程呼叫的網址(例如 POST /api/cron/daily-briefing),而且要檢查請求裡有沒有帶正確的密碼,否則任何人都能觸發。
CRON_SECRET(Secret),重新部署。Credentials → Add credential → 搜尋 Header Auth:Name 填 Authorization,Value 填 Bearer 加上剛才的密碼 → 儲存。Schedule Trigger 節點,設定執行時間(例如每天 07:30)。HTTP Request 節點:Method 選 POST,URL 填你網站的排程網址,Authentication 選 Generic Credential Type → Header Auth → 選剛建的 Credential。⋯ → Settings → Timezone 改為 Asia/Taipei。Test workflow 試一次,網站回應成功後,打開右上角 Active。進階:延時執行(例如報價 72 小時後沒回覆就自動提醒):網站在建立報價時通知 n8n 的 Webhook 節點 → n8n 用 Wait 節點等到指定時間 → 再呼叫網站的回呼網址。回呼時要帶網站事先產生的簽章,網站確認簽章無誤才執行,避免被別人亂觸發。
MCP 讓 Claude 這類 AI 助理可以直接操作其他系統。分成兩種用途:
| 用途 | 連到哪裡 | 可以做什麼 | 怎麼登入 |
|---|---|---|---|
| 管理部署 | Vercel、Neon、GitHub 官方提供的 MCP | 請 AI 查部署錯誤、看資料表、改程式 | OAuth 登入(推薦) |
| 操作業務資料 | 你自己網站提供的 MCP(例如 /api/mcp) | 請 AI 查訂單、建立訂單 | 你網站發的 Token |
在 claude.ai 加入:左下角頭像 → 設定 → 連接器 → 新增自訂連接器,貼上網址。官方 MCP 會跳出登入畫面,登入同意即可。
在 Claude Code 加入(終端機執行):
claude mcp add --transport http vercel https://mcp.vercel.com
claude mcp add --transport http neon https://mcp.neon.tech/mcp
claude mcp add --transport http github https://api.githubcopilot.com/mcp/
# 你自己網站的 MCP(Token 換成你網站發給 Claude 的那一把)
claude mcp add --transport http tutorial-demo https://tutorial-demo.vercel.app/api/mcp \
--header "Authorization: Bearer <你的 Token>"加完後在 Claude Code 輸入 /mcp,看到狀態為已連線即可。
Claude,權限依你要它做的事勾選。一、先用 curl 確認 API 和 Token 正常(Mac 用「終端機」、Windows 用 PowerShell,Windows 請把 curl 寫成 curl.exe):
curl -i https://tutorial-demo.vercel.app/api/v1/orders \
-H "Authorization: Bearer <你的 Token>"HTTP/2 200:Token 正確,API 正常。401:Token 錯了或過期;403:Token 對,但沒有讀取訂單的權限。-i 的意思是把狀態碼一起印出來,排錯時一定要加。二、用 MCP Inspector 看你的 MCP 有哪些工具(官方的測試工具,需要 Node.js):
npx @modelcontextprotocol/inspectorTransport Type 選 Streamable HTTP,URL 填 https://tutorial-demo.vercel.app/api/mcp。Authorization,值為 Bearer <你的 Token>,按 Connect。Tools 分頁,按 List Tools,看到工具清單就代表 MCP 正常。可以點一個唯讀工具(例如查訂單)實際執行一次。下表是這套架構常見的環境變數。實際名稱以你的程式為準,大小寫必須完全一致。
| 變數 | 從哪裡拿 | 套用環境 | 類型 |
|---|---|---|---|
DATABASE_URL | Neon Connect(Pooling 開) | Production、Preview 各一組 | Secret |
DATABASE_URL_UNPOOLED | Neon Connect(Pooling 關) | Production、Preview 各一組 | Secret |
AUTH_SECRET | 自己產生 | Production、Preview 用不同值 | Secret |
AUTH_GOOGLE_ID | Google Cloud 憑證 | Production(Preview 要有固定網址才加) | Config |
AUTH_GOOGLE_SECRET | Google Cloud 憑證 | 同上 | Secret |
APP_BASE_URL | 你的正式網址 | Production | Config |
BLOB_READ_WRITE_TOKEN | Vercel Blob 自動建立 | 全部 | Secret |
LINE_CHANNEL_SECRET | LINE Messaging API › Basic settings | Production | Secret |
LINE_CHANNEL_ACCESS_TOKEN | LINE Messaging API › Long-lived token | Production | Secret |
NEXT_PUBLIC_LIFF_ID | LINE Login › LIFF | Production | Config |
DIFY_API_KEY(每個應用一個) | Dify › 存取點 › API 金鑰 | Production | Secret |
CRON_SECRET | 自己產生 | Production、Preview | Secret |
誰拿著哪一把鑰匙:
| 誰呼叫誰 | 用哪一把 | 存在哪裡 |
|---|---|---|
| 網站 → Neon | 連線字串 | Vercel DATABASE_URL |
| 網站 → Dify | Dify API Key | Vercel 環境變數 |
| Dify → 網站 | 網站發的 Token | Dify 工具設定 |
| LINE → 網站 | (網站用 Channel secret 檢查) | Vercel LINE_CHANNEL_SECRET |
| 網站 → LINE | Channel access token | Vercel LINE_CHANNEL_ACCESS_TOKEN |
| n8n → 網站 | CRON_SECRET | n8n Credential |
| Claude → 網站 | 網站發的 Token | Claude 連接器設定 |
| Claude → Vercel/Neon/GitHub | OAuth 登入 | 不用手動貼 |
怎麼產生一組安全的亂碼密碼(AUTH_SECRET、CRON_SECRET 這類「自己產生」的值):
Mac、Linux、Windows 都可用(需先安裝 Node.js):
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"Mac、Linux 也可以用:
openssl rand -hex 32https://tutorial-demo.vercel.app,網站正常顯示。Verify 顯示 Success;用自己的手機傳一句話給官方帳號,網站有收到。測試:Token 正確時成功;故意改錯一個字,會得到 401。/mcp,看到你的網站已連線。| 看到的狀況 | 最可能的原因 | 怎麼處理 |
|---|---|---|
| 改了環境變數,網站沒反應 | 沒有重新部署 | Deployments → 最新一筆 ⋯ → Redeploy |
Google 登入出現 redirect_uri_mismatch | 重新導向 URI 和實際網址不一樣(多了斜線、http/https、網域不同) | 回 Google Cloud 憑證頁逐字核對;改完等幾分鐘 |
| Google 登入出現「存取遭封鎖」 | 帳號不在測試使用者名單 | Google Auth Platform → 目標對象 → 加入該帳號 |
| 測試站(Preview)無法 Google 登入 | 測試站網址沒登記 | 給測試站綁固定網址並登記(Vercel、Google 兩章) |
| 測試站突然全部連不上資料庫 | Neon preview 分支被自動刪除 | 重建分支並設 Auto-delete: Never,更新 Vercel 的 Preview 連線字串 |
| 早上第一次開網站特別慢 | Neon 資料庫休眠中 | 正常現象,第二次就快了 |
| 網站整體很慢 | 網站、資料庫不在同一區 | Vercel 函式與 Neon 都改到新加坡 |
| 建立資料表時出現怪錯誤 | migration 用了 pooled 連線 | migration 改用 DATABASE_URL_UNPOOLED |
第一次 git push 被拒絕(rejected) | GitHub 上建 repo 時多加了 README 或 .gitignore | 建一個全空的 repo 重推,或先 git pull --rebase origin main 再推 |
| LINE Webhook Verify 失敗 | 金鑰沒設好、沒重新部署,或值多了換行 | 重貼 LINE_CHANNEL_SECRET、重新部署,再按 Verify |
| 客人訊息同時收到兩則回覆 | 官方帳號的自動回應沒關 | 官方帳號後台 設定 → 回應設定 → 關閉自動回應 |
| LIFF 拿不到客人身分 | Scopes 沒勾 openid | LIFF 設定 → Scopes → 加勾 openid |
| Dify 呼叫網站一直 401 | 鑑權選了 Basic,或值裡多寫了 Bearer | Swagger 工具改 Bearer、值只貼 Token;MCP 標題值要自己加 Bearer |
| Dify 建了重複的訂單 | 節點重試時沒有防重複機制 | HTTP 請求加 Idempotency-Key |
| n8n 排程時間差 8 小時 | 工作流時區是 UTC | 工作流 Settings → Timezone → Asia/Taipei |
| Vercel 頁面上改了區域沒效果 | 被 vercel.json 覆寫 | 改 vercel.json 裡的 regions |