顯示具有 主機 標籤的文章。 顯示所有文章
顯示具有 主機 標籤的文章。 顯示所有文章

2026年10月16日 星期五

Claude Code 學習筆記 : 安裝 Vercel CLI 與部署技能包

昨天上 Karen 老師的 Vibe coding 實作課, 需註冊 Vercel 帳號, 安裝 Vercel CLI 與 Vercel 部署技能包, 這樣在 Claude Code 裡就能用提示詞例如「幫我把網站部署到 Vercel」自動執行 vercel 指令直接把檔案打包上傳到 Vercel 雲端平台. 


1. 註冊 Vercel 帳號 : 

到 Vercel 官網 : 


按右上角的 SIGN UP 鈕 : 




可以用 Google 或 GitHub 等帳號快速註冊, 但我習慣用 Email : 




輸入 Email 按 Continue with Email :



這時要去收信, 取得驗證碼 :




填入驗證碼 :




勾選 I'm working on personal projects, 隨便填一個 Team name 按 Continue :




註冊完成後按右上角頭像就可以看到帳戶名稱 (username) :




帳戶名稱會出現在網址中, 可以按名稱右邊的齒輪鈕進入設定頁面修改, 我將後面的 -5388 去掉以減少網址長度 (只要沒被別人用走即可) :




接下來在 PS 視窗輸入 vercel login 指令來登入, 它會開啟瀏覽器, 選擇登入方式, 我使用 Email, 輸入後按 Continue with Email :




這時要去信箱收驗證信, 將驗證碼輸入到網頁 :





這時會顯示授權此裝置存取 Vercel 的頁面, 按底下 Allow Access 鈕 : 




授權成功即可關掉頁面 : 



2. 安裝 Vercel CLI : 

這是 Claude Code 與 Vercel 溝通的管道, 是實際執行部署的命令列工具, 全域安裝指令如下 :

PS C:\Users\tony1> npm install -g vercel   
npm warn EBADENGINE Unsupported engine {
npm warn EBADENGINE   package: '@renovatebot/pep440@4.2.1',
npm warn EBADENGINE   required: { node: '^20.9.0 || ^22.11.0 || ^24', pnpm: '^10.0.0' },
npm warn EBADENGINE   current: { node: 'v25.2.1', npm: '11.13.0' }
npm warn EBADENGINE }

added 285 packages in 2m

可見 Vercel CLI 已安裝成功 (那些 npm warn EBADENGINE 警告與功能無關, 可以直接忽略). 開啟一個新的 PS 視窗, 檢視版本 :

PS C:\Users\tony1> vercel --version 
Vercel CLI 64.2.0
64.2.0

用 vercel login 指令登入 : 

PS C:\Users\tony1> vercel login    
Vercel CLI 64.2.0 (Node.js 25.2.1)
>
  Visit https://vercel.com/oauth/device?user_code=PSGC-KMFK

  Congratulations! You are now signed in.

  To deploy something, run `vercel`.
  To set up the Vercel plugin and connect your coding agents to the AI Gateway, run `vercel setup`.

  💡 To deploy every commit automatically,
  connect a Git Repository (vercel.link/git (https://vercel.link/git)).

這要就讓本機的命令列環境與 Claude Code 跟我們的雲端 Vercel 帳號完成免密碼安全授權綁定, Vercel CLI 已經在我們的電腦裡產生並儲存了一組專屬的登入憑證 (token), 之後不需要再打開瀏覽器輸入驗證碼, 電腦就能直接與我們的 Vercel 帳號溝通. 


3. 安裝 Claude Code 的 Vercel 技能包 : 

此 agent-skills 技能包是給 Claude Code 看的 Vercel 部署武功秘笈, 用來教它如何將網站部署到 Vercel 平台, 安裝指令如下 :

npx skills add vercel-labs/agent-skills --all -a claude-code

PS C:\Users\tony1> npx skills add vercel-labs/agent-skills --all -a claude-code  
Need to install the following packages:
skills@1.7.2
Ok to proceed? (y) y

███████╗██╗  ██╗██╗██╗     ██╗     ███████╗
██╔════╝██║ ██╔╝██║██║     ██║     ██╔════╝
███████╗█████╔╝ ██║██║     ██║     ███████╗
╚════██║██╔═██╗ ██║██║     ██║     ╚════██║
███████║██║  ██╗██║███████╗███████╗███████║
╚══════╝╚═╝  ╚═╝╚═╝╚══════╝╚══════╝╚══════╝

T   skills
|
o  Source: https://github.com/vercel-labs/agent-skills.git
|
o  Repository cloned
|
o  Found 9 skills
|
•  Installing all 9 skills
|
•  Installing to all 79 agents

|
o  Installation Summary ---------------------------------------------------------+
|                                                                                |
|  ~\.agents\skills\vercel-composition-patterns                                  |
|    universal: Amp, Antigravity, Antigravity CLI, Cline, Codex +18 more         |
|    symlink → AiderDesk, AstrBot, Autohand Code CLI, Augment, IBM Bob +51 more  |
|                                                                                |
|  ~\.agents\skills\deploy-to-vercel                                             |
|    universal: Amp, Antigravity, Antigravity CLI, Cline, Codex +18 more         |
|    symlink → AiderDesk, AstrBot, Autohand Code CLI, Augment, IBM Bob +51 more  |
|                                                                                |
|  ~\.agents\skills\vercel-react-best-practices                                  |
|    universal: Amp, Antigravity, Antigravity CLI, Cline, Codex +18 more         |
|    symlink → AiderDesk, AstrBot, Autohand Code CLI, Augment, IBM Bob +51 more  |
|                                                                                |
|  ~\.agents\skills\vercel-react-native-skills                                   |
|    universal: Amp, Antigravity, Antigravity CLI, Cline, Codex +18 more         |
|    symlink → AiderDesk, AstrBot, Autohand Code CLI, Augment, IBM Bob +51 more  |
|                                                                                |
|  ~\.agents\skills\vercel-react-view-transitions                                |
|    universal: Amp, Antigravity, Antigravity CLI, Cline, Codex +18 more         |
|    symlink → AiderDesk, AstrBot, Autohand Code CLI, Augment, IBM Bob +51 more  |
|                                                                                |
|  ~\.agents\skills\vercel-cli-with-tokens                                       |
|    universal: Amp, Antigravity, Antigravity CLI, Cline, Codex +18 more         |
|    symlink → AiderDesk, AstrBot, Autohand Code CLI, Augment, IBM Bob +51 more  |
|                                                                                |
|  ~\.agents\skills\vercel-optimize                                              |
|    universal: Amp, Antigravity, Antigravity CLI, Cline, Codex +18 more         |
|    symlink → AiderDesk, AstrBot, Autohand Code CLI, Augment, IBM Bob +51 more  |
|                                                                                |
|  ~\.agents\skills\web-design-guidelines                                        |
|    universal: Amp, Antigravity, Antigravity CLI, Cline, Codex +18 more         |
|    symlink → AiderDesk, AstrBot, Autohand Code CLI, Augment, IBM Bob +51 more  |
|                                                                                |
|  ~\.agents\skills\writing-guidelines                                           |
|    universal: Amp, Antigravity, Antigravity CLI, Cline, Codex +18 more         |
|    symlink → AiderDesk, AstrBot, Autohand Code CLI, Augment, IBM Bob +51 more  |
|                                                                                |
+--------------------------------------------------------------------------------+
|
o  Security Risk Assessments ---------------------------------------------------+
|                                                                               |
|                                 Gen               Socket            Snyk      |
|  vercel-composition-patterns    Safe              0 alerts          Low Risk  |
|  deploy-to-vercel               Safe              0 alerts          Med Risk  |
|  vercel-react-best-practices    Safe              0 alerts          Low Risk  |
|  vercel-react-native-skills     Safe              0 alerts          Low Risk  |
|  vercel-react-view-transitions  Safe              0 alerts          Low Risk  |
|  vercel-cli-with-tokens         Safe              0 alerts          Med Risk  |
|  vercel-optimize                Safe              0 alerts          Low Risk  |
|  web-design-guidelines          Safe              0 alerts          Low Risk  |
|  writing-guidelines             Safe              0 alerts          Med Risk  |
|                                                                               |
|  Details: https://skills.sh/vercel-labs/agent-skills                          |
|                                                                               |
+-------------------------------------------------------------------------------+
|
o  Installation complete

|
o  Installed 9 skills ----------------------------------------------------------------------------------------+
|                                                                                                             |
|  ✓ ~\.agents\skills\vercel-composition-patterns                                                             |
|    universal: Amp, Antigravity, Antigravity CLI, Cline, Codex +18 more                                      |
|    symlinked: Claude Code, Eve, Kiro CLI                                                                    |
|    skipped: AiderDesk, AstrBot, Autohand Code CLI, Augment, IBM Bob +48 more (project directory not found)  |
|  ✓ ~\.agents\skills\deploy-to-vercel                                                                        |
|    universal: Amp, Antigravity, Antigravity CLI, Cline, Codex +18 more                                      |
|    symlinked: Claude Code, Eve, Kiro CLI                                                                    |
|    skipped: AiderDesk, AstrBot, Autohand Code CLI, Augment, IBM Bob +48 more (project directory not found)  |
|  ✓ ~\.agents\skills\vercel-react-best-practices                                                             |
|    universal: Amp, Antigravity, Antigravity CLI, Cline, Codex +18 more                                      |
|    symlinked: Claude Code, Eve, Kiro CLI                                                                    |
|    skipped: AiderDesk, AstrBot, Autohand Code CLI, Augment, IBM Bob +48 more (project directory not found)  |
|  ✓ ~\.agents\skills\vercel-react-native-skills                                                              |
|    universal: Amp, Antigravity, Antigravity CLI, Cline, Codex +18 more                                      |
|    symlinked: Claude Code, Eve, Kiro CLI                                                                    |
|    skipped: AiderDesk, AstrBot, Autohand Code CLI, Augment, IBM Bob +48 more (project directory not found)  |
|  ✓ ~\.agents\skills\vercel-react-view-transitions                                                           |
|    universal: Amp, Antigravity, Antigravity CLI, Cline, Codex +18 more                                      |
|    symlinked: Claude Code, Eve, Kiro CLI                                                                    |
|    skipped: AiderDesk, AstrBot, Autohand Code CLI, Augment, IBM Bob +48 more (project directory not found)  |
|  ✓ ~\.agents\skills\vercel-cli-with-tokens                                                                  |
|    universal: Amp, Antigravity, Antigravity CLI, Cline, Codex +18 more                                      |
|    symlinked: Claude Code, Eve, Kiro CLI                                                                    |
|    skipped: AiderDesk, AstrBot, Autohand Code CLI, Augment, IBM Bob +48 more (project directory not found)  |
|  ✓ ~\.agents\skills\vercel-optimize                                                                         |
|    universal: Amp, Antigravity, Antigravity CLI, Cline, Codex +18 more                                      |
|    symlinked: Claude Code, Eve, Kiro CLI                                                                    |
|    skipped: AiderDesk, AstrBot, Autohand Code CLI, Augment, IBM Bob +48 more (project directory not found)  |
|  ✓ ~\.agents\skills\web-design-guidelines                                                                   |
|    universal: Amp, Antigravity, Antigravity CLI, Cline, Codex +18 more                                      |
|    symlinked: Claude Code, Eve, Kiro CLI                                                                    |
|    skipped: AiderDesk, AstrBot, Autohand Code CLI, Augment, IBM Bob +48 more (project directory not found)  |
|  ✓ ~\.agents\skills\writing-guidelines                                                                      |
|    universal: Amp, Antigravity, Antigravity CLI, Cline, Codex +18 more                                      |
|    symlinked: Claude Code, Eve, Kiro CLI                                                                    |
|    skipped: AiderDesk, AstrBot, Autohand Code CLI, Augment, IBM Bob +48 more (project directory not found)  |
|                                                                                                             |
+-------------------------------------------------------------------------------------------------------------+

|
—  Done!  Review skills before use; they run with full agent permissions.

npm notice
npm notice New minor version of npm available! 11.13.0 -> 11.21.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v11.21.0
npm notice To update run: npm install -g npm@11.21.0
npm notice

可見此技能包裡面的 9 個 skills 都安裝好了 (下方都有顯示 symlinked: Claude Code), 同時也自動幫 Antigravity CLI 與 Codex 等全域環境的連結都做好了. 


4. 把網站佈署到 Vercel 雲端 : 

以上把 Vercel CLI 與佈署技能包 agent-skills 安裝好後, 就可以在 Claude Code 內開發網站專案, 完成後只要用下列提示詞 Claude Code 就會將專案佈署到 Vercel 雲端 :

請把目前的網站直接部署到 Vercel 正式環境 (Production) 並給我公開網址

請用 deploy-to-vercel 技能幫我把專案部署到 Vercel 正式環境

也可以在 PS 視窗的專案目錄下, 用下列指令佈署專案 :

PS D:\claude_code\project_1>vercel --prod --yes    

注意, 以上所安裝的佈署技能包 (agent-skills) 是安裝在共用目錄 (~\.agents\skills\) 下, Vercel CLI 為全域安裝, 且登入狀態為作業系統層級, 所以不管是 Claude Code 或 Antigravity CLI, Codex 等 AI 代理都能透過它們一鍵佈署專案. 

2026年7月22日 星期三

註冊第三個 render.com 帳戶

上週完成 serverless 改版後本想先佈署到 Mapleboard 上, 做實際驗證後再提交上傳 GitHub, 但由於 Mapleboard 站台設定引發疑似光世代數據機的雞肋防火牆阻擋問題, 導致本地的圖書館爬蟲要更新 Mapleboard 的 serverless 資料庫時偶而被阻擋, 這讓我對自架網站可靠性動搖. 反觀我架在 render.com 上的 serverless 只要定時 trigger 卻很穩定在運行, 可見雲端還是比較可靠, 所以今天又註冊了一個 render.com 帳戶來做測試. 

本系列全部測試文章索引參考 :


首先到 render.com 官網按右上角的 Sign Up 鈕進入註冊頁面 :


這次使用 Google 帳戶註冊, 過程比用 email 簡單 :




選擇 Google 帳戶後按 "繼續" 即可 : 





註冊成功直接進入 Dashboard 頁面 :



2026年2月26日 星期四

無程式碼 SaaS 開發平台 Bubble.io

最近在上課時得知一個很棒的無程式碼 SaaS 開發平台 Bubble.io :


Bubble.io 為 Emmanuel Straschnov (法國工程 & 商業背景, 哈佛 MBA) 與 Josh Haas (Harvard 畢業的程式設計師) 於 2012 年在紐約共同創立, 是一個將前端設計, 後端邏輯, 與資料庫管理整合在一起的全功能 no-code 開發平台. 他們當時觀察到一個問題 : "想創業的人遠多於會寫程式的人", 當時 Josh Haas 在紐約接觸了大量創業者, 發現許多創意發想其實不需要高度創新的技術, 然而 80% 的 Web App 需要的登入/註冊, CRUD 操作, 付款金流, Workflow, 與權限控管等功能卻每次都要由工程師從頭寫起, 於是促成了 Bubble.io 的成立, 其宗旨是要讓軟體開發不再專屬於工程師, 使不具備傳統程式開發背景的人 (就是小白啦) 也能透過視覺化的介面建立功能複雜的網頁應用程式 (Web Apps). 以下是 AI 情蒐整理. 


1. 主要功能 :
  • 視覺化拖放編輯 (Visual Editor) :
    使用者可以自由地放置按鈕, 文字, 輸入框等元件, 並可透過拖拉來調整排版.
  • 工作流邏輯 (Workflows) :
    這是 Bubble 的靈魂, 可以免程式碼設定 "當 A 發生時執行 B" 的邏輯, 例如, 當使用者點擊 "註冊" 按鈕時將資料寫入資料庫並發送驗證郵件等.
  • 內建資料庫 (Built-in Database) :
    使用者無需另外設定 SQL 或其他資料庫, 可直接在 Bubble 內部定義資料類型 (Data Types)與欄位. 
  • 強大的 API 整合 :
    雖然是 No-code, 但它支持 API Connector, 可連接任何第三方服務 (如 OpenAI, Stripe 支付, Google Maps 等). 
  • 雲端託管 : 開發完後可直接在 Bubble 的伺服器上部署上線, 不需要自己處理伺服器維護或環境設定. 

2. 優點 :
  • 開發速度極快 :
    與傳統撰寫程式碼相比, 開發時間可縮短數倍.
  • 門檻很低 :
    創業者或 PM 能夠以極低成本製作出 MVP (最小可行性產品) 來驗證市場或展示功能.
  • 靈活性高 :
    幾乎可以自定義任何視覺細節與操作邏輯. 

3. 缺點與限制 :
  • 學習曲線 :
    雖然不用寫代碼, 但因為功能極其強大, 理解其資料架構與邏輯流程仍需要一定的學習時間才能操作自如. 
  • 平台依賴性 :
    運行在 Bubble 上的應用程式無法取得原始碼移植到其他伺服器 (但資料可匯出成 CSV / JSON 下載). 
  • 效能限制 :
    對於極大規模或運算極其複雜的應用, 其性能表現可能不如原生開發. 
總之, Bubble 非常適合拿來快速驗證產品想法 (快速做出 MVP), 實作 AI / API 整合型產品, 或者當 PM 的 "可運作規格書". 不過, 在 Bubble.io 製作的 MVP 我們無法取得傳統意義上的 "原始碼", 即使是付費帳戶也不行, 因為 Bubble 是封閉的 no‑code 平台 (SaaS), 不是 code generator, 我們在 Bubble 裡做的不是寫程式碼而是在描述一個 App 的結構與行為模型, 因此它沒有一個可讀可維護的程式碼專案可以讓我們匯出, 也不能把 Bubble App 轉成一個可在外部自行部署的程式碼專案, 所製作的 App 也只能在 Bubble 的 runtime 上運行, 只有資料可匯出而已. 

Bubble.io 官網提供豐富使用教學 (英文), 參考 :


尤其是 30 分鐘的快速上手, 從註冊帳號到建立 App 手把手的互動導覽教學 :


YT 上也有豐富的教學影片, 例如 : 


下面是官方的教學影片列表 (英文) :


其它線上教材 : 


2025年12月10日 星期三

Pi 3 主機升版為 Raspberry Pi OS Trixie (32-bit Desktop)

高雄家的 Pi 3 主機因為社區網路停止服務後停擺, 申裝光世代後又因為桌面異常無法更改網路設定, 只好改燒錄新版 OS Trixie, 這回我改用官方燒錄程式 Imager, 參考 :


開機後檢查 TF 卡檔案系統 :

pi@KAO-Pi3:~ $ df -h   
Filesystem      Size  Used Avail Use% Mounted on
udev            323M     0  323M   0% /dev
tmpfs           185M  9.0M  176M   5% /run
/dev/mmcblk0p2   29G  5.3G   22G  20% /
tmpfs           461M  8.0K  461M   1% /dev/shm
tmpfs           5.0M   12K  5.0M   1% /run/lock
tmpfs           1.0M     0  1.0M   0% /run/credentials/systemd-journald.service
tmpfs           461M  171M  291M  37% /tmp
/dev/mmcblk0p1  510M  106M  405M  21% /boot/firmware
tmpfs           1.0M     0  1.0M   0% /run/credentials/getty@tty1.service
tmpfs           1.0M     0  1.0M   0% /run/credentials/serial-getty@ttyS0.service
tmpfs            93M   64K   93M   1% /run/user/1000

用掉 5.3GB, 還有 22GB 可用. 

首先安裝 VNC 遠端桌面, 參考 :


接著安裝 Anydesk, 因 OS 是 32 位元故要安裝 armhf 版的 anydesk, 只有舊的 6.3.0 版可下載 :




但安裝時出現錯誤 :




詢問 AI 得知 Anydesk 目前僅支援 64 位元 OS (似乎已放棄 32 位元), 所以只好放棄安裝. 

Trixie 內建 Python 3.13 版環境 : 

pi@KAO-Pi3:~ $ python   
Python 3.13.5 (main, Jun 25 2025, 18:55:22) [GCC 14.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

然後是建立 Python 共用虛擬環境來安裝常用套件, 參考 : 


注意, 不要在此共用虛擬環境安裝 streamlit, 它依賴的底層 C 程式會破壞 pandas 等套件之運作, 要用單獨的虛擬環境安裝 streamlit. 

pi@KAO-Pi3:~ $ python -m venv myenv313   
pi@KAO-Pi3:~ $ ls -ls   
total 36
4 drwxrwxr-x 2 pi pi 4096 Dec  4 22:56 Desktop
4 drwxr-xr-x 2 pi pi 4096 Dec  4 22:56 Documents
4 drwxr-xr-x 2 pi pi 4096 Dec  9 07:05 Downloads
4 drwxr-xr-x 2 pi pi 4096 Dec  4 22:56 Music
4 drwxrwxr-x 5 pi pi 4096 Dec  9 10:37 myenv313  
4 drwxr-xr-x 2 pi pi 4096 Dec  4 22:56 Pictures
4 drwxr-xr-x 2 pi pi 4096 Dec  4 22:56 Public
4 drwxr-xr-x 2 pi pi 4096 Dec  4 22:56 Templates
4 drwxr-xr-x 2 pi pi 4096 Dec  4 22:56 Videos

這樣便建立了一個虛擬環境資料夾 myenv313, 用下列指令進入虛擬環境 : 

pi@KAO-Pi3:~ $ source myenv313/bin/activate    
(myenv313) pi@KAO-Pi3:~ $

接下來即可在此虛擬環境用 pip 安裝套件了. 


1. 資料科學基礎套件 : 

pip install numpy==2.2.6
pip install pandas
pip install scipy
pip install matplotlib
pip install seaborn
pip install bokeh
pip install plotly
pip install scikit-learn

註 : 因 pandas-ta 0.4.71b 依賴 numpy 2.2.6, 故先行指定此版本. 


2. 深度學習框架 : 

pip install torch torchvision torchaudio


3. Web UI : 

pip install django
pip install gradio

註 : streamlit 依賴許多 C extension, 與樹莓派 Trixie 的 Python 3.13 部分不相容, 會導致 Python 執行環境崩潰, 勿安裝. 


4. 爬蟲 : 

pip install html5lib
pip install selenium
pip install scrapy


5. 量化投資 : 

pip install yfinance
pip install twstock
pip install mplfinance
pip install ta
pip install kbar
pip install backtrader
pip install pyfolio-reloaded


6. Bot 套件 : 

pip install line-bot-sdk
pip install python-telegram-bot


7. LLM 套件 : 

pip install openai
pip install google-generativeai


2025年11月19日 星期三

如何刪除 VNC Cloud 上登錄的主機

最近將 Pi 400 加入 VNC Cloud, 但是 Lite 帳戶最多只能登錄三台電腦, 之前舊的已下線電腦仍掛在 team 列表中佔著位置的話, 新電腦登入帳號時會被拒絕, 要先刪除舊主機才行, 先到 VNC 管理頁面登入帳號 : 


點擊左方導覽列 Devices 下的 Computers : 




在右方會列出所有電腦 (Lite 最多只有三台), 點擊要刪除的電腦最右邊 Actions 欄的三個小點, 點選 Remove from team 即可 : 




重新登入 VNC Viewer 後這台電腦就會在 team 列表中消失, 新電腦才能登入此帳戶. 


2025年11月18日 星期二

樹莓派 Pi 3A+ Raspberry Pi OS Trixie Lite 設定 (二)

用 raspi-config 做完 Raspberry Pi OS Trixie Lite 的基本設定連上網路後, 接下來最重要的便是遠端連線了, 由於 Lite 版的樹莓派 OS 沒有桌面環境, 所以無法使用 VNC Cloud/Server, 加上我這台 Pi 3A+ 放在高雄家的社區網路內, 也無法使用 Port forwarding 穿牆, 想用 ssh 遠端連線最簡單方便的做法便是透過 ngrok 提供的 TCP 連線. 


1. 註冊 ngrok 取得 authtoken :  

首先到 Ngrok 網站註冊帳號 : 






註冊完進入 ngrok 官網的 setup&instalation 頁面 : 




將其中第二項的的授權碼複製下來, 記在文字檔中備用 :




注意, 如果有啟用 MFA 驗證機制, 登入時會要求輸入驗證碼, Android 用戶可以用 Google Authenticator App 取得驗證碼 :




參考 : 



2. 下載 GPG 公鑰存入信任金鑰資料夾 :  

首先用 curl 指令從 ngrok 官方網站下載 GPG 公鑰用來驗證套件來源的合法性, 然後用 tee 指令將下載的公鑰寫入系統的 APT 信任金鑰資料夾, 這兩個指令的目的是要讓 APT 安裝 ngrok 時能驗證來源安全, 避免下載到偽造之套件 : 

pi@pi3aplus:~ $ curl -s https://ngrok-agent.s3.amazonaws.com/ngrok.asc | sudo tee /etc/apt/trusted.gpg.d/ngrok.asc
-----BEGIN PGP PUBLIC KEY BLOCK-----

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
/7JXRqfXsWxyTbOUVnmRWIXPXHU=
=ghCR
-----END PGP PUBLIC KEY BLOCK-----


3. 將套件來源寫入新的列表檔 :   

用 echo 指令生成一行 APT 軟體源列表, 用來指定 ngrok 官方套件的來源; 再用 tee 指令將這個套件源寫入新的列表檔, 這樣 APT 就知道從這個來源抓 ngrok 套件 : 

pi@pi3aplus:~ $ echo "deb https://ngrok-agent.s3.amazonaws.com buster main" | sudo tee /etc/apt/sources.list.d/ngrok.list
deb https://ngrok-agent.s3.amazonaws.com buster main
pi@pi3aplus:~ $ sudo apt update
已有:1 http://deb.debian.org/debian trixie InRelease
已有:2 http://deb.debian.org/debian trixie-updates InRelease
已有:3 http://deb.debian.org/debian-security trixie-security InRelease
下載:4 https://ngrok-agent.s3.amazonaws.com buster InRelease [20.3 kB]
下載:5 http://archive.raspberrypi.com/debian trixie InRelease [54.9 kB]
下載:6 https://ngrok-agent.s3.amazonaws.com buster/main armhf Packages [9,550 B]
下載:7 https://ngrok-agent.s3.amazonaws.com buster/main arm64 Packages [9,531 B]
下載:8 http://archive.raspberrypi.com/debian trixie/main arm64 Packages [363 kB]
取得 457 kB 用了 3s (150 kB/s)
All packages are up to date.


4. 安裝 ngrok 套件 :   

經過上面準備後, 即可用 apt 下載安裝 ngrok 了 : 

pi@pi3aplus:~ $ sudo apt install ngrok   
Installing:
  ngrok

Summary:
  Upgrading: 0, Installing: 1, Removing: 0, Not Upgrading: 0
  Download size: 5,835 kB
  Space needed: 0 B / 26.9 GB available

下載:1 https://ngrok-agent.s3.amazonaws.com buster/main arm64 ngrok arm64 3.33.0 [5,835 kB]
取得 5,835 kB 用了 27s (215 kB/s)
選取了原先未選的套件 ngrok。
(讀取資料庫 ... 目前共安裝了 70933 個檔案和目錄。)
正在準備解包 .../ngrok_3.33.0_arm64.deb……
Unpacking ngrok (3.33.0) ...
設定 ngrok (3.33.0) ...


5. 將 ngrok 帳號授權與主機綁定 : 

用 ngrok config add-authtoken <YOUR_TOKEN> 指令將 ngrok 授權寫到機器裡, 這會建立一個  ngrok 設定檔 ~/.config/ngrok/ngrok.yml, 以後啟動 TCP, HTTPS, SSH 等隧道時就不需要再用 email , 密碼, 或 MFA 登入 ngrok, 直接用這個 token 代表我們的 ngrok 帳號, 這樣啟動隧道時不會跳出登入畫面, 就算是未來重開機, 或重跑 ngrok 都不用登入或被要求 MFA 驗證 :

pi@pi3aplus:~ $ ngrok config add-authtoken 1n4EbyjkVWZ1RXPyZVSQ1ToNY1966_3kbM2zgjAt62W7RGhsx1L    (此為範例 token)
Authtoken saved to configuration file: /home/pi/.config/ngrok/ngrok.yml


6. 建立 ngrok TCP 隧道並取得埠號 :  

所謂的隧道 (tunnel) 是從外網透過 ngrok 走到樹莓派主機的路徑, 因為 Pi 3 A+ 主機是在社區網路內網, 其私有 IP (192.168.x.x) 從外網無法連線, 建立一個 ngrok 的 TCP 隧道就是幫我們的主機在 ngrok 的伺服器上開一個公開的 TCP 埠號, 這樣送到 ngrok 此埠號的資料就會送到我們的主機的某個埠號了, 換句話說, 就是讓 ngrok 幫我們開一個在 Internet 上能連到我們主機的入口, 毋須使用公網 IP. 

以下為透過 ngrok 建立 TCP 隧道的 Python 程式 :

pi@pi3aplus:~ $ nano ngrok_tcp.py  

# ngrok_tcp.py
import subprocess
import time
import requests

# 1. 啟動 ngrok TCP 隧道(背景執行)
subprocess.Popen(["ngrok", "tcp", "22", "--log", "stdout"])

time.sleep(5)  # 等 ngrok 啟動

# 2. 取得隧道資訊
try:
    r = requests.get("http://127.0.0.1:4040/api/tunnels")
    data = r.json()
    for t in data['tunnels']:
        if t['proto'] == 'tcp':
            public_url = t['public_url']
            print("Public TCP URL:", public_url)
except Exception as e:
    print("Error:", e)

執行 ngrok_tcp.py : 

pi@pi3aplus:~ $ python ngrok_tcp.py  
INFO[11-18|00:55:27] no configuration paths supplied
INFO[11-18|00:55:27] using configuration at default config path path=/home/pi/.config/ngrok/ngrok.yml
INFO[11-18|00:55:27] open config file path=/home/pi/.config/ngrok/ngrok.yml err=nil
t=2025-11-18T00:55:28+0800 lvl=info msg="FIPS 140 mode" enabled=false
t=2025-11-18T00:55:28+0800 lvl=info msg="starting web service" obj=web addr=127.0.0.1:4040 allow_hosts=[]
t=2025-11-18T00:55:29+0800 lvl=info msg="client session established" obj=tunnels.session
t=2025-11-18T00:55:29+0800 lvl=info msg="tunnel session started" obj=tunnels.session
t=2025-11-18T00:55:29+0800 lvl=info msg="started tunnel" obj=tunnels name=command_line addr=//localhost:22 url=tcp://0.tcp.ap.ngrok.io:19669
t=2025-11-18T00:55:32+0800 lvl=info msg=start pg=/api/tunnels id=2f56e23924a75aa0
t=2025-11-18T00:55:32+0800 lvl=info msg=end pg=/api/tunnels id=2f56e23924a75aa0 status=200 dur=2.126497ms
Public TCP URL: tcp://0.tcp.ap.ngrok.io:19669

可見 ngrok 已建立埠號為 19669 的 TCP 隧道, 網址為  :

tcp://0.tcp.ap.ngrok.io:19669   (此為範例埠號)


7. 用 ssh 遠端連線 : 

從遠端 (我的 LG Gram) 用 ssh 連線位於社區網路防火牆後面的 Pi 3A+ 主機 :

C:\Users\tony1>ssh pi@0.tcp.ap.ngrok.io -p 19669   
The authenticity of host '[0.tcp.ap.ngrok.io]:19669 ([18.141.106.224]:19669)' can't be established.
ED25519 key fingerprint is SHA256:4BubX0iFouGpd/DtCG1966... (略) .....
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[0.tcp.ap.ngrok.io]:19669' (ED25519) to the list of known hosts.
pi@0.tcp.ap.ngrok.io's password:
Linux pi3aplus 6.12.47+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.12.47-1+rpt1 (2025-09-16) aarch64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Nov 18 00:18:43 2025 from 192.168.50.76

連線成功! 出現樹莓派終端機提示號 : 

pi@pi3aplus:~ $ ls -ls  
總用量 4
4 -rw-rw-r-- 1 pi pi 518 11月 18 00:54 ngrok_tcp.py
pi@pi3aplus:~ $   

Lite 版的 Raspberry Pi OS 使用者根目錄果然很乾淨, 目前只有上面的建立 TCP 隧道的程式 ngrok_tcp.py 而已, 沒有桌面環境效能更好. 


2025-12-04 補充 :

由於社區網路只剩五戶參加, 主辦的九樓張先生會賠本決定結束營業, 我 12/1 去中華電信申辦光世代 300M, 昨天工程師來拉光纖裝機, 我也同步把 Pi 3A+ 的連線 SSID 更換, 重新執行上面的 ngrok_tcp.py 程式卻出現如下錯誤 :

d:\python\test>ssh pi@0.tcp.jp.ngrok.io -p 18959    
The authenticity of host '[0.tcp.jp.ngrok.io]:18959 ([3.114.158.133]:18059)' can't be established.
ED25519 key fingerprint is SHA256:4BubX0iFouGpd/DtC... (略) ....
This host key is known by the following other names/addresses:
    C:\Users\tony1/.ssh/known_hosts:1: [0.tcp.ap.ngrok.io]:19669
Are you sure you want to continue connecting (yes/no/[fingerprint])?
Host key verification failed.

詢問 AI 得知原來我的筆電 C:\Users\tony1\.ssh\known_hosts 裡已經記錄過之前那個 ngrok 伺服器的 SSH 金鑰 : 

[0.tcp.ap.ngrok.io]:19669

由於 ngrok 每次重新連線都會分配不同伺服器, 也會有不同的 Host Key, SSH 發現同一個主機名稱但金鑰不一樣而覺得可疑便拒絕連線, 這是 SSH 的安全機制.

用 type 指令列印使用者目錄底下的 .ssh\known_hosts 檔就能看到之前的連線資訊 : 

d:\python\test>type C:\Users\tony1\.ssh\known_hosts     
[0.tcp.ap.ngrok.io]:19669 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAA ... (略) ...
[0.tcp.ap.ngrok.io]:19669 ssh-rsa AAAAB3NzaC1yc2EAAAADAQAB ... (略) ...
[0.tcp.ap.ngrok.io]:19669 ecdsa-sha2-nistp256 AAAAE2VjZHNhL ... (略) ...

最簡單的解決方法式用下列指令刪除 known_hosts 裡與 ngrok 相關的舊紀錄 :  

d:\python\test>ssh-keygen -R "[0.tcp.ap.ngrok.io]:19669" 
# Host [0.tcp.ap.ngrok.io]:19669 found: line 1
# Host [0.tcp.ap.ngrok.io]:19669 found: line 2
# Host [0.tcp.ap.ngrok.io]:19669 found: line 3
C:\Users\tony1/.ssh/known_hosts updated.
Original contents retained as C:\Users\tony1/.ssh/known_hosts.old

然後連線新的伺服器就不會出現 Host key verification 失敗訊息了 :

d:\python\test>ssh pi@0.tcp.jp.ngrok.io -p 18959   
pi@0.tcp.jp.ngrok.io's password:  (輸入密碼)
Linux pi3aplus 6.12.47+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.12.47-1+rpt1 (2025-09-16) aarch64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Dec  3 21:49:43 2025 from ::1
pi@pi3aplus:~ $  


2025-12-08 補充 :

如果忘記或未記下 ngrok 產生的網址, 可以到原主機上用 curl 查詢 tunnels :

pi@pi3aplus:~ $ curl http://localhost:4040/api/tunnels   
{"tunnels":[{"name":"command_line","ID":"acc9f9c13483e07a123456735c8ce82f","uri":"/api/tunnels/command_line","public_url":"tcp://0.tcp.jp.ngrok.io:18959","proto":"tcp","config":{"addr":"localhost:22","inspect":false},"metrics":{"conns":{"count":17,"gauge":1,"rate1":2.964393875e-314,"rate5":7.937875243996238e-142,"rate15":6.890263591892029e-50,"p50":308761884155,"p90":1365783669392.4001,"p95":1756118554850,"p99":1756118554850},"http":{"count":0,"rate1":0,"rate5":0,"rate15":0,"p50":0,"p90":0,"p95":0,"p99":0}}}],"uri":"/api/tunnels"}

其中 public_url 屬性即為公開網址. 


2025-12-11 補充 : 

我之前測試 WordPress 網站時用過 ngrok, 那時用 wget 下載 zip 檔解壓後使用, 參考 : 


用 sudo apt install ngrok 安裝的 ngrok 通常是舊版 (V1 版本), 軟體倉庫中的版本更新較慢, 現在官方主推 V3 版, 用 wget 下載的則最新版本 (目前為 V3), 支援所有最新的 ngrok 功能, 指令和連線協定. 可從 ngrok 儀表板取得最新連結 : 


wget https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-v3-stable-linux-arm64.tgz (64 位元)
wget https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-v3-stable-linux-arm.tgz (32 位元)



樹莓派 Pi 3A+ Raspberry Pi OS Trixie Lite 設定 (一)

之前我在 Pi 3A+ 的 TF 卡燒錄 Raspberry Pi OS Buster, 發現因為內建 Python 3.7 實在太舊了, 許多套件例如 Selenium 都無法順利安裝, 且只有 512MB DRAM 跑 Desktop 效能不佳, 決定找另一張 32GB 卡來燒錄最新的 Raspberry Pi OS Trixie Lite (無桌面僅終端機介面), Trixie 內建 Python 3.13 夠新, 不用擔心套件安裝問題 :





燒錄完放進 Pi 3A+, 因為無桌面故不需要滑鼠, 只要鍵盤即可, 開機後會出現設定選單 :
  • "Keyboard layout" : 要選最底下 Others 按 Enter. 
  • "Country of origin for the keyboard" : 選 English (US)
  • "Please enter new username" : 設定新帳號 (例如 pi)
  • "Please set a password for pi" : 設定登入密碼
然後會自動進入 raspi-config 設定畫面, 先進 1 System Options :




進入 S1 Wireless LAN :




輸入 SSID : 




輸入基地台連線密碼 :




接下來會出現 "Select the country in which the Pi is to be used", 選 TW Taiwan 即完成 WiFi 設定. 

進入 3 Interface Options :




進入 I1 SSH :




按 "是" 開啟 SSH :




進入 5 Localization Options : 




進入 L1 Locale :





拉到最底下, 用 Space 鍵勾選 zh_TW.UTF-8 UTF-8 這項 :




選擇 zh_TW.UTF-8 按確定即完成 Locale 設定 : 




進入 L2 Timezone : 




選擇 Asia :




選擇 Taipei 按確定 : 




進入 L3 Keyboard :




選擇 Generic 105-key PC :




選擇 English (US) : 




鍵盤排列方式預設值 (The default for the keyboard layout) 選 "沒有 AltGr 鍵 (No AltGr key)"




組合鍵 (Compose key) 選 "沒有 Compose 鍵 (No compose key)" :




進入 L4 WLAN Country :




國家選擇 TW Taiwan 按確定 :





最後進入 6 Advanced Options :




進入 A1 Extend Filesystem :




按確定擴展檔案系統 : 




設定完按 Tab 鍵移到 Finish 按 Enter 跳出設定選單 :




重開機 : 

pi@pi3aplus:~ $ sudo reboot    

用 ifconfig 檢視 IP  :

pi@pi3aplus:~ $ ifconfig   
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 28522  bytes 3720832 (3.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 28522  bytes 3720832 (3.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.50.235  netmask 255.255.255.0  broadcast 192.168.50.255
        inet6 fe80::f11e:cbf7:f78f:3e21  prefixlen 64  scopeid 0x20<link>
        ether b8:27:eb:28:c8:a0  txqueuelen 1000  (Ethernet)
        RX packets 101300  bytes 42894353 (40.9 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 83033  bytes 8314390 (7.9 MiB)
        TX errors 0  dropped 2 overruns 0  carrier 0  collisions 0

Ping 一下谷歌看看外網連線是否 OK :

pi@pi3aplus:~ $ ping google.com   
PING google.com (142.250.196.206) 56(84) bytes of data.
64 bytes from nctsaa-ac-in-f14.1e100.net (142.250.196.206): icmp_seq=1 ttl=115 time=11.8 ms
64 bytes from nctsaa-ac-in-f14.1e100.net (142.250.196.206): icmp_seq=2 ttl=115 time=11.8 ms
64 bytes from nctsaa-ac-in-f14.1e100.net (142.250.196.206): icmp_seq=3 ttl=115 time=13.5 ms
64 bytes from nctsaa-ac-in-f14.1e100.net (142.250.196.206): icmp_seq=4 ttl=115 time=13.9 ms
64 bytes from nctsaa-ac-in-f14.1e100.net (142.250.196.206): icmp_seq=5 ttl=115 time=10.7 ms
64 bytes from nctsaa-ac-in-f14.1e100.net (142.250.196.206): icmp_seq=6 ttl=115 time=15.3 ms
64 bytes from nctsaa-ac-in-f14.1e100.net (142.250.196.206): icmp_seq=7 ttl=115 time=13.2 ms
^C
--- google.com ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 6009ms
rtt min/avg/max/mdev = 10.706/12.892/15.285/1.431 ms

用 df -h 檢視 TF 卡容量是否已擴展 :

pi@pi3aplus:~ $ df -h    
檔案系統        容量  已用  可用 已用% 掛載點
udev             74M     0   74M    0% /dev
tmpfs            84M  2.9M   81M    4% /run
/dev/mmcblk0p2   29G  2.5G   25G   10% /
tmpfs           209M     0  209M    0% /dev/shm
tmpfs           5.0M   12K  5.0M    1% /run/lock
tmpfs           1.0M     0  1.0M    0% /run/credentials/systemd-journald.service
tmpfs           209M     0  209M    0% /tmp
/dev/mmcblk0p1  510M   66M  445M   13% /boot/firmware
tmpfs           1.0M     0  1.0M    0% /run/credentials/getty@tty1.service
tmpfs            42M  8.0K   42M    1% /run/user/1000

標示 32GB 的 TF 實際上是 29GB, 可見已擴展. 


2025-12-11 補充 : 

最近發現我好像下載到 64 位元的 Trixie Lite, 應該要 32 位元較好, 雖然 Pi 3A+ 是 64 位元架構, 但因只有 512MB 記憶體, 若安裝 64-bit OS, 會較吃記憶體.