Select Page

Docker 學習日誌:看懂 docker build,從映像建置到容器更新

學 Docker 時,很容易先記住一串指令,等到遇上「明明 build 成功,服務卻沒有更新」,才發現還有一些觀念需要釐清。

這篇從一條常見的建置指令出發,記錄映像、標籤、建置範圍與快取的關係,再整理部署時值得注意的七件事。範例使用通用的 Python API 專案名稱,方便套用到自己的環境。

一、先看懂這條指令

假設專案根目錄叫做 my-project,在該目錄執行:

docker build -t demo-api:1 -f api/Dockerfile .
指令片段意義
docker build依照 Dockerfile 建立映像
-t demo-api:1將映像命名為 demo-api,標籤設為 1
-f api/Dockerfile指定要使用的 Dockerfile
.以目前目錄作為建置範圍,也就是 build context

docker build:依照配方製作映像

Dockerfile 描述建置步驟;image(映像)是產物;container(容器)則是由映像建立、可以啟動的執行個體。

常見指令包括:

  • FROM:選擇基礎映像,開始一個建置階段。
  • RUN:在建置過程執行命令,例如安裝套件。
  • COPY:將檔案複製到映像內。
  • CMD:設定容器啟動時預設執行的命令。

映像由多個檔案系統層組成,但不能把「每條 Dockerfile 指令」都當成「新增一層檔案」。例如 CMD、ENV 主要記錄設定;FROM 則引入基礎映像。可參考 Dockerfile 官方說明。

-t demo-api:1:給映像一個容易引用的名稱

demo-api 是映像名稱,1 是 tag(標籤)。標籤由使用者自行命名,Docker 不會因為寫了 1,就自動幫你維護版本歷史。

如果再次使用同一標籤建出不同映像,demo-api:1 會改為指向新映像。舊映像若沒有其他標籤,可能顯示為 <none>;若仍被容器引用,就不能直接當作可清除的垃圾。

已存在的容器不會因為 tag 改指向新映像,就自動換版本。

實際發布時,可以改用 demo-api:1.0.1 這類明確標籤,並約定不覆寫已發布版本,讓追蹤與回復更容易。標籤本身是可變的引用,詳見 Docker image tag。

-f api/Dockerfile:選擇配方的位置

在本文這種本機目錄建置方式中,未指定 -f 時,Docker 預設使用 context 根目錄下的 Dockerfile。

-f api/Dockerfile 表示使用子目錄內的檔案,不代表把 build context 改成 api/。

.:決定 COPY 能從哪裡拿檔案

假設專案包含以下內容:

路徑用途
api/Dockerfile建置配方
api/main.pyAPI 程式
api/requirements.txtPython 套件清單
shared/共用模組
compose.yaml服務設定
.dockerignore建置時要排除的檔案

Dockerfile 可以寫:

COPY api/main.py /app/main.py
COPY shared/ /app/shared/

這裡一般 COPY 的來源路徑,是從 build context 根目錄算起,不是從 Dockerfile 所在的目錄算起。COPY --from 則是另一種情境,可從其他階段或指定來源複製。

因此,在專案根目錄執行:

docker build -t demo-api:1 -f api/Dockerfile .

如果已經進入 api/,也可以明確把 context 指回上一層:

docker build -t demo-api:1 -f Dockerfile ..

重點是最後的路徑包含哪些檔案。詳見 Build context。

二、建置與部署時要注意的七件事

1. 控制 context 大小,避免帶入不需要的檔案

專案裡可能放著資料集、備份、套件目錄與環境設定。這些東西通常不需要拿來建置。

可以在 context 根目錄放入 .dockerignore:

.git/
.env
.env.*
!.env.example
.venv/
node_modules/
**/__pycache__/
**/*.pyc
data/
backups/
*.tar
*.tar.gz

請依專案調整:如果建置真的需要 data/ 中的檔案,就不能整個排除。

現代 Docker 常使用 BuildKit,能跳過未使用的檔案,並減少重複傳輸。因此,「整個目錄一定會先全部打包送出」並不是通用的描述。但明確排除無關檔案,仍能減少負擔,也避免 COPY . . 把環境設定或備份帶進映像。參考 BuildKit 與 .dockerignore 說明。

2. 安裝套件可能需要網路,離線部署要事先準備

以下建置步驟通常需要連到套件來源:

RUN apt-get update \
    && apt-get install -y --no-install-recommends curl \
    && rm -rf /var/lib/apt/lists/*

RUN pip install --no-cache-dir -r requirements.txt

基礎映像若尚未存在,也可能需要下載。使用內部套件庫或已備妥的離線套件時,做法則會不同。

若部署環境無法上網,一種常見方式是在可上網、且目標平台相容的準備機建好映像,再匯出:

docker image save -o demo-api_1.tar demo-api:1

把檔案搬到目標主機後載入:

docker image load -i demo-api_1.tar

save 和 load 處理的是映像;Compose 設定、環境變數、掛載檔案與資料庫資料,需要另外準備。若有多個服務,也要備齊各服務使用的映像。參考 docker image save 與 docker image load。

此外,同一份 Dockerfile 在不同日期重新建置,不一定得到完全相同的套件。需要可重現的版本時,應管理套件鎖定檔、基礎映像 digest 與建置來源。參考 Docker 建置最佳實務。

3. Cache 能加速建置,但不會主動檢查套件是否更新

Docker 會依指令、前面的建置狀態與相關輸入,判斷是否能重用快取。

以常見的單階段 Dockerfile 為例,調整順序可以減少重做的工作:

WORKDIR /app

COPY api/requirements.txt ./requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

COPY api/main.py ./main.py
COPY shared/ ./shared/

這樣只修改程式碼時,前面的套件安裝步驟通常仍能使用快取;修改套件清單時,才需要重新安裝。參考 快取最佳化。

但 RUN apt-get update ... 或 RUN pip install ... 若命中快取,就不會實際執行,也不會上網確認是否有新版。一般 COPY 的內容或相關檔案中繼資料改變,則可能讓快取失效;只改檔案修改時間並不足以觸發。參考 快取失效規則。

需要停用建置快取時:

docker build --no-cache -t demo-api:1 -f api/Dockerfile .

如果也要嘗試更新基礎映像,可加上 --pull:

docker build --pull --no-cache -t demo-api:1 -f api/Dockerfile .

--no-cache 與 --pull 用途不同。另外,Dockerfile 裡的 pip --no-cache-dir 只控制 pip 的下載快取,不會關閉 Docker 的建置快取。Docker 旗標可參考 Buildx build 說明。

4. 定期看磁碟使用量,再決定清理範圍

多次建置後,可能累積舊映像與 build cache。因為映像之間可以共享層,磁碟占用不一定是每建一次就增加一份完整映像大小。

先查看:

docker system df
docker image ls

若要清除未被容器引用的 dangling 映像,可以執行:

docker image prune

這個命令會先要求確認;加上 -f 才會省略確認。-a 會把清理範圍擴大到所有未被容器引用的映像,包含有標籤、可能留作回復用途的版本。

映像清理也不等於清空 build cache,不必把兩者混為一談。參考 docker image prune 與 Build cache 管理。

5. Build 成功後,還要讓服務使用新映像

假設 compose.yaml 中有以下服務:

services:
  api:
    image: demo-api:1
    ports:
      - "127.0.0.1:8000:8000"

此設定假設應用程式在容器內監聽 0.0.0.0:8000,並將主機端連線限制在本機。api 是 Compose 服務名稱,demo-api:1 是映像名稱,兩者用途不同。

建置完成後,在 Compose 檔案所在目錄執行:

docker compose up -d api

Compose 偵測到映像或設定變更時,通常會重建容器。如果希望明確要求重建,即使沒有偵測到變更,也可以用:

docker compose up -d --force-recreate api

所以,--force-recreate 是強制重建的選項,不是更新映像唯一的方法。參考 docker compose up。

docker compose restart api 則是重新啟動既有容器,不能用來切換到剛建好的映像。參考 docker compose restart。

重建之前,也要知道資料放在哪裡:

資料位置重建容器時要注意的事
容器可寫層刪除舊容器時,裡面的資料會一併失去
具名 volume重新掛載相同 volume 可沿用資料;刪除 volume 另當別論
主機 bind mount資料保留在主機路徑,需確保仍掛載相同位置
外部資料庫或儲存服務需確認連線設定及新版程式的資料相容性

沒有掛載 volume,不代表重建一定安全。 上傳檔案、SQLite 或日誌若只存在容器內,就可能遺失。參考 Docker 儲存說明。

更新後可查看:

docker compose ps
docker compose logs --tail=100 api

接著實際呼叫 API 或檢查健康狀態。容器正在執行,與應用程式已正常提供服務,是兩件需要分別確認的事。

6. 搬映像之前,確認 CPU 架構

常見平台包括 linux/amd64(一般 x86-64 主機)與 linux/arm64(ARM64 主機)。

未特別指定時,建置平台通常跟隨 builder 的預設平台。不同架構的單一平台映像,不能假設能在另一台主機原生執行。

可以先檢查映像:

docker image inspect demo-api:1 --format '{{.Os}}/{{.Architecture}}'

若 builder 已具備跨平台建置能力,可明確指定目標:

docker buildx build --platform linux/amd64 --load -t demo-api:1 -f api/Dockerfile .

這裡 --load 會將單一平台建置結果載入本機映像儲存區。跨平台的 RUN 步驟可能需要模擬器、原生節點或其他支援,基礎映像與套件也必須支援目標平台。

遇到 exec format error 時,架構不符是排查方向之一,也要檢查執行檔與腳本格式。跨平台原理與前提可參考 Multi-platform builds。

7. 建置時做基本自檢,讓問題早點出現

假設程式需要 requests 套件與 curl 指令,可以在安裝完成後加入:

RUN python -c "import requests" && command -v curl

這種自檢可以提早發現套件漏裝或命令不存在。命令回傳非零狀態時,該次建置會失敗。

但自檢只能涵蓋實際檢查的項目,不能保證部署環境中的資料庫、網路、權限或完整功能都正常。建置時也應避免匯入會立刻連線正式服務的模組。

還有一個容易忽略的地方:這次 build 失敗,之前的同名映像可能仍然存在。 不要只看 docker image ls 有沒有該 tag,就認為這次建置成功。

三、把日常更新整理成固定步驟

以下假設位於專案根目錄,使用前面的 Compose 設定,而且既有容器也是由同一個 Compose 專案建立。

先建置:

docker build -t demo-api:1 -f api/Dockerfile .

確認成功後,再更新服務:

docker compose up -d api

查看狀態與日誌,再驗證實際功能:

docker compose ps
docker compose logs --tail=100 api

如果使用 Bash 自動串接建置與更新,可以使用 &&,確保前一步成功才繼續:

docker build -t demo-api:1 -f api/Dockerfile . && docker compose up -d api

若原本使用 docker compose -p demo ... 指定專案名稱,後續操作也要維持相同的 -p demo,避免操作到另一組服務。

這次學習後,我會在每次更新時依序確認:建置用了哪些檔案、產出了哪個映像、服務是否已使用新映像,以及資料是否放在能持續保存的位置。把這幾件事分開檢查,就比較容易找出更新流程卡在哪一步。

雲端現代化:如何將 WordPress 部署至 Cloud Run、Cloud SQL 與 Cloud Storage

在管理多個 WordPress 專案時,傳統 VM 加架構往往面臨擴展性與維護成本的挑戰。透過 Google Cloud Run (Serverless)、Cloud SQL (代管資料庫) 與 Cloud Storage (雲端儲存) 的組合,我們可以建立一個自動縮放、安全且高效率的網站環境。

一、 架構預覽

  • 計算節點:Google Cloud Run (Docker 容器化運行)。
  • 資料庫:Google Cloud SQL (MySQL 8.0)。
  • 靜態檔案:Google Cloud Storage (GCS)。
  • 流量分配:Google Cloud Load Balancing (HTTPS 負載平衡器)。

二、 準備 Docker 鏡像與環境排除

在打包之前,請務必設定 .dockerignore 以優化鏡像體積並保護敏感資訊 。

my-wp-site/
├── Dockerfile           # 自動化打包腳本
├── wp-config.php        # 修改為讀取環境變數的版本
├── .dockerignore        # 排除不需要打包的檔案 (如 .git, local backups)
└── wp-content/
    ├── plugins/         # 放置您自定義的外掛
    └── themes/          # 放置您自定義的主題

建立 標準化 Dockerfile 範本

# 使用官方 PHP-Apache 映像檔,穩定且相容性高
FROM wordpress:php8.2-apache

# 1. 設定環境變數 (Cloud Run 預設監聽 8080,但官方 WP 鏡像預設是 80)
# 這裡我們讓 Apache 監聽 Cloud Run 指定的 PORT
RUN sed -i 's/Listen 80/Listen ${PORT}/g' /etc/apache2/ports.conf
RUN sed -i 's/:80/:${PORT}/g' /etc/apache2/sites-available/000-default.conf

# 2. 安裝必要的系統套件 (如有需要自訂 PHP 擴展可在這加)
RUN apt-get update && apt-get install -y \
    libpng-dev \
    libjpeg-dev \
    && docker-php-ext-configure gd --with-jpeg \
    && docker-php-ext-install gd

# 3. 複製現有的自定義檔案進入容器
# 建議只複製 plugins 和 themes,核心檔案由官方鏡像提供
COPY ./wp-content/plugins/ /var/www/html/wp-content/plugins/
COPY ./wp-content/themes/ /var/www/html/wp-content/themes/
COPY ./wp-config.php /var/www/html/wp-config.php

# 4. 設定正確的檔案權限 (對 WordPress 運行至關重要)
RUN chown -R www-data:www-data /var/www/html

# 5. 設定預設環境變數 (可在部署時被 gcloud 指令覆蓋)
ENV PORT=8080
ENV DB_HOST=127.0.0.1
ENV DB_USER=root
ENV DB_PASSWORD=password

# 暴露埠號
EXPOSE 8080

1. 建立 .dockerignore

Plaintext

.git
.gitignore
.dockerignore
Dockerfile
*.sql
*.zip
.vscode/
wp-config-sample.php

2. 打包與推送鏡像

PowerShell

# 編譯鏡像
docker build -t asia-east1-docker.pkg.dev/[PROJECT_ID]/wp-repo/[docker_name]:latest .

# 推送到 Artifact Registry
docker push asia-east1-docker.pkg.dev/[PROJECT_ID]/wp-repo/[docker_name]:latest

三、 資料庫遷移與設定

1. 匯入 SQL 腳本

將 .sql 檔案上傳至 Google Cloud Storage (GCS) 後執行匯入 。

注意:請確保 SQL 檔案中不含 CREATE DATABASE 或 USE 語句,以免匯入失敗或指向錯誤的資料庫。

PowerShell

gcloud sql import sql [INSTANCE_NAME] gs://[BUCKET_NAME]/[docker_name].sql --database=[docker_name]_db

2. 設定 wp-config.php 智慧判斷

為了同時支援本地開發與雲端環境,建議在 wp-config.php 加入連線判斷邏輯 :

PHP

// 偵測是否在 Cloud Run 環境 (透過 Unix Socket 連線)
if (getenv('INSTANCE_CONNECTION_NAME')) {
    define( 'DB_HOST', ':/cloudsql/' . getenv('INSTANCE_CONNECTION_NAME') );
} else {
    define( 'DB_HOST', getenv('DB_HOST') ?: '127.0.0.1' );
}

// 負載平衡器 HTTPS 辨識
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
    $_SERVER['HTTPS'] = 'on';
}

四、 部署至 Cloud Run

部署時需指定 Cloud SQL 連線名稱,這會自動建立加密隧道 。

PowerShell

gcloud run deploy [docker_name] `
  --image asia-east1-docker.pkg.dev/[PROJECT_ID]/wp-repo/[docker_name]:latest `
  --region asia-east1 `
  --allow-unauthenticated `
  --add-cloudsql-instances [PROJECT_ID]:asia-east1:[INSTANCE_NAME] `
  --set-env-vars="INSTANCE_CONNECTION_NAME=[PROJECT_ID]:asia-east1:[INSTANCE_NAME],DB_NAME=[docker_name]_db,DB_USER=root,DB_PASSWORD=[PASSWORD]"

五、 設定負載平衡器 (GCLB) 與自訂網域

為了使用自有的網域(如 blog.rain.tips),建議使用 HTTPS 負載平衡器 。

  1. 建立 Serverless NEG:讓負載平衡器找到 Cloud Run 。
  2. 設定前端 IP:保留一個靜態全域 IP。
  3. Google 管理憑證:在前端設定中新增網域,Google 會自動處理 SSL 簽發與續期 。
  4. DNS 設定:將您的網域 A 紀錄 指向負載平衡器的靜態 IP 。

六、 故障排除 (Troubleshooting)

  • Error establishing a database connection:
    • 檢查 Cloud Run 服務帳戶是否擁有 「Cloud SQL Client」 角色 。
    • 確認 DB_HOST 在雲端環境是否正確指向 :/cloudsql/... 。
  • 503 Service Unavailable:
    • 確認 Cloud Run 服務已設定為 「允許未經驗證的叫用」 。
    • 檢查負載平衡器的憑證是否已變為綠色的 Active 狀態 。
  • IPv6 連線問題:
    • 若使用 Nginx 反向代理遇到 Network is unreachable,請強制 Nginx 優先使用 IPv4 或修改系統 /etc/hosts 。

參考資料

NVIDIA Spark 如何啟用 VNC:使用 Vino 與 RealVNC 遠端桌面完整教學

在使用 nvidia spark 或 NVIDIA Jetson 類型的 AI 開發平台時,很多開發者會希望能夠遠端操作設備,而不是每次都連接螢幕、鍵盤與滑鼠。這時候 VNC(Virtual Network Computing) 就是一個非常方便的遠端桌面解決方案。

透過 vino VNC Server 與 RealVNC Viewer,你可以在 Windows、macOS 或 Linux 上遠端連線到 NVIDIA Spark 的桌面環境,像是直接操作本機一樣。VNC 可以透過網路傳輸桌面畫面與輸入操作,因此非常適合 AI 開發、邊緣設備管理與遠端維護。

本文將介紹如何在 nvidia spark / Ubuntu 系統 中啟用 VNC Server(vino),並透過 RealVNC Viewer 進行遠端連線。

為什麼 NVIDIA Spark 建議使用 VNC

在 AI 或嵌入式開發場景中,遠端桌面有幾個重要用途:

  • 遠端查看 GPU 程式的 GUI
  • 遠端操作桌面應用程式
  • headless(無螢幕)設備管理
  • 在不同電腦之間共享桌面

VNC 允許使用者透過網路存取 Linux 圖形桌面,而不需要實際連接顯示器。


NVIDIA Spark 啟用 VNC(vino)教學

以下步驟適用於 Ubuntu / GNOME 環境的 nvidia spark。

1 安裝 VNC Server(vino)

首先在 NVIDIA Spark 中安裝 vino:

sudo apt update
sudo apt install vino

vino 是 GNOME 桌面內建的 VNC Server,常用於 Ubuntu 遠端桌面。


2 啟用 VNC Server 自動啟動

建立 symbolic link,讓 vino 在登入後自動啟動:

cd /usr/lib/systemd/user/graphical-session.target.wants
sudo ln -s ../vino-server.service ./

這樣每次登入桌面時,VNC 服務就會自動啟動。


3 設定 VNC Server

關閉安全提示與加密:

gsettings set org.gnome.Vino prompt-enabled false
gsettings set org.gnome.Vino require-encryption false

這些設定可以避免某些 VNC Viewer 無法連線的問題。


4 設定 VNC 密碼

設定遠端登入密碼:

gsettings set org.gnome.Vino authentication-methods "['vnc']"
gsettings set org.gnome.Vino vnc-password $(echo -n 'yourpassword' | base64)

請將 yourpassword 替換為自己的密碼。


5 重新啟動系統

sudo reboot

重新啟動後,VNC Server 設定就會生效。


使用 RealVNC Viewer 連線 NVIDIA Spark

在另一台電腦安裝 RealVNC Viewer。

接著:

  1. 查詢 NVIDIA Spark IP
ifconfig

或

ip a
  1. 開啟 RealVNC Viewer
  2. 輸入 IP 地址

例如:

192.168.1.50
  1. 輸入剛剛設定的 VNC 密碼

即可成功遠端操作 NVIDIA Spark 桌面。


VNC 常見問題

1 VNC 無法連線

可能原因:

  • vino 沒有啟動
  • GNOME 沒有登入
  • 防火牆阻擋

確認服務:

ps aux | grep vino

2 VNC 黑畫面

可能是:

  • 沒有登入桌面
  • 沒有顯示器(headless模式)

可設定 自動登入(Auto Login) 解決。


VNC、RealVNC、vino 的差異

工具功能
vinoLinux GNOME VNC Server
VNC遠端桌面協定
RealVNC Viewer常用 VNC 客戶端

通常搭配方式:

vino server + RealVNC viewer

結論

透過 VNC + vino + RealVNC,可以快速讓 nvidia spark 具備遠端桌面能力,對於 AI 開發、遠端管理或 headless 系統來說非常方便。

只需要簡單幾個步驟:

  1. 安裝 vino
  2. 啟用 VNC server
  3. 設定密碼
  4. 使用 RealVNC 連線

就能輕鬆遠端控制 NVIDIA Spark。

相關資料

https://developer.nvidia.com/embedded/learn/tutorials/vnc-setup

Stagehand 教學|AI 驅動的瀏覽器自動化神器,TypeScript 與 Python 都支援!

想用 AI 控制網頁自動化,但程式碼又要精準可靠,同時享受自然語言,高效又方便?那你絕不能錯過由 Browserbase 團隊推出的 Stagehand —— 這款專為 AI 時代設計的瀏覽器自動化框架,不僅支援 TypeScript 與 Python、可本地或雲端部署,還比 Browser‑Use 更快、更耐變動!

Stagehand 兼具控制力與智慧的 AI 瀏覽器自動化框架

Stagehand 是以 Playwright 為核心構建的 AI-native 自動化工具,它加入了 LLM 判斷能力,結合程式精準控制與自然語言指令,令自動化腳本更穩定、更智慧也更高效

  • 自然語言 + 程式碼混合操作:你可以用程式寫明確動作,也能用「act(‘點擊第一個 Stagehand 元件’)」這樣類人語法完成UI操作 。
  • 接口完整,支援察看、執行與資料萃取:核心三大命令 act、observe、extract,讓操作更透明、更可控
  • 容錯與自恢復能力:UI 略有變動也不怕,Stagehand 的 observe + 快取策略讓腳本更具彈性
  • 完美整合 Playwright:所有 Playwright 腳本都能無縫升級 Stagehand,省心又高效

核心玩法!TypeScript/JavaScript 快速上手範例

// Use Playwright functions on the page object
const page = stagehand.page;
await page.goto("https://github.com/browserbase");

// Use act() to execute individual actions
await page.act("click on the stagehand repo");

// Use Computer Use agents for larger actions
const agent = stagehand.agent({
    provider: "openai",
    model: "computer-use-preview",
});
await agent.execute("Get to the latest PR");

// Use extract() to read data from the page
const { author, title } = await page.extract({
  instruction: "extract the author and title of the PR",
  schema: z.object({
    author: z.string().describe("The username of the PR author"),
    title: z.string().describe("The title of the PR"),
  }),
});

這段程式完整示範了初始化、導航、AI 驅動操作到資料萃取的流程,不僅省事,也大幅提升開發效率。

Stagehand 與 Browser-Use 比較

功能面Stagehand(此文主角)Browser-Use
控制精準度Token 級動作掌控 + 自然語言指令混合攻擊角度偏自然語言,程式控制較弱
容錯能力observe + 快取策略,對 DOM 變化更耐受缺少自恢復機制
雲端支援原生整合 Browserbase,輕鬆雲端部署需額外集成,無預設雲平台支援
語言支援TypeScript / Python主要依賴 Python
AI 整合天生結合 LLM,支援複雜任務拆解依賴外部 LLM,不那麼一體化

只要先學四個指令,快速上手

指定去那一個網頁

goto():

    # 初始化
    page = stagehand.page
    # 指定去那一個頁面
    await page.goto("https://rain.tips/")

使用自然語言操作

act():

    await page.act("點選確定按鈕");

抓取數據資料

extract():

    post = await page.extract("取得標題")

預覽功能

observe():

   links = await page.observe("找到頁面中的所有連結")

實戰快速導覽

安裝

# 用 pip
pip install stagehand python-dotenv

# 安裝playwright
python -m playwright install

# 裝 chromium 瀏覽器
python -m playwright install chromium

建立 .env

export BROWSERBASE_API_KEY="your_browserbase_api_key"
export BROWSERBASE_PROJECT_ID="your_browserbase_project_id"
export MODEL_API_KEY="your_model_api_key"  # OpenAI, Anthropic, etc.

建立程式碼 main.py

import asyncio
import os
from stagehand import Stagehand, StagehandConfig
from dotenv import load_dotenv

load_dotenv()

async def main():
    config = StagehandConfig(
        env="BROWSERBASE",
        api_key=os.getenv("BROWSERBASE_API_KEY"),
        project_id=os.getenv("BROWSERBASE_PROJECT_ID"),
        model_name="gpt-4o",
        model_api_key=os.getenv("MODEL_API_KEY")
    )
    
    stagehand = Stagehand(config)
    
    try:
        await stagehand.init()
        page = stagehand.page
        
        await page.goto("https://docs.stagehand.dev/")
        await page.act("click the quickstart link")
        
        result = await page.extract("extract the main heading of the page")
        
        print(f"Extracted: {result}")
        
    finally:
        await stagehand.close()

if __name__ == "__main__":
    asyncio.run(main())

驗證與測試

python main.py 

若要用本地端的瀏覽器的話,可以改成下面的程式碼

import asyncio
import os
from dotenv import load_dotenv
from stagehand import StagehandConfig, Stagehand

load_dotenv()

async def main():
    # 检查API密钥是否设置
    api_key = os.getenv("OPENAI_API_KEY")

    config = StagehandConfig(
        env="LOCAL",  # 本地运行
        # AI模型配置 - 使用环境变量
        model_name="gpt-4o-mini",  # 使用更便宜的模型
        model_api_key=api_key,  # 从环境变量读取

        # 本地运行配置
        headless=False,  # 显示浏览器窗口
        verbose=3,  # 详细日志
        debug_dom=True,  # DOM调试
    )

    # 使用配置创建Stagehand实例
    stagehand = Stagehand(config)

    # 初始化Stagehand(启动浏览器会话)
    await stagehand.init()

    # 获取页面对象,用于后续的页面操作
    page = stagehand.page

    await page.goto("https://rain.tips/")

    # # 使用observe()取得文章的連結
    blog_links = await page.observe("取得文章中的所有連結)
    print(f"✅ Page link: {blog_links}")

    await page.act(blog_links[0]) 
    data_post_1 = await page.extract("取得文章的標題和內文")
    print(f"✅ 文章資訊如下: {data_post_1}")

if __name__ == "__main__":
    asyncio.run(main())

總結:為什麼 Stagehand 是下一代自動化框架?

  • 語言直覺更自然,人類可理解
  • 對 UI 變化具彈性、不易失效
  • 結合 LLM,自動拆解任務,效率提升數倍
  • 支援本地與雲端,開發與生產環境都得心應手

Stagehand 正重新定義瀏覽器自動化,不再只是死板指令,而是一場「程式控+AI 智能」的完美結合,無論對開發者或 AI 自動化愛好者,都是一大利器。快一起駕馭它,打造更強、更智慧的自動化流程!

參考資料

BrowserBase

GitHub Stagehand

Demo

開發說明文件

https://www.aivi.fyi/aiagents/introduce-stagehand

WireShark-在Windows內如何解密https

WireShark-在Windows內如何解密https

Wireshark 是一款功能強大的網絡協議分析工具,可以幫助我們深入了解網絡流量,在日常使用中,我們有時需要檢查 HTTPS 流量,這些流量通常是加密的,通過配置 Wireshark,我們可以抓取並解碼 SSL/TLS 的加密資訊。

步驟 1:下載並安裝 Wireshark

首先,從 Wireshark 官方網站 下載適合您系統的安裝包,並完成安裝。安裝過程中,建議選擇安裝 WinPcap 或 Npcap,這是用於抓取網絡數據包的必要工具。

步驟 2:在 Windows 中設置用戶變量

要讓瀏覽器記錄 SSL/TLS 的密鑰,我們需要設置環境變量。

  1. 新增用戶變量:
    • 打開「系統屬性」>「高級系統設置」>「環境變量」。
    • 在「用戶變量」區域中,點擊「新增」。
  2. 設置變量名稱與變量值:
    • 變量名:SSLKEYLOGFILE
    • 變量值:C:\logs
  3. 點擊「確定」保存變量。

步驟 3:使用 Chrome 訪問 HTTPS 網頁

  1. 打開 Google Chrome 瀏覽器。
  2. 瀏覽任意 HTTPS 網頁(例如 https://example.com)。
  3. 在剛才設置的 C:\logs 路徑下,會生成一個名為 sslkeylog.log 的文件。
    該文件包含了瀏覽器和服務器之間進行加密通信的 Premaster Secret。

這個設置的作用是讓支持 SSLKEYLOGFILE 的應用程序(例如 Chrome)記錄密鑰到指定文件中。

步驟 4:配置 Wireshark 解碼 SSL 流量

接下來,我們需要將生成的密鑰文件導入 Wireshark,以便解碼 HTTPS 流量。

  1. 打開 Wireshark。
  2. 點擊選單中的「編輯」>「首選項」。
  3. 在彈出的「首選項」窗口中:
    • 展開左側的「Protocols」。
    • 找到並選擇「TLS」協議。
  4. 在右側的「(Pre)-Master-Secret log filename」欄位中,填入生成的 sslkeylog.log 文件的完整路徑,例如:

步驟 5:開始抓取 HTTPS 流量

  1. 在 Wireshark 中選擇網絡介面(例如 Wi-Fi 或有線網絡)。
  2. 點擊「開始捕獲」按鈕(或快捷鍵 Ctrl+E)。
  3. 打開瀏覽器並訪問任意 HTTPS 網頁。

步驟 6:檢查解碼的內容

  1. 在抓取的數據包中,選擇任意 Client Hello 或 Server Hello 消息。
  2. Wireshark 會根據 sslkeylog.log 自動解碼加密的數據流,您可以在「解碼」區域中看到未加密的數據內容。
HubSpot:一站式行銷、銷售與客戶關係管理解決方案

HubSpot:一站式行銷、銷售與客戶關係管理解決方案

HubSpot 是一款功能強大的整合式行銷、銷售和客戶服務軟體,為企業提供了從行銷自動化到客戶關係管理 (CRM) 的多種解決方案。成立於 2006 年,HubSpot 以「吸引力行銷」(Inbound Marketing) 理念為核心,幫助企業透過內容行銷、社交媒體互動、以及顧客關係管理等工具來吸引、轉換和滿足客戶需求。以下是 HubSpot 的主要功能及優勢介紹:

1. 行銷自動化

HubSpot 的行銷工具涵蓋電子郵件行銷、社交媒體管理、SEO、廣告管理和內容創建。透過其強大的行銷自動化功能,企業可以針對不同的潛在客戶設計自動化工作流程,提供個性化的電子郵件、行銷信息和跟進活動,幫助提高行銷效率並增加潛在客戶的轉化率。

2. CRM (客戶關係管理)

HubSpot 的 CRM 是其核心功能之一,它能夠免費使用,且提供了強大的客戶資料管理和互動追蹤功能。用戶可以輕鬆管理客戶資料、跟蹤客戶行為,並記錄所有的溝通互動,讓業務團隊能夠更深入了解客戶需求,提供更好的服務。

3. 銷售工具

HubSpot 提供多種銷售支援工具,像是銷售管道管理、線索打分、預測分析和報表工具等,幫助業務團隊自動化重複性的任務,專注於建立與潛在客戶的關係。透過 HubSpot 的銷售功能,業務人員可以追蹤線索的進度、提醒後續行動,並利用個性化的銷售策略來提升銷售效率。

4. 客戶服務管理

HubSpot 的客戶服務工具包括客戶支援票務系統、聊天機器人、知識庫、客戶回饋和調查功能,讓企業可以提供一致且高效的客戶支援服務。企業可以追蹤每位客戶的服務歷史紀錄,確保所有團隊成員都能夠準確回應客戶的需求。

5. 數據分析和報表

HubSpot 的報表和分析工具能夠幫助企業衡量行銷、銷售和服務績效。企業可以輕鬆生成多種報表來評估行銷活動效果、銷售業績以及客戶滿意度,讓決策團隊能夠依據數據做出更有效的商業策略。

6. 與其他應用程式的整合

HubSpot 提供眾多第三方應用程式的整合,包括 Salesforce、Shopify、Slack、Google Workspace 等。透過這些整合,企業可以將所有業務流程集中在 HubSpot 中,減少切換應用的時間,並提高工作效率。

延伸閱讀