
2026년을 맞이하며 저는 개인적으로 운영하던 서버 'moana'를 폐기하기로 결정했습니다. 월 100달러가 넘는 Vultr VPS 비용도 문제였지만, 더 큰 문제는 그 서버가 저의 '반려동물(Pet)'이 되어버렸다는 사실이었습니다. 넷플릭스에서는 수만 대의 인스턴스를 가축(Cattle)처럼 취급하며 불변 인프라(Immutable Infrastructure)를 외치던 제가, 정작 개인 서버는 수동으로 패치하고 설정 파일을 고치며 애지중지하고 있었습니다. '시스템 엔지니어의 신발엔 구멍이 나 있다'는 말이 딱 제 꼴이었습니다.
그래서 저는 더 저렴하고, 무엇보다 '내가 손댈 필요가 없는' 후속 서버 'tinkerbell'을 구축하기로 했습니다. 이 프로젝트의 핵심 목표는 단 하나였습니다. "서버에 SSH 접속을 하지 않는다." 아니, 더 정확히는 접속할 수 없게 만드는 것입니다. SSH 접속이 가능하다는 것은 곧 운영자가 개입해서 무언가를 '고칠' 수 있다는 뜻이고, 그것은 곧 시스템이 불완전하다는 반증이기 때문입니다. 저는 새벽 3시에 깨어나 서버 로그를 뒤지는 낭만 따위는 믿지 않습니다. 저에게 필요한 건 완벽한 자동화와 숙면뿐입니다.

많은 엔지니어들이 Docker Compose나 Ansible을 사용해 서버를 관리합니다. 저 역시 오랫동안 Ansible 애호가였습니다. 하지만 Ansible 플레이북을 작성해 본 분들은 아실 겁니다. 완전히 새로운 머신을 프로비저닝하는 로직과, 이미 운영 중인 서버를 업데이트하는 로직이 미묘하게 달라진다는 것을요. 이 '상태 관리'의 복잡함은 결국 엔트로피를 증가시킵니다. 저는 이 문제를 근본적으로 해결하기 위해 Fedora CoreOS와 Ignition을 선택했습니다. CoreOS는 컨테이너 실행에 최적화된 OS이며, Ignition은 최초 부팅 시 딱 한 번만 실행되어 시스템을 설정합니다. 한 번 설정된 후에는 변경되지 않습니다. 무언가 바꾸고 싶다면? VM을 삭제하고 새로 띄우면 됩니다. 이것이 진정한 불변성입니다.
구체적인 구현은 Podman Quadlets와 Terraform의 조합으로 완성되었습니다. Kubernetes는 개인 블로그 규모에는 지나친 오버헤드입니다. 저는 복잡성을 혐오합니다. 대신 systemd와 긴밀하게 통합된 Podman Quadlets를 사용했습니다. 이를 통해 컨테이너를 마치 리눅스 시스템 서비스처럼 관리할 수 있습니다. 업데이트 방식은 극도로 단순합니다. 제가 새로운 컨테이너 이미지를 레지스트리에 푸시하면, 서버의 Podman이 이를 감지하고 자동으로 이미지를 풀(pull) 받아 서비스를 재시작합니다. 이 과정에서 제가 서버에 접속해 명령어를 칠 일은 전무합니다.
웹사이트 호스팅을 위한 아키텍처는 Caddy와 정적 바이너리 컨테이너, 딱 두 가지로 구성했습니다. Caddy는 TLS 인증서 발급과 갱신을 알아서 처리해줍니다. 저는 기존에 Nginx와 certbot을 수동으로 엮어 쓰던 고통스러운 기억을 Caddy 한 줄 설정으로 날려버렸습니다. 웹사이트 자체는 OCaml로 빌드된 정적 바이너리를 스크래치(scratch) 이미지에 담아 배포했습니다. 이 모든 설정은 Butane을 통해 사람이 읽기 쉬운 YAML로 작성된 뒤, 기계가 읽는 Ignition JSON 파일로 변환되어 Vultr 인스턴스 생성 시 주입됩니다.
결과적으로 저는 제 서버에 대한 SSH 접근 권한을 잃었습니다. 설정조차 제거했으니까요. 하지만 그 대가로 저는 자유를 얻었습니다. 트래픽이 몰리거나 배포가 필요할 때, 저는 그저 로컬에서 코드를 수정하고 푸시할 뿐입니다. 서버가 죽으면 Terraform이 다시 띄웁니다. 제가 개입할 여지를 없애버린 덕분에, 시스템은 역설적으로 더 견고해졌습니다. 우리가 시스템의 가용성(Availability) 99.999%를 추구하는 이유는, 결국 엔지니어 자신의 '인생 가용성'을 확보하기 위함임을 잊지 마십시오. 기술은 당신을 더 바쁘게 만드는 것이 아니라, 당신을 불필요한 노동에서 해방시켜야 합니다.


