Blog của tôi // Lưu trữ kỹ thuật số

Suy nghĩ, dự án và ghi chú kỹ thuật

Hiển thị các bài viết với thẻ: #nixos Hiển thị tất cả ×

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" ];
  };
}

Tôi vừa cài đặt một blog cá nhân — chủ yếu là để tìm hiểu kỹ hơn về #NixOS. Thật ngạc nhiên là mọi thứ diễn ra khá suôn sẻ và không hề phức tạp.

WriteFreely cực kỳ phù hợp cho mục đích này: tối giản, thiết lập nhanh và không có nhiều tính năng thừa thãi. Nó hoàn hảo để bắt đầu ngay lập tức và học hỏi thêm điều gì đó trong quá trình thực hiện. Cấu hình của nó cũng rất rõ ràng. Chỉ cần thiết lập vài tùy chọn, chuẩn bị thư mục, đặt một Reverse Proxy phía trước — thế là xong.

Dưới đây là cấu hình NixOS hiện tại của tôi cho việc này:

{ config, pkgs, ... }:

{
  services.writefreely = {
    enable = true;
    host = "blog.burningboard.org"; 
    settings = {
      server = {
        port = 8080;
        min_log_level = "debug";
      };
      app = {
        host = "https://blog.burningboard.org";
        single_user = true;
        landing = "/read";
        wf_modesty = true;
        federation = true;
        public_stats = true;
        theme = "write";
      };
    };
    stateDir = "/opt/writefreely";
  };

  # Sửa lỗi tạo khóa ActivityPub: Liên đoàn (Federation) yêu cầu openssl
  systemd.services.writefreely.path = [ pkgs.openssl ];

  # Tự động tạo thư mục dữ liệu với các quyền hạn chính xác
  systemd.tmpfiles.rules = [
    "d /opt/writefreely 0700 writefreely writefreely -"
  ];

  services.caddy.virtualHosts."blog.burningboard.org".extraConfig = ''
    reverse_proxy 127.0.0.1:8080 {
      header_up Host {host}
      header_up X-Real-IP {remote_host}
      header_up X-Forwarded-For {remote_host}
      header_up X-Forwarded-Proto {scheme}
    }
  '';
}

Về cơ bản chỉ có vậy thôi. NixOS thực sự giúp việc cấu hình các dịch vụ như thế này trở nên sạch sẽ và dễ dàng tái lập.