GitHub 可以正常開啟,不代表整套開發工具鏈都能順利工作。程式碼主倉庫、Release 附件、Container Registry、Docker Hub、npm Registry、套件文件和 CI Runner,往往使用不同的網域、連線協定與憑證流程。瀏覽器能載入 GitHub 首頁,只能證明其中一部分 HTTPS 請求可用;當你執行 git clone、docker pull、npm install 或建置映像檔時,實際走的可能是另一條路徑。
開發者環境的重點不是把所有流量粗略地送到同一個出口,而是先拆解工作流程,再決定哪些應用程式需要代理、哪些網域應該分流、哪些請求必須保留本地直連。本文以 GitHub、Docker Hub 與 npm 為主,整理 VPN 與代理用戶端、終端機環境變數、Docker Engine、Node.js 套件管理器,以及個人、團隊和 CI 環境的實際配置思路。
開發者最穩妥的做法通常是「系統層保持可控、終端機明確指定、Docker daemon 單獨配置、CI 不依賴個人電腦」。先確認失敗的是 DNS、TLS、代理繼承、Registry 認證還是分流規則,再更換節點或協定,會比反覆切換全域模式更容易定位問題。
GitHub、Docker Hub 與 npm為什麼不能用同一種判斷方式
GitHub 的常見操作包括瀏覽網頁、透過 HTTPS 拉取與推送、使用 SSH 遠端、下載 Release 附件,以及由 Actions 或其他服務取得原始碼。這些操作可能涉及主站、API、附件儲存和登入相關網域。即使主頁正常,某個 Release 檔案或 API 請求仍可能因路由、DNS、憑證或權限問題失敗。
git clone 使用 HTTPS 時,通常會遵循 Git 的代理設定或終端機中的 HTTP_PROXY、HTTPS_PROXY 變數;使用 SSH 時,則需要處理 SSH 本身的連線方式,不能假設瀏覽器代理會自動接管。這也是「瀏覽器能開 GitHub,但 Git 拉不下來」的常見原因之一。排查時應先查看遠端網址格式,再確認 Git 是否讀取了預期的代理配置。
Docker Hub 的流程更複雜。執行 docker pull 時,命令列只是向 Docker Engine 發出請求,真正存取 Registry 的可能是背景執行的 daemon。Docker Desktop、Linux 上的 Docker Engine、遠端 Docker 主機,代理配置入口各不相同。即使瀏覽器和終端機已能連線,daemon 仍可能沒有代理,結果便是命令列看似正常,拉取映像檔卻逾時。
npm 則涉及 Registry、套件 tarball、套件中繼資料、登入 Token 與套件生命週期腳本。npm install 不只是下載一個網址;解析版本後,npm 還要取得相依套件及其壓縮檔。某個套件頁面可開啟,不代表所有 tarball 網域都能穩定存取。若使用私有 Registry,還要額外區分公開套件與公司內部套件的路由及認證。
90+
國家覆蓋
200+
全球線路
不限
同時在線設備
5
支援平台
如果需要在 Windows、macOS、iOS、Android 或 Linux 之間使用同一組服務,應先確認官方客戶端是否支援目標平台;也可以依需求使用 Clash Verge、sing-box 等兼容客戶端。Shadowrocket 主要適合行動裝置場景,不能直接取代桌面端的 Git、Docker daemon 或 CI Runner 配置。不同協定,例如 Shadowsocks、VMess、Trojan、Hysteria2 與 WireGuard,對應的客戶端支援和系統接管方式也不完全相同。
先決定代理範圍,再選 VPN 或兼容客戶端
VPN 一詞在實際產品中可能指系統層 VPN,也可能指提供代理節點的訂閱服務。WireGuard 通常透過虛擬網路介面接管路由;Shadowsocks、VMess、Trojan 和 Hysteria2 則常由代理客戶端建立本地 HTTP 或 SOCKS 入口,再由應用程式或系統代理使用。配置前要先確認服務實際提供的協定與訂閱格式,不能把任何訂閱連結直接當成 WireGuard 設定檔。
瀏覽器測試不等於終端機已生效
系統代理可以讓支援系統設定的應用程式自動使用代理,但命令列工具未必全部遵循同一套設定。Git 有自己的配置層,npm 會讀取自己的設定與環境變數,Docker daemon 又是另一個獨立的程序。若使用 Clash Verge 或 sing-box,應確認本地 HTTP、HTTPS 或 SOCKS 監聽入口,並按客戶端提示填入對應位置;不要把 SOCKS 入口誤填到只接受 HTTP 代理的設定欄位。
規則分流適合日常開發,因為本地程式碼平台、公司內網、私有 Registry 和內部 DNS 不一定應該經過同一出口。全域模式適合短時間確認「是否為路由或分流造成的問題」,但不宜直接當成長期方案。若全域模式可用、規則模式不可用,通常應檢查網域規則、DNS 模式、IPv6 路由和子網域是否被遺漏。
- ✅ 先確認目前使用的是系統 VPN、HTTP 代理、SOCKS 代理,還是應用程式專用代理。
- ✅ Git、npm 與 Docker 分別檢查自己的代理繼承方式。
- ✅ 公司內網、私有 Registry 和本地服務保留直連或使用指定出口。
- ✅ 更換網路環境後,重新啟動需要長時間運行的 Docker daemon 與終端機工作階段。
- ❌ 不要同時啟用兩個會修改系統代理或虛擬網卡的客戶端。
- ❌ 不要把「首頁能開」當成整個開發鏈路已經通過。
終端機、Git 與 npm的動手配置流程
下面是一套適合個人電腦的配置順序。它不依賴特定客戶端名稱,重點是把代理入口、應用程式設定和測試結果分開記錄。開始前先關閉不需要的代理工具,確認目前使用的節點與本地監聽埠,並避免把帳號密碼直接寫入命令歷史或提交到專案。
- 確認本地代理入口。在客戶端中查看 HTTP、HTTPS 或 SOCKS 入口,確認規則模式和全域模式的目前狀態。若客戶端是透過訂閱一鍵導入,先確認訂閱內容已成功更新,並選擇一條適合開發服務出口位置的線路。
- 檢查 Git 遠端格式。使用
git remote -v查看專案採用 HTTPS 還是 SSH。HTTPS 需要檢查 Git 代理;SSH 則要檢查 SSH 設定與目標主機連線,不要只測試瀏覽器。 - 設定終端機代理。在目前工作階段設定
HTTP_PROXY、HTTPS_PROXY和必要的NO_PROXY。NO_PROXY可放入 localhost、內部網域和私有服務,避免公司資源被送往公共出口。 - 分別測試 Git。先執行小型的遠端查詢,再進行 clone 或 fetch。若 HTTPS 查詢成功而 SSH 失敗,問題集中在 SSH 路徑;若兩者都失敗,再檢查 DNS、憑證、代理認證和分流規則。
- 設定 npm 的代理與 Registry。使用 npm 的設定檢查目前 Registry 和代理值,確認公開套件與私有套件是否應使用不同 Registry。登入 Token 應使用安全儲存方式,避免把包含 Token 的設定檔放入 Git。
- 清除錯誤的暫存狀態後重試。如果一次安裝在中途失敗,先閱讀錯誤訊息中的實際網域和 HTTP 狀態,再決定是否重試。不要在沒有判斷原因的情況下反覆清除整個套件快取。
對 npm 而言,最有價值的診斷資訊通常包括目前 Registry、失敗的 tarball 網域、是否需要代理認證,以及錯誤發生在解析版本還是下載壓縮檔。對 Git 而言,則要區分 DNS 解析失敗、TLS 握手失敗、遠端拒絕和認證失敗。這些錯誤即使都表現為「下載不了」,修復方向卻完全不同。
終端機配置應以「可驗證、可撤銷、可分專案」為原則。先在單一工作階段測試,再決定是否寫入使用者層設定;每次改動後只測試一個工具,才能知道是哪個配置真正產生效果。
Docker pull與建置階段要分開處理
Docker 使用者最容易遇到的誤區,是隻為終端機設定代理,卻忘記 Docker Engine 由另一個程序負責網路請求。docker pull、拉取基礎映像檔、推送映像檔和部分建置流程,可能由 daemon 或 BuildKit 執行。Docker Desktop 的代理入口與 Linux systemd 管理的 Docker Engine 不同;如果 Docker 主機在遠端,配置應放在遠端主機,而不是本地電腦。
拉取映像檔的代理位置
先區分三個階段:命令列與 daemon 的溝通、daemon 存取 Registry、建置程序在 Dockerfile 中執行的網路請求。第一階段正常,不代表第二階段有代理;第二階段能拉取基礎映像檔,也不代表第三階段中 RUN 指令能存取套件來源。配置時應按實際執行者設定代理,而不是隻修改 Shell 的環境變數。
Docker Desktop 通常在應用程式設定中處理代理;Linux 上則常見以 systemd drop-in 或服務環境配置方式讓 Docker Engine 讀取代理。修改後要重新載入服務並查看 daemon 狀態。若使用遠端 Docker context,請先用 docker context ls 確認目前命令實際連到哪台主機,否則很容易在錯誤的環境反覆修改配置。
Dockerfile 中的套件下載
即使 docker pull 已經成功,Dockerfile 的 RUN apt、RUN npm install 或其他套件管理命令仍可能失敗。這些請求來自建置容器,可能需要透過 BuildKit 的代理參數或明確的建置環境傳入。應避免把含有帳密的代理 URL 寫死在 Dockerfile,因為它可能出現在映像層、建置記錄或快取中。
更安全的做法是使用建置環境中的祕密管理、短期憑證或 CI 平台提供的安全變數,並為私有 Registry 設定最小權限 Token。完成建置後,檢查映像層和建置輸出,確認沒有殘留代理密碼、npm Token 或其他認證資訊。對團隊而言,最好把代理和 Registry 配置寫進可審查的建置文件,而不是依賴某位開發者的本機狀態。
| 工作 | 主要執行者 | 優先檢查 | 常見誤區 |
|---|---|---|---|
| Git clone 或 fetch | Git 用戶端 | 遠端格式、Git 代理、SSH 設定 | 只測試瀏覽器首頁 |
| npm install | npm 與 Node.js 程序 | Registry、代理、tarball 網域、Token | 把所有失敗都當成 Registry 故障 |
| docker pull | Docker daemon | Docker Engine 代理、Registry 認證 | 只設定 Shell 環境變數 |
| Dockerfile 的 RUN | BuildKit 或建置容器 | 建置代理、套件來源、祕密管理 | 把帳密寫入 Dockerfile |
| CI 建置與推送 | CI Runner 與遠端 daemon | Runner 出口、Secrets、快取和權限 | 假設本地配置會自動複製 |
團隊與 CI環境的分流、安全與預算
個人電腦可以透過官方 Windows、macOS、iOS、Android、Linux 客戶端,或兼容客戶端導入訂閱後自行切換線路;團隊與 CI 則不應把某一台電腦的本地代理當作基礎設施。CI Runner 可能位於不同地區、不同雲端網路或隔離環境,必須單獨確認它是否能解析 Registry、存取 Git 遠端並完成映像推送。
CI 配置應優先使用平台的 Secrets 管理,不把代理帳密、Registry Token 或私有 npm Token 寫入 YAML、Dockerfile 和公開日誌。對公開原始碼專案,還要避免讓 fork 或未受信任的工作流程取得高權限祕密。可以將公開依賴下載、私有套件下載、映像拉取和映像推送拆成不同工作,按需要授予權限。
分流方面,公開 GitHub、Docker Hub 與 npm 流量可以按團隊政策使用指定出口;公司 Git、內部 npm Registry、內部 Docker Registry 和資料庫則通常需要保留內網路徑。若同一個網域同時承載公開與內部資源,不能只靠網域名稱判斷,應以 DNS、IP 範圍、憑證和實際請求結果綜合確認。
如何估算個人使用成本
若只是偶爾拉取程式碼與套件,可先按每月流量需求選擇月訂閱:¥9.9/月含 60GB、¥18/月含 250GB、¥28/月含 500GB,流量按開通日每月重置;中途升級時,差價會按剩餘天數折算。若使用量不固定,也可考慮用完為止且永久不過期的流量包:¥158/300GB、¥358/1000GB、¥658/3000GB。
團隊需要比較的,不只是流量,還包括是否要讓多台工作站使用、是否支援 Linux、是否能在 Docker 主機部署、是否有合適的協定與分流能力。YsVPN 支援不限台數同時在線設備,節點覆蓋 90+ 國家、200+ 線路,並支援支付寶、微信與 USDT;註冊只需使用者名稱和密碼,不需要郵箱地址。若服務不符合團隊安全政策,則不應因價格低而直接導入 CI。
- ✅ 個人環境先以一條穩定線路完成 Git、npm 與 Docker 的實際流程測試。
- ✅ 團隊環境將節點、代理設定、Registry 認證和 CI Secrets 分開管理。
- ✅ Linux、Docker Desktop 與遠端 Runner 分別確認代理是否生效。
- ✅ 對私有套件和映像使用最小權限 Token,並定期撤銷不再使用的憑證。
- ✅ 以「每月重置」或「用完為止」的流量模式,對照實際建置與下載習慣選擇。
- ❌ 不要將公共代理帳密放在公開 Dockerfile、Shell 腳本或 CI 日誌中。
- ❌ 不要把本機能成功執行視為 CI Runner 一定能成功。
若只是希望改善日常開發工具的連線,月訂閱通常較容易控制週期和預算;長期大量拉取基礎映像檔、套件或大型 Release 附件時,則應先估算團隊的實際流量與並行工作流程,再比較流量包。無論選哪種方式,都應把「能否在目標執行環境配置」放在單純價格之前。
把 Git、npm、Docker pull、Docker build 和 CI push 當成五個不同的網路工作來驗證。先用可觀察的錯誤訊息確認代理範圍,再使用規則分流降低不必要的接管;對團隊和 CI,優先確保祕密管理、權限邊界與可重現配置,速度只是最後的比較項目。