Nix و NixOS برای زیرساخت بازتولیدپذیر، بخش ۵: NixOS در عمل؛ سرویس‌ها، کاربران و شبکه

در بخش قبل یک سیستم پایه را اعلانی ساختیم. حالا آن را به یک سرور واقعی تبدیل می‌کنیم: یک وب‌سرور، یک فایروال محدود، کاربران، یک سرویس systemd سفارشی، و مدیریت امن secret‌ها؛ همه در همان مدل اعلانی و بازگشت‌پذیر. برای تمیز ماندن، پیکربندی را به چند فایل ماژول تقسیم می‌کنیم و در configuration.nix آن‌ها را import می‌کنیم.

یک سرویس و یک فایروال محدود

در NixOS برای راه‌اندازی nginx کافی است آن را «فعال» اعلام کنیم؛ NixOS خودش unit مربوط به systemd، کاربر سرویس و پوشه‌ها را می‌سازد. فایروال هم به‌صورت پیش‌فرض همه‌ی پورت‌ها را مسدود می‌کند و فقط پورتی که صراحتاً باز کنیم در دسترس خواهد بود:

پیکربندی nginx و فایروال در NixOS و آزمایش سرویس با curl
راه‌اندازی nginx و بازکردن تنها پورت ۸۰ در فایروال، در چند خط. سرویس فعال است، به پورت گوش می‌دهد و صفحه را سرو می‌کند؛ بدون ویرایش دستی هیچ فایل systemd یا فایروالی.

کاربران و یک سرویس systemd سفارشی

کاربران هم اعلانی‌اند: یک کاربر deploy با کلید SSH خودش تعریف می‌کنیم. سرویس‌های سفارشی هم مستقیماً در همان زبان توصیف می‌شوند؛ لازم نیست فایل unit جدا بنویسیم. NixOS از توضیح ما یک واحد systemd کامل می‌سازد:

تعریف کاربر deploy و یک سرویس systemd سفارشی در NixOS
یک کاربر تازه و یک سرویس oneshot سفارشی، هر دو اعلانی. کاربر ساخته می‌شود و سرویس هنگام بوت اجرا شده و در لاگ نوشته است.

مدیریت امن secret‌ها با sops-nix

یک مشکل کلاسیک: پیکربندی سیستم را می‌خواهیم در Git نگه داریم، اما نمی‌خواهیم رمزها و توکن‌ها به‌صورت متن ساده آنجا باشند. راه‌حل sops-nix است. secret‌ها به‌صورت رمزنگاری‌شده (با یک کلید age) در repo می‌مانند و فقط هنگام فعال‌سازی سیستم، در مسیر /run/secrets و تنها برای root رمزگشایی می‌شوند:

مدیریت secret با sops-nix؛ رمزنگاری‌شده در فایل و رمزگشایی در زمان اجرا
با sops-nix، فایل secret در حالت سکون رمزنگاری‌شده است (ENC[AES256_GCM,...])، اما پس از nixos-rebuild switch مقدار واقعی فقط در /run/secrets/api_token و با دسترسی محدود به root ظاهر می‌شود. متن ساده هیچ‌وقت وارد Git یا /nix/store نمی‌شود.

جمع‌بندی و بخش بعد

حالا یک سرور واقعی داریم که کل وضعیتش (سرویس، فایروال، کاربران، سرویس سفارشی و secret‌ها) اعلانی، قابل‌بازبینی و بازگشت‌پذیر است. یک قدم مانده: محیط خودِ کاربر و استقرار این پیکربندی روی یک ماشین دیگر از راه دور.

در بخش پایانی به سراغ home-manager می‌رویم تا محیط کاربری را هم اعلانی کنیم، و این پیکربندی را از راه دور روی یک ماشین دیگر مستقر می‌کنیم.

بخش‌های این مجموعه

← بازگشت به وبلاگ