클라우드 서버에 NixOS 설치하기


요약

예전에 Nix를 잠깐 찍먹해보려고 하다가 NixOS라는 거대한 장벽을 마주하고 앗뜨거 도망친 적이 있었는데, 살다보니 이제 내가 docker compose 세개 + 두 개의 도메인을 돌리고 있는 상황이 되었고, 내가 기억해야 하는 서버 관리 설정이 점점 더 커지는 문제가 생겼다.

어차피 클라우드 서버 OS에 큰 선호가 있는 건 아니라서, 이번에 한번 NixOS를 직접 설치하는건 어떤지 알아보게 되었다.

환경

오라클 클라우드의 Free tier에 빌붙어있는 ARM 서버에 NixOS를 설치하기로 했다.

초기 설정

이미 돌아가고 있는 데비안 시스템에 NixOS를 덧씌워야 하는 상황인데, 이미 용자들이 여럿 방법을 전수하고 있다.

간단히 말하자면 서버의 램에 초소형 OS를 잠깐 띄우고, 거기서 다시 파일 시스템을 싹 정리하고 NixOS를 설치하는 것이다. 몇가지 내 입장에서 정리하자면…

  • 뭔가 잘 안되면 Oracle에서 제공하는 Virtual console로 접속해서 수정해볼 수 있다. ssh가 안되는 상황에서도 쓸 수 있기 때문에 디버깅용으로 아주 유용하다.
  • 원글에서는 zfs를 썼는데, 나는 좀 찜찜해서 btrfs를 써봤다. 기본 설정을 조금 더 고쳐야 한다.
  • Debian에서 제공하는 nix 패키지로는 잘 안되고, 그냥 nix를 잠깐 유저 인스톨하는게 편하다. 어차피 날리는 시스템에 잠깐 쓰는거라…
  • 초기 설치시에 root 패스워드를 입력하라고 해서 이걸로 로그인할 수 있을줄 알았는데, ssh 서버가 root의 password 로그인을 막아놓았는지 잘 안됐다.
    • 그래서 virtual console로 해결했다. 오라클 만세!
    • 다음엔 초기 ramdisk 설정부터 사용자를 잘 추가해야 할 것 같다.

결론

용자들의 도움은 아주 효과적이었다! NixOS를 잘 설치했다!

이제…

  • NixOS에서 nginx 설정하기
  • NixOS에서 docker-compose 설정하기
  • NixOS에서 Let’s Encrypt 설정하기
  • NixOS에서 git post-receive 훅을 이용한 CI 설정하기
  • NixOS에서 task-spooler 설정하기

GitHub copilot이 이런 것들을 하면 된다고 하시네요. 그럼 이만!

후일담

그 후 하루종일 NixOS 설치를 위해 씨름했고, 결국 다음과 같은 결론을 마주하게 되었다.

Nix냐 Docker냐, 그것이 문제로다 😱

내가 어떤 아주 작은 Python 프로그램을 짜서 이걸 서버에서 돌리고 싶다고 하더라도, 이제는 NixOS님의 허락을 받아야 한다. 그렇지 않으면… 대부분의 OS에 기본적으로 설치되어 있는 shared object 같은것들을 못찾아서 난리가 나는 경우가 있다. NixOS님의 허락을 받는 방법은 두가지가 있는데:

  • Nix 패키지로 아예 빌드를 해서 모든 의존성을 Nix 안에서 처리하는 방법
  • Docker 컨테이너로 감싸서 컨테이너 안에서 의존성을 찾도록 하는 방법

뭐든지 평소엔 그냥 서버에 python 코드 뚝 올리고 대충 venv 설정한 다음에 돌리던 사람 입장에선 여간 번거로운 일이 아닐 수 없다.