저는 이번에 NixOS 홈 서버의 백업 방식을 간단한 일일 스크립트에서 시간별 백업으로 변경했습니다. 제 친구가 관리하는 마스토돈(Mastodon) 인스턴스처럼 20분마다 ZFS 스냅샷을 찍는 방식만큼 우아하지는 않지만, 이 솔루션에도 만족하고 있습니다. 그리고 NixOS가 점점 더 마음에 든다는 점을 말씀드리고 싶네요. AI가 없었다면 제가 이해하기에는 너무 복잡했겠지만, 이제는 완성된 Nix 파일들을 어느 정도 읽을 수 있게 되었습니다. 서버를 일반적인 리눅스로 바꿀까 고민한 적도 있었지만, 이렇게 잘 작동하는 한 계속 사용할 것 같습니다.

  1. /etc/nixos: 전체 NixOS 설정 (모든 .nix 파일).

  2. /opt/minecraft: 마인크래프트 서버의 모든 월드와 데이터.

  3. /opt/satisfactory: 새티스팩토리(Satisfactory) 서버의 세이브 파일과 설정.

  4. /opt/Blog: 블로그의 소스 코드와 콘텐츠.

  5. /opt/ui: 마스토돈 UI 파일들.

  6. /opt/audiobookshelf: 오디오북과 관련 데이터베이스.

이 모든 데이터는 RClone을 통해 마운트된 S3 스토리지에 저장됩니다.

NixOS 설정


{ config, pkgs, ... }:

{
  # BorgBackup 설정
  services.borgbackup.jobs.hourly = {
    # S3 마운트 내의 저장소(Repository) 경로
    repo = "/opt/S3/Backup/NixOSHomeServer_Borg";

    # 비밀번호 불필요
    encryption.mode = "none";

    # 더 많은 공간 절약을 위한 압축
    compression = "auto,zstd";

    # 백업할 경로
    paths = [
      "/etc/nixos"
      "/opt/minecraft"
      "/opt/satisfactory"
      "/opt/Blog"
      "/opt/ui"
      "/opt/audiobookshelf"
    ];

    # 매시간 실행
    startAt = "hourly";

    # 저장소가 없는 경우 자동 초기화
    doInit = true;

    # 보관 규칙 (Pruning)
    prune.keep = {
      within = "1d"; # 최근 24시간 내의 모든 스냅샷
      daily = 7;
      weekly = 4;
      monthly = 12;
    };
  };

  # Borg가 시작되기 전 S3 마운트가 준비되었는지 확인
  systemd.services.borgbackup-job-hourly = {
    requires = [ "rclone-s3-mount.service" ];
    after = [ "rclone-s3-mount.service" ];
  };
}