وبلاگ من // آرشیو دیجیتال

افکار، پروژه‌ها و یادداشت‌های فنی

نمایش پست‌ها با برچسب: #nixos نمایش همه ×

من اخیراً سیستم بک‌آپ سرور خانگی NixOS خود را تغییر دادم و به جای یک اسکریپت ساده روزانه، آن را به حالت ساعتی تنظیم کردم. این راهکار به اندازه نمونه مستودونی (Mastodon) که دوستم مدیریت می‌کند ظریف نیست – آنجا هر ۲۰ دقیقه یک اسنپ‌شات ZFS داریم – اما از این راهکار هم راضی هستم. و باید بگویم که NixOS هر روز بیشتر از قبل نظرم را جلب می‌کند. البته بدون هوش مصنوعی، درک آن بسیار پیچیده می‌شد، اما حالا حداقل می‌توانم فایل‌های آماده Nix را بخوانم. زمانی به فکر تغییر سرور به یک لینوکس معمولی بودم، اما تا زمانی که این‌قدر خوب کار می‌کند...

  1. /etc/nixos: کل پیکربندی NixOS (تمام فایل‌های .nix).

  2. /opt/minecraft: تمام جهان‌ها و داده‌های سرور ماینکرفت.

  3. /opt/satisfactory: فایل‌های ذخیره بازی و پیکربندی سرور Satisfactory.

  4. /opt/Blog: کد منبع و محتوای وبلاگ.

  5. /opt/ui: فایل‌های رابط کاربری مستودون.

  6. /opt/audiobookshelf: کتاب‌های صوتی و پایگاه داده مربوطه.

تمام این‌ها در یک فضای ذخیره‌سازی S3 که از طریق RClone مانت (mount) شده است، قرار می‌گیرند.

پیکربندی 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
  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";
  };

  # Fix für die ActivityPub-Schlüsselgenerierung: Föderation erfordert openssl
  systemd.services.writefreely.path = [ pkgs.openssl ];

  # Automatisches Erstellen des Datenverzeichnisses mit den korrekten Berechtigungen
  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 واقعاً پیکربندی تمیز و بازتولیدپذیر چنین سرویس‌هایی را بسیار آسان می‌کند.