Tôi vừa thay đổi cách sao lưu máy chủ gia đình NixOS của mình, chuyển từ một script đơn giản hàng ngày sang sao lưu hàng giờ. Nó không hoàn toàn tinh tế như phiên bản Mastodon mà bạn tôi quản lý – ở đó chúng tôi có một bản snapshot ZFS mỗi 20 phút – nhưng tôi cũng hài lòng với giải pháp này. Và tôi phải nói rằng tôi ngày càng thích NixOS hơn. Nếu không có AI, nó sẽ quá phức tạp để tôi có thể hiểu được, nhưng giờ đây ít nhất tôi đã có thể đọc được các tệp Nix hoàn chỉnh. Tôi đã từng cân nhắc chuyển máy chủ sang một bản phân phối Linux thông thường, nhưng miễn là nó vẫn hoạt động tốt như thế này...

  1. /etc/nixos: Toàn bộ cấu hình NixOS (tất cả các tệp .nix).

  2. /opt/minecraft: Tất cả các thế giới và dữ liệu của máy chủ Minecraft.

  3. /opt/satisfactory: Các bản lưu game và cấu hình của máy chủ Satisfactory.

  4. /opt/Blog: Mã nguồn và nội dung của blog.

  5. /opt/ui: Các tệp giao diện người dùng (UI) của Mastodon.

  6. /opt/audiobookshelf: Sách nói và cơ sở dữ liệu liên quan.

Tất cả sẽ được lưu trữ trên bộ nhớ S3 được mount thông qua RClone.

Cấu hình NixOS


{ config, pkgs, ... }:

{
  # Cấu hình BorgBackup
  services.borgbackup.jobs.hourly = {
    # Đường dẫn đến kho lưu trữ (repository) trong S3 mount
    repo = "/opt/S3/Backup/NixOSHomeServer_Borg";

    # Không yêu cầu mật khẩu
    encryption.mode = "none";

    # Nén để tiết kiệm không gian hơn nữa
    compression = "auto,zstd";

    # Các đường dẫn cần sao lưu
    paths = [
      "/etc/nixos"
      "/opt/minecraft"
      "/opt/satisfactory"
      "/opt/Blog"
      "/opt/ui"
      "/opt/audiobookshelf"
    ];

    # Thực thi hàng giờ
    startAt = "hourly";

    # Tự động khởi tạo kho lưu trữ nếu nó bị thiếu
    doInit = true;

    # Quy tắc lưu giữ (Pruning)
    prune.keep = {
      within = "1d"; # Tất cả các bản snapshot trong 24 giờ qua
      daily = 7;
      weekly = 4;
      monthly = 12;
    };
  };

  # Đảm bảo rằng S3 mount đã sẵn sàng trước khi Borg bắt đầu
  systemd.services.borgbackup-job-hourly = {
    requires = [ "rclone-s3-mount.service" ];
    after = [ "rclone-s3-mount.service" ];
  };
}