MJ EXPLORE ACADEMY

網頁部署教學

從零開始,把做好的網頁放上網 — 給完全沒碰過 Cloudflare 的你
學無止拓 ・ 行致卓越

我該看哪一份?

部署,就是「把電腦裡做好的網頁,搬到網路上讓大家看得到」。這裡整理了三種做法,九成的需求第一種就夠。

Pages 靜態網頁

難度 ★ ・ 最常用

像把海報貼到公佈欄。網頁做好是幾個檔案,丟上去大家就看得到,沒有資料庫。

實例:課前互動網頁、行前指南、課堂筆記、直播公告頁

Worker + D1

難度 ★★★ ・ 有資料庫

像開一間有店員和帳本的小店。Worker 是店員(回應訪客動作),D1 是帳本(存下報名資料)。

實例:超級業務力直播報名系統

Pages + Access 門禁

難度 ★★ ・ 白名單限定

公佈欄外面加一道刷卡門。進門前要用 Email 收驗證碼,白名單裡的人才進得來。

實例:MJ 行程管理網頁

對照表

你要做的事看這份難度
第一次接觸,什麼都還沒裝
把做好的網頁放上網,拿一個網址分享
做有後端、有資料庫的系統(例如報名表單)★★★
網頁只想給特定的人看(Email 白名單)★★

開始前的三句話

1. 一律先看「00 前置準備」,帳號、工具、鑰匙(Token)的正確用法都在裡面。
2. 資安鐵律:Token 不進 git、不貼進任何會存檔的地方、用完就刪。寧可重發一千次,也不能在 git 上裸奔一秒。
3. 卡住不要硬試。把畫面上的錯誤訊息完整複製下來問人(或問 AI),比亂按快十倍。

00 ・ 前置準備

三種部署都要先做這份。目標:帳號跟工具一次到位,之後不用再回頭補東西。全程免費,不需要信用卡。

一、先搞懂四個名詞

名詞它是什麼比喻
Cloudflare提供「把網頁放上網」服務的公司,個人使用免費免費的雲端房東
Pages放靜態網頁的服務,網址長這樣:xxx.pages.dev公佈欄
Worker會跑程式的小伺服器,網址長這樣:xxx.workers.dev24 小時待命的店員
wrangler在終端機裡跟 Cloudflare 溝通的指令工具對講機
終端機是什麼?Mac 上叫「Terminal」,按 Cmd + 空白鍵打 terminal 就能開。它是一個打字下指令的視窗,接下來所有指令都在這裡貼上、按 Enter 執行。

二、註冊 Cloudflare 帳號(5 分鐘)

1

註冊

打開 dash.cloudflare.com/sign-up,用工作用的 Email 註冊、設密碼。

2

認證

收認證信、點連結完成。登入後看到的畫面叫 Dashboard(後台),之後會常回來。

建議順手開兩步驟驗證:右上角頭像 → My Profile → Authentication。帳號被盜 = 你所有網站被盜。

三、安裝 Node.js(10 分鐘)

wrangler 需要 Node.js 才能跑。先檢查是否已安裝:

node -v

有出現版本號(例如 v20.x.x,18 以上都可以)就跳過這節。出現 command not found → 去 nodejs.org 下載 LTS 版,一路下一步裝完,關掉終端機重開再檢查一次。

wrangler 本身不用另外安裝:之後指令都用 npx wrangler ... 開頭,npx 會自動幫你抓最新版。

四、讓 wrangler 有權限操作你的帳號(關鍵步驟)

wrangler 要「代表你」去 Cloudflare 上傳檔案,所以要給它一把鑰匙。有兩條路:

A

路線 A|瀏覽器授權(最簡單,先試這個)

npx wrangler login

會自動打開瀏覽器,按 Allow 授權即可。

已知地雷:有些電腦會卡在 Authorizing… 轉圈圈。卡住就放棄這條路,改走路線 B,不用糾結。
B

路線 B|API Token(卡關時用,也是最可控的做法)

Token 就是一把「限定用途的鑰匙」:

1. Dashboard 右上角頭像 → My ProfileAPI TokensCreate Token
2. 選範本 Edit Cloudflare Workers(Pages 和 Worker 部署都夠用)
3. 名稱寫用途 + 日期(例如 deploy-mjlive-20260804)、帳號只選自己的、有效期限設短一點
4. 按 Create → 畫面顯示一長串 Token,只會顯示這一次,先複製起來
5. 回終端機執行(把「貼上你的token」換掉):

export CLOUDFLARE_API_TOKEN=貼上你的token

這行只對「目前這個終端機視窗」有效,關掉視窗鑰匙就自動失效 — 這是優點,不是缺點。

Token 五不一定

五、驗證一切就緒

npx wrangler whoami

有列出你的 Email 和帳號名稱 → 前置準備完成。出現錯誤 → 回第四步重做(九成是 Token 沒 export 成功或已過期)。

六、每個專案開工前的資安檢查(30 秒)

有任何一項不確定 → 先停下來確認,再部署。公開 = 全世界看得到,撤不回。

01 ・ Pages 靜態網頁部署

適用:任何「一包 HTML / CSS / JS 檔案」的網頁。成果:拿到 https://你的專案名.pages.dev,全世界都能開。第一次約 15 分鐘,之後更新只要 1 分鐘。

準備資料夾 資安檢查 取專案名 上鑰匙 一行指令部署 驗證 刪 Token
1

準備網頁資料夾

把要上線的檔案集中在一個資料夾,首頁檔名必須是 index.html

my-event-page/ ├── index.html ← 首頁(檔名固定) ├── style.css ├── app.js └── images/logo.png

檢查方式:直接雙擊 index.html 用瀏覽器開,本機看起來是對的,上線後就會是對的。

注意:部署指令指到哪個資料夾,裡面所有東西都會被上傳。原始資料(學員名單 Excel、含個資的 CSV、草稿)一律放外面。
2

資安檢查(30 秒,不可跳過)

3

幫專案取名字

專案名會直接變成網址:取 mj-super-218,網址就是 https://mj-super-218.pages.dev。

規則:只能用小寫英文、數字、連字號 -(不能有中文、空格、底線)。建議格式「品牌或課程-識別」,例如 tuo-0829-yewuli。名字全 Cloudflare 不能重複,被用走就換一個。

4

上鑰匙

照「00 前置準備」的路線 A 或 B。用 Token 路線的話:

export CLOUDFLARE_API_TOKEN=貼上你的token
5

部署(就一行)

npx wrangler pages deploy my-event-page --project-name=my-event-page --commit-dirty=true

把兩個 my-event-page 換成你的資料夾名專案名(兩者可以不同)。第一次跑會問 Create a new project? → 按 Enter 選 Yes。

成功的樣子:最後印出 ✨ Deployment complete! 和一串網址。

小提醒:它顯示的是帶亂碼前綴的「本次版本網址」。分享給別人請用乾淨的主網址:https://專案名.pages.dev(把前面那段亂碼拿掉就是)。
6

驗證(別跳過,用無痕視窗)

無痕視窗(Cmd + Shift + N)輸入網址,檢查:首頁有出來、圖片有顯示、按鈕點得動。手機也開一次 — 大部分使用者是用手機看的。

7

刪 Token

回 Dashboard → My Profile → API Tokens → 把剛剛那把刪掉。每次都刪,養成習慣。

之後要更新內容怎麼辦?

改好本機檔案後,重跑步驟 4 + 5 同一行指令即可,網址不變、內容更新。不會建出第二個專案,放心跑。

更新後看到的還是舊版?那是瀏覽器快取。按 Cmd + Shift + R 強制重新整理,或換無痕視窗看。手機:關掉分頁重開。

常見錯誤對照表

錯誤訊息/狀況原因解法
Authentication error / 10000Token 沒設好或過期重新 export,或重發一把 Token
project name already exists專案名被全球其他人用走換個名字
ENOENT / 找不到資料夾終端機目前位置不對先 pwd 看自己在哪、cd 到正確位置
網址打開是 404資料夾裡沒有 index.html,或指錯資料夾確認首頁檔名、重新部署
上線後圖片破圖檔名大小寫不符(本機不分、雲端分)檔名和 HTML 引用的大小寫要完全一致
更新了但畫面沒變瀏覽器快取Cmd + Shift + R 或無痕視窗

02 ・ Worker + D1 部署

適用:報名系統、投票、留言板 — 任何「要把使用者填的資料存起來」的網站。建議先做過一次 01 熟悉手感。第一次約 1 小時。

先搞懂架構(白話版)

訪客瀏覽器 │ ▼ Worker(店員)──── 送出網頁畫面(public/ 裡的 HTML) │ 接收報名、檢查資料 ▼ D1(帳本)───────── 把報名紀錄存進資料庫

一個專案長這樣:

my-signup/ ├── wrangler.jsonc ← 專案設定檔(名字、綁哪個資料庫) ├── src/index.js ← 店員的工作手冊(後端程式) ├── public/index.html ← 給訪客看的報名頁面 ├── schema/schema.sql ← 帳本的格式(資料表長怎樣) └── .dev.vars ← 本機測試用的密碼(絕不進 git!)
1

寫設定檔 wrangler.jsonc

{
  // ⚠️ 這個檔會進 git,絕不可寫入任何 token / 密碼
  "name": "my-signup",
  "main": "src/index.js",
  "compatibility_date": "2025-01-01",
  "assets": { "directory": "./public", "binding": "ASSETS" },
  "d1_databases": [{
    "binding": "DB",
    "database_name": "my_signup_db",
    "database_id": "先留空,步驟 3 會拿到"
  }]
}

第一行註解不是裝飾 — 真的不要把任何密碼寫進這個檔。

2

先在本機測試(不用碰雲端)

cd my-signup
npx wrangler dev --local

會在 http://localhost:8787 跑起完整的本機版,連資料庫都是本機假帳本,隨便測、隨便填,跟雲端完全無關。

鐵則:開發測試一律走本機 --local,測好才部署。本機資料庫和雲端資料庫是兩本分開的帳本。

後台需要密碼的話,在專案夾建一個 .dev.vars 檔(本機測試專用),並確認 .gitignore 有 .dev.vars 這行:

ADMIN_KEY=本機測試用的隨便密碼
3

建立正式的 D1 資料庫(一次性)

先上鑰匙(Token 權限要包含 D1 Edit),然後:

npx wrangler d1 create my_signup_db

成功會回一串 database_id,把它複製、貼回 wrangler.jsonc。接著把帳本格式建到雲端(--remote 表示操作正式資料庫):

npx wrangler d1 execute my_signup_db --remote --file=schema/schema.sql
4

設定正式站的密碼(Secret)

機密不寫在任何檔案裡,用 secret 存到 Cloudflare 後台:

npx wrangler secret put ADMIN_KEY

它會請你輸入密碼(畫面不顯示字,正常)。這個密碼只存在 Cloudflare 那端,程式裡用 env.ADMIN_KEY 讀取。

想確認有設成功:npx wrangler secret list --name my-signup(要加 --name 指定 Worker,不加會查不到)。
5

部署

cd my-signup   # 一定要先進到專案資料夾!
npx wrangler deploy

成功會印出正式網址:https://my-signup.你的帳號.workers.dev

6

驗證

無痕視窗開正式網址 → 實際填一筆測試報名(名字標明「測試」)→ 開後台用步驟 4 的密碼登入 → 看得到那筆資料 → 手機也開一次。

7

刪 Token

跟 01 一樣,每次都刪。

上線後的維運鐵則(有真人資料後必讀)

deploy 只更新程式碼,不會動到資料庫 — 改頁面、改功能可以安心重新部署,報名資料不會消失。
絕不可整批清空資料(DELETE 不加條件)。要清測試資料,只能用 Email 精準鎖定:DELETE FROM registrations WHERE email='你的測試email';
動正式資料庫(--remote)前先想三秒:這行指令萬一寫錯,資料回得來嗎?不確定就先在 --local 試跑一次。
Worker 改名 = 砍掉重建:網址會變、secret 會消失要重設。名字第一次就取好,之後不要改。

常見錯誤對照表

錯誤訊息/狀況原因解法
Missing entry-point / ENOENT沒 cd 進專案資料夾就跑 wrangler先 cd 進去再跑(最常見的雷)
Authentication errorToken 沒設或權限不含 D1重發 Token,權限勾 Workers + D1
本機測好好的,正式站報名失敗正式 D1 還沒建表對正式庫跑一次 schema(步驟 3 第二行)
secret list 查不到東西少了 --name 參數加上 --name 你的worker名
改了前端但網頁沒變邊緣快取 + 瀏覽器快取等一兩分鐘 + Cmd + Shift + R
wrangler login 卡在 Authorizing…瀏覽器擋 localhost 回傳改走 API Token 路線(00 的路線 B)

03 ・ Pages 加 Access 門禁

適用:網頁內容不宜公開(行程、內部儀表板、名單),只想給指定的幾個 Email 看。前提:先照 01 部署好 Pages 網站。第一次約 30 分鐘,免費方案支援 50 人以內。

先搞懂它在做什麼

訪客 → https://xxx.pages.dev │ ▼ Cloudflare Access(刷卡門) │ Email 在白名單?──否──→ 擋在門外(連檔案都拿不到) │是 ▼ 寄一次性驗證碼到該 Email → 輸入正確 → 看到網頁
重點:擋的是整個網站,不是只擋首頁 — 沒登入的人連背後的資料檔(例如 data.js)都拿不到,這才是真的有保護。
1

先把網站部署上 Pages

照 01 教學做完,拿到 https://你的專案名.pages.dev。

資安提醒:就算等下會上門禁,敏感的原始資料(快照、名單 Excel)還是不要放進部署資料夾。只上傳網頁需要的最少檔案。門禁是保險,不是垃圾桶蓋。
2

開通 Zero Trust(一次性)

Dashboard 左側選單找 Zero Trust → 第一次進入會請你取一個 team name(內部識別用,跟網址無關)→ 方案選 Free

3

把 Pages 網站設為受保護的應用程式

Zero Trust → AccessApplicationsAdd an application → 類型選 Self-hosted

Application domain(保護哪個網址):填 你的專案名.pages.dev。

建議多加一條:*.你的專案名.pages.dev — Pages 每次部署都會產生帶亂碼前綴的「預覽網址」,不加這條的話,別人猜到預覽網址就能繞過門禁。

登入方式:勾 One-time PIN(Email 驗證碼)就好,不用接 Google 登入那些。

4

設定白名單(Policy)

Policy name 取例如 allow-team;Action 選 Allow;Include 區塊 Selector 選 Emails,填要放行的 Email 一行一個(先填自己的,確保自己進得去)→ 儲存。

5

驗證(兩邊都要測)

6

之後要加人/移除人

Zero Trust → Access → Applications → 找到你的應用 → Policies → 編輯 → 在 Emails 加一行或刪一行 → 儲存。立即生效,網站不用重新部署。

常見問題

狀況原因解法
設完門禁自己也進不去白名單 Email 打錯字回 Policy 檢查拼字(最常見)
驗證碼一直收不到信進垃圾郵件翻垃圾郵件夾,寄件者是 Cloudflare
無痕視窗還是直接看到網頁Application domain 填錯檢查 domain 和網址完全一致
預覽網址(帶亂碼那種)沒被擋沒加 *.專案名.pages.dev 那條回步驟 3 補加
登入一次後很久不用再登正常,Session 有效期預設較長可在設定裡調短 Session duration

什麼時候不該用這招

內容含高度敏感個資(身分證、財務明細)→ 靜態網頁 + 門禁仍不夠格,該用有後端權限控管的系統,或根本不要上網。使用者超過 50 人 → 超出免費方案,先評估付費或改做法。