這份文件整理 Git、WordPress、Monitoring 與 Server 的日常指令。指令均由 orca-shkit dispatcher 呼叫 scripts/ 底下的腳本。
同步到虎鯨官網的文章,連結orca-wp-cli 虎鯨助手執行 https://orca-biz.com/manual/orca-shkit-cmd
快速查表
# 更新單站主題與 orca-* 外掛
orca-shkit-git git-pull-app-theme example example.com
# 依 domains_wp_plugins.json 預覽單站外掛更新
orca-shkit-wordpress update-wp-plugins --site example.com --dry-run
# 本機查最近 15 分鐘哪站疑似被打
orca-shkit-monitoring find-ddos-logs -m 15 -n 30 --cf-only
# 檢查單站公開首頁 5xx,不發 Slack
orca-shkit-monitoring cron-watchdog-homepage --domain example.com --dry-run
# 預覽 root crontab 變更
orca-shkit-server refresh-orca-crontab --user root
# 預覽哪些站台需要關閉 WP_DEBUG
orca-shkit-wordpress disable-wp-debug
# 預覽全站既有 debug.log 與預計釋放容量
orca-shkit-server clear-wordpress-debug-logs
# 重啟 PHP-FPM、檢查 socket 並 reload Nginx
orca-shkit-server restart-php-fpm
# 依 domains_wp_plugins.json 批次更新外掛
sudo orca-shkit-wordpress update-wp-plugins
# 中斷後從指定站續跑(包含該站)
sudo orca-shkit-wordpress update-wp-plugins --start-from example.com
# 預覽 Nginx 主設定與四份相依 conf 部署
sudo orca-shkit-server deploy-nginx-conf --dry-run
執行入口
Cloud 主機已安裝全域 symlink 時:
orca-shkit-git list
orca-shkit-wordpress list
orca-shkit-monitoring list
orca-shkit-server list
Mac 本機或 repo 內測試時:
cd /Library/WebServer/Documents/orca_shkit
./orca-shkit categories
./orca-shkit git list
./orca-shkit wordpress list
./orca-shkit monitoring list
./orca-shkit server list
全域指令是指向 repo 內 orca-shkit 的 symlink。現有 scripts/<module>/ 裡新增或修改 .sh 後通常無需重新安裝;只有 symlink 不存在、指錯 repo、更換 bin dir 或新增公開 module 時才重跑:
cd /home/orca/orca_shkit
sudo ./orca-shkit install /usr/local/bin
ls -l /usr/local/bin/orca-shkit*
Git
Git 模組會對正式站的 theme/plugin repository 執行 pull,目前沒有 dry-run。先確認站台、branch 與 dirty worktree,優先從單站開始。
更新單站的單一外掛
orca-shkit-git git-pull-app-plugin \
APP_NAME \
example.com \
orca-example
APP_NAME 是現有腳本保留的第一參數;日常使用可與外掛名稱相同:
orca-shkit-git git-pull-app-plugin \
example \
example.com \
orca-example
可選擇在 pull 後清除 WP Rocket 快取或 reload PHP-FPM:
orca-shkit-git git-pull-app-plugin \
example \
example.com \
orca-example \
--clear-cache \
--reload-php-fpm
更新單站主題與全部 orca-* 外掛
orca-shkit-git git-pull-app-theme \
example \
example.com
第一參數是主題目錄名稱,第二參數可用 domain 或完整 WordPress 路徑:
orca-shkit-git git-pull-app-theme \
example \
example.com \
--clear-cache \
--reload-php-fpm
這支會更新指定主題、站內所有 orca-* Git 外掛、刷新 rewrite,並執行首頁健康檢查。
更新 WooPlus 外掛組
orca-shkit-git git-pull-app-wooplus-plugin \
wooplus \
example.com
目前包含:
orca-wooplusorca-wooplus-gatewayorca-wooplus-subscription
全主機批次更新
orca-shkit-git git-pull-apps-theme
如果要連帶清快取與 reload PHP-FPM:
orca-shkit-git git-pull-apps-theme \
--clear-cache \
--reload-php-fpm
這支會掃描
/home/wwwroot並更新全部站台,沒有 dry-run。應先用git-pull-app-theme測單站。
WordPress
依 JSON 更新外掛與續跑
統一使用 update-wp-plugins,掃描 /home/wwwroot 第一層站台。正式主機需有 wp、jq、curl 與 unzip;腳本會以站台目錄擁有者執行 WP-CLI。
先建立本次更新清單;domains_wp_plugins.json 已加入 .gitignore,每台主機自行維護。檔案已存在時不要覆蓋原設定:
cd /home/orca/orca_shkit
cp -n domains_wp_plugins.example.json domains_wp_plugins.json
vi domains_wp_plugins.json
清單範例:
{
"*": ["seo-by-rank-math"],
"example.com": ["elementor", "wp-rocket"],
"skip.example.com": []
}
Key 必須是站台資料夾名稱,不含 https:// 或路徑。* 是可選的全站共用清單;單站清單完全覆蓋 *,不會合併,空陣列表示略過該站。若只要更新指定幾站,省略 * 即可。scripts/wordpress/sites_ignore.json 的外掛排除規則在全站、單站與續跑模式都會生效。
先 dry-run 單站:
sudo orca-shkit-wordpress update-wp-plugins \
--site example.com \
--dry-run
Dry-run 全站:
sudo orca-shkit-wordpress update-wp-plugins \
--dry-run
正式更新單站:
sudo orca-shkit-wordpress update-wp-plugins \
--site example.com
依清單正式全站更新:
sudo orca-shkit-wordpress update-wp-plugins
中斷後從指定站續跑(包含起點;別名 --resume-from):
sudo orca-shkit-wordpress update-wp-plugins --start-from example.com --dry-run
sudo orca-shkit-wordpress update-wp-plugins --start-from example.com
常用選項:
--config FILE:使用另一份 JSON 清單。--source-root DIR:站台根目錄(預設/home/wwwroot,只掃描第一層)。--archive-dir DIR:共用 ZIP 目錄(預設/home/orca/wp_plugins)。--start-from SITE:略過起點之前的資料夾,不可與--site同用;找不到起點會報錯。--backup-dir DIR:DB 備份根目錄(預設/root)。--no-slack:不送出最後的失敗摘要。--no-db-backup:關閉正式更新前的 DB 備份,不建議。
--dry-run 不下載 ZIP、不修改外掛或備份 DB;WP-CLI 載入 WordPress 時仍可能刷新更新資訊快取。確認單站預覽後,先正式更新單站,再預覽及執行全站。
預設更新到各站外掛更新來源回報的最新版,從 update_version 與 update_package 取得版本及下載網址。共用 ZIP 存在 /home/orca/wp_plugins/<slug>-<version>.zip,相同版本已有有效 ZIP 就直接重用,沒有才下載;付費外掛需有有效更新來源,或先放入對應版本 ZIP。只更新已安裝外掛,保留原本啟用/停用狀態。
正式更新每站首次變更前備份一次 DB 到 /root/backupdb-YYYYMMDD/backup-<site>-<時間>-<PID>.sql,備份失敗則不更新該站。WP Rocket 原本啟用時先停用並驗證,更新後恢復;安裝失敗也會嘗試恢復啟用。每項更新後讀回版本與狀態;啟用中的外掛另做公開首頁檢查,HTTP 500–599 才會呼叫 restart_php_fpm.sh 並重測。
续跑按站台資料夾的掃描順序開始,包含起點站,不會自動儲存進度。已完成的外掛會重新查詢更新資訊,沒有新版就略過。--start-from 與 --resume-from 都只接受資料夾名稱,不接受完整路徑。
外掛更新失敗後處理
每輪最後會顯示更新、略過、下載/重用、失敗項目與去重後的失敗站台數;正式執行有失敗時,將站台與原因彙整成一則 Slack #server告警。--dry-run、--no-slack 不發通知。
空目錄、WordPress 核心不完整或 wp-content/plugins 為空的資料夾會提示並略過,不列為失敗。清單未建立會顯示建立方式並結束;未設定清單、清單中的站台資料夾不存在、外掛未安裝時也會提示。
若顯示「無法讀取外掛清單」,先確認站台檔案與 DB 連線;DB 備份失敗先處理連線、權限或容量。首頁檢查無法取得 HTTP 狀態、PHP-FPM 重啟失敗或重測仍為 5xx,會列入失敗。修復原因後,先單站預覽及重試:
sudo orca-shkit-wordpress update-wp-plugins --site coolhealth.com.tw --dry-run
sudo orca-shkit-wordpress update-wp-plugins --site coolhealth.com.tw
# 若整批中斷,再從該站接續後面的站台
sudo orca-shkit-wordpress update-wp-plugins --start-from coolhealth.com.tw --dry-run
sudo orca-shkit-wordpress update-wp-plugins --start-from coolhealth.com.tw
退出碼:0 完成/預覽成功、1 更新/備份/站台讀取或健康檢查失敗、2 設定或環境錯誤。腳本不會自動還原 DB;若已更新成功但首頁檢查失敗,重跑可能因已是最新版而略過該外掛,須另用首頁 watchdog 驗證恢復:
orca-shkit-monitoring cron-watchdog-homepage --domain coolhealth.com.tw --dry-run
舊 update-plugin-all-sites 只顯示遷移提示,不再更新;須調整既有排程。新指令只更新已安裝外掛並保留狀態,不支援舊 --zip、安裝缺少外掛或自動啟用。若強制終止留下 .update-wp-plugins.lock,須先確認沒有執行中的批次,再移除共用 ZIP 目錄下的殘留鎖。
WordPress Core 與全站維護更新
這支沒有 dry-run,必須先測單站:
sudo orca-shkit-wordpress upgrade-wp-vers \
--site example.com
預設 Core 只升 minor。需要跨主版或指定版本時:
sudo orca-shkit-wordpress upgrade-wp-vers \
--site example.com \
--major-core
sudo orca-shkit-wordpress upgrade-wp-vers \
--site example.com \
--core-version 7.0.1
全站中斷後續跑:
sudo orca-shkit-wordpress upgrade-wp-vers \
--start-from example.com
這支會更新 Core、DB、外掛、主題、權限與快取,並 reload PHP-FPM、檢查首頁、發 Slack。Log 位於 /var/log/updateall_<timestamp>.txt。
媒體使用量
# 全站 incremental
orca-shkit-wordpress update-media-usaged-all-sites \
--mode=incremental
安全權限、WP_DEBUG 與 debug.log
# 更新站台權限(會互動詢問站台資料夾名稱)
sudo orca-shkit-wordpress update-secure-permission
先關閉 WordPress debug 模式,避免站台繼續寫入新的除錯訊息。預設只會 dry-run:
# 預覽所有站台的 WP_DEBUG 狀態
orca-shkit-wordpress disable-wp-debug
# 只預覽 jeken.com.tw
orca-shkit-wordpress disable-wp-debug \
--site jeken.com.tw
# 完整預檢通過後,將所有站台設為布林值 WP_DEBUG=false
sudo orca-shkit-wordpress disable-wp-debug \
--apply
# 只套用 jeken.com.tw
sudo orca-shkit-wordpress disable-wp-debug \
--site jeken.com.tw \
--apply
disable-wp-debug 只處理 /home/wwwroot 第一層且同時具有 wp-config.php、wp-content 的 WordPress 專案。套用前會完整預檢並備份待修改檔案到 /var/backups/orca-shkit/wp-debug-<時間>/;修改後會檢查 PHP 語法、讀回布林值 false,並確認權限與擁有者沒有改變。重複定義、符號連結或無法安全解析時整批不寫入;途中失敗會從本次備份回復已處理站台。
確認 debug 模式已關閉後,再清空既有 wp-content/debug.log。這支同樣預設只會 dry-run:
# 預覽全站 debug.log、檔案大小與預計釋放容量
orca-shkit-server clear-wordpress-debug-logs
# 只預覽 jeken.com.tw
orca-shkit-server clear-wordpress-debug-logs \
--site jeken.com.tw
# 清空全站既有 debug.log
sudo orca-shkit-server clear-wordpress-debug-logs \
--apply
# 只清空 jeken.com.tw
sudo orca-shkit-server clear-wordpress-debug-logs \
--site jeken.com.tw \
--apply
clear-wordpress-debug-logs 只掃描 /home/wwwroot/*/wp-content/debug.log,以原檔截斷方式清空內容,不使用刪除再重建,因此會保留檔案、inode、權限與擁有者。更深層同名檔、符號連結及非一般檔案不會處理。這與 Nginx/主機輪轉 log 不同;後者請使用 Server 模組的 clean-orca-logs。
update-secure-permission 目前不接受 domain 參數,會在執行中互動詢問。WP_DEBUG=false 與清空 debug.log 是兩個獨立動作:前者停止 WordPress debug 模式,後者只釋放既有檔案內容。
Monitoring
本機掃描 Cloudflare:哪個站被打
cd /Library/WebServer/Documents/orca_shkit
./orca-shkit monitoring find-ddos-logs \
-m 15 \
-n 30 \
-p 10 \
--cf-only
這是只讀 Cloudflare Analytics,可在 Mac 本機執行。輸出 H/M/L、PageReq、Peak15、Top IP/path、403、499/5xx 與 origin-bound 請求。
單站詳細分析:
./orca-shkit monitoring find-ddos-logs \
-s example.com \
-m 30 \
-n 50 \
--cf-only
Cloud 主機上加入 origin log 交叉比對:
orca-shkit-monitoring find-ddos-logs \
-m 15 \
-n 30 \
--with-local
orca-shkit-monitoring find-malicious-requests \
-d /home/wwwlogs \
-s example.com \
-t 30 \
-w 120 \
-v
Cloudflare 是 edge 聚合資料,不是 origin 即時 log。攻擊判斷應同時看 domain、path、IP、User-Agent、403/499/5xx 與 Nginx/PHP-FPM 狀態。
公開首頁 5xx Watchdog
單站 dry-run,不發 Slack:
orca-shkit-monitoring cron-watchdog-homepage \
--domain example.com \
--dry-run
全站只掃描、不發 Slack:
orca-shkit-monitoring cron-watchdog-homepage --no-slack
正式掃描,有 HTTP 500–599 時同一輪彙整成一則 Slack:
orca-shkit-monitoring cron-watchdog-homepage
每個請求都會加上 orca_cache=<時間>-<亂數>-<序號> 並使用瀏覽器型 User-Agent。HTTP 000、DNS 或 timeout 只會警告,不發 Slack。
WordPress Core 版本掃描
# 只列出低於 6.8.2 的站台
orca-shkit-monitoring check-wp-core-versions 6.8.2
# 顯示所有站台
orca-shkit-monitoring check-wp-core-versions 6.8.2 --all
# 單站
orca-shkit-monitoring check-wp-core-versions \
6.8.2 \
--site example.com
Exit code:0 全部符合、1 找到過舊站台、2 參數或環境失敗。
WordPress cache 容量
# 全站快速統計
orca-shkit-monitoring check-wp-cache-usage --fast
# 單站並顯示最大的 20 個項目
orca-shkit-monitoring check-wp-cache-usage \
--site example.com \
--top 20
這支只讀取容量,不會刪除 cache。
PHP-FPM、Nginx 與全站服務 Watchdog
先 dry-run:
sudo orca-shkit-monitoring cron-watchdog-services \
--all \
--dry-run
只監測與蒐證,不 restart:
sudo orca-shkit-monitoring cron-watchdog-services \
--all \
--no-restart
正式模式可在達到門檻後重啟 PHP-FPM 並發 Slack:
sudo orca-shkit-monitoring cron-watchdog-services --all
Server
部署 Nginx 主設定與相依 conf
在 Cloud 主機的 repo 內執行,先預覽:
cd /home/orca/orca_shkit
sudo orca-shkit-server deploy-nginx-conf --dry-run
確認後備份並複製到 /usr/local/nginx/conf/:
sudo orca-shkit-server deploy-nginx-conf --apply
部署清單共五份:nginx.conf、orca-logformat.conf、orca-cloudflare.conf、orca-headers.conf、orca-security-firewall.conf。orca-block-ips.conf 未被主設定引用,不在部署清單。
既有主設定會先備份成 /usr/local/nginx/conf/nginx.conf.back-YYYYMMDD-HHMMSS,其他既有目標 conf 也使用相同時間備份。複製前先檢查目前設定;寫入後再執行 nginx -t,失敗會回復本次部署的檔案。預覽只檢查目前設定,不會備份或複製。
脚本不會自動 reload。部署成功後確認測試結果,再套用到執行中的 Nginx:
sudo /usr/local/nginx/sbin/nginx -t
sudo systemctl reload nginx
systemctl is-active nginx
最後用單站首頁 watchdog 驗證。自訂路徑可用 --source-dir DIR、--dest-dir DIR、--nginx-bin PATH,所有路徑與參數先用 --dry-run 核對。
預覽與刷新 ORCA crontab
預設只預覽 diff:
sudo orca-shkit-server refresh-orca-crontab \
--user root
確認預覽後套用:
sudo orca-shkit-server refresh-orca-crontab \
--user root \
--apply
sudo crontab -u root -l
寫入前會備份舊 crontab 到 /var/backups/orca-shkit/,只替換 ORCA SHKIT managed block,不應刪除其他排程。
重啟 PHP-FPM
sudo orca-shkit-server restart-php-fpm
指定 socket 或不 reload Nginx:
sudo orca-shkit-server restart-php-fpm \
--expect-socket /tmp/php-cgi.sock \
--wait 10
sudo orca-shkit-server restart-php-fpm \
--no-nginx-reload
預設會 restart PHP-FPM、等待 socket、執行 nginx -t,然後 reload Nginx。
SSL 憑證檢查
# 查到期日
sudo orca-shkit-server ssl-valid-date example.com
# 驗證 fullchain
sudo orca-shkit-server ssl-verify example.com
這兩支會讀取 /etc/letsencrypt/live/<domain>/,需在擁有憑證檔的主機上執行。
清理 ORCA 與 Nginx 舊 log
# 先預覽超過 30 天的 log 與 ORCA 備份
sudo orca-shkit-server clean-orca-logs --dry-run
# 套用預設 30 天保留期限
sudo orca-shkit-server clean-orca-logs
# 改為保留 60 天
sudo orca-shkit-server clean-orca-logs --days 60
預設保留 30 天,會刪除 /var/log 與 /home/wwwlogs 裡過期的輪轉 log/gzip,不刪除正在寫入的主 .log 檔。也會清除 /var/backups/orca-shkit/ 下超過期限的 wp-debug-*、vhost-error-logs-* 目錄與 crontab-*.bak 檔案;不會碰 /var/backups/ 內其他系統備份或名稱不符的項目。
服務讀回驗證
執行 server 變更後,至少檢查:
systemctl is-active php-fpm
systemctl is-active nginx
nginx -t
ls -l /tmp/php-cgi.sock
再用首頁 watchdog 測單站:
orca-shkit-monitoring cron-watchdog-homepage \
--domain example.com \
--dry-run
操作原則
- 先單站、再全站;有 dry-run 就先 dry-run。
- 「檢查」不等於授權 Git pull、WordPress 更新、PHP-FPM restart 或 crontab apply。
cron-watchdog-cpu、cron-watchdog-services、Slack、Cloudflare WAF/purge 都可能有外部副作用。- repo 修改、commit、push、Cloud 主機 pull/deploy、全域 symlink install 與 crontab apply 是不同階段。
- 回報時分開交代執行環境、目標、命令、讀回結果與尚未部署的階段。




