원문 캡처 · entropicthoughts.com
원문 캡처 · entropicthoughts.com

얼마 전 FreshRSS에 관한 글을 읽고 괜찮아 보여 서버에 설치해 사용하기 시작했다. 1년 전이었다면 하지 않았을 일이다. 당시에는 NixOS 서버가 없었기 때문이다.

지난 몇 년 동안 RSS 피드는 휴대전화에만 저장해 왔다. 컴퓨터를 떠나 있을 때 읽을 시간이 나는 경우가 많다는 생각에서였다. 하지만 실제로는 잘 맞지 않았다. 큰 화면에서 읽는 편이 나은 경우가 많았고, 수천 개의 글과 100개가량의 피드에서 읽음 상태를 휴대전화 앱 하나가 관리하게 하는 것도 불안했다. 특히 휴대전화를 바꾸면 피드는 옮길 수 있어도 읽음 상태는 사라졌다.

원했던 것은 서버에서 피드를 관리하는 피드 수집기였다. 서버에서 RSS 피드를 관리하고 웹 인터페이스나 클라이언트 앱으로 읽는 소프트웨어다. 전부터 갖고 싶었지만 배포 관리라는 사이드 프로젝트가 하나 더 생길 것 같아 시작하지 못했다.

NixOS를 어느 정도 사용해 본 뒤에는 백업을 포함한 FreshRSS 설정을 Nix 코드 9줄로 추가할 수 있었다. nginx 역방향 프록시 설정에는 12줄가량이 더 들었다. 특정 위치 블록에서 proxy_pass를 사용하고 쿠키 경로를 다시 써야 해서 조금 복잡해졌지만, 이는 NixOS의 문제가 아니라 내 설정에 따른 일이었다. 설치한 뒤 몇 달 동안 별다른 손을 대지 않아도 작동했다. 서버가 고장 나더라도 같은 설정으로 새 서버를 띄우면 아마 15분쯤 걸릴 것이다. 이렇게 할 수 있다면 새 소프트웨어를 시험해 보지 않을 이유가 없다.

NixOS가 아니라면 FreshRSS를 설치할 때 아카이브를 내려받아 적절한 위치에 풀고, 안내에 따라 권한을 설정해야 한다. 서버에 필요한 의존성과 함께 nginx와 php-fpm을 설치하고, php-fpm 풀을 설정한 뒤 nginx가 요청을 php-fpm으로 전달하도록 구성해야 한다. Let’s Encrypt 인증서와 백업도 마련해야 한다. 나중에 서버를 다시 설치하거나 업그레이드할 때 문제가 생기면 이 과정을 다시 기억해야 한다.

FreshRSS 프로젝트가 제공하는 컨테이너 이미지를 쓰면 과정이 조금 짧아진다. 이미지에는 Apache와 mod_php가 설정돼 있다고 안내돼 있다. 그래도 백업을 설정하고 컨테이너를 실행하는 systemd 서비스를 만들며, TLS를 처리하는 역방향 프록시로 nginx를 앞에 둬야 한다. 컨테이너 이미지에 TLS 지원이 없는 것은 합리적인 선택이다. 하지만 여전히 기억해 둘 작업이 있고, 어떤 컨테이너 이미지를 내려받았는지 정확히 기록하지 않으면 6개월 뒤 재설치할 때 같은 결과를 얻으리라는 보장도 없다. 같은 Dockerfile로 시차를 두고 이미지를 두 번 빌드해도 결과물이 꽤 달라질 수 있으므로, 소스에서 컨테이너 이미지를 빌드하는 것만으로 해결되지 않는다.

나는 사이드 프로젝트를 유지 관리하는 일을 싫어한다고 전에도 말한 적이 있다. 내 코드뿐 아니라 다른 사람이 만든 셀프 호스팅 서비스도 마찬가지다. 여기저기 몇 분씩 손보는 일은 괜찮지만, 무언가를 업그레이드하려고 방해받지 않는 시간을 몇 시간씩 잡거나 긴급 유지 보수에 시간을 써야 한다면 컴퓨터를 다루고 싶은 마음이 크게 줄어든다.

그런 성향이라면 구성 관리나 컨테이너 오케스트레이션을 깊이 쓰고 있을 것 같지만 그렇지 않다. CFEngine, Ansible, podman, k3s를 진지하게 써 보려 했지만, 설치·설정·배포 경험을 꼼꼼히 기록하거나 그 기록을 ssh 명령을 순서대로 실행하는 셸 스크립트로 만드는 것보다 크게 개선해 주지는 않았다. 사실상 Ansible을 다시 만드는 셈이지만, pip를 누군가 곁눈질하는 바람에 다음번에 깨지는 일은 적다. 셸 스크립트는 시간이 지나거나 다른 환경에서 실행할 때 유효하지 않게 되는 가정에 기대는 경우가 많다는 단점이 있다. NixOS 설정은 스스로에게 적어 둔 꼼꼼한 안내처럼 읽히면서도 실행할 수 있고, 매번 같은 결과를 만든다.