আমার ব্লগ // ডিজিটাল আর্কাইভ

চিন্তাভাবনা, প্রকল্প এবং প্রযুক্তিগত নোট

ট্যাগ সহ এন্ট্রিগুলি দেখান: #nixos সব দেখান ×

আমি এখন আমার NixOS হোম সার্ভারের ব্যাকআপ সিস্টেম পরিবর্তন করেছি এবং একটি সাধারণ দৈনিক স্ক্রিপ্টের পরিবর্তে এটিকে প্রতি ঘণ্টার ব্যাকআপে রূপান্তর করেছি। আমার বন্ধুর পরিচালিত মাস্টোডন (Mastodon) ইনস্ট্যান্সের মতো এটি অতটা মার্জিত নয় – সেখানে প্রতি ২০ মিনিটে একটি ZFS স্ন্যাপশট নেওয়া হয় – তবে আমি এই সমাধানটি নিয়েও সন্তুষ্ট। এবং আমাকে বলতেই হবে যে NixOS আমার দিন দিন আরও ভালো লাগছে। এআই (AI) ছাড়া এটি বোঝা আমার জন্য অনেক বেশি জটিল হতো, তবে এখন আমি অন্তত তৈরি করা Nix ফাইলগুলো পড়তে পারি। একবার সার্ভারটিকে সাধারণ লিনাক্সে পরিবর্তন করার কথা ভেবেছিলাম, কিন্তু যতক্ষণ এটি এত ভালো কাজ করছে...

  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 স্টোরেজে জমা হয় যা RClone-এর মাধ্যমে মাউন্ট করা হয়েছে।

NixOS কনফিগারেশন


{ config, pkgs, ... }:

{
  # BorgBackup কনফিগারেশন
  services.borgbackup.jobs.hourly = {
    # S3-মাউন্টে রিপোজিটরির পাথ
    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"; # গত ২৪ ঘণ্টার সব স্ন্যাপশট
      daily = 7;
      weekly = 4;
      monthly = 12;
    };
  };

  # Borg শুরু করার আগে S3-মাউন্ট প্রস্তুত আছে কিনা তা নিশ্চিত করা
  systemd.services.borgbackup-job-hourly = {
    requires = [ "rclone-s3-mount.service" ];
    after = [ "rclone-s3-mount.service" ];
  };
}

আমি আমার নিজস্ব একটি ব্লগ ইনস্টল করেছি — মূলত #NixOS সম্পর্কে আরও ভালোভাবে জানার জন্য। আশ্চর্যজনকভাবে, পুরো বিষয়টি বেশ সহজ ছিল।

WriteFreely এর জন্য দারুণ উপযোগী: এটি মিনিমালিস্টিক, দ্রুত সেটআপ করা যায় এবং এতে বাড়তি কোনো ঝামেলা নেই। কাজ শুরু করার এবং পাশাপাশি কিছু শেখার জন্য এটি উপযুক্ত। এর কনফিগারেশন বেশ গোছানো। কয়েকটি অপশন সেট করা, ডিরেক্টরি প্রস্তুত করা, সামনে একটি রিভার্স প্রক্সি রাখা — ব্যাস, কাজ শেষ।

এর জন্য আমার বর্তমান 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 কী জেনারেশনের জন্য ফিক্স: ফেডারেশনের জন্য 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 এই ধরনের সার্ভিসগুলোকে সুন্দরভাবে কনফিগার করা এবং রিপ্রোডিউসিবল রাখা সত্যিই সহজ করে দেয়।