میرا بلاگ // ڈیجیٹل آرکائیو

خیالات، منصوبے اور تکنیکی نوٹس

اس ٹیگ کے ساتھ اندراجات دکھائیں: #nixos سب دکھائیں ×

میں نے اب اپنے NixOS ہوم سرور کے بیک اپ کو ایک سادہ روزانہ اسکرپٹ کے بجائے فی گھنٹہ بیک اپ پر منتقل کر دیا ہے۔ یہ اتنا شاندار تو نہیں ہے جتنا کہ میرے دوست کے زیر انتظام Mastodon انسٹینس پر ہے – وہاں ہمارے پاس ہر 20 منٹ میں ایک ZFS اسنیپ شاٹ ہوتا ہے – لیکن میں اس حل سے بھی مطمئن ہوں۔ اور مجھے کہنا پڑے گا کہ NixOS مجھے اب پہلے سے زیادہ پسند آ رہا ہے۔ مصنوعی ذہانت (AI) کے بغیر یہ سمجھنا بہت مشکل ہوتا، لیکن اب میں کم از کم تیار شدہ Nix فائلوں کو پڑھ سکتا ہوں۔ میں نے ایک بار سرور کو عام لینکس پر منتقل کرنے کا سوچا تھا، لیکن جب تک یہ اتنا اچھا کام کر رہا ہے...

  1. /etc/nixos: مکمل NixOS کنفیگریشن (تمام .nix فائلیں)۔

  2. /opt/minecraft: مائن کرافٹ سرور کی تمام دنیایں اور ڈیٹا۔

  3. /opt/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"; # گزشتہ 24 گھنٹوں کے تمام اسنیپ شاٹس
      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 ایسی سروسز کو صاف ستھرے طریقے سے کنفیگر کرنے اور انہیں دوبارہ قابلِ استعمال (reproducible) رکھنے کو واقعی آسان بنا دیتا ہے۔