مدونتي // الأرشيف الرقمي

أفكار ومشاريع وملاحظات تقنية

عرض المقالات التي تحمل الوسم: #nixos عرض الكل ×

لقد قمت الآن بتغيير نظام النسخ الاحتياطي لخادم NixOS المنزلي الخاص بي، وانتقلت من مجرد سكربت يومي بسيط إلى نسخ احتياطي كل ساعة. ليس الأمر بنفس الأناقة الموجودة في نسخة Mastodon التي يديرها صديقي - حيث يتم أخذ لقطة (ZFS Snapshot) كل 20 دقيقة - ولكنني راضٍ عن هذا الحل أيضاً. ويجب أن أقول إن NixOS يعجبني أكثر فأكثر. لولا الذكاء الاصطناعي، لكان الأمر معقداً للغاية لدرجة أنني لن أتمكن من فهمه، ولكنني الآن أستطيع على الأقل قراءة ملفات Nix الجاهزة. فكرت ذات مرة في تحويل الخادم إلى توزيعة لينكس عادية، ولكن طالما أن الأمور تسير على هذا النحو الجيد...

  1. /etc/nixos: تكوين NixOS بالكامل (جميع ملفات .nix).

  2. /opt/minecraft: جميع العوالم والبيانات الخاصة بخادم Minecraft.

  3. /opt/satisfactory: ملفات الحفظ وتكوين خادم Satisfactory.

  4. /opt/Blog: الكود المصدري ومحتويات المدونة.

  5. /opt/ui: ملفات واجهة مستخدم Mastodon.

  6. /opt/audiobookshelf: الكتب الصوتية وقاعدة البيانات المرتبطة بها.

يتم تخزين كل هذا على مساحة تخزين S3 تم وصلها (mount) عبر 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;
    };
  };

  # التأكد من أن نقطة وصل S3 جاهزة قبل بدء 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 من السهل حقاً تكوين مثل هذه الخدمات بشكل نظيف والحفاظ عليها قابلة لإعادة الإنتاج (reproducible).