<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dimas Rangga</title>
    <description>The latest articles on DEV Community by Dimas Rangga (@derangga).</description>
    <link>https://dev.to/derangga</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F527413%2Fa75dd1b6-3fc7-4982-aecc-a648ca2c1033.jpg</url>
      <title>DEV Community: Dimas Rangga</title>
      <link>https://dev.to/derangga</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/derangga"/>
    <language>en</language>
    <item>
      <title>Nix Series: Security Hardening</title>
      <dc:creator>Dimas Rangga</dc:creator>
      <pubDate>Mon, 15 Jun 2026 05:13:48 +0000</pubDate>
      <link>https://dev.to/derangga/nix-series-security-hardening-41hi</link>
      <guid>https://dev.to/derangga/nix-series-security-hardening-41hi</guid>
      <description>&lt;p&gt;Pada series ini kita akan melakukan dasar konfigurasi security di NixOS. Konfigurasi yang dilakukan cukup standar, seperti: ssh, firewall, dan fail2ban.&lt;/p&gt;

&lt;h2&gt;
  
  
  SSH (Secure Shell)
&lt;/h2&gt;

&lt;p&gt;Di series &lt;a href="https://dev.to/derangga/nix-series-nixos-installation-2pn7"&gt;nix installation&lt;/a&gt; kita melakukan konfigurasi sederhana untuk ssh.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="nv"&gt;services&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;openssh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;enable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;ports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="mi"&gt;222&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="nv"&gt;settings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;PermitRootLogin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"no"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kita akan memindahkan semua konfigurasi &lt;em&gt;security hardening&lt;/em&gt; disebuah file &lt;code&gt;security.nix&lt;/code&gt;. Buat directory baru &lt;code&gt;modules&lt;/code&gt; dan buat file &lt;code&gt;security.nix&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="c"&gt;# security.nix&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nv"&gt;lib&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}:&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;services&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;openssh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;enable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;ports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="mi"&gt;222&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="nv"&gt;settings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nv"&gt;AllowUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"vboxuser"&lt;/span&gt; &lt;span class="p"&gt;];&lt;/span&gt;
      &lt;span class="nv"&gt;PermitRootLogin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"no"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;LogLevel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"VERBOSE"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Enable Firewall
&lt;/h2&gt;

&lt;p&gt;Dengan menggunakan firewall kita bisa memfilter traffic yang masuk ke VirtualBox. Edit file &lt;code&gt;security.nix&lt;/code&gt; dan tambahkan konfigurasi ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="nv"&gt;networking&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;firewall&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;enable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;allowedTCPPorts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="mi"&gt;80&lt;/span&gt;
    &lt;span class="mi"&gt;222&lt;/span&gt;
    &lt;span class="mi"&gt;443&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="nv"&gt;allowPing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Berbeda dengan OS lainnya, di NixOS saat enable firewall secara default akan melakukan restriction terhadap incoming network.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup Fail2ban
&lt;/h2&gt;

&lt;p&gt;Fail2ban adalah salah satu tools yang digunakan untuk memblokir IP address jika IP tersebut mencoba authentication ke komputer dan gagal sebanyak rules yang sudah kita terapkan pada fail2ban.&lt;/p&gt;

&lt;p&gt;Tambahkan konfigurasi berikut di &lt;code&gt;security.nix&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="nv"&gt;services&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;fail2ban&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;enable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;maxretry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;bantime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"1h"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;jails&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;sshd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;settings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nv"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"222"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"aggressive"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mode di fail2ban ada 3:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;normal: hanya mendeteksi failed password attempts yang eksplisit&lt;/li&gt;
&lt;li&gt;aggressive: mendeteksi lebih banyak pattern seperti invalid user, connection reset, authentication failure dari berbagai metode&lt;/li&gt;
&lt;li&gt;extra: paling broad, termasuk pattern yang lebih jarang muncul&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  User Configuration
&lt;/h2&gt;

&lt;p&gt;Saat ini konfigurasi user kita ada di &lt;code&gt;configuration.nix&lt;/code&gt;, kita akan pindah konfigurasi user ke &lt;code&gt;modules/users.nix&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="c"&gt;# users.nix&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}:&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;vboxuser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;isNormalUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;extraGroups&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"wheel"&lt;/span&gt; &lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c"&gt;# Enable ‘sudo’ for the user.&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Update &lt;code&gt;configuration.nix&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Tambahkan &lt;code&gt;users.nix&lt;/code&gt; dan &lt;code&gt;security.nix&lt;/code&gt; di &lt;code&gt;configuration.nix&lt;/code&gt; dan hapus konfigurasi user dan ssh saat ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nv"&gt;lib&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}:&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;imports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sx"&gt;./hardware-configuration.nix&lt;/span&gt;

    &lt;span class="sx"&gt;./modules/security.nix&lt;/span&gt;
    &lt;span class="sx"&gt;./modules/users.nix&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="c"&gt;# omited&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setelah kita memisahkan konfigurasi user dan security, struktur file akan terlihat seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;├── configuration.nix
├── flake.lock
├── flake.nix
├── hardware-configuration.nix
├── home.nix
└── modules
 &amp;nbsp;&amp;nbsp; ├── security.nix
&amp;nbsp; &amp;nbsp; └── users.nix
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kemudian rebuild system dengan menggunakan &lt;code&gt;rebuild&lt;/code&gt; (karena di series sebelumnya kita sudah menambahkan alias)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frvcjja3jh8ijy9g7wq6m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frvcjja3jh8ijy9g7wq6m.png" alt="Rebuild System" width="798" height="179"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dari hasil konfigurasi yang kita lakukan, kita bisa validasi konfigurasi fail2ban di &lt;code&gt;/etc/fail2ban/jail.local&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffvtcyca96d4xl0lp0yjj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffvtcyca96d4xl0lp0yjj.png" alt="fail2ban" width="800" height="210"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jika menggunakan OS seperti Ubuntu, kita memerlukan copy paste &lt;code&gt;jail.conf&lt;/code&gt; -&amp;gt; &lt;code&gt;jail.local&lt;/code&gt; lalu menuliskan kebutuhan konfigurasinya. Di NixOS kita tidak perlu melakukan hal tersebut dan di &lt;code&gt;jail.local&lt;/code&gt; sudah terkonfigurasi sesuai yang kita deklarasikan pada &lt;code&gt;security.nix&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing Brute Force
&lt;/h2&gt;

&lt;p&gt;Untuk testing, pertama kita butuh disconnected terlebih dahulu dari ssh saat ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kemudian coba ssh ke VirtualBox dan masukkan invalid password sebanyak tiga kali:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-p&lt;/span&gt; 2222 vboxuser@127.0.0.1 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiyrncfw7z3e69vx7xbcu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiyrncfw7z3e69vx7xbcu.png" alt="Brute Force" width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hasil seperti gambar diatas menandakan bahwa IP dari komputer sudah diblokir oleh fail2ban yang ada di VirtualBox. Kita bisa cek di VirtualBox secara langsung.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxwau3e5v3qqv54k87vbv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxwau3e5v3qqv54k87vbv.png" alt="Jail VirtualBox" width="800" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nah untuk melakukan unban, kita bisa melakukan cara seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ubah IP address berdasarkan IP yang di ban&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;fail2ban-client &lt;span class="nb"&gt;set &lt;/span&gt;sshd unbanip &lt;span class="o"&gt;{&lt;/span&gt;IP Address&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Bonus: Secure SSH with Key Pairs
&lt;/h2&gt;

&lt;p&gt;Ada cara lain untuk meningkatkan security, yaitu dengan cara menon-aktifkan password authentication pada ssh&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Generate SSH key
&lt;/h3&gt;

&lt;p&gt;Generate ssh key pada komputer (bukan di VirtualBox):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"vboxuser"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By default, ssh key akan digenerate di &lt;code&gt;~/.ssh&lt;/code&gt; dan key yang akan kita pasang ke users di VirtualBox adalah public key. Kita bisa salin public key dari file yang berekstensi &lt;code&gt;.pub&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Enable SSH Agent
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# enable ssh agent&lt;/span&gt;
&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;ssh-agent &lt;span class="nt"&gt;-s&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# attach ssh key&lt;/span&gt;
ssh-add ~/.ssh/id_ed25519 &lt;span class="c"&gt;# sesuaikan dengan nama private key&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dengan cara ini kita melakukkan attachment ssh key ke memory, sehingga kita hanya perlu input password ssh satu kali saja.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Update &lt;code&gt;users.nix&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Lakukan ssh ke VirtualBox:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-p&lt;/span&gt; 2222 vboxuser@127.0.0.1 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kemudian update &lt;code&gt;users.nix&lt;/code&gt; yang ada di &lt;code&gt;~/nix/modules&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}:&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;vboxuser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;isNormalUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;extraGroups&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"wheel"&lt;/span&gt; &lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c"&gt;# Enable ‘sudo’ for the user.&lt;/span&gt;

    &lt;span class="nv"&gt;openssh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;authorizedKeys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="s2"&gt;"ssh-ed25519 AAAA... your-public-key-here"&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Update &lt;code&gt;security.nix&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Tambahkan konfigurasi ini pada &lt;code&gt;security.nix&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="nv"&gt;services&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;openssh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;enable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;ports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="mi"&gt;222&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="nv"&gt;settings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;AllowUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"vboxuser"&lt;/span&gt; &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="nv"&gt;KbdInteractiveAuthentication&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;PasswordAuthentication&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;PermitRootLogin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"no"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rebuild system dan lakukan relogin ke VirtualBox. &lt;/p&gt;

&lt;h2&gt;
  
  
  Penutup
&lt;/h2&gt;

&lt;p&gt;Konfigurasi yang telah kita lakukan mencakup tiga lapisan pertahanan dasar: SSH hardening untuk membatasi akses, firewall untuk memfilter traffic, dan Fail2ban untuk mencegah brute force. Namun dari ketiganya, beralih ke SSH key pairs adalah langkah yang paling signifikan, karena sekalipun IP rotation bisa mengakali Fail2ban, private key yang kita simpan pada komputer pribadi jauh lebih sulit untuk dicuri atau ditebak. Security bukan tentang satu solusi, melainkan tentang berlapis-lapis perlindungan yang saling melengkapi.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wiki.nixos.org/wiki/Fail2ban" rel="noopener noreferrer"&gt;Fail2ban&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.nixos.org/wiki/Firewall" rel="noopener noreferrer"&gt;Firewall&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.nixos.org/wiki/SSH" rel="noopener noreferrer"&gt;SSH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/derangga/vbox-nixos/tree/security-hardening" rel="noopener noreferrer"&gt;Hasil Konfigurasi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>nix</category>
      <category>nixos</category>
      <category>linux</category>
      <category>programming</category>
    </item>
    <item>
      <title>Nix Series: Basic Nix Language</title>
      <dc:creator>Dimas Rangga</dc:creator>
      <pubDate>Fri, 12 Jun 2026 09:57:09 +0000</pubDate>
      <link>https://dev.to/derangga/nix-series-basic-nix-language-3jm1</link>
      <guid>https://dev.to/derangga/nix-series-basic-nix-language-3jm1</guid>
      <description>&lt;p&gt;Pada series sebelumnya, kita sudah melakukan &lt;a href="https://dev.to/derangga/nix-series-nixos-installation-2pn7"&gt;instalasi nix&lt;/a&gt; di VirtualBox dan setup SSH agar dapat diakses diluar VirtualBox. Sebelum kita lanjut untuk melakukan konfigurasi system lagi, kita butuh mengetahui bagaimana syntax dalam menulis program Nix dan di artikel ini kita akan mempelajari dasar syntax-nya.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nix Language
&lt;/h2&gt;

&lt;p&gt;Nix adalah &lt;strong&gt;purely functional language yang lazy-evaluated&lt;/strong&gt;, digunakan untuk mengkonfigurasi Nix package manager dan NixOS. Karakteristik utama:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Purely functional&lt;/strong&gt;: sebuah function hanya bisa mengembalikan nilai berdasarkan inputnya, tidak bisa mengubah variabel di luar scope-nya (no side effects), dan tidak ada variabel yang bisa diubah setelah didefinisikan (no mutation). Kalau kamu familiar dengan &lt;code&gt;const&lt;/code&gt; di beberapa bahasa pemrograman, semua variabel di Nix berperilaku seperti itu.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lazy evaluation&lt;/strong&gt;: Nix tidak menghitung nilai suatu ekspresi sampai nilai itu benar-benar dibutuhkan. Ini artinya kamu bisa mendefinisikan ribuan package di nixpkgs tanpa semuanya dievaluasi sekaligus. Hanya yang kamu gunakan saja yang akan diproses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semua adalah expression&lt;/strong&gt;: tidak ada statement di Nix, setiap baris kode selalu menghasilkan sebuah nilai. &lt;code&gt;if/else&lt;/code&gt; bukan statement seperti di bahasa pemrograman pada umumnya, melainkan expression yang harus mengembalikan nilai dari kedua cabangnya.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tidak ada loops&lt;/strong&gt;: karena variabel tidak bisa diubah, loop seperti &lt;code&gt;for&lt;/code&gt; atau &lt;code&gt;while&lt;/code&gt; tidak ada artinya di Nix. Sebagai gantinya, kamu menggunakan fungsi seperti &lt;code&gt;map&lt;/code&gt; dan &lt;code&gt;filter&lt;/code&gt;, atau rekursi untuk mengolah kumpulan data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1. Basic Data Type
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Konsep&lt;/th&gt;
&lt;th&gt;JavaScript&lt;/th&gt;
&lt;th&gt;Nix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"hello"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"hello"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;42&lt;/code&gt;, &lt;code&gt;3.14&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;42&lt;/code&gt;, &lt;code&gt;3.14&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;true&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;true&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Null&lt;/td&gt;
&lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[1, 2, 3]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[ 1 2 3 ]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Object&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ a: 1 }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ a = 1; }&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;⚠️ Perbedaan Penting&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;List di Nix menggunakan &lt;strong&gt;spasi&lt;/strong&gt; sebagai pemisah, bukan koma&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Attribute set menggunakan &lt;code&gt;=&lt;/code&gt; bukan &lt;code&gt;:&lt;/code&gt;, dan setiap entry diakhiri dengan &lt;code&gt;;&lt;/code&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Nix&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt;
  &lt;span class="nv"&gt;name&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;age&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;scores&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="nv"&gt;person&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Bob"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kn"&gt;in&lt;/span&gt;
  &lt;span class="nv"&gt;person&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Javascript&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bob&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. String
&lt;/h3&gt;

&lt;p&gt;Nix memiliki beberapa cara dalam mendifinisikan string:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="c"&gt;# String biasa&lt;/span&gt;
&lt;span class="s2"&gt;"Hello, World"&lt;/span&gt;

&lt;span class="c"&gt;# String multiline (menggunakan '' bukan backtick)&lt;/span&gt;
&lt;span class="s2"&gt;''&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;  Hello&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;  World&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;''&lt;/span&gt;

&lt;span class="c"&gt;# String interpolation, menggunakan ${} seperti template literal di JS&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;"Hello, &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!"&lt;/span&gt;    &lt;span class="c"&gt;# -&amp;gt; "Hello, Alice!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. let ... in (Variable Binding)
&lt;/h3&gt;

&lt;p&gt;Nix tidak punya &lt;code&gt;var&lt;/code&gt;/&lt;code&gt;const&lt;/code&gt;/&lt;code&gt;let&lt;/code&gt; seperti di JS. Sebagai gantinya, kamu pakai blok &lt;code&gt;let ... in&lt;/code&gt;. Anggap saja ini sebagai &lt;strong&gt;blok yang punya scope dan mengembalikan sebuah nilai&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nix:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="c"&gt;# Keseluruhan ekspresi ini menghasilkan "Hello, Alice!"&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt;
  &lt;span class="nv"&gt;greeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;name&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;in&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;greeting&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Attribute Sets
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt;
  &lt;span class="nv"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;age&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kn"&gt;in&lt;/span&gt;
  &lt;span class="nv"&gt;person&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;    &lt;span class="c"&gt;# -&amp;gt; "Alice" (dot access, sama seperti JS!)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;rec&lt;/code&gt; - Recursive Attribute Sets
&lt;/h3&gt;

&lt;p&gt;Di JS, kamu bisa mereferensikan &lt;code&gt;this.x&lt;/code&gt; di dalam sebuah object. Di Nix, gunakan &lt;code&gt;rec&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="c"&gt;# Tanpa rec, ini akan ERROR karena b tidak bisa melihat a&lt;/span&gt;
&lt;span class="kr"&gt;rec&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c"&gt;# -&amp;gt; 20  ✅&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;with&lt;/code&gt; - Membawa Attributes ke Scope Saat Ini
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kn"&gt;in&lt;/span&gt;
  &lt;span class="kn"&gt;with&lt;/span&gt; &lt;span class="nv"&gt;person&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="s2"&gt;"Name: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, Age: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="kr"&gt;toString&lt;/span&gt; &lt;span class="nv"&gt;age&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Functions
&lt;/h3&gt;

&lt;p&gt;Di Nix, &lt;strong&gt;semua function hanya menerima satu argumen&lt;/strong&gt;. Untuk multiple argumen,.&lt;/p&gt;

&lt;h3&gt;
  
  
  Satu Argumen
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt;
  &lt;span class="nv"&gt;greet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Hello, &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;in&lt;/span&gt;
  &lt;span class="nv"&gt;greet&lt;/span&gt; &lt;span class="s2"&gt;"Alice"&lt;/span&gt;    &lt;span class="c"&gt;# -&amp;gt; "Hello, Alice!"&lt;/span&gt;
  &lt;span class="c"&gt;#     ^^^^^^ tidak perlu tanda kurung untuk memanggil function!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Attribute Set sebagai Argumen (Destructured Params)
&lt;/h3&gt;

&lt;p&gt;Cara ini cocok jika kamu memerlukan beberapa argument pada function&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt;
  &lt;span class="nv"&gt;greet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;age&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="s2"&gt;"I'm &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="kr"&gt;toString&lt;/span&gt; &lt;span class="nv"&gt;age&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; years old"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;in&lt;/span&gt;
  &lt;span class="nv"&gt;greet&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Default Argumen
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt;
  &lt;span class="nv"&gt;greet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;greeting&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;"Hello"&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;greeting&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;in&lt;/span&gt;
  &lt;span class="nv"&gt;greet&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;   &lt;span class="c"&gt;# -&amp;gt; "Hello, Alice!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Conditionals
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;if/else&lt;/code&gt; di Nix bekerja berbeda dari JavaScript. Di JS, &lt;code&gt;if&lt;/code&gt; adalah sebuah statement yang mengeksekusi blok kode. Di Nix, &lt;code&gt;if&lt;/code&gt; adalah sebuah expression yang menghasilkan nilai, persis seperti ternary operator di JS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;in&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="s2"&gt;"adult"&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="s2"&gt;"minor"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;ℹ️ &lt;code&gt;if&lt;/code&gt;/&lt;code&gt;else&lt;/code&gt; di Nix selalu butuh cabang else karena ini adalah expression yang harus menghasilkan nilai!&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  7. &lt;code&gt;inherit&lt;/code&gt; - Shorthand untuk Attribute Sets
&lt;/h3&gt;

&lt;p&gt;Mirip seperti shorthand property name di JS, &lt;code&gt;{ name }&lt;/code&gt; alih-alih menulis &lt;code&gt;{ name: name }&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt;
  &lt;span class="nv"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;age&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kn"&gt;inherit&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt; &lt;span class="nv"&gt;age&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c"&gt;# sama dengan: name = name; age = age;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8. &lt;code&gt;import&lt;/code&gt; - Memisahkan File
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="c"&gt;# math.nix&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;add&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;mul&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# main.nix&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt;
  &lt;span class="nv"&gt;math&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="sx"&gt;./math.nix&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;in&lt;/span&gt;
  &lt;span class="nv"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;add&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;    &lt;span class="c"&gt;# -&amp;gt; 7&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Evaluating and Testing Nix Code
&lt;/h2&gt;

&lt;p&gt;Setelah mengetahui syntaxnya, kamu bisa coba-coba untuk evaluate kode nix dengan nix tools berikut:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Kegunaan&lt;/th&gt;
&lt;th&gt;Butuh file?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nix repl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Scratch pad interaktif, uji syntax secara langsung&lt;/td&gt;
&lt;td&gt;Tidak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nix eval --expr&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;One-liner cepat dari terminal&lt;/td&gt;
&lt;td&gt;Tidak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nix-instantiate --eval&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Evaluasi file &lt;code&gt;.nix&lt;/code&gt; standalone&lt;/td&gt;
&lt;td&gt;Ya&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nix eval .#attr&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inspeksi nilai output dari flake&lt;/td&gt;
&lt;td&gt;Ya (flake)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;nix build&lt;/code&gt; / &lt;code&gt;nix run&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Build dan jalankan package dari flake&lt;/td&gt;
&lt;td&gt;Ya (flake)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Contoh penggunaan &lt;code&gt;nix repl&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgyfzipaqmqs7rvfnynng.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgyfzipaqmqs7rvfnynng.png" alt="nix repl" width="799" height="265"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;💡 Perintah berguna di dalam REPL&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;:q&lt;/code&gt; untuk keluar dari REPL&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;:l &amp;lt;nixpkgs&amp;gt;&lt;/code&gt; untuk load nixpkgs sehingga bisa akses &lt;code&gt;pkgs.nodejs&lt;/code&gt; dll.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;:t &amp;lt;expr&amp;gt;&lt;/code&gt; untuk melihat tipe dari sebuah ekspresi&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;:?&lt;/code&gt; untuk melihat semua perintah yang tersedia&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Contoh &lt;em&gt;evaluate&lt;/em&gt; nix file, buat default.nix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt;
  &lt;span class="nv"&gt;greeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;name&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;in&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;greeting&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;evaluate&lt;/em&gt; dengan &lt;code&gt;nix-instantiate --eval&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo1dz03eijod3ir5ryzh3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo1dz03eijod3ir5ryzh3.png" alt="nix instantiate" width="799" height="125"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Penutup
&lt;/h2&gt;

&lt;p&gt;Setelah kita mengetahui syntax dasar nix, pada series selanjutnya kita akan melanjutkan konfigurasi security hardening&lt;/p&gt;

</description>
      <category>nix</category>
      <category>nixos</category>
      <category>programming</category>
      <category>linux</category>
    </item>
    <item>
      <title>Nix Series: NixOS Installation</title>
      <dc:creator>Dimas Rangga</dc:creator>
      <pubDate>Thu, 11 Jun 2026 08:14:12 +0000</pubDate>
      <link>https://dev.to/derangga/nix-series-nixos-installation-2pn7</link>
      <guid>https://dev.to/derangga/nix-series-nixos-installation-2pn7</guid>
      <description>&lt;p&gt;Pada artikel ini kita akan memulai berinteraksi dengan nix dengan cara melakukan instalasi NixOS dengan menggunakan VirtualBox. Sebelum memulai instalasi, pastikan kamu sudah membaca &lt;a href="https://dev.to/derangga/nix-series-introduction-5cba"&gt;series introduction&lt;/a&gt; nix terlebih dahulu, agar tau apa itu nix.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisite
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Download NixOS iso di &lt;a href="https://nixos.org/download/" rel="noopener noreferrer"&gt;nixos official&lt;/a&gt; dan pilih Minimal ISO image, karena pada artikel ini akan menggunakan versi ISO tersebut&lt;/li&gt;
&lt;li&gt;Download &lt;a href="https://www.virtualbox.org/wiki/Downloads" rel="noopener noreferrer"&gt;VirtualBox&lt;/a&gt; dan install&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setup VirtualBox
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Buat virtual machine baru pada VirtualBox dengan pilih New&lt;/li&gt;
&lt;li&gt;Pilih NixOS yang sudah didownload pada ISO image
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5676npcpx7xcje3t76rk.png" alt="Setup New VM" width="800" height="541"&gt;
&lt;/li&gt;
&lt;li&gt;VirtualBox sudah dibuat dengan disk minimal 20GB&lt;/li&gt;
&lt;li&gt;Start VM yang sudah kita buat&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installation Step
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Boot Live Environment
&lt;/h3&gt;

&lt;p&gt;Saat pertama booting akan ada 2 pilihan NixOS, pilih yang LTS&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqlglf12oujm4c9w5mnh7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqlglf12oujm4c9w5mnh7.png" alt="Boot Selection" width="800" height="518"&gt;&lt;/a&gt;&lt;br&gt;
Tampilan setelah booting ISO NixOS&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fypxoy6z78y9ximpl3fnl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fypxoy6z78y9ximpl3fnl.png" alt="NixOS Installer" width="800" height="518"&gt;&lt;/a&gt;&lt;br&gt;
Setelah berhasil boot ke live environment, masuk sebagai root terlebih dahulu&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;su
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prompt akan berubah dari &lt;code&gt;[nixos@nixos:~]$&lt;/code&gt; menjadi &lt;code&gt;[root@nixos:/home/nixos]#&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;⚠️ Semua perintah partisi dan instalasi harus dijalankan sebagai root. Tanpa ini akan muncul error Permission denied.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. Check Disk Information
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lsblk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Disk VirtualBox biasanya terdeteksi sebagai &lt;code&gt;/dev/sda&lt;/code&gt;. Pastikan sebelum lanjut karena perintah berikutnya akan menghapus semua isi disk.&lt;br&gt;
Pastikan outputnya seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda      8:0    0   20G  0 disk
sr0     11:0    1  1.6G  0 rom  /iso
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Disk Partition
&lt;/h3&gt;

&lt;p&gt;Kita pakai parted dengan skema GPT + EFI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;parted /dev/sda &lt;span class="nt"&gt;--&lt;/span&gt; mklabel gpt
parted /dev/sda &lt;span class="nt"&gt;--&lt;/span&gt; mkpart primary 512MB 100%
parted /dev/sda &lt;span class="nt"&gt;--&lt;/span&gt; mkpart ESP fat32 1MB 512MB
parted /dev/sda &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nb"&gt;set &lt;/span&gt;2 esp on
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Penjelasan setiap perintah:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Perintah&lt;/th&gt;
&lt;th&gt;Fungsi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mklabel gpt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Membuat partition table baru bertipe GPT (standar modern, pengganti MBR)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mkpart primary 512MB 100%&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Membuat partisi root &lt;code&gt;/&lt;/code&gt; dari 512MB sampai akhir disk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mkpart ESP fat32 1MB 512MB&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Membuat EFI System Partition dari 1MB sampai 512MB, format FAT32&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;set 2 esp on&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Memberi flag &lt;code&gt;esp&lt;/code&gt; pada partisi ke-2 agar UEFI firmware mengenalinya sebagai boot partition&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Layout akhir:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/dev/sda
├── sda1  (512MB → 100%)  = /      → ext4, sistem NixOS
└── sda2  (1MB   → 512MB) = /boot  → FAT32, bootloader EFI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;📝 Pesan &lt;code&gt;You may need to update /etc/fstab&lt;/code&gt; setelah setiap perintah adalah normal, bukan error.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Verifikasi hasil partisi:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lsblk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Harusnya muncul &lt;code&gt;sda1&lt;/code&gt; dan &lt;code&gt;sda2&lt;/code&gt; di bawah &lt;code&gt;sda&lt;/code&gt;.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmdhmhctk61s5b97dxctu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmdhmhctk61s5b97dxctu.png" alt="Disk Partition" width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Kenapa parted dengan GPT + EFI?
  &lt;br&gt;
Kenapa parted dengan Skema GPT + EFI? Karena &lt;code&gt;parted&lt;/code&gt; lebih straightforward untuk ditulis sebagai langkah-langkah sequential.

&lt;p&gt;Kenapa GPT, bukan MBR? Karena GPT (GUID Partition Table) adalah pengganti MBR (Master Boot Record) dan berikut adalah perbedaannya:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;MBR&lt;/th&gt;
&lt;th&gt;GPT&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Maks partisi&lt;/td&gt;
&lt;td&gt;4 primary&lt;/td&gt;
&lt;td&gt;128 partisi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maks ukuran disk&lt;/td&gt;
&lt;td&gt;2TB&lt;/td&gt;
&lt;td&gt;9.4ZB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pasangan firmware&lt;/td&gt;
&lt;td&gt;BIOS/Legacy&lt;/td&gt;
&lt;td&gt;UEFI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ketahanan&lt;/td&gt;
&lt;td&gt;Partition table hanya satu salinan&lt;/td&gt;
&lt;td&gt;Ada backup partition table di akhir disk&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Karena saat membuat VM baru secara default UEFI pada VirtualBox akan aktif dan skema GPT adalah pasangan naturalnya. UEFI secara teknis bisa booting dari MBR, tapi GPT adalah standar modern dan yang direkomendasikan untuk UEFI. Kamu bisa melihat pada settings dibagian system&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpbjm57yylink1rqdgszw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpbjm57yylink1rqdgszw.png" alt="VM Settings System" width="800" height="516"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;br&gt;
&lt;p&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Format Partition
&lt;/h3&gt;

&lt;p&gt;Jalankan perintah berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mkfs.ext4 &lt;span class="nt"&gt;-L&lt;/span&gt; nixos /dev/sda1
mkfs.fat &lt;span class="nt"&gt;-F&lt;/span&gt; 32 &lt;span class="nt"&gt;-n&lt;/span&gt; boot /dev/sda2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Flag &lt;code&gt;-L&lt;/code&gt; dan &lt;code&gt;-n&lt;/code&gt; memberikan label pada partisi. Label ini yang dipakai saat mounting (by-label) agar lebih readable dibanding UUID.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Mount Partition
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mount /dev/disk/by-label/nixos /mnt
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /mnt/boot
mount &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nb"&gt;umask&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;077 /dev/disk/by-label/boot /mnt/boot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Generate Nix Configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nixos-generate-config &lt;span class="nt"&gt;--root&lt;/span&gt; /mnt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perintah ini menghasilkan dua file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/mnt/etc/nixos/
├── configuration.nix        &lt;span class="c"&gt;# konfigurasi utama&lt;/span&gt;
└── hardware-configuration.nix  &lt;span class="c"&gt;# auto-detected hardware&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnuggjgaiffpqkhg1bz6d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnuggjgaiffpqkhg1bz6d.png" alt="Generate Nix Configuration" width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Edit Configuration
&lt;/h3&gt;

&lt;p&gt;Ubah konfigurasi pada &lt;code&gt;/mnt/etc/nixos/configuration.nix&lt;/code&gt;, kita bisa menggunakan &lt;code&gt;nano&lt;/code&gt; atau &lt;code&gt;vim&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vim /mnt/etc/nixos/configuration.nix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk proses instalasi saat ini, kita hanya edit seminimal mungkin.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;imports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="sx"&gt;./hardware-configuration.nix&lt;/span&gt; &lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="c"&gt;# Boot loader — gunakan systemd-boot untuk UEFI&lt;/span&gt;
  &lt;span class="nv"&gt;boot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;loader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;systemd-boot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;enable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;boot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;loader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;efi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;canTouchEfiVariables&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;# Networking&lt;/span&gt;
  &lt;span class="nv"&gt;networking&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;hostName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"nixos-server"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;networking&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;networkmanager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;enable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;# Timezone&lt;/span&gt;
  &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;timeZone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Asia/Jakarta"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;# User&lt;/span&gt;
  &lt;span class="nv"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;vboxuser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;isNormalUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;extraGroups&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"wheel"&lt;/span&gt; &lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c"&gt;# wheel = akses sudo&lt;/span&gt;
    &lt;span class="nv"&gt;initialPassword&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"qwerty123"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="c"&gt;# Package dasar&lt;/span&gt;
  &lt;span class="nv"&gt;environment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;systemPackages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kn"&gt;with&lt;/span&gt; &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nv"&gt;curl&lt;/span&gt;
    &lt;span class="nv"&gt;git&lt;/span&gt;
    &lt;span class="nv"&gt;neovim&lt;/span&gt;
    &lt;span class="nv"&gt;wget&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="c"&gt;# SSH — penting untuk server&lt;/span&gt;
  &lt;span class="nv"&gt;services&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;openssh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;enable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nv"&gt;system&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;stateVersion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"25.11"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;# sesuaikan dengan versi NixOS yang diinstall&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8. Install NixOS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nixos-install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saat proses instalasi, NixOS akan memberikan prompt input password.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl5dbuye1l4j1wd8qg3in.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl5dbuye1l4j1wd8qg3in.png" alt="NixOS Installation" width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;⚠️ Password yang muncul saat prompt instalasi adalah password untuk &lt;code&gt;root&lt;/code&gt; sedangkan password yang sudah kita deklarasikan pada &lt;code&gt;configuration.nix&lt;/code&gt; dibagian &lt;code&gt;initialPassword&lt;/code&gt; adalah password untuk &lt;code&gt;vboxuser&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Setelah instalasi selesai, kita bisa melakukan reboot.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;reboot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  9. Post Installation
&lt;/h3&gt;

&lt;p&gt;Setelah proses reboot selesai, kamu bisa login dengan user &lt;code&gt;vboxuser&lt;/code&gt; dengan password yang sudah diberikan pada &lt;code&gt;initialPassword&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ❄ Nix Flakes ❄
&lt;/h2&gt;

&lt;p&gt;Flakes adalah fitur di Nix yang mengubah cara kita mendefinisikan dan berbagi konfigurasi Nix. Sebelum Flakes ada, konfigurasi NixOS bergantung pada &lt;strong&gt;Nix channels&lt;/strong&gt;. Ini semacam subscription ke versi &lt;code&gt;nixpkgs&lt;/code&gt; tertentu yang disimpan di sistem. Permasalahannya adalah channels tidak di-lock per project, jadi dua orang yang menjalankan konfigurasi yang sama bisa mendapat hasil berbeda karena versi &lt;code&gt;nixpkgs&lt;/code&gt; tidak identik.&lt;/p&gt;

&lt;p&gt;Dengan Flakes, setiap konfigurasi punya file &lt;code&gt;flake.nix&lt;/code&gt; sebagai entry point yang mendefinisikan &lt;strong&gt;inputs&lt;/strong&gt; (dependency seperti nixpkgs dan home-manager) dan &lt;strong&gt;outputs&lt;/strong&gt; (hasil build seperti NixOS configuration). Semua input di-lock di file &lt;code&gt;flake.lock&lt;/code&gt;, mirip seperti &lt;code&gt;package-lock.json&lt;/code&gt; di Node.js atau &lt;code&gt;go.sum&lt;/code&gt; di Go, sehingga siapapun yang pakai konfigurasi yang sama akan mendapat hasil yang identik.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flake.nix       → mendefinisikan dependency dan konfigurasi
flake.lock      → mengunci versi semua dependency (auto-generated)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Flakes juga membuat konfigurasi lebih &lt;strong&gt;portable&lt;/strong&gt; dan tidak terikat ke &lt;code&gt;/etc/nixos&lt;/code&gt;, bisa disimpan di mana saja termasuk di GitHub sebagai dotfiles.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;ℹ️ Flakes masih berstatus "experimental" secara resmi, tapi sudah dipakai luas di komunitas Nix dan dianggap sebagai cara yang direkomendasikan untuk mengelola konfigurasi modern.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  1. Enable Flakes
&lt;/h3&gt;

&lt;p&gt;Aktifkan flakes dengan cara edit &lt;code&gt;configuration.nix&lt;/code&gt;. Gunakan &lt;code&gt;nano&lt;/code&gt; atau &lt;code&gt;nvim&lt;/code&gt; untuk edit file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvim /etch/nixos/configuration.nix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tambahkan baris ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;  &lt;span class="o"&gt;...&lt;/span&gt;
  &lt;span class="nv"&gt;system&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;stateVersion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"25.11"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;# Enable flakes&lt;/span&gt;
  &lt;span class="nv"&gt;nix&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;experimental-features&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s2"&gt;"nix-command"&lt;/span&gt;
    &lt;span class="s2"&gt;"flakes"&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lalu apply sebagai default boot&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nixos-rebuild switch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ecxw8i0sbl18bl5oyc5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ecxw8i0sbl18bl5oyc5.png" alt="Enable Flakes" width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Setelah flakes aktif, kita bisa memindahkan konfigurasi NixOS dari &lt;code&gt;root&lt;/code&gt; ke &lt;code&gt;home&lt;/code&gt; dengan cara berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; /etc/nixos ~/
&lt;span class="nb"&gt;mv &lt;/span&gt;nixos nix
&lt;span class="nb"&gt;cd &lt;/span&gt;nix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nah.. dengan ini kita tidak perlu membutuhkan &lt;code&gt;root&lt;/code&gt; lagi untuk melakukan perubahan konfigurasi pada system NixOS kita.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Git Setup
&lt;/h3&gt;

&lt;p&gt;Langkah selanjutnya adalah &lt;em&gt;initialize&lt;/em&gt; git, karena &lt;strong&gt;nix flake hanya membaca file yang sudah ditambahkan pada git&lt;/strong&gt; (&lt;code&gt;git add&lt;/code&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git init
git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email &lt;span class="s2"&gt;"johndoe@example.com"&lt;/span&gt; &lt;span class="c"&gt;# gunakan emailmu&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email &lt;span class="s2"&gt;"johndoe"&lt;/span&gt; &lt;span class="c"&gt;# gunakan user gitmu&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kamu juga bisa setup remote origin dan dipush ke githubmu &lt;/p&gt;

&lt;h3&gt;
  
  
  3. Setup Flake
&lt;/h3&gt;

&lt;p&gt;Tambahkan file &lt;code&gt;flake.nix&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;flake.nix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lalu deklarasikan minimum konfigurasi berikut&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"NixOS Server Configuration"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nv"&gt;inputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;nixpkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"github:NixOS/nixpkgs/nixos-25.11"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nv"&gt;outputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nv"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nv"&gt;nixpkgs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c"&gt;# nixos-server adalah hostname&lt;/span&gt;
      &lt;span class="nv"&gt;nixosConfigurations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;nixos-server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;nixpkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;nixosSystem&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;system&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"aarch64-linux"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;modules&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="sx"&gt;./configuration.nix&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
      &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stage &lt;code&gt;flake.nix&lt;/code&gt; dengan cara &lt;code&gt;git add flake.nix&lt;/code&gt; atau &lt;code&gt;git add .&lt;/code&gt;, kemudian &lt;em&gt;verify&lt;/em&gt; konfigurasi dengan cara&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nix flake check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Melakukan konfigurasi akan generate &lt;code&gt;flake.lock&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4cx4oldvhwli3vvvmqo9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4cx4oldvhwli3vvvmqo9.png" alt="Nix Verify" width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Setelah &lt;em&gt;verify&lt;/em&gt; sukses, kita bisa rebuild dan apply sebagai default boot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nixos-rebuild switch &lt;span class="nt"&gt;--flake&lt;/span&gt; ~/nix#nixos-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5nadjzoge2opo6z5e8ov.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5nadjzoge2opo6z5e8ov.png" alt="Nix Rebuild" width="800" height="48"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Setiap kali kita melakukan &lt;code&gt;nixos-rebuild&lt;/code&gt;, NixOS akan generate konfigurasi system baru kemudian apply as default dan kita bisa melihatnya dengan cara:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nixos-rebuild list-generations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frjw7cbmurap3t37of2kq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frjw7cbmurap3t37of2kq.png" alt="List Generations" width="799" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  NixOS Rollback
  &lt;br&gt;
Disinilah keungglan nix, kita bisa melakukan rollback ke versi sebelumnya dengan cara&lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nixos-rebuild &lt;span class="nt"&gt;--rollback&lt;/span&gt; switch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Add New Package
&lt;/h3&gt;

&lt;p&gt;Untuk saat ini semua konfigurasi package yang kita install ada di &lt;code&gt;configuration.nix&lt;/code&gt;, jadi kita butuh edit file ini dan menambahkan package yang dibutuhkan. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Pada artikel ini aku akan menggunakan lazyvim sebagai code editor&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;...
environment.systemPackages &lt;span class="o"&gt;=&lt;/span&gt; with pkgs&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
    curl
    git
    neovim
    tree
    wget

    &lt;span class="c"&gt;# untuk neovim&lt;/span&gt;
    fnm &lt;span class="c"&gt;# node version manager&lt;/span&gt;
    gcc
    nixd
    nixfmt
&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perlu diingat, setiap kali melakukan penambahan package atau melakukan perubahan konfigurasi, kita butuh melakuakan rebuild dan apply sebagai default boot.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Nix Rebuild Command
&lt;/h3&gt;

&lt;p&gt;Seperti yang kamu ketahui, untuk melakukan rebuild flake kita menjalankan perintah berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nixos-rebuild switch &lt;span class="nt"&gt;--flake&lt;/span&gt; ~/nix#nixos-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perintah ini memiliki sytax seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nixos-rebuild switch &lt;span class="nt"&gt;--flake&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;path_flake&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="c"&gt;#{hostname}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Bonus: install lazyvim
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/LazyVim/starter ~/.config/nvim
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Enable SSH
&lt;/h2&gt;

&lt;p&gt;Kita akan melakukan setup minimum ssh untuk VirtualBox ini agar dapat kita remote dari terminal laptop. Edit &lt;code&gt;configuration.nix&lt;/code&gt; lalu jalankan perintah &lt;code&gt;nixos-rebuild&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  services.openssh &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    ports &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
      222
    &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    settings &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      PermitRootLogin &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"no"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;⚠️ Konfigurasi ini hanya diperuntukkan praktik saja, untuk best practices konfigurasi ssh dapat dilihat pada &lt;a href="https://wiki.nixos.org/wiki/SSH" rel="noopener noreferrer"&gt;NixOS Wiki&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fty988i7uu0s1x0d7x4xo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fty988i7uu0s1x0d7x4xo.png" alt="SSH Status" width="800" height="205"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agar dapat akses VirtualBox dari terminal laptop, kita membutuhkan &lt;em&gt;port-forwarding&lt;/em&gt;. Lakukan konfigurasi port forwarding dengan cara&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shutdown VM terlebih dahulu. Kamu bisa klik close bar pada VM dan pilih shutdown&lt;/li&gt;
&lt;li&gt;Pilih VMmu dan klik Settings&lt;/li&gt;
&lt;li&gt;Pilih Network -&amp;gt; port forwarding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F19jhuffdrri0kxidl11q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F19jhuffdrri0kxidl11q.png" alt="VirtualBox Network Settings" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tambahkan port VM: Host IP 127.0.0.1, Host Port 2222, Guest Port 222. Host port adalah target port laptop kita dan guest port adalah port dari ssh VM kita.&lt;/li&gt;
&lt;li&gt;Apply Settings dan nyalakan VM dan pilih latest generations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flin4gk7ksptkidymbnqi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flin4gk7ksptkidymbnqi.png" alt="NixOS List Generations" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Buka terminal pada laptopmu dan lakukan ssh ke VM
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-p&lt;/span&gt; 2222 vboxuser@127.0.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Home Manager
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/nix-community/home-manager" rel="noopener noreferrer"&gt;Home Manager&lt;/a&gt; adalah tool dari komunitas Nix yang memungkinkan kita mengelola konfigurasi user secara deklaratif, seperti yang NixOS lakukan untuk konfigurasi sistem. Tanpa Home Manager, konfigurasi seperti ~/.gitconfig, ~/.bashrc, atau ~/.config/nvim/init.lua ditulis manual dan tidak reproducible.&lt;/p&gt;

&lt;p&gt;Dengan Home Manager, semua konfigurasi user dideklarasikan di home.nix dan bisa di-reproduce di mesin manapun hanya dengan satu perintah.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;configuration.nix&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;home.nix&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scope&lt;/td&gt;
&lt;td&gt;System-wide&lt;/td&gt;
&lt;td&gt;Per user&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contoh&lt;/td&gt;
&lt;td&gt;nginx, SSH, kernel&lt;/td&gt;
&lt;td&gt;git config, shell aliases, dotfiles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Butuh sudo&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lokasi install&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/run/current-system&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.nix-profile&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  1. Add home.nix
&lt;/h3&gt;

&lt;p&gt;home.nix&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;home&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"vboxuser"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;home&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;homeDirectory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"/home/vboxuser"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nv"&gt;home&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;packages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kn"&gt;with&lt;/span&gt; &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nv"&gt;ripgrep&lt;/span&gt;
    &lt;span class="nv"&gt;fd&lt;/span&gt;
    &lt;span class="nv"&gt;jq&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="nv"&gt;programs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;bash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nv"&gt;enable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;shellAliases&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;rebuild&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"sudo nixos-rebuild switch --flake ~/nix#nixos-server"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="nv"&gt;lazygit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nv"&gt;enable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;enableBashIntegration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nv"&gt;home&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;stateVersion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"25.11"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Update flake.nix
&lt;/h3&gt;

&lt;p&gt;flake.nix&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"NixOS Server Configuration"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nv"&gt;inputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;nixpkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"github:NixOS/nixpkgs/nixos-25.11"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nv"&gt;home-manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"github:nix-community/home-manager/release-25.11"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;home-manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;inputs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;nixpkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;follows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"nixpkgs"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nv"&gt;outputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nv"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nv"&gt;nixpkgs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nv"&gt;home-manager&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nv"&gt;nixosConfigurations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;nixos-server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;nixpkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;nixosSystem&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;system&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"aarch64-linux"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;modules&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="sx"&gt;./configuration.nix&lt;/span&gt;

          &lt;span class="nv"&gt;home-manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;nixosModules&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;home-manager&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;home-manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;useGlobalPkgs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nv"&gt;home-manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;useUserPackages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nv"&gt;home-manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;vboxuser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="sx"&gt;./home.nix&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
      &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Rebuild
&lt;/h3&gt;

&lt;p&gt;Rebuild NixOS system.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nixos-rebuild switch &lt;span class="nt"&gt;--flake&lt;/span&gt; ~/nix#nixos-server
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc &lt;span class="c"&gt;# reload bash untuk agar bisa rebuild dengan alias&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Karena kita sudah menambahkan alias pada &lt;code&gt;shellAliases&lt;/code&gt; di &lt;code&gt;home.nix&lt;/code&gt;, maka untuk selanjutnya kita tidak perlu mengetik perintah &lt;code&gt;nixos-rebuild&lt;/code&gt; yang panjang itu, kita hanya tinggal menjalankan perintah &lt;code&gt;rebuild&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Penutup
&lt;/h2&gt;

&lt;p&gt;Bagaimana menurutmu setelah melewati proses yang cukup panjang untuk install dan konfigurasi NixOS, sangat menarik bukan?&lt;/p&gt;

&lt;p&gt;Kita bisa menambahkan package dengan mudah, melakukan konfigurasi secara deklaratif, dan bisa rollback system jika tidak cocok dengan konfigurasinya.&lt;/p&gt;

&lt;p&gt;Berikut adalah referensi yang sangat membantu untuk melakukan explorasi nix&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wiki.nixos.org/wiki/NixOS_Wiki" rel="noopener noreferrer"&gt;Nix Wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://search.nixos.org/packages?channel=26.05" rel="noopener noreferrer"&gt;Nix Store&lt;/a&gt;: adalah situs official untuk nix package&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://home-manager-options.extranix.com/" rel="noopener noreferrer"&gt;Nix Home manager&lt;/a&gt;: situs untuk melihat konfigurasi package di home manager&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>nix</category>
      <category>nixos</category>
      <category>linux</category>
      <category>programming</category>
    </item>
    <item>
      <title>Nix Series: Introduction</title>
      <dc:creator>Dimas Rangga</dc:creator>
      <pubDate>Tue, 02 Jun 2026 08:34:53 +0000</pubDate>
      <link>https://dev.to/derangga/nix-series-introduction-5cba</link>
      <guid>https://dev.to/derangga/nix-series-introduction-5cba</guid>
      <description>&lt;p&gt;Pada series ini aku akan membahas apa itu Nix, NixOS, dan bagaimana menggunakan NixOS di server. Nix punya cara berpikir yang cukup berbeda dari package manager pada umumnya, jadi kita mulai dari dasarnya dulu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sedikit Sejarah Nix
&lt;/h2&gt;

&lt;p&gt;Nix dikenalkan oleh &lt;strong&gt;Eelco Dolstra&lt;/strong&gt;, seorang peneliti asal Belanda yang mana ia frustasi dengan cara kerja package manager yang tidak bisa menjamin konsistensi software environment. Analogi permasalahan yang coba diselesaikan oleh Dolstra sederhananya seperti ini, bayangkan kamu sedang mengerjakan sebuah project di komputermu dan semuanya berjalan lancar. Lalu kamu pindah ke komputer lain, menginstal ulang semua dependency yang kamu butuhkan dan tiba-tiba terjadi error. Error bermunculan saat install dependency, padahal kamu sudah melakukan hal yang sama persis di komputer sebelumnya. Masalah ini sering terjadi dengan sebutan "&lt;em&gt;works on my machine&lt;/em&gt;". &lt;/p&gt;

&lt;p&gt;Dolstra mengerjakan Nix sebagai bagian dari disertasi PhD-nya yang dipublikasikan pada &lt;strong&gt;2006&lt;/strong&gt;, berjudul &lt;em&gt;"The Purely Functional Software Deployment Model"&lt;/em&gt;. Tesis ini membahas tentang bagaimana cara deploy sebuah software yang &lt;em&gt;reliable&lt;/em&gt;, di mana input yang sama selalu menghasilkan output yang sama. Nix pertama kali dirilis pada &lt;strong&gt;2003&lt;/strong&gt; sebagai bagian dari riset tersebut, dan kini telah berkembang menjadi ekosistem dengan lebih dari 100.000 package.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apa itu nix
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frtpcgrqlz1rs98134poa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frtpcgrqlz1rs98134poa.png" alt="Source: https://www.dgt.is/blog/2025-01-10-nix-death-by-a-thousand-cuts" width="800" height="735"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Saat pertama kali mendengar nix beberapa orang pasti bingung karena nix bisa merujuk ke beberapa konteks sekaligus, nah pada artikel ini kita akan berkenalan dengan nix.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sebagai Bahasa Pemrograman: Nix adalah &lt;em&gt;functional programming language&lt;/em&gt; yang digunakan untuk menulis konfigurasi secara deklaratif. Gimana maksudnya? Sederhananya seperti ini, jika kita menggunakan OS linux seperti ubuntu, debian, arch, dll., untuk installasi sebuah package kita harus menjalankan perintah &lt;code&gt;apt-get install&lt;/code&gt; atau &lt;code&gt;pacman&lt;/code&gt; dan disetiap package yang sudah kita install, lokasi file konfigurasi berada ditempat yang berbeda-beda. Dengan menggunakan nix kita tidak perlu melakukan installasi dan konfigurasi sebuah package secara imperative, kita hanya perlu mendeklarasikan package dan konfigurasi yang kita butuhkan lalu di evaluasi.&lt;/li&gt;
&lt;li&gt;Sebagai Package Manager: Nix adalah &lt;em&gt;package manager&lt;/em&gt; yang mengevaluasi seluruh konfigurasi pada file &lt;code&gt;.nix&lt;/code&gt;. Berbeda dengan package manager lainnya seperti &lt;code&gt;apt&lt;/code&gt; atau &lt;code&gt;pacman&lt;/code&gt;. Nix menyimpan semua &lt;em&gt;package&lt;/em&gt; secara &lt;em&gt;isolate&lt;/em&gt; di &lt;code&gt;/nix/store&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Sebagai OS: NixOS adalah linux distribution yang menggunakan nix sebagai package manager yang dikelola secara deklaratif, seluruh konfigurasi sistem pun ditulis dalam nix language, mulai dari networking, user, service, sampai bootloader.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sekarang kita sudah tahu bahwa "Nix" bukan satu hal: ia adalah bahasa, package manager, sekaligus OS. Untuk memahami kenapa tiga hal ini bisa menyatu, kita perlu melihat bagaimana Nix bekerja di balik layar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bagaimana Nix bekerja
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Masalah dengan package manager
&lt;/h3&gt;

&lt;p&gt;Ketika kamu menginstal software dengan &lt;code&gt;apt install&lt;/code&gt; atau &lt;code&gt;brew install&lt;/code&gt;, biasanya file-file program ini ditempatkan di lokasi standar seperti &lt;code&gt;/usr/lib/&lt;/code&gt; atau &lt;code&gt;/usr/bin/&lt;/code&gt;. Ini terlihat tertata dengan rapi, tapi dapat menimbulkan masalah dikemudian hari. Contoh masalah yang bisa saja terjadi adalah &lt;em&gt;dependency hell&lt;/em&gt;, sebuah situasi dimana dua aplikasi butuh versi library yang berbeda tapi tidak bisa berjalan secara bersamaan&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Situasi bermasalah: "Dependency Hell"

Aplikasi A  ──────────────►  butuh Python 3.8
                                    │
                             FILE DI /usr/lib/python3.8/
                                    │
Aplikasi B  ──────────────►  butuh Python 3.11
                                    │
                             ⚠️  KONFLIK!
                             Tidak bisa dua versi
                             di tempat yang sama!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Solusi Nix: Storage Khusus di &lt;code&gt;/nix/store&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Nix mengatasi masalah ini dengan pendekatan yang berbeda. Setiap package disimpan di direktori khusus: &lt;code&gt;/nix/store&lt;/code&gt;. Yang membuatnya unik adalah setiap package memiliki &lt;strong&gt;nama folder yang berisi hash&lt;/strong&gt;, semacam &lt;em&gt;identifier&lt;/em&gt; unik berdasarkan isi package itu sendiri.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;/nix/store/
│
├── 9xgd3k2lmn7pqrs123abc456def7890z-firefox-120.0/  ← Firefox versi 120
│   ├── bin/firefox
│   └── lib/...
│
├── 7hqw8p9rst456mnop789qrs012tuv3456-firefox-119.0/ ← Firefox versi 119
│   ├── bin/firefox                         (bisa hidup berdampingan!)
│   └── lib/...
│
├── 2abc4d5efg789wxyz012345abc678def90-python-3.8.18/ ← Python 3.8
│   └── lib/...
│
└── 5jkl6m7nop012ghi345jkl678mno9012p-python-3.11.6/ ← Python 3.11
    └── lib/...                             (keduanya ada sekaligus!)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dua versi Python, dua versi Firefox; semuanya bisa diinstall dan digunakan tanpa konflik, karena masing-masing punya &lt;em&gt;identifier&lt;/em&gt; yang unik.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sistem Hash: Unique Signature Build
&lt;/h3&gt;

&lt;p&gt;Hash sebagai &lt;em&gt;unique identifier&lt;/em&gt; (deretan 32 karakter seperti &lt;code&gt;9xgd3k2lmn7pqrs123abc456def7890z&lt;/code&gt;) ini dihitung dari &lt;strong&gt;seluruh definisi&lt;/strong&gt; pembuatan package mulai dari: source code, dependency, compiler yang digunakan, bahkan environment variable yang dipakai saat build. Jika ada satu hal yang berbeda maka hashnya akan berbeda juga.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│            CARA NIX MEMBERI NAMA SEBUAH PACKAGE             │
│                                                             │
│  Input:                                                     │
│  ┌─────────────────────────────────┐                        │
│  │ • Source code Firefox 120.0     │                        │
│  │ • Versi GCC yang dipakai        │    ──► HASH ──         │
│  │ • Semua library dependency-nya  │   9xgd3k2l...          │
│  │ • Versi library-library itu     │   (32 karakter)        │
│  └─────────────────────────────────┘                        │
│                                                             │
│  Hasilnya:                                                  │
│  /nix/store/9xgd3k2lmn7pqrs123abc456def7890z-firefox-120.0/ │
│                                                             │
│  Ubah SATU hal kecil → hash BERBEDA →                       │
│  folder BERBEDA → tidak akan pernah bentrok!                │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ini disebut &lt;strong&gt;content-addressed storage&lt;/strong&gt;. Jika apapun berubah dari inputs → hashnya berbeda → path di store berbeda → package yang berbeda&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Karena hash inilah yang membuat nix menjamin reproducibility.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reproducible Builds: Kunci Utama Nix
&lt;/h3&gt;

&lt;p&gt;Inilah keunggulan terbesar Nix: &lt;strong&gt;reproducibility&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Karena setiap package dibuild dari definisi yang &lt;em&gt;deterministic&lt;/em&gt;, siapapun yang menjalankan build yang sama akan mendapat hasil yang identik, di komputer mana pun.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Tanpa Nix:
┌──────────┐         ┌──────────┐         ┌──────────┐
│ Laptop A │         │ Laptop B │         │  Server  │
│ Python   │         │ Python   │         │ Python   │
│ 3.11.2   │  ≠ ≠ ≠  │ 3.11.6   │  ≠ ≠ ≠  │ 3.11.8   │
│ pip 22.x │         │ pip 23.x │         │ pip 24.x │
│ numpy    │         │ numpy    │         │ numpy    │
│ 1.24.0   │         │ 1.25.1   │         │ 1.26.0   │
└──────────┘         └──────────┘         └──────────┘
"Works on my machine!" 😩

─────────────────────────────────────────────────────

Dengan Nix:
┌──────────┐         ┌──────────┐         ┌──────────┐
│ Laptop A │         │ Laptop B │         │  Server  │
│ Python   │         │ Python   │         │ Python   │
│ 3.11.6   │  = = =  │ 3.11.6   │  = = =  │ 3.11.6   │
│ numpy    │         │ numpy    │         │ numpy    │
│ 1.25.1   │         │ 1.25.1   │         │ 1.25.1   │
└──────────┘         └──────────┘         └──────────┘
Works perfectly! ✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Binary vs Source: Bagaimana Nix Memutuskan?
&lt;/h3&gt;

&lt;p&gt;Saat kamu menggunakan nix dan melakukan installasi sebuah package, kamu bisa melihat ada proses copy atau build from source pada package tersebut. Nix tidak selalu melakukan build dari source dan nix memiliki mekanisme yang disebut substituters (atau binary cache).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Nix evaluate expression → dapat hash/
└── Nix lookup ke binary cache: "Ada /nix/store/&lt;span class="nt"&gt;&amp;lt;hash&amp;gt;&lt;/span&gt;-nodejs-20.11.0 ?"/
    ├── Ada → Download binary langsung (substitute)
    └── Tidak ada → Build dari source secara lokal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Default binary cache untuk NixOS/nixpkgs adalah &lt;strong&gt;&lt;code&gt;cache.nixos.org&lt;/code&gt;&lt;/strong&gt; yang dimanage oleh Hydra (Nix's CI system). Hydra secara otomatis build semua package di &lt;code&gt;nixpkgs&lt;/code&gt; dan menyimpan hasilnya ke cache, sehingga mayoritas package populer sudah tersedia sebagai binary dan tidak perlu di-build ulang dari source.&lt;/p&gt;

&lt;p&gt;Perlu dicatat: jika kamu menggunakan &lt;code&gt;nixpkgs-unstable&lt;/code&gt; (channel yang lebih baru), ada kemungkinan binary cache untuk package tertentu belum tersedia karena Hydra belum selesai build-nya, sehingga Nix akan fall back ke build dari source secara lokal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alasan Nix Lebih Unggul dari Package Manager Lain
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Tidak ada lagi “Dependency Hell”&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Seperti yang sudah dijelaskan diatas, Nix memungkinkan berbagai versi package terinstall secara bersamaan. Dengan &lt;code&gt;apt&lt;/code&gt; atau &lt;code&gt;brew&lt;/code&gt;, kamu tidak bisa melakukan installasi secara native untuk dua package dengan versi yang berbeda.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Bisa Rollback sistem&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Saat melakukan upgrade sistem, Nix tidak langsung menggantikan package yang sudah terinstall. Sebaliknya, Nix membangun &lt;strong&gt;generation baru&lt;/strong&gt; yang berisi versi package yang sudah diperbarui, sementara generation lama tetap utuh di sistem.&lt;/p&gt;

&lt;p&gt;Setiap kali kamu menjalankan perintah berikut, Nix secara otomatis membuat generation baru:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# NixOS&lt;/span&gt;
sudo nixos-rebuild switch

&lt;span class="gh"&gt;# Nix Darwin&lt;/span&gt;
sudo darwin-rebuild switch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Konsep generation inilah yang membuat Nix aman untuk diupgrade. Jika sesuatu berjalan tidak semestinya setelah upgrade, kamu bisa rollback ke generation sebelumnya tanpa perlu reinstall atau konfigurasi ulang apapun. Cukup dengan satu command atau memilih generation dari boot menu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Rollback ke generation sebelumnya&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nixos-rebuild switch &lt;span class="nt"&gt;--rollback&lt;/span&gt;

&lt;span class="c"&gt;# Atau pilih generation spesifik dari daftar&lt;/span&gt;
nix-env &lt;span class="nt"&gt;--list-generations&lt;/span&gt;
nix-env &lt;span class="nt"&gt;--switch-generation&lt;/span&gt; 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Berikut ilustrasinya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Riwayat "generasi" sistemmu:

  gen 1          gen 2          gen 3 (sekarang)
┌────────┐     ┌────────┐     ┌────────┐
│Firefox │     │Firefox │     │Firefox │
│ 118    │     │ 119    │     │ 120    │
│Python  │     │Python  │     │Python  │
│ 3.10   │     │ 3.10   │     │ 3.11   │
└────────┘     └────────┘     └────────┘
                   ▲                │
                   │                │ ada yang salah?
                   └────────────────┘
          rollback → kembali ke gen 2
          atau pilih gen 1 dari boot menu!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Development Environment yang Terisolasi
&lt;/h3&gt;

&lt;p&gt;Nix memiliki fitur &lt;code&gt;nix develop&lt;/code&gt; dan &lt;code&gt;nix shell&lt;/code&gt; yang memungkinkan kita untuk membuat development environment yang terisolasi per-project, mirip &lt;code&gt;virtualenv&lt;/code&gt; di python atau &lt;code&gt;node_modules&lt;/code&gt; di Node.js.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Project A butuh Node 18 + PostgreSQL 14:
$ cd project-a &amp;amp;&amp;amp; nix develop
→ Masuk environment: Node 18, PostgreSQL 14 ✓

Project B butuh Node 20 + PostgreSQL 16:
$ cd project-b &amp;amp;&amp;amp; nix develop
→ Masuk environment: Node 20, PostgreSQL 16 ✓

Keduanya terisolasi, tidak saling mengganggu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Environment ini didefinisikan dalam file &lt;code&gt;flake.nix&lt;/code&gt; (cara modern) atau &lt;code&gt;shell.nix&lt;/code&gt; (cara lama). Dengan &lt;strong&gt;Nix Flakes&lt;/strong&gt; (fitur yang kini menjadi standar de facto), kamu bisa mendefinisikan seluruh dependency project dalam satu file &lt;code&gt;flake.nix&lt;/code&gt; yang ter-lock (mirip &lt;code&gt;package-lock.json&lt;/code&gt; di Node.js), sehingga siapapun yang clone project tersebut akan mendapat environment yang sama persis.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="c"&gt;# Contoh flake.nix sederhana&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;inputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;nixpkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"github:NixOS/nixpkgs/nixos-24.05"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;flake-utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"github:numtide/flake-utils"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nv"&gt;outputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;nixpkgs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;flake-utils&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt;
    &lt;span class="nv"&gt;flake-utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;eachDefaultSystem&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;system&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;pkgs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;nixpkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;legacyPackages&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;system&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt; &lt;span class="kn"&gt;in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;devShells&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;mkShell&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nv"&gt;packages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;nodejs_20&lt;/span&gt; &lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tidak Mengotori Sistem
&lt;/h3&gt;

&lt;p&gt;Berbeda dengan package manager konvensional, Nix menyimpan setiap package di lokasi terisolasi di bawah &lt;code&gt;/nix/store&lt;/code&gt;. Tidak ada file yang tersebar ke berbagai direktori sistem seperti &lt;code&gt;/usr/lib&lt;/code&gt; atau &lt;code&gt;/etc&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Dengan struktur penyimpanan yang terisolasi seperti ini, Nix tahu persis mana yang masih dibutuhkan dan mana yang sudah tidak. Jadi saat kamu menjalankan &lt;code&gt;nix-collect-garbage&lt;/code&gt;, hanya package yang benar-benar tidak dibutuhkan oleh siapapun yang akan dihapus. Tidak ada file sisa (&lt;em&gt;leftover&lt;/em&gt;) yang tertinggal di sudut-sudut sistem, seperti yang sering terjadi setelah &lt;code&gt;apt remove&lt;/code&gt; di Ubuntu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Penutup
&lt;/h2&gt;

&lt;p&gt;Dependency hell sudah jadi masalah lama di dunia software, dan Nix adalah salah satu jawaban tepat untuk masalah tersebut. Lahir dari frustasi nyata seorang peneliti pada 2003, Nix kini telah berkembang menjadi ekosistem yang mencakup lebih dari 100.000 package, dengan komunitas yang aktif dan terus bertumbuh.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Empat hal yang perlu diingat:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Nix adalah bahasa&lt;/strong&gt; untuk mendeskripsikan software secara deklaratif.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nix adalah package manager&lt;/strong&gt; yang menyimpan setiap package secara terisolasi di &lt;code&gt;/nix/store&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reproducibility&lt;/strong&gt;: build yang sama menghasilkan output yang identik di mesin mana pun.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NixOS adalah OS&lt;/strong&gt; di mana seluruh konfigurasi sistem (dari networking hingga bootloader) ditulis dalam Nix language.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Learning curve Nix memang curam, dan bagian terberatnya bukan di syntax melainkan perubahan mental model dari imperatif ke deklaratif. Tapi kabar baiknya: begitu kamu "klik" dengan cara berpikirnya, kamu akan sulit kembali ke cara lama. Di artikel berikutnya, kita akan mulai menginstall Nix dan mencoba langsung fitur-fitur yang sudah dibahas di sini.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referensi:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nixos.org/guides/how-nix-works/" rel="noopener noreferrer"&gt;https://nixos.org/guides/how-nix-works/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/5D3nUU1OVx8?si=1PkrPetk5Kp8RBe8" rel="noopener noreferrer"&gt;https://youtu.be/5D3nUU1OVx8?si=1PkrPetk5Kp8RBe8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/9OMDnZWXjn4?si=Ql5E_gBe-D-lvrcy" rel="noopener noreferrer"&gt;https://youtu.be/9OMDnZWXjn4?si=Ql5E_gBe-D-lvrcy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>nix</category>
      <category>linux</category>
    </item>
  </channel>
</rss>
