by Rain Chu | 4 月 1, 2026 | Agent, AI, OpenClaw
如果你想使用 OpenClaw 這類 AI Agent 工具,大多需要一台電腦或伺服器來執行。
但現在,你甚至可以用「一支舊 Android 手機」來打造一個 隨身遠端 AI 控制節點!
👉 沒錯,舊手機不再只是備用機,而是可以變成:
這篇文章會帶你一步步完成:
📌 在 Android 手機上透過 Termux 安裝 OpenClaw,並實現遠端操控能力
🎯 為什麼要用「舊 Android 手機 + OpenClaw」?
📸 使用場景示意
4
✅ 核心優勢
1️⃣ 硬體要求低(舊手機就能跑)
- 不需要高效能 CPU / GPU
- 2GB~4GB RAM 就能運作
- 廢棄手機再利用
2️⃣ 可直接使用手機硬體能力
👉 不同於傳統 server,你可以用:
- 📷 相機(影像輸入)
- 🎤 麥克風(語音控制)
- 📶 行動網路(隨時在線)
3️⃣ 隨身攜帶的 AI 控制中心
- SSH 控制 GCP / VM
- 呼叫 AI Agent workflow
- 當 DevOps 控制台
4️⃣ 比舊電腦更省電、更穩定
🧠 系統架構
Android 手機 -> Termux (Linux 環境) -> OpenClaw Agent -> Local AI / Server / GCP
👉 手機只是「控制層」,重運算仍在雲端
以下安裝方法 2 選 1 ,薪水推薦用 APK
🛠️ 安裝流程(APK)
🔗 官方下載
👉 來源:
https://github.com/mithun50/openclaw-termux/releases/
📱 Step 1:下載 APK
在 Releases 頁面找:
👉 通常名稱會像:
openclaw-android.apk
或
app-release.apk
下載到手機
🔐 Step 2:允許安裝未知來源
Android 需要開:
👉 設定 → 安全性
👉 允許「未知來源」
📲 Step 3:安裝 APK
直接點 APK:
👉 完成後會出現 App(OpenClaw)
⚙️ Step 4:準備 Backend(重點)
👉 APK 本身不會跑 AI
你需要一個 Gateway:
方法 A(最推薦)
👉 手機本機跑:
👉 流程:
APK → localhost:port
方法 B(更穩定)
👉 連 GCP:
APK → GCP VM(OpenClaw)
🔗 Step 5:連線 OpenClaw Gateway
打開 APK → 設定連線:
方式 1:自動配對
方式 2:手動輸入
Host: 你的IP
Port: 3000 / 8080(依你設定)
Token: Gateway Token
👉 官方說明支援:
- manual host/port
- token / TLS
🧪 Step 6:測試
成功後你可以:
🛠️ 安裝流程(完整實戰)
📱 Step 1:安裝 Termux
👉 使用:
Termux
⚠️ 注意:
- 請從 F-Droid 安裝(不要用 Play 商店版本)
🔄 Step 2:更新環境
pkg update && pkg upgrade -y
pkg install git wget curl -y
📦 Step 3:安裝 OpenClaw
👉 官方 repo:
openclaw-termux
git clone https://github.com/mithun50/openclaw-termux.git
cd openclaw-termux
bash install.sh
⚙️ Step 4:啟動服務
bash start.sh
啟動後你會看到:
🌐 遠端操控方式
方法一:瀏覽器控制
👉 手機或電腦打開:
http://手機IP:PORT
方法二:API / AI Agent 控制
👉 你可以串:
- LangChain
- Local AI Agent
- webhook
方法三:SSH 進手機
pkg install openssh
sshd
⚡ 進階玩法
🔥 架構升級
👉 也可以這樣玩:
手機(OpenClaw)-> 控制指令 -> GCP VM(AI模型)-> 回傳結果
🤖 實際應用
- 📊 自動抓資料 → 分析 → 回報
- 🧠 控制 Ollama AI 模型
- 🏠 智慧家居控制中心
- 📡 遠端監控節點
⚠️ 注意事項(實戰會踩雷)
❌ Android 限制
❌ Port 問題
👉 常見:
lsof -i :8080
❌ 效能限制
👉 不適合:
❌ 手機連不到內網
👉 用:
❌ 以為 APK = 完整系統
👉 錯
👉 APK 只是 UI
❌ Port 連不到
👉 要開:
ufw allow 3000
❌ Gateway 沒啟動
openclaw gateway
🧠 舊手機 vs 舊電腦
| 項目 | 舊手機 | 舊電腦 |
|---|
| 功耗 | ⭐⭐⭐⭐ | ⭐ |
| 攜帶性 | ⭐⭐⭐⭐ | ⭐ |
| 穩定性 | ⭐⭐⭐ | ⭐⭐ |
| 擴充性 | ⭐ | ⭐⭐⭐⭐ |
👉 結論:
📌 手機適合「控制節點」,電腦適合「運算節點」
參考資訊
官方網站
https://github.com/mithun50/openclaw-termux
下載最新版本
https://github.com/mithun50/openclaw-termux/releases
by Rain Chu | 3 月 12, 2026 | Docker, google, wordpress
在管理多個 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 負載平衡器 。
- 建立 Serverless NEG:讓負載平衡器找到 Cloud Run 。
- 設定前端 IP:保留一個靜態全域 IP。
- Google 管理憑證:在前端設定中新增網域,Google 會自動處理 SSL 簽發與續期 。
- 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 。
參考資料
by Rain Chu | 2 月 11, 2026 | PHP, 程式
最近我的伺服器突然出現網站 502 錯誤,檢查後發現 php8.2-fpm 服務竟然被系統強制終止。透過一系列排查,最終確認是 Linux OOM Killer(Out Of Memory) 觸發導致。
這篇文章整理完整排查過程與解決方案,提供給遇到相同問題的人參考。
📌 問題現象
使用 systemctl status php8.2-fpm 發現:
Active: failed (Result: oom-kill)
進一步檢查 kernel log:
Out of memory: Killed process 7057 (php-fpm8.2)
anon-rss:283560kB
shmem-rss:119848kB
代表:
- 系統記憶體耗盡
- Linux 啟動 OOM Killer
- 強制殺掉 php-fpm worker
🔍 進一步分析
查看當時 PHP worker 記憶體使用情況:
ps -o pid,rss,etime,cmd -C php-fpm8.2 --sort=-rss | head -n 20
當時結果顯示:
RSS 約 250MB ~ 325MB/每個 worker
而之前狀態顯示:
Processes active: 80
idle: 0
🔥 問題核心
如果每個 worker 約 300MB:
但機器只有:
👉 記憶體一定會爆。
🧠 伺服器環境
這代表:
- 沒有 swap 作為緩衝
- 一旦瞬間記憶體尖峰,直接 OOM
🛠 解決方案
✅ 1️⃣ 建立 8GB Swap(防止再次 OOM)
sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
確認:
結果:
建議調整 swappiness
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl -p /etc/sysctl.d/99-swappiness.conf
✅ 2️⃣ 調整 PHP-FPM 設定(關鍵)
編輯:
/etc/php/8.2/fpm/pool.d/www.conf
修改為:
pm = dynamic
pm.max_children = 25
pm.start_servers = 6
pm.min_spare_servers = 4
pm.max_spare_servers = 10
pm.max_requests = 500
為什麼設 25?
假設每個 worker 約 150MB:
在 15GB RAM 環境下非常安全。
✅ 3️⃣ 開啟 Slow Log(抓出慢請求)
在 www.conf 加入:
request_slowlog_timeout = 10s
slowlog = /var/log/php8.2-fpm/www-slow.log
request_terminate_timeout = 60s
建立目錄:
sudo mkdir -p /var/log/php8.2-fpm
sudo chown -R www-data:www-data /var/log/php8.2-fpm
sudo systemctl restart php8.2-fpm
查看慢請求:
sudo tail -f /var/log/php8.2-fpm/www-slow.log
📊 調整後效果
重啟後查看:
ps -o pid,rss,etime,cmd -C php-fpm8.2 --sort=-rss | head -n 20
結果:
RSS 約 100MB ~ 170MB
ELAPSED 僅 20 秒左右
✔ 不再出現 300MB 以上肥 worker
✔ 不再出現 active 80
✔ 系統穩定運作
🎯 問題總結
本次 OOM 原因:
pm.max_children 設定過高
- 每個 worker 記憶體使用偏高
- 沒有 swap 緩衝
- 慢請求導致 worker 堆積
最終解法:
- 限制 max_children
- 建立 swap
- 開 slowlog 抓慢請求
- 設定 max_requests 避免 memory leak
🚀 建議最佳實務
| 設定 | 建議 |
|---|
| Swap | 一定要有(至少 4GB) |
| max_children | 用 RAM / worker RSS 計算 |
| max_requests | 300~1000 |
| slowlog | 必開 |
| request_terminate_timeout | 必設 |
📌 結論
OOM Killer 不是錯誤,它是保護機制。
真正的問題通常是:
- PHP-FPM 設定不合理
- 慢請求堆積
- 記憶體容量與負載不匹配
只要正確限制 worker 數量並建立 swap,伺服器穩定度會大幅提升。
如果你也遇到 php-fpm 被 OOM kill 的問題,希望這篇實戰紀錄能幫助你快速排查與解決。
相關資訊
近期留言