فا نیکسی

راه‌اندازی کش باینری HTTP

یک کش باینری، اشیای انبار Nix پیش‌ساخته را ذخیره کرده و آن‌ها را از طریق شبکه در اختیار سایر ماشین‌ها قرار می‌دهد. هر ماشینی که دارای یک انبار Nix باشد می‌تواند به عنوان یک کش باینری برای سایر ماشین‌ها عمل کند.

مقدمه

در این آموزش، یک کش باینری Nix را راه‌اندازی می‌کنید که اشیای انبار را از یک ماشین NixOS از طریق HTTP یا HTTPS سرویس‌دهی می‌کند.

چه چیزی خواهید آموخت؟

شما یاد خواهید گرفت که چگونه:

  • کلیدهای امضا را برای کش خود راه‌اندازی کنید
  • سرویس‌های مناسب را روی ماشین NixOS سرویس‌دهی‌کننده کش فعال کنید
  • بررسی کنید که راه‌اندازی به درستی کار می‌کند

به چه چیزهایی نیاز دارید؟

  • یک نصب Nix کاری روی ماشین محلی خود

  • دسترسی SSH به یک ماشین NixOS برای استفاده به عنوان کش

  • اگر با NixOS تازه آشنا شده‌اید، درباره‌ی سیستم ماژول بیاموزید و اولین سیستم خود را با nixos-vms پیکربندی کنید.

  • (اختیاری) یک آی‌پی عمومی و دامین DNS

    اگر خودتان هاست را میزبانی نمی‌کنید، هاست‌های سازگار با NixOS را در ویکی NixOS بررسی کنید. برای استقرار پیکربندی NixOS خود، آموزش provisioning-remote-machines-tutorial را دنبال کنید.

برای یک کش در یک شبکه محلی، فرض می‌کنیم:

  • نام هاست cache است (آن را با نام خود یا یک آدرس IP جایگزین کنید)
  • هاست، اشیای انبار را از طریق HTTP روی پورت 80 سرویس‌دهی می‌کند (این حالت پیش‌فرض است)

برای یک کش با دسترسی عمومی، فرض می‌کنیم:

  • نام دامنه cache.example.com است (آن را با نام خود جایگزین کنید)
  • هاست، اشیای انبار را از طریق HTTPS روی پورت 443 سرویس‌دهی می‌کند (این حالت پیش‌فرض است)

چقدر زمان خواهد برد؟

  • ۲۵ دقیقه

راه‌اندازی سرویس‌ها

برای ماشین NixOS که میزبان کش است، یک ماژول پیکربندی جدید در binary-cache.nix ایجاد کنید:

{ config, ... }:

{
  services.nix-serve = {
    enable = true;
    secretKeyFile = "/var/secrets/cache-private-key.pem";
  };

  services.nginx = {
    enable = true;
    recommendedProxySettings = true;
    virtualHosts.cache = {
      locations."/".proxyPass = "http://${config.services.nix-serve.bindAddress}:${toString config.services.nix-serve.port}";
    };
  };

  networking.firewall.allowedTCPPorts = [
    config.services.nginx.defaultHTTPListenPort
  ];
}

گزینه‌های زیر services.nix-serve سرویس کش باینری را پیکربندی می‌کنند.

ابزار nix-serve از پروتکل‌های IPv6 یا SSL/HTTPS پشتیبانی نمی‌کند. گزینه‌های services.nginx برای راه‌اندازی یک پروکسی استفاده می‌شوند که از IPv6 پشتیبانی کرده و درخواست‌های ارسالی به هاست‌نیم cache را مدیریت می‌کند.

مهم

یک بخش HTTPS اختیاری در انتهای این آموزش وجود دارد.

ماژول جدید NixOS را به پیکربندی ماشین موجود اضافه کنید:

{ config, ... }:

{
  imports = [
    ./binary-cache.nix
  ];

  # ...
}

از ماشین محلی خود، پیکربندی جدید را مستقر کنید:

nixos-rebuild switch --no-flake --target-host root@cache

نکته

daemon کش باینری خطاهایی را گزارش خواهد کرد زیرا هنوز هیچ فایل کلید محرمانه‌ای وجود ندارد.

تولید یک جفت کلید امضا

برای اطمینان از اصالت اشیاء انبار (store objects) موجود در کش، به یک جفت کلید خصوصی و عمومی نیاز دارید.

برای تولید یک جفت کلید برای کش باینری، نام هاست نمونه cache.example.com را با هاست‌نیم خود جایگزین کنید:

nix-store --generate-binary-cache-key cache.example.com cache-private-key.pem cache-public-key.pem

فایل cache-private-key.pem توسط خدمت پس‌زمینه کش باینری برای امضای باینری‌ها در هنگام ارائه آن‌ها استفاده خواهد شد. آن را در مسیری که در گزینه services.nix-serve.secretKeyFile روی ماشینی که میزبان کش است پیکربندی شده است، کپی کنید:

scp cache-private-key.pem root@cache:/var/secrets/cache-private-key.pem

تاکنون، خدمت پس‌زمینه (daemon) کش باینری به دلیل نبود فایل کلید مخفی در حلقه راه‌اندازی مجدد (restart loop) قرار داشت. بررسی کنید که اکنون به درستی کار می‌کند:

ssh root@cache systemctl status nix-serve.service

مهم

custom-binary-cache با استفاده از cache-public-key.pem روی ماشین محلی خود.

بررسی دسترسی

مراحل زیر بررسی می‌کنند که آیا همه چیز به درستی راه‌اندازی شده است یا خیر و ممکن است در شناسایی مشکلات کمک کنند.

بررسی دسترسی عمومی

با پرس‌وجو از کش، بررسی کنید که آیا کش باینری، پروکسی معکوس و قوانین فایروال همان‌طور که در نظر گرفته شده‌اند کار می‌کنند یا خیر:

$ curl http://cache/nix-cache-info
StoreDir: /nix/store
WantMassQuery: 1
Priority: 30

بررسی امضای شیء انبار

برای آزمایش اینکه آیا اشیاء انبار به درستی امضا شده‌اند یا خیر، متادیتا (فراطلاعات) یک درایویشن نمونه را بررسی کنید. روی هاست کش باینری، بسته hello را بسازید و فایل .narinfo را از کش دریافت کنید:

$ hash=$(nix-build '<nixpkgs>' -A pkgs.hello | awk -F '/' '{print $4}' | awk -F '-' '{print $1}')
$ curl "http://cache/$hash.narinfo" | grep "Sig: "
...
Sig: cache.example.org:GyBFzocLAeLEFd0hr2noK84VzPUw0ArCNYEnrm1YXakdsC5FkO2Bkj2JH8Xjou+wxeXMjFKa0YP2AML7nBWsAg==

ارائه کش باینری از طریق HTTPS

اگر کش باینری به‌صورت عمومی قابل دسترسی باشد، می‌توان HTTPS را با استفاده از گواهی‌های SSL Let's Encrypt اعمال کرد. فایل binary-cache.nix خود را مانند زیر ویرایش کنید و مطمئن شوید که URL و آدرس ایمیل نمونه را با اطلاعات خود جایگزین می‌کنید:

   services.nginx = {
     enable = true;
     recommendedProxySettings = true;
-    virtualHosts.cache = {
+    virtualHosts."cache.example.com" = {
+      enableACME = true;
+      forceSSL = true;
       locations."/".proxyPass = "http://${config.services.nix-serve.bindAddress}:${toString config.services.nix-serve.port}";
     };
   };

+   security.acme = {
+     acceptTerms = true;
+     certs = {
+       "cache.example.com".email = "[email protected]";
+     };
+   };

   networking.firewall.allowedTCPPorts = [
     config.services.nginx.defaultHTTPListenPort
+    config.services.nginx.defaultSSLListenPort
   ];

برای استقرار این تغییرات، سیستم را بازسازی (rebuild) کنید:

nixos-rebuild switch --no-flake --target-host [email protected]

گام‌های بعدی

اگر کش باینری شما در حال حاضر یک ماشین بیلد راه دور است، تمام اشیاء انبار را در انبار Nix خود سرویس‌دهی خواهد کرد.

برای صرفه‌جویی در فضای ذخیره‌سازی، لطفاً به صفات پیکربندی NixOS زیر مراجعه کنید:

  • nix.gc: گزینه‌ها برای جمع‌آوری زباله خودکار
  • nix.optimise: گزینه‌ها برای بهینه‌سازی دوره‌ای انبار Nix

جایگزین‌ها

  • nix-serve-ng: جایگزینی بی‌نقص و آماده برای nix-serve که به زبان Haskell نوشته شده است

  • انبار SSH، انبار SSH تجربی و انبار کش باینری S3 نیز می‌توانند برای سرویس‌دهی یک کش استفاده شوند. ارائه‌دهندگان تجاری زیادی برای ذخیره‌سازی سازگار با S3 وجود دارند، برای مثال:

    • Amazon S3
    • Tigris
    • Cloudflare R2
  • attic: سرور کش باینری Nix پشتیبانی‌شده توسط یک ارائه‌دهنده ذخیره‌سازی سازگار با S3

  • Cachix: کش باینری Nix به عنوان یک سرویس

مراجع

nix.dev/tutorials/nixos/binary-cache-setup

نیکسی · یادداشت‌های فارسی Nix local fonts