brunch

You can make anything
by writing

C.S.Lewis

by 영춘 Jan 21. 2022

개백취 | 슬기로운 Self-hosted 생활

의존적인 삶에서 벗어나기

안녕하세요, 영춘입니다.

개발자의 백만 가지 취미 시리즈의 이번 주제는 “슬기로운 Self-hosted 생활"입니다. 슬기로운 Self-hosted 생활을 위해, 직접 설치하여 사용할 수 있는 도구를 소개해드리겠습니다.



Self-hosted는 무엇인가요? 그리고 왜 필요한가요?


우리는 일상에서 다양한 웹 서비스를 사용합니다. 스마트폰과 컴퓨터로 메일을 주고받고, 블로그를 작성하고, 소중한 사진들을 보관합니다. 하지만 만약 이런 서비스들이 멈춘다면 어떻게 할까요? 아무런 얘기도 없이 서비스와 회사가 사라져 버린다면 그동안 보관해 둔 데이터들은 어떻게 찾을 수 있을까요?


이런 걱정은 서비스가 잘 운영되고 있을 때도 사라지지 않습니다. 어쩌면 나의 내밀한 기분과 발견을 적어둔 문서를 누군가 훔쳐볼 수 있지 않을까요? 나의 검색 기록과 사이트 방문 기록은 어떻게 관리되고 있을까요? 나의 관심사를 기가 막히게 알아낸 타겟팅 광고에 흠칫 놀란 적은 없나요?


소프트웨어 엔지니어들은 손을 조금만 놀리면 이런 걱정에서 벗어날 수 있습니다.

데이터를 우리 손 안으로!

보통 웹으로 접속해 이용할 수 있는 서비스들은 SaaS (Software as a Service) 형태로 제공됩니다. 사용자는 소프트웨어를 설치할 필요 없이, 모든 인프라스트럭처와 데이터 관리를 회사에 맡기는 형태입니다. Self-hosting은 이와는 반대로 소프트웨어 설치 및 운영을 직접 수행하고 인프라 관리도 직접 하는 것을 말합니다. Self-hosted Service는 손수 구축하고 관리하는 서비스를 말하는 것이죠.


Self-hosting을 이야기하고 있는 블로그 글​ 하나를 링크했는데요. 이 글에서 Self-hosting에 대해 조언하는 부분이 있어 소개해드리겠습니다.

Self-hosted로 갑시다!

뭔가를 만들기 좋아하고 작은 디테일에 요란을 떠나요? 사소한 문제를 해결하기 위해 수십 시간… 아니, 며칠을 보낼 수 있나요?

컴퓨터의 구석구석을 배우길 좋아하나요? 컴퓨터가 아니라도 뭔가를 배우길 좋아하나요?

거대한 회사에서 제공하는 기능들을 저렴한 대안으로 누리는 것에 흥미가 있나요?

자신의 데이터를 스스로 소유하고 싶은가요?

아니 난 못 가겠어..

무엇보다도 서비스의 안정성과 편리함이 중요한가요?

의미 없는 문제를 해결하는데, 골머리 썩고 싶지 않나요?

당신의 데이터를 소유하는데 별로 관심이 없나요?

위의 조언을 보며 많은 부분에 공감했습니다. 사실 직접 인프라를 구축하고 혼자 혹은 소수를 위한 서비스를 운영하는 일은 수지타산이 맞지 않는 일이기도 합니다. 이런 귀찮음에도 불구하고 Self-hosting을 하는 것의 장점은 무엇일까요?


인프라와 서비스를 관리하는 과정에서 즐거움과 배움을 얻을 수 있습니다

서비스를 배포하고 운영할 땐, 배포 환경을 가상화하는 Containerization 기술과 컨테이너/서비스들의 안정적인 운영을 위한 Container Orchestration 기술을 활용합니다. 저는 이런 기술에 관심이 있지만, 업무에서는 충분히 활용하기 어려운 상황이라 Self-hosting 환경을 만들어가며 이런 기술을 익혀볼 수 있었습니다.

머릿속에 그려둔 대로 일이 진행되지 않을 때가 있습니다. 생각하지 못했거나 해결하기 까다로운 문제와 마주하게 됐을 때, 보통의 경로로는 알 수 없던 지식을 습득하는 기회가 되기도 합니다.


적은 비용으로 원하는 서비스를 이용할 수 있습니다

개인 블로그를 사용하기 위해 Ghost라는 도구를 사용하고 있습니다. 이 도구는 오픈소스 소프트웨어인데 Ghost.org 사이트에 가입해 월 비용을 지불하고 호스팅을 받는 방법과 직접 설치해 무료로 사용하는 두 가지의 방법이 있습니다. 많은 도구들이 이런 형태로 제공됩니다. 오픈소스 소프트웨어임에도 수익을 창출할 수 있는데, 직접 Self-hosting을 하기보다 비용을 지불하더라도 편하게 이용하고 싶어 하는 사용자들이 있기 때문입니다.

클라우드 스토리지의 경우, 테라바이트(TB) 단위로 이용하려면, 꽤 큰 비용이 듭니다. 애플의 iCloud와 구글의 Google One의 경우 2TB를 이용하기 위해 월 11,000~12,000원 (한국 기준)의 비용이 듭니다. 2TB 하드디스크의 가격은 약 6만 원 수준이니 5년 정도 사용하면 같은 용량의 하드디스크를 살 수 있는 셈입니다.

어떤 서비스의 경우, 다양한 기능을 사용하기 위해 서비스를 구독해야 하는 경우가 있습니다. 부가 기능을 반드시 이용해야 하는 경우, Self-hosted 대안을 찾아 활용할 수 있습니다. 예를 들어, 예전의 Github에서 Private Repository를 정해진 개수만큼 만들 수 있었습니다 (아, 물론 지금은 제한 없이 원하는 만큼 만들 수 있습니다. 마이크로소프트 고마워!). 제한 개수 이상으로 만들려면 역시 비용을 지불해야 했습니다. Github과 유사한 서비스를 제공하는 Self-hosted 도구들로 Gogs, Gitea 등이 있고 직접 설치해 사용한다면 제한 없이 Private Repository를 만들어 사용할 수 있습니다.


데이터에 대한 소유권과 코드 수정에 대한 자유를 누릴 수 있습니다

황당한 예시일 수 있지만.. 여러분이 메일을 보낼 때마다 무작위로 고양이 사진을 첨부하고 싶다면, 여러분이 이용하는 메일 서비스 회사에서 이 기능을 만들어 줄까요? 소프트웨어 엔지니어 여러분이 작성한 Pull Request가 머지될 때, 코드 저장소에 접속한 모든 이의 브라우저에서 팡파르가 울려 퍼지게 만들고 싶다면.. Github에서 만들어 줄까요?

Self-hosting을 한다면 할 수 있습니다!


나의 Self-hosted 생활

이번엔 제가 사용하는 도구들을 소개하겠습니다.


광고 없는 세상

버스를 타고 출퇴근을 하던 어느 날, 문득 스피커를 통해 나오는 버스 광고가 성가시게 느껴졌습니다. 하지만 이제 광고는 생활 속에 만연해있어 피하려 해도 피할 수 없습니다.


필립 K 딕 작가의 SF 단편 소설 중, Sales Pitch라는 작품이 있습니다. 주인공은 개인 우주선에 탑승해 목성의 위성인 가니메데에서 지구로 퇴근하며, 긴 여정에서 수많은 광고와 마주하고 따라붙는 세일즈 로봇들과 씨름합니다.


저 역시 아침 출근길마다 듣게 되는 광고에 지쳐, 아래와 같은 영상을 만들어 보았습니다. 영상에선 버스 광고들이 연달아 플레이되며 정신을 쏙 빼놓다가 점차 소리가 페이드 아웃되며 백색 소음만 남게 됩니다. 그리고 마침내 아무 소리도 들리지 않게 되죠. 광고 배경음이 사라진 버스의 풍경은 얼마나 평온한가요.

힘든 출근길을 지나 컴퓨터 앞에 앉은 직장인들은 또다시 웹페이지에 끼어든 배너광고와 무료 앱을 사용할 때 등장하는 인앱 광고들에 시달리게 됩니다.


이런 광고에서 벗어나고 싶다면, Pi-hole와 AdGuard를 사용해 보세요. 도구들이 동작하는 방식은 아래와 같습니다.

배너 광고, 인앱광고들은 동적으로 그 내용이 바뀌는데 광고 영역에 표시할 콘텐츠를 가져오기 위해 특정 주소로 웹 요청을 보내야 합니다.

Pi-hole, AdGuard는 도메인 이름을 IP 주소로 변환해주는 DNS (Domain Name System) 서버로 동작하는데, 광고를 가져오는 주소들에 대한 블랙리스트들이 있어 해당 주소로의 접근을 차단해 광고를 가져오지 못하도록 합니다.


이 도구를 실행시킨 다음, 도메인 이름 해석을 위해 사용할 DNS 주소를 해당 도구의 IP 주소로 설정하면 끝입니다. 얼마나 많은 광고 요청이 차단되었는지 통계 값을 확인할 수도 있고, 특정 주소를 허용하도록 화이트리스트에 등록하거나 블랙리스트에 없지만 차단할 주소를 추가할 수도 있습니다.

Pi-hole: https://pi-hole.net/
Pi-hole Dashboard 화면
AdGuard: https://github.com/AdguardTeam/AdGuardHome
AdGuard Home 사용화면


도청장치 피하기

인터넷을 사용할 때 주고받는 정보들은 패킷이라는 단위로 통신망으로 흘러 들어갑니다. 그 통신망을 감시하는 사람이 있어 여러분의 통신 내용을 훔쳐본다면, 그 감시자의 존재를 알아챌 방법이 없다면 마음 편히 인터넷을 사용하지 못할 겁니다.

혹시 웹사이트에서 로그인 전에 HTTP/HTTPS 프로토콜을 확인하시나요?
비밀번호 없는 와이파이 AP에 접속해야 할 때 꺼림칙한 기분이 드나요?


HTTP 프로토콜을 사용하는 경우, 여러분이 입력한 로그인 정보는 글자 그대로 (Plaintext 형태로) 패킷에 담겨 전달됩니다. 만약 패킷의 이동 경로 중에 누군가 이 패킷을 훔쳐볼 수 있다면 사이트 계정은 해킹 위험에 노출되는 셈입니다.


HTTPS 프로토콜을 사용한다면 어떨까요? 보통 브라우저에서 어떤 사이트에 접속하기 위해선 IP 주소를 알아야 하는데 특별한 설정이 없으면 이 요청은 암호화 없이 전달합니다. 사이트와 무얼 주고받는지는 모를지언정 어떤 사이트들에 접근하고 있는지는 훔쳐볼 수 있습니다. (이를 방지하지 위해 DNS over TLS 기술을 사용하기도 합니다)


몇 달 전, 저는 작은 휴대용 라우터를 구입했습니다. 이 라우터에는 OpenWRT라는 오픈소스 소프트웨어가 탑재되어 있고, 다양한 부가 기능을 사용할 수 있으며 프로그래밍도 할 수 있습니다. 패킷 스핑의 위험성을 직접 확인해보고자 아래와 같은 실험을 해봤습니다.

라우터에서 비밀번호 없는 AP를 제공하도록 했고 SSID는 iptime으로 정했습니다.

OpenWRT에는 tcpdump라는 패킷 덤프 도구를 설치한 다음, AP 제공에 사용하는 무선 네트워크 인터페이스의 패킷을 덤프 하도록 했습니다. (HTTP 프로토콜 한정)

이런 작업을 하고 해당 AP에 접속하여 웹 브라우징을 했더니, 예상했던 것처럼 웹 서버와 주고받는 패킷의 내용을 훔쳐볼 수 있었습니다. 작업하는 도중에도 iptime이라는 이름에 속아 접속하는 익명의 사용자들도 있었습니다. 자기도 모르는 사이 해킹의 위험에 노출된 셈입니다.


그럼 이런 위협에서 벗어나려면 어떻게 해야 할까요? 하나의 방법은 VPN을 사용하는 것입니다. VPN 연결을 통해 주고받는 패킷은 암호화되므로 훔쳐본다 한들 그 내용을 알 수 없습니다. 예를 들어, 어딘가 외부로 출장을 갔는데 혹은 카페엘 갔는데 이용할 수 있는 무선 AP는 암호화 없는 AP밖에 없다? VPN 연결을 활성화하고 이용한다면 현재 네트워크 접속 지점과 VPN 서버 사이의 구간은 암호화 채널로 보호할 수 있습니다.


저는 다양한 VPN 프로토콜 중 가볍다고 알려진 WireGuard 프로토콜을 이용하고 싶어 이를 설치하는 도구로 Algo VPN을 찾아 사용했습니다.

Algo VPN: https://github.com/trailofbits/algo​​​

최근에는 Subspace라는 도구를 이용했는데 편리한 웹 인터페이스를 제공합니다.

Subspace, https://github.com/subspacecloud/subspace​


기록하는 인간

여러분은 기록하는 습관이 있나요? 김 초엽 작가의 SF 단편 “인지 공간”에서는 거대한 구조물의 형태로 만들어진 인지 공간이 등장합니다. 인지 공간은 일종의 데이터베이스와 비슷한 것으로 인류의 지식을 물리적인 구조물의 형태로 저장하고 탐색하는 공간이 됩니다.


SF 속에만 존재하는 생경한 도구가 아니더라도 지능을 확장할 수 있는 오래된 도구가 있습니다. 메모나 책이 그것인데요. 현재로 이야기하자면, 인터넷 역시 비슷한 역할을 하고 있습니다. 우리들도 나중에 참고할만한 것들은 기록 시스템에 적어두고, 필요한 시점에 다시 찾으면 정확한 정보를 활용할 수 있습니다.


소프트웨어 엔지니어로 일하다 보면, 자주 사용하는 명령이나 코드 조각들이 있습니다. 이를 암기하기는 어렵기 때문에 필요할 때마다 검색하곤 했는데 이런 비효율을 없애고 싶어, 따로 기록해두기 시작했습니다. 그리고 개인적인 기록들을 남기기 위한 도구 중 DokuWiki를 선택했습니다. 이름에서 알 수 있듯 위키의 모양을 갖추고 있습니다.


다른 도구들과 비교했을 때 DokuWiki의 장점으로 간소함이 있습니다. 따로 데이터베이스를 준비할 필요가 없고, 작성한 글들은 텍스트 파일로 저장됩니다. 텍스트 파일은 가장 범용적이고, UI도 단순한 만큼 빠르게 반응해, 가볍게 사용할 수가 있습니다. 또한 플러그인을 지원하고 있어, 커뮤니티에서 작성한 다양한 기능의 플러그인을 사용할 수 있습니다.


제가 사용하는 몇 개의 플러그인을 소개해드리면.. Markdown 문법을 지원해주는 기능, MathJax를 통해 수식을 렌더링하고 PrismJS를 통해 소스코드 하이라이팅 하는 기능, 그리고 글 쓰는 공간만을 남겨주어 Distraction-free 글쓰기 환경을 만들어주는 widearea 플러그인이 있습니다.


DokuWiki: https://www.dokuwiki.org/dokuwiki

소프트웨어 엔지니어들은 기술 블로그를 만들어 공유하고 싶은 내용을 작성하곤 하는데요. DokuWiki는 블로그로 사용하기엔 모양이 허술해 보일 수 있습니다. 이를 보완하고 좀 더 미려한 디자인의 블로그를 위해 저는 Ghost라는 도구를 사용합니다.


앞서 소개한 다른 도구들과 마찬가지로 Docker 이미지들을 찾을 수 있어 호스트 컴퓨터의 환경을 어지럽히지 않고 docker 명령 하나로 쉽게 도구를 사용할 수 있습니다. 또한 다양한 Theme을 사용할 수 있습니다. 기본적으로 댓글 기능이 포함되어 있지 않지만 Disqus 같은 외부 도구를 통합해 어렵지 않게 사용할 수 있습니다.

Ghost: https://github.com/TryGhost/Ghost


스토리지 서비스(Stroage Service)

살아가면서 우린 많은 콘텐츠를 소비하고 만들어냅니다. 이런 콘텐츠들 중에는 가족들의 사진이나, 좋아하는 영화 등, 두고두고 보관해놓고 보고 싶은 것들도 있습니다. 이런 데이터들을 보관하기 위한 도구로 NextCloud를 소개합니다.


NextCloud를 설치 후 실행하면 서버가 동작하고 웹브라우저로 접근할 수 있는 웹 인터페이스를 제공합니다. 로그인을 하면, 대시보드에서 저장된 파일들을 확인하고 내려받거나 업로드를 할 수 있습니다.


또한 파일을 다른 사람에게 공유하고 싶을 때는 공개 URL을 얻을 수 있어 해당 URL을 공유하면 로그인 없이 파일을 내려받을 수 있습니다.

NextCloud: https://github.com/nextcloud/server
NextCloud 사용 화면

두 번째 도구로는 MinIO를 소개합니다. MinIO는 Amazon Web Services의 S3 (Simple Storage Service)와 호환 가능한 API를 제공하는 스토리지 도구입니다.


AWS Command-line Interface 도구로 파일을 탐색하고, 파일의 업로드, 다운로드가 가능합니다. 또한 MinIO Client 명령행 도구를 사용할 수 있어, 좀 더 개발자 친화적인 도구라고 생각합니다. 명령행을 자주 사용하는 소프트웨어 엔지니어라면 쉽게 파일을 저장하고 불러올 수 있습니다.


MinIO의 설치 방법은 다양한데 Docker 이미지를 사용할 수 있고, 싱글 바이너리 파일을 사용할 수도 있습니다. MinIO의 장점은 성능과 안정성을 고려해 구성을 할 수 있다는 점입니다. 여러 대의 컴퓨터에 스토리지를 달아두고, 각각의 컴퓨터에서 MinIO 서버를 실행해, 그 컴퓨터들을 잘 엮어두면 MinIO에서 파일을 분산 저장하여 High Availability를 확보할 수 있게 해 줍니다.


중요한 자료들을 저장해야 할 땐 RAID 같은 기술을 이용하여 하드웨어 결함으로 인한 파일 손실에 대비하는데, MinIO는 소프트웨어 수준에서 이런 기능을 제공해 줍니다.

MinIO: https://github.com/minio/minio

마지막으로 rclone을 소개하겠습니다. rclone은 다양한 스토리지를 대상으로 데이터를 옮길 수 있습니다. rsync에서는 ssh 등으로 연결 가능한 두 컴퓨터에서 파일을 옮기지만, rclone은 google drive, mega, s3, dropbox 등 다양한 클라우드 스토리지로 파일을 옮길 수 있습니다.

Rclone: https://rclone.org/
Rclone Suported Providers: https://rclone.org/#providers



Self-hosted 생활에 필요한 기술

첫째로, 셀프 호스팅 도구들을 설치할 때 발생하는 문제들을 해결하기 위해선 운영체제를 능숙하게 사용할 수 있어야 합니다.

무료로 쉽게 사용할 수 있는 운영체제로, 리눅스 계열 운영체제 (예. Ubuntu)를 꼽아보겠습니다. 위키피디아 항목을 참고하면 (Public servers on the Internet) 절반 이상의 서버들이 유닉스 혹은 리눅스 기반의 운영체제로 돌아가고 있습니다.

디렉터리 구조들 (어떤 위치에 시스템 설정들이 있고, 실행 바이너리들과 시스템 로그들은 어디 위치하는지 등)과 파일 시스템 (소유자, 그룹, 권한 등), 빈번하게 사용하는 명령행 도구들 종류와 사용법 등을 익히면 도움이 됩니다.

네트워크 관련 지식도 도움이 됩니다.

셀프 호스팅 도구를 설치하고 외부에서 사용하기 위해선 공유기가 할당받은 Public IP를 도메인과 연결하여 사용하고, 다양한 (서브) 도메인을 각각의 도구들과 연결하기 위해선 Nginx 같은 Reverse proxy도구를 활용합니다.


HTTPS프로토콜을 사용하기 위해 Let’s Encrypt 인증서를 발급받고 적용하는 과정을 진행하기도 합니다 (참고로 duckdns.org를 활용하시면 무료로 서브도메인을 할당받아 사용할 수 있습니다)


셀프 호스팅 도구들은 다른 자원을 참고하여 사용하거나 인터넷을 가로질러 연결하는 경우도 있습니다. 연결이 잘 되지 않는 경우, 문제가 발생할만한 여러 구석을 살펴봐야 합니다. DNS 해석이 제대로 되고 있는지, 특정 포트가 막혔는지 등 netstat, ping, nc, curl 등 네트워크 유틸리티를 활용할 수 있어야 합니다.



여기서 소개한 도구들은 수많은 셀프 호스팅 도구의 일부에 지나지 않습니다. Awesome Self-hosted​ 저장소를 확인하여 더 많은 도구를 만날 수 있습니다. 다양한 분야의 도구들이 있어 각자의 필요에 따라 사용하시면 됩니다.


여러분만의 Self-hosted 생활을 응원하며 글을 마칩니다.

매거진의 이전글 개발자의 백만 가지 취미 | 클라이밍
작품 선택
키워드 선택 0 / 3 0
댓글여부
afliean
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari