随时随地进行软件开发:我的分布式远程工作场所

已发表: 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、转发端口、钻孔隧道安装外部系统,以远程访问您的私人服务器或基于云的数据,同时俯瞰阳光浴的海滩,或在雾蒙蒙的城市喝时髦级的环保咖啡。 去做就对了!