National Chengchi University
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try a Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

1

Local AI

--

Uedu Code

--

政治大學 AQI 61 23°C PM2.5 13
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 06

部署上線與雲端服務商

CI/CD、滾動更新與回滾、主要雲端服務商
Interaction 20 minute(s)

Learning Objectives

  • 說明容器映像檔為什麼讓部署更一致,以及 CI/CD 流程中每一站在做什麼
  • 比較滾動更新與藍綠部署,並在新版本出問題時回滾到上一版
  • 認識主要的雲端服務商、PaaS 平台與學生、學術資源,依需求選擇合適的服務
  • 保護金鑰與密碼:不提交到 Git、用環境變數與 .gitignore、外流時立刻撤銷並更換

「在我電腦上明明可以跑」

第 04 課是用 SSH 登入主機、一個指令一個指令把網站架起來。這樣做一次很有收穫,但要每次改版都這樣做,問題就來了:

手動部署的問題 例子
環境不一致 你的電腦是 Python 3.12,伺服器是 3.10,某個語法在伺服器上就出錯
步驟容易漏 忘了安裝新加的套件、忘了重新啟動服務
出錯難回頭 新版本有 bug,卻不記得上一版的檔案是哪些
只有一個人會 只有負責架站的組員知道怎麼更新,他生病那天就沒人能上線

這一課介紹兩個解法:用容器把環境打包起來,用 CI/CD 把部署的步驟自動化。最後介紹有哪些雲端服務可以選,以及最重要的:怎麼保護你的金鑰。

容器:把環境一起打包

容器映像檔(image)裡包含了作業系統的檔案、Python 版本、套件與你的程式。同一份映像檔,在你的筆電、組員的電腦、雲端主機上執行,環境都一樣。

沒有容器 有容器
在每台伺服器上手動安裝 Python、套件、設定 用 Dockerfile 描述環境,docker image build 建立一次映像檔
「上一版」是一堆散落的檔案 每個版本是一份有標籤的映像檔(例如 app:v3),要回到上一版就執行 app:v2
多台伺服器的環境可能慢慢變得不一樣 每台都用同一份映像檔建立容器

所以現代的部署流程,常常是「把程式建立成映像檔、推送到映像檔倉庫(registry)、再讓伺服器拉下來執行」。 Dockerfile、build、push 的細節請看 Docker 容器軌道。

CI/CD:每次 push 都自動測試、自動部署

CI(Continuous Integration,持續整合):每次有人把程式碼推上 Git,系統就自動執行測試,及早發現問題。 CD(Continuous Delivery/Deployment,持續交付/持續部署):測試通過後,自動建立可部署的版本;持續部署更進一步,自動上線。

一條常見的部署流程(pipeline):

git push ──▶ 自動測試 ──▶ 建立映像檔 ──▶ 推送到 registry ──▶ 部署到伺服器
               │
               └─ 失敗就停在這裡,線上的版本不受影響

觸發點就是 Git 軌道 學過的 git push。以 GitHub Actions 為例,流程寫成儲存庫裡的一份設定檔(示意,實際步驟依專案而定):

# .github/workflows/deploy.yml
on:
  push:
    branches: [main]          # 推到 main 分支時觸發
jobs:
  test-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: pip install -r requirements.txt
      - run: pytest           # 測試失敗,後面的步驟就不會執行
      - run: docker image build -t app:${{ github.sha }} .
      # 接著推送映像檔並通知伺服器更新(依你使用的平台而定)

GitLab、Bitbucket 等 Git 平台也有類似的功能。重點不是哪一套工具,而是:部署變成一個可以重複、可以檢查的流程,不再靠某個人記得步驟。

換版本的方式:滾動更新、藍綠部署與回滾

網站有好幾台伺服器時,新版本要怎麼換上去,才不會讓使用者看到網站停擺?

方式 做法 優點 代價
滾動更新(rolling update) 一台一台換成新版,換的時候其他台繼續服務 不需要額外的機器 更新期間新舊版本同時在線上
藍綠部署(blue-green) 另外準備一整組新版伺服器(綠組),準備好後把流量一次切過去,舊的(藍組)先留著 切換快,要回頭也只要把流量切回藍組 切換期間要有兩倍的機器
金絲雀部署(canary) 先讓一小部分使用者用新版,沒問題再逐步擴大 出問題時影響範圍小 需要比較完整的監控

不管哪一種方式,測試都不可能抓到所有 bug。新版本上線後錯誤率升高,就要回滾(rollback):退回上一個正常的版本,先止血,再慢慢找原因。 能夠快速回滾的前提是:每個版本都有保存下來(例如有版本標籤的映像檔),而不是直接覆蓋掉舊檔案。

互動練習:部署流程與回滾

按「推送新版本」會從 git push 開始跑完整條流程,下方的終端機會記錄每一步。依任務操作:先成功部署一個新版本;再勾選「這一版的測試會失敗」並推送,看部署停在哪一站、線上版本有沒有受影響;接著取消測試失敗、改勾「這一版藏著一個 bug(測試沒抓到)」並推送,看錯誤率升高後,按「回滾到上一版」;最後把部署方式切換成另一種,滾動更新與藍綠部署都各部署一次,比較伺服器怎麼換版本。

PaaS 一鍵部署:讓平台替你跑流程

自己搭 CI/CD、管伺服器很有學習價值,但專題時間有限時,PaaS 平台可以替你做掉大部分的事。常見的使用方式:

  1. 把程式碼放在 GitHub 上
  2. 在 PaaS 平台登入並連結這個儲存庫
  3. 設定建置與啟動方式,例如 Flask 專案要有 requirements.txt,啟動指令設成 gunicorn app:app(或提供 Dockerfile)
  4. 在平台的設定頁填入環境變數(資料庫網址、API 金鑰)
  5. 之後每次 git push 到 main,平台就自動建置、部署新版本,失敗時可以從介面退回上一版

要注意的事:

  • 有些平台的免費方案在一段時間沒人使用後會休眠,下一個請求要等它醒來,第一次開啟會比較慢
  • 平台替你決定了很多事(作業系統、可用的區域、能不能常駐背景程式),遇到限制時要看文件或改用 IaaS
  • 平台上的檔案系統常常是暫時的,重新部署就會清空;資料要放在資料庫或物件儲存

主要的雲端服務商

雲端服務商很多,概念都是這幾課學過的:虛擬機、儲存、資料庫、負載平衡、自動擴展,只是名稱與介面不同。

綜合型雲端服務商(IaaS 到 PaaS 都有,服務項目最多):

服務商 經營者 定位與適合的情境
AWS(Amazon Web Services) Amazon 服務種類很多、使用者社群與教學資源豐富;學會之後很多概念可以帶到其他家
Microsoft Azure Microsoft 與 Windows、Microsoft 365、Visual Studio 等工具整合緊密,學校與企業常見;有大學生專屬的學生方案
Google Cloud Google 資料分析、機器學習相關服務完整,也有容器相關的代管服務
Oracle Cloud Infrastructure(OCI) Oracle 資料庫是強項;提供長期免費(Always Free)的部分服務,也有給學校的 Oracle Academy 計畫

PaaS 與網站託管平台(連結 GitHub 儲存庫就能部署,適合學生專題):

平台 定位與適合的情境
Render 可以部署 Flask 這類網頁服務、靜態網站與 PostgreSQL 資料庫;免費方案適合測試與練習,閒置時會休眠,官方說明不建議用於正式服務
Vercel 以前端與 Next.js 等框架見長,適合靜態網站與前端專題;個人方案限非商業用途
Netlify 適合靜態網站與前端專案,連結儲存庫後每次 push 自動部署
Fly.io 用 Dockerfile 與 flyctl 指令工具部署容器,可以選擇放在世界各地的區域;設定比其他平台多一些
Heroku 經營者是 Salesforce,是 PaaS 的老牌平台;2026 年 2 月起改以維持穩定與安全為主、不再積極開發新功能,新專案選用前先確認最新公告
GitHub Pages GitHub 內建的靜態網站託管,放作品集、課程網頁最簡單;只能放靜態檔案,不能執行 Flask

台灣的學術資源:

單位 說明
國家實驗研究院國家高速網路與計算中心(國網中心) 提供學研界高速計算與 AI 算力,例如台灣杉系列超級電腦、早期推出的 TWCC 台灣 AI 雲,以及近年的晶創系列 AI 主機;也和教育部資訊司合作推出大學 AI 算力優惠方案。適合訓練 AI 模型等大量運算的研究,通常由學校或研究計畫申請,不是用來放專題網站。服務名稱與方案近年持續調整,請以國網中心官網為準

以上只整理定位,不列價格與免費額度:各家的價格、免費方案與限制常常調整,也依區域而不同,使用前請以官方網站的最新說明為準。

學生可以利用的資源

多數服務商都有給學生的方案,但資格與內容各不相同,申請前先讀清楚官方條款:

資源 取得方式與內容
GitHub Education 學生開發者套件(Student Developer Pack) 在 GitHub 驗證學生身分後取得;包含多家合作夥伴的學生優惠,例如 Microsoft Azure、Heroku 等,合作夥伴與內容常常更換,以套件頁面為準
Azure for Students 限全職大學生,用學校信箱註冊,不需要信用卡;在學期間每年續用
AWS Educate 免費的自學課程、實作 Lab 與數位徽章,只要電子郵件就能註冊、不需要信用卡;主要是學習平台,不是用來架設長期服務的額度
Google Cloud for Students 透過 Google Cloud Skills Boost 提供課程、實作 Lab 與技能徽章;學生可以申請 Lab 學習點數,資格依國家與學校而定
Oracle Academy 學校以機構身分加入後,老師與學生可以在教學中使用 Oracle Cloud 的服務;請洽學校是否已加入
學校的資源 有些學校有自己的私有雲、虛擬機申請服務,或課程合作的雲端帳號;先問授課老師或電算中心

申請任何免費方案時,都要留意:

  • 免費期限或額度用完之後會不會自動開始收費?綁了信用卡的帳號尤其要注意
  • 一定要設定預算警示(第 05 課),並開啟帳號的兩步驟驗證
  • 學生身分到期後,資源可能被停用或刪除,重要的資料記得備份

怎麼選?從需求出發

你的需求 可以先考慮
作品集、課程網頁這類純靜態網站 GitHub Pages、Netlify、Vercel
Flask 網站加資料庫的課堂專題 PaaS 平台(例如 Render),或學生方案的雲端主機
想學 Linux 與伺服器管理、需要完整控制 IaaS 虛擬機(第 03、04 課的做法)
訓練 AI 模型、需要 GPU 的研究 學校或國網中心的算力資源,或請指導老師協助申請

其他要一起考慮的事:

  • 使用者在哪裡:選離使用者近的區域
  • 資料能不能出國:若處理個資或研究資料,先確認學校、研究倫理或計畫對資料存放位置的規定
  • 組員會不會用:選大家都能操作的平台,避免只有一個人會部署
  • 避免綁死:用容器、標準的資料庫,日後要換平台比較容易
  • 費用:先估算(第 05 課),並設好預算警示

金鑰安全:最常見、代價也最高的錯誤

雲端帳號的存取金鑰、資料庫密碼、AI 服務的 API key,等於你的錢包和鑰匙。 有自動掃描程式專門在公開的 GitHub 儲存庫裡找金鑰,找到就拿去開機器、呼叫付費服務,帳單寄給你。

原則:金鑰不寫在程式碼裡,也不提交到 Git。

把金鑰放在專案根目錄的 .env 檔,程式從環境變數讀取:

# .env(只留在自己電腦或伺服器上,不提交)
DATABASE_URL=postgresql://app:密碼@db.example.com/app
OPENAI_API_KEY=sk-請換成你的金鑰
import os
from dotenv import load_dotenv   # pip install python-dotenv

load_dotenv()                     # 讀取 .env,放進環境變數
api_key = os.environ['OPENAI_API_KEY']

在 .gitignore 加上 .env,Git 就不會追蹤它;另外提供一份不含真實值的 .env.example 給組員參考。 部署到 PaaS 或 CI/CD 時,金鑰填在平台的「環境變數」或「Secrets」設定頁,不放進儲存庫。

如果金鑰不小心推上去了:

  1. 立刻到服務商的主控台撤銷(revoke)這把金鑰,產生新的一把,這是最重要的一步
  2. 只刪掉檔案再 commit 沒有用:舊的提交紀錄裡還看得到,別人也可能早就複製走了
  3. 檢查帳單與使用紀錄,看有沒有不認得的資源或呼叫;有異常就聯絡服務商
  4. 更新所有用到這把金鑰的地方

其他好習慣:雲端帳號開啟兩步驟驗證;日常操作不要用最高權限的主帳號,另外建立權限只夠用的帳號;設定預算警示,異常花費能及早發現。

想一想:部署流程

1.

在 CI/CD 流程中,某次 push 的自動測試失敗了。接下來會發生什麼事?

2.

新版本上線後,使用者回報登入失敗、錯誤率升高。最優先的處置是?

3.

滾動更新與藍綠部署的差別,下面哪一個描述正確?

第 1 次作答

想一想:選服務與保護金鑰

1.

你發現自己的 OpenAI API key 在三天前被推到公開的 GitHub 儲存庫。最重要的第一步是?

2.

下面哪一種做法,能避免把 .env 裡的密碼提交到 Git?

3.

你要放一個純 HTML/CSS 的個人作品集網站,下面哪一個選擇最簡單合適?

第 1 次作答

重點精華回顧

  • 容器映像檔把環境與程式一起打包,讓每台機器的環境一致,每個版本也能保存下來。
  • CI/CD:git push → 自動測試 → 建立映像檔 → 推送到 registry → 部署;測試失敗就停下,線上版本不受影響。
  • 滾動更新一台一台換、藍綠部署整組切換、金絲雀部署先給少數人用;出問題時回滾到上一版。
  • PaaS 連結 GitHub 儲存庫就能自動部署,適合專題;留意休眠、平台限制與暫時性的檔案系統。
  • 主要服務商有 AWS、Azure、Google Cloud、Oracle Cloud,PaaS 有 Render、Vercel、Netlify、Fly.io 等;學生方案與學術資源各有資格限制,價格與額度以官方網站為準。
  • 金鑰不寫進程式、不提交到 Git:用 .env+.gitignore+環境變數;外流時立刻撤銷並更換,並設定兩步驟驗證與預算警示。
這一課完成了!
看我的學習進度
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。