어디에서나 소프트웨어 개발: 내 분산 원격 작업 공간

게시 됨: 2022-03-11

원격 프리랜서로 일하는 것은 많은 이점이 있지만 효과적인 분산 작업 환경을 설정하는 것은 정말 어려운 일입니다. 물론 취할 수 있는 접근 방식은 다양하며 모든 사람에게 적합한 단일 "최상의" 방법은 없습니다. 원격 디지털 직장 조직은 실제로 매우 개인적인 일이며 한 개발자에게는 잘 작동하는 것이 다른 개발자에게는 전혀 효과가 없을 수 있습니다.

이를 염두에 두고 여기에서 제시하는 설정은 개인적으로 특히 개발 및 시스템 관리를 모두 포함하는 원격 프로젝트에서 잘 작동하는 것입니다. 이 접근 방식에는 여러 가지 장점이 있다고 생각하지만 각 독자는 운영상의 필요와 개인 취향의 조합에 따라 자신에게 가장 잘 맞는 방식으로 이를 적용하는 방법을 고려해야 합니다.

내 접근 방식은 주로 SSH 및 Linux의 관련 도구에서 제공하는 기능을 기반으로 합니다. MacOS 및 기타 유닉스 계열 시스템의 사용자는 시스템이 설명된 도구를 지원하는 범위 내에서 설명된 절차를 활용할 수도 있습니다.

내 분산 원격 작업장

나만의 개인 미니 서버

내 설정의 중요한 첫 번째 단계는 내 소스 코드 리포지토리에서 데모 사이트에 이르기까지 모든 것을 호스팅하는 데 사용되는 내 집에 있는 Raspberry Pi 2 기반 서버입니다.

나는 여행을 하기는 하지만 내 아파트는 적절한 인터넷 연결(100Mbit/초)과 추가 대기 시간이 거의 없는 원격 "고정 작업 기반" 역할을 합니다. 이것은 내 아파트에서 기본적으로 대상 네트워크의 속도에 의해서만 제약을 받는다는 것을 의미합니다. 내가 설명하는 설정은 이러한 유형의 연결에서 가장 잘 작동하지만 필수 사항은 아닙니다. 사실, 나는 또한 비교적 낮은 대역폭의 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 주소가 없습니다. 제 목적으로는 24/7 사이트가 아닌 개인 또는 SOHO 작업 환경을 만드는 것이 목표이기 때문에 원격으로 작업하는 것이 약간 불편할 뿐입니다. (서버에 고정 IP 주소가 필요한 사람들을 위해 고정 IP 주소 비용이 계속 낮아지고 상당히 저렴한 고정 VPN IP 옵션을 사용할 수 있다는 점에 주목할 가치가 있습니다.) 내가 사용하는 DNS 브로커, Joker.com , 다른 모든 서비스와 함께 무료 동적 DNS 서비스를 제공하므로 내 개인 도메인의 한 하위 도메인이 동적 이름으로 존재합니다. 나는 외부에서 내 자신의 네트워크로 연결하기 위해 이 이름을 사용하고 Mikrotik은 SSH와 HTTP를 NAT를 통해 Raspberry Pi로 전달하도록 구성되어 있습니다. 내 개인 홈 서버에 로그인하려면 ssh mydomain.example.com 에 해당하는 항목을 입력하기만 하면 됩니다.

어디서나 데이터

Raspberry Pi가 제공하지 않는 한 가지 중요한 것은 중복성입니다. 32GB 카드를 장착했는데 혹시라도 무슨 일이 생기면 잃어버릴 데이터가 너무 많아요. 이 문제를 해결하고 가정용 인터넷 액세스 문제가 발생하는 경우 내 데이터에 대한 액세스를 보장하기 위해 모든 데이터를 클라우드와 같은 외부 서버에 미러링합니다. 저는 유럽에 있기 때문에 2GB RAM 및 500GB SSHD를 제공하는 저가형 VIA CPU와 함께 제공되는 Online.net에서 가장 작은 전용 베어메탈(즉, 가상화되지 않은) 서버를 구입하는 것이 합리적이었습니다. Raspberry Pi 미니 서버와 마찬가지로 높은 CPU 성능이나 메모리도 필요하지 않으므로 완벽하게 일치합니다. (여담으로 필자는 Pentium 3 CPU 2개와 RAM 1GB를 탑재하고 Raspberry Pi 2의 절반 속도였던 나의 첫 "대형" 서버와 이 서버로 훌륭한 작업을 수행한 방법을 기억합니다. 최적화에 관심이 있습니다.)

rdiff-backup을 사용하여 원격 클라우드와 같은 서버에 Raspberry Pi를 백업합니다. 시스템의 상대적 크기로 판단할 때 이러한 백업은 거의 무제한의 기록을 얻을 수 있습니다. 클라우드와 같은 서버에 있는 또 다른 기능은 ownCloud를 설치하는 것인데, 이를 통해 개인 Dropbox와 같은 서비스를 실행할 수 있습니다. 제품으로서의 ownCloud는 그룹웨어와 협업으로 이동하고 있으므로 더 많은 사람들이 사용하면 더욱 유용합니다. 사용하기 시작한 이후로 말 그대로 라즈베리파이나 클라우드 같은 서버에 백업되지 않은 로컬 데이터가 하나도 없고 대부분 2회 백업을 하고 있습니다. 데이터를 소중하게 생각한다면 추가로 백업을 이중화하는 것이 좋습니다.

SSHFS의 "마법"

요즘 내 작업의 대부분은 웹과 직접적인 관련이 없는 개발을 포함하므로(충격적입니다! 저도 알고 있습니다!), 그래서 제 작업 흐름은 종종 고전적인 편집-컴파일-실행 주기를 따릅니다. 프로젝트의 특정 상황에 따라 해당 파일을 랩톱에 로컬로 저장하거나, ownCloud-synced 디렉터리에 저장하거나, 더 흥미롭게도 해당 파일을 Raspberry Pi에 직접 저장하여 사용할 수 있습니다. .

후자의 옵션은 SSHFS 덕분에 가능해졌습니다. SSHFS를 사용하면 Raspberry Pi에서 로컬로 원격 디렉터리를 마운트할 수 있습니다. 이것은 거의 마법의 작은 조각과 같습니다. SSH 액세스 권한이 있는(사용자가 서버에 대한 권한으로 작업하는) 모든 서버에 원격 디렉토리를 로컬 디렉토리로 마운트할 수 있습니다.

원격 프로젝트 디렉토리가 있습니까? 로컬에 마운트하고 이동하십시오. 개발 또는 테스트를 위해 강력한 서버가 필요하고 – 어떤 이유에서인지 콘솔에서 vim을 사용하는 것이 옵션이 아닌 경우 – 해당 서버를 로컬로 탑재하고 원하는 대로 수행하십시오. 이것은 인터넷에 대한 낮은 대역폭 연결을 사용할 때 특히 잘 작동합니다. 콘솔 텍스트 편집기에서 작업하더라도 해당 편집기를 로컬에서 실행한 다음 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 - SSH 엔드포인트가 끊어지면 sshfs에 다시 연결하도록 지시합니다. 이것은 기본적으로 연결이 끊어지면 마운트 지점이 갑자기 실패하거나 단순히 중단되기 때문에 매우 중요합니다(더 일반적으로 발견됨). 이것이 기본 옵션이어야 한다고 생각합니다.
  • -o idmap=user - 원격 사용자(즉, 연결하려는 사용자)를 로컬 사용자와 동일하게 매핑하도록 sshfs에 지시합니다. SSH를 통해 임의의 사용자 이름으로 연결할 수 있기 때문에 로컬 시스템에서 사용자가 동일하다고 생각하도록 "수정"됩니다. 원격 시스템에 대한 액세스 권한 및 권한은 원격 사용자에게 평소와 같이 적용됩니다.
  • -o follow_symlinks - 임의의 수의 원격 파일 시스템을 마운트할 수 있지만, 내 홈 디렉토리인 원격 디렉토리 하나만 마운트하는 것이 더 편리합니다. 그리고 그 안에(원격 SSH 세션에서) 중요한 디렉토리에 대한 심볼릭 링크를 생성할 수 있습니다. /srv 또는 /etc 또는 /var/log 와 같은 원격 시스템의 다른 위치. 이 옵션을 사용하면 sshfs가 원격 심볼릭 링크를 파일 및 디렉토리로 해석하여 링크된 디렉토리를 추적할 수 있습니다.
  • -C - SSH 압축을 켭니다. 이것은 파일 메타데이터 및 텍스트 파일에 특히 효과적이므로 기본 옵션이 되어야 하는 것처럼 보이는 또 다른 것입니다.
  • server.example.com:. - 원격 종점입니다. 첫 번째 부분(이 예에서 server.example.com )은 호스트 이름이고 두 번째 부분(콜론 뒤)은 마운트할 원격 디렉토리입니다. 이 경우 "."를 추가했습니다. 내 홈 디렉터리인 SSH 로그인 후 내 사용자가 끝나는 기본 디렉터리를 나타냅니다.
  • server - 원격 파일 시스템이 마운트될 로컬 디렉토리.

특히 대역폭이 낮거나 인터넷 연결이 불안정한 경우 SSH 공개/개인 키 인증 및 로컬 SSH 에이전트와 함께 SSHFS를 사용해야 합니다. 이렇게 하면 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 액세스 권한이 있는 호스트
  • 로컬 시스템, localhost

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 셸 세션을 열고 연결할 수 있는 localhost 포트 8080에서 수신 대기합니다.

최근 몇 년 동안 SSH가 개발한 가장 인상적인 트릭 중 하나는 실제 VPN 터널을 생성하는 기능입니다. 이러한 장치는 연결 양쪽에서 가상 네트워크 장치로 나타나며(적절한 IP 주소가 설정되어 있다고 가정) 마치 실제로 그곳에 있는 것처럼 원격 네트워크에 액세스할 수 있습니다(방화벽 우회). 기술 및 보안상의 이유로 터널과 연결된 두 시스템 모두에서 루트 액세스가 필요하므로 포트 전달이나 SSHFS 또는 SCP를 사용하는 것보다 훨씬 덜 편리합니다. 이것은 방법에 대한 튜토리얼을 쉽게 찾을 수 있는 고급 사용자를 위한 것입니다.

어디서나 원격 사무실

정비소에서 차를 기다리는 동안에도 작업을 계속할 수 있습니다.

정비소에서 차를 기다리는 동안에도 작업을 계속할 수 있습니다.
트위터

한 곳에서 작업할 필요가 없기 때문에 내가 설명한 기술과 기술을 사용하여 인터넷 연결이 절반 정도만 되는 곳이면 어디에서나 문자 그대로 작업할 수 있습니다(정비사에서 차를 기다리는 동안 포함). SSH, 포워드 포트, ​​드릴 터널을 통해 외부 시스템을 마운트하여 개인 서버 또는 클라우드 기반 데이터에 원격으로 액세스하면서 햇살 가득한 해변을 내려다보거나 안개 낀 도시에서 힙스터급 친환경 커피를 마시세요. 그냥 해!