บล็อกของฉัน // คลังเก็บข้อมูลดิจิทัล

ความคิด โปรเจกต์ และบันทึกทางเทคนิค

แสดงรายการที่มีแท็ก: #nixos แสดงทั้งหมด ×

ตอนนี้ผมได้เปลี่ยนระบบสำรองข้อมูล (Backup) ของโฮมเซิร์ฟเวอร์ NixOS จากเดิมที่ใช้สคริปต์ง่ายๆ รายวัน มาเป็นแบบรายชั่วโมงแล้ว อาจจะไม่หรูหราเท่ากับอินสแตนซ์ Mastodon ที่เพื่อนของผมดูแล ซึ่งที่นั่นมีการทำ ZFS Snapshot ทุกๆ 20 นาที แต่สำหรับโซลูชันนี้ผมก็พอใจแล้ว และต้องบอกเลยว่าผมเริ่มชอบ NixOS มากขึ้นเรื่อยๆ ถ้าไม่มี AI มันคงจะซับซ้อนเกินกว่าที่ผมจะเข้าใจได้ แต่ตอนนี้อย่างน้อยผมก็สามารถอ่านไฟล์ Nix ที่เสร็จสมบูรณ์ได้แล้ว เคยคิดจะเปลี่ยนเซิร์ฟเวอร์ไปใช้ Linux ทั่วไปอยู่เหมือนกัน แต่ตราบใดที่มันยังทำงานได้ดีขนาดนี้...

  1. /etc/nixos: การตั้งค่า NixOS ทั้งหมด (ไฟล์ .nix ทั้งหมด)

  2. /opt/minecraft: โลกและข้อมูลทั้งหมดของเซิร์ฟเวอร์ Minecraft

  3. /opt/satisfactory: ไฟล์เซฟเกมและการตั้งค่าของเซิร์ฟเวอร์ Satisfactory

  4. /opt/Blog: ซอร์สโค้ดและเนื้อหาของบล็อก

  5. /opt/ui: ไฟล์ Mastodon-UI

  6. /opt/audiobookshelf: หนังสือเสียงและฐานข้อมูลที่เกี่ยวข้อง

ข้อมูลทั้งหมดจะถูกเก็บไว้ใน S3 Storage ที่เมานต์ผ่าน RClone

การตั้งค่า NixOS


{ config, pkgs, ... }:

{
  # การตั้งค่า BorgBackup
  services.borgbackup.jobs.hourly = {
    # พาธไปยัง Repository ใน S3-mount
    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";

    # เริ่มต้น Repository โดยอัตโนมัติหากยังไม่มี
    doInit = true;

    # กฎการเก็บรักษาข้อมูล (Pruning)
    prune.keep = {
      within = "1d"; # Snapshot ทั้งหมดในช่วง 24 ชั่วโมงที่ผ่านมา
      daily = 7;
      weekly = 4;
      monthly = 12;
    };
  };

  # ตรวจสอบให้แน่ใจว่า S3-mount พร้อมใช้งานก่อนที่ Borg จะเริ่มทำงาน
  systemd.services.borgbackup-job-hourly = {
    requires = [ "rclone-s3-mount.service" ];
    after = [ "rclone-s3-mount.service" ];
  };
}

ผมได้ติดตั้งบล็อกส่วนตัวของตัวเองขึ้นมา — โดยมีจุดประสงค์หลักคือเพื่อทำความรู้จักกับ #NixOS ให้มากขึ้น ซึ่งก็น่าประหลาดใจที่ทุกอย่างดำเนินไปอย่างราบรื่นและไม่ซับซ้อนเลย

WriteFreely ตอบโจทย์นี้ได้ดีมาก ทั้งความเรียบง่าย ติดตั้งได้รวดเร็ว และไม่มีฟีเจอร์ที่เกินความจำเป็น เหมาะอย่างยิ่งสำหรับการเริ่มต้นเขียนและเรียนรู้สิ่งใหม่ๆ ไปพร้อมกัน การตั้งค่าก็ดูสะอาดตาและเข้าใจง่าย เพียงแค่กำหนดตัวเลือกไม่กี่อย่าง เตรียมไดเรกทอรี ตั้งค่า Reverse Proxy ไว้ข้างหน้า เท่านี้ก็เรียบร้อย

นี่คือการตั้งค่า NixOS ปัจจุบันของผมสำหรับโปรเจกต์นี้:

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

  # แก้ไขสำหรับการสร้างคีย์ ActivityPub: Federation จำเป็นต้องใช้ openssl
  systemd.services.writefreely.path = [ pkgs.openssl ];

  # สร้างไดเรกทอรีข้อมูลโดยอัตโนมัติพร้อมกำหนดสิทธิ์ที่ถูกต้อง
  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}
    }
  '';
}

หลักๆ ก็มีเพียงเท่านี้ NixOS ช่วยให้การตั้งค่าบริการต่างๆ เป็นไปอย่างเป็นระเบียบและสามารถทำซ้ำได้ง่ายจริงๆ