隨時隨地進行軟件開發:我的分佈式遠程工作場所
已發表: 2022-03-11作為遠程自由職業者工作有很多好處,但建立一個有效的分佈式工作環境可能是一個真正的挑戰。 當然,可以採取多種方法,沒有一種“最佳”方法適合所有人。 遠程數字工作場所組織確實是一件非常私人的事情,對一個開發人員有用的東西可能對其他人根本不起作用。
考慮到這一點,我在這裡展示的設置對我個人來說很有效,尤其是在涉及開發和系統管理的遠程項目上。 我確實相信這種方法有很多優點,但是每個讀者都應該考慮如何根據他們的操作需求和個人偏好以最適合他們的方式調整它。
我的方法主要基於 SSH 和 Linux 上的相關工具提供的功能。 請注意,MacOS 和其他類 Unix 系統的用戶也可以利用所描述的過程,只要他們的系統支持所描述的工具。
我自己的個人迷你服務器
在我的設置中,重要的第一步是在我自己的家中使用 Raspberry Pi 2 供電的服務器,用於託管從我的源代碼存儲庫到演示站點的所有內容。
雖然我會出差,但我的公寓確實是我的遠程“固定運營基地”,具有良好的互聯網連接(100 Mbit/秒),幾乎沒有額外的延遲。 這意味著,在我的公寓裡,我基本上只受目標網絡速度的限制。 我所描述的設置最適合這種類型的連接,儘管這不是必需的。 事實上,當我有一個帶寬相對較低的 ADSL 連接時,我也使用過這種方法,大多數情況下都可以正常工作。 以我的經驗,唯一真正的要求是帶寬要么不計量,要么便宜。
作為住宅用戶,我有我的 ISP 可以購買的最便宜的家庭網絡路由器,但這根本不足以滿足我的需要。 因此,我要求 ISP 將路由器置於“橋接模式”,在這種模式下,它僅用作連接終止器,為一個連接的系統提供 PPPoE 端點。 這意味著該設備將停止作為 WiFi 接入點甚至作為普通家庭路由器工作。 所有這些任務都由專業的小型 Mikrotik 路由器 RB951G-2HnD 處理。 它為我的本地網絡(我的編號為 10.10.10.0/24)執行 NAT 服務,並為連接到它的有線和無線設備提供 DHCP。 Mikrotik 和 Raspberry Pi 具有靜態地址,因為它們用於需要已知地址的上下文中。 就我而言,它們分別是 10.10.10.1 和 10.10.10.10。
我的家庭連接沒有靜態 IP 地址。 就我而言,這只是遠程工作的輕微不便,因為目標是創建個人或 SOHO 工作環境,而不是 24/7 站點。 (對於那些確實需要為其服務器提供靜態 IP 地址的人,值得注意的是,靜態 IP 地址的成本持續下降,並且可以使用相當便宜的靜態 VPN IP 選項。)我使用的 DNS 代理 Joker.com ,與所有其他服務一起提供免費的動態 DNS 服務,因此我個人域的一個子域作為動態名稱存在。 我使用這個名稱從外部連接到我自己的網絡,並將 Mikrotik 配置為通過 NAT 將 SSH 和 HTTP 傳遞到 Raspberry Pi。 我只需要鍵入ssh mydomain.example.com
的等效項即可登錄到我的個人家庭服務器。
數據無處不在
Raspberry Pi不提供的一件重要的事情是冗餘。 我已經為它配備了一張 32 GB 的卡,如果發生某些事情,仍然會丟失很多數據。 為了解決這個問題,並確保在住宅互聯網訪問中斷時訪問我的數據,我將所有數據鏡像到外部的類似雲的服務器。 由於我在歐洲,因此從 Online.net 獲得最小的專用裸機(即非虛擬化)服務器是有意義的,它配備低端 VIA CPU,提供 2 GB RAM 和 500 GB SSHD。 與樹莓派迷你服務器一樣,我不需要很高的 CPU 性能甚至內存,所以這是一個完美的搭配。 (順便說一句,我記得我的第一台“大型”服務器,它有兩個 Pentium 3 CPU 和 1 GB RAM,速度可能是 Raspberry Pi 2 的一半,以及我們如何用它做的很棒的事情,這影響了我對優化的興趣。)
我使用 rdiff-backup 將我的 Raspberry Pi 備份到遠程雲服務器。 從系統的相對大小來看,這些備份將使我獲得幾乎無限的歷史記錄。 我在類雲服務器上的另一件事是安裝 ownCloud,它使我能夠運行類似 Dropbox 的私有服務。 ownCloud作為一個產品正在朝著群件和協作的方向發展,所以如果有更多的人使用它,它就會變得更加有用。 自從我開始使用它以來,我實際上沒有任何本地數據沒有備份到 Raspberry Pi 或類似雲的服務器,而且大部分都備份了兩次。 如果您重視數據,您可以進行的任何額外備份冗餘總是一件好事。
SSHFS 的“魔力”
這些天我的大部分工作都涉及開發與網絡不直接相關的東西(我知道,這很令人震驚!),所以我的工作流程通常遵循經典的編輯-編譯-運行循環。 根據項目的具體情況,我可能將其文件放在筆記本電腦本地,我可能將它們放在 ownCloud-synced 目錄中,或者更有趣的是,我可能將它們直接放在 Raspberry Pi 上並從那裡使用它們.
由於 SSHFS,後一個選項成為可能,它使我能夠從 Raspberry Pi 本地掛載遠程目錄。 這幾乎就像一個小魔法:你可以在任何你有 SSH 訪問權限的服務器上擁有一個遠程目錄(在你的用戶在服務器上擁有的權限下工作)作為本地目錄安裝。
有一個遠程項目目錄? 將其安裝在本地並繼續使用。 如果你需要一個強大的服務器來進行開發或測試——出於某種原因,只是去那裡並在控制台中使用 vim 不是一種選擇——在本地安裝該服務器並做任何你想做的事情。 當我在 Internet 的低帶寬連接上時,這尤其有效:即使我確實在控制台文本編輯器中工作,如果我在本地運行該編輯器然後僅通過 SSHFS 傳輸文件,體驗會好得多,而不是而不是通過遠程 SSH 會話工作。
需要比較不同遠程服務器上的幾個/etc
目錄? 沒問題。 只需使用 SSHFS 在本地安裝它們,然後使用 diff(或任何其他適用的工具)來比較它們。
或者您可能需要處理大型日誌文件,但您不想在服務器上安裝日誌解析工具(因為它具有大量依賴項),並且無論出於何種原因,複製日誌都很不方便。 再一次,不是問題。 只需通過 SSHFS 在本地掛載遠程日誌目錄並運行您需要的任何工具——即使它是一個龐大、繁重且由 GUI 驅動的工具。 SSH 支持動態壓縮並且 SSHFS 使用它,因此使用文本文件對帶寬非常友好。

出於我的目的,我在sshfs
命令行上使用以下選項:
sshfs -o reconnect -o idmap=user -o follow_symlinks -C server.example.com:. server
以下是這些命令行選項的作用:
-
-o reconnect
- 告訴 sshfs 在 SSH 端點中斷時重新連接它。 這非常重要,因為默認情況下,當連接中斷時,掛載點要么突然失敗,要么簡單地掛起(我發現這種情況更常見)。 在我看來,這應該是默認選項。 -
-o idmap=user
- 告訴 sshfs 將遠程用戶(即我們正在連接的用戶)映射為與本地用戶相同。 由於您可以使用任意用戶名通過 SSH 連接,因此這“修復”了一些問題,因此本地系統認為用戶是相同的。 遠程系統上的訪問權限和權限照常適用於遠程用戶。 -
-o follow_symlinks
- 雖然您可以掛載任意數量的遠程文件系統,但我發現隻掛載一個遠程目錄(我的主目錄)更方便,並且在其中(在遠程 SSH 會話中)我可以創建指向重要目錄的符號鏈接遠程系統上的其他地方,例如/srv
或/etc
或/var/log
。 此選項使 sshfs 將遠程符號鏈接解析為文件和目錄,允許您跟踪鏈接目錄。 -
-C
- 打開 SSH 壓縮。 這對文件元數據和文本文件特別有效,因此它似乎應該是默認選項。 -
server.example.com:.
- 這是遠程端點。 第一部分(本例中的server.example.com
)是主機名,第二部分(冒號後)是要掛載的遠程目錄。 在這種情況下,我添加了“。” 指示我的用戶在 SSH 登錄後結束的默認目錄,即我的主目錄。 -
server
- 遠程文件系統將被掛載到的本地目錄。
特別是如果您處於低帶寬或不穩定的 Internet 連接上,您需要使用 SSHFS 和 SSH 公鑰/私鑰身份驗證以及本地 SSH 代理。 這樣,在使用 SSHFS 時將不會提示您輸入密碼(系統密碼或 SSH 密鑰密碼),並且重新連接功能將按宣傳的方式工作。 請注意,如果您沒有設置 SSH 代理以便它在會話中根據需要提供解鎖密鑰,則重新連接功能通常會失敗。 網絡上到處都是 SSH 密鑰教程,而且我嘗試過的大多數基於 GTK 的桌面環境都會自動啟動它們自己的代理(或“錢包”,或者他們選擇的任何名稱)。
一些高級 SSH 技巧
在互聯網上擁有一個可以從世界任何地方遠程訪問的固定點,並且具有高帶寬連接——對我來說,這是我的 Raspberry Pi 系統,它真的可以是任何通用 VPS——減輕壓力並讓你做各種交換和隧道數據的事情。
需要快速的 nmap 並且您已通過手機網絡連接? 只需從該服務器執行此操作。 需要快速復制一些數據,而 SSHFS 是不是有點矯枉過正? 只需使用普通的 SCP。
另一種情況您可能會發現自己面臨我們的情況,您可以通過 SSH 訪問服務器,但其端口 80(或任何其他端口)被防火牆屏蔽到您連接的外部網絡。 為了解決這個問題,您可以使用 SSH 將此端口轉發到本地計算機,然後通過localhost
訪問它。 一種更有趣的方法是使用您通過 SSH 連接到的主機來轉發另一台機器上的端口,可能在同一防火牆後面。 例如,如果您有以下主機:
- 192.168.77.15 - 位於防火牆後面的遠程本地網絡中的主機,您需要連接到其端口 80
- foo.example.com - 您可以通過 SSH 訪問的主機,可以連接到上述主機
- 您的本地系統,本地主機
通過 foo.example.com SSH 服務器將 192.168.77.15 上的端口 80 轉發到 localhost:8080 的命令是:
ssh -L 8080:192.168.77.15:80 -C foo.example.com
-L
的參數指定本地端口,以及目標地址和端口。 -C
參數啟用壓縮,因此您可以再次節省帶寬,最後您只需鍵入 SSH 主機名。 此命令將打開一個到主機的普通 SSH shell 會話,除此之外,偵聽 localhost 端口 8080,您可以連接到該端口。
近年來,SSH 開發的最令人印象深刻的技巧之一是它能夠創建真正的 VPN 隧道。 它們表現為連接兩側的虛擬網絡設備(假設它們設置了適當的 IP 地址),並且可以讓您訪問遠程網絡,就像您在物理上一樣(繞過防火牆)。 出於技術和安全原因,這需要在與隧道連接的兩台機器上進行 root 訪問,因此它比僅使用端口轉發或 SSHFS 或 SCP 方便得多。 這個是為高級用戶準備的,他們可以很容易地找到有關如何操作的教程。
隨時隨地遠程辦公
無需在單個位置工作,您可以使用我概述的技術和技術(包括在修理工處等車時)在任何具有半體面互聯網連接的地方工作。 通過 SSH、轉發端口、鑽孔隧道安裝外部系統,以遠程訪問您的私人服務器或基於雲的數據,同時俯瞰陽光浴的海灘,或在霧濛濛的城市喝時髦級的環保咖啡。 去做就對了!