DEV Community

Cover image for Install NixOS on Jetorbit
Dimas Rangga
Dimas Rangga

Posted on

Install NixOS on Jetorbit

Overview

Tulisan ini menceritakan pengalaman saya meng-install NixOS di VPS Jetorbit memakai nixos-anywhere, dideploy dari laptop macOS (nix-darwin).

Komposisi

  • Laptop (macOS + nix-darwin): Semua konfigurasi NixOS dibuat di sini, lalu dikirim ke server.
  • VPS Jetorbit (x86_64 Linux): target deploy. Boot lewat legacy BIOS, dengan IP statis (bukan DHCP).
  • nixos-anywhere: dipakai sekali saja untuk install awal.
  • nixos-rebuild: dipakai untuk update konfigurasi setelah install awal.

Catatan Penting: VPS tidak perlu menyimpan file konfigurasi sendiri. Kita edit config di laptop, lalu push ke VPS lewat SSH. Tidak ada apt update, tidak ada config drift, dan kondisi server selalu reproducible dari git.

Pre-flight: Cek Sebelum Menyentuh Server

Banyak kegagalan install sebenarnya bisa dicegah kalau kita cek tiga hal ini:

1. Mode boot: UEFI atau legacy BIOS?

Ini menentukan konfigurasi bootloader. Salah konfigurasi di sini dapat menyebabkan GRUB gagal saan install nanti.

Di VPS (SSH ke VPS):

[ -d /sys/firmware/efi ] && echo "UEFI" || echo "BIOS"
Enter fullscreen mode Exit fullscreen mode

Di Jetorbit secara default adalah BIOS. Artinya konfigurasi GRUB mode legacy BIOS, bukan EFI.

2. Networking: IP, netmask, dan gateway

Jetorbit memakai IP statis, bukan DHCP. Kalau konfigurasi NixOS kita set IP maka NixOS akan fallback ke DHCP, dan akan gagal dapat IP, sehingga server jadi tidak bisa diakses sama sekali setelah reboot.

Di VPS:

ip -4 a      # lihat IP + CIDR dan nama interface (misal. ens3)
ip route     # lihat "default via X.X.X.X", itu gateway-nya
Enter fullscreen mode Exit fullscreen mode

Contoh:

2: ens3: ... inet 110.XXX.XXX.XXX/24 brd 110.XXX.XXX.255 scope global ens3
Enter fullscreen mode Exit fullscreen mode

3. SSH Root

nixos-anywhere memerlukan akses root ke server untuk bisa melakukan instalasi. Akses ini didapat lewat SSH key, bukan password. Jadi pastikan Di VPS: public key sudah terdaftar di root. Konfigurasi SSH root ini bisa dilakukan saat install OS awal di panel Jetorbit atau dikonfigurasi secara manual di ~/.ssh/authorized_keys.

Cara Kerja nixos-anywhere

Sebelum menjalankan perintahnya, ada baiknya paham apa yang sebenarnya terjadi. nixos-anywhere mengubah server yang sedang menjalankan OS lain (Ubuntu) menjadi NixOS tanpa perlu installer iso. Seperti ini prosesnya:

  1. Evaluate Process (di laptop). nixos-anywhere meng-evaluasi flake kita secara lokal di laptop. Di tahap ini laptop mengunduh flake inputs (source nixpkgs, disko, dll.). Ukurannya relatif kecil dan dicache.

  2. kexec ke installer (di VPS). nixos-anywhere mengirim sebuah image installer kecil ke server, lalu memakai kexec untuk "boot" langsung ke kernel installer itu tanpa reboot dan tanpa reinstall dari panel provider. Server yang tadinya Ubuntu sekarang menjalankan environment installer NixOS di RAM.

  3. Partisi disk lewat disko (di VPS). Installer menjalankan disko yang membaca disk-config.nix kita, lalu mempartisi dan memformat disk berdasarkan konfigurasi yang sudah kita definisikan. Semua data lama di disk ditimpa ditahap ini.

  4. Build and copy system closure. System NixOS perlu di-build terlebih dahulu, dan disini kita akan menggunakan flag --build-on-remote agar proses build dilakukan di VPS. Hasil build (system closure) akan dicopy ke root filesystem baru dan packages akan didownload dari cache.nixos.org, ditahap ini berjalan lewat internet VPS, bukan laptop.

  5. Install bootloader dan reboot (di VPS). Bootloader dipasang ke disk, lalu server reboot ke sistem NixOS yang baru. Setelah ini, Ubuntu sudah hilang total dan diganti NixOS.

Pemahaman fase ini penting untuk satu pertanyaan yang sering muncul: kenapa download package terlihat lewat internet yang berbeda? Jawabannya, fase evaluasi jalan di laptop, sedangkan fase build/subtitution jalan di --build-on-remote, yaitu VPS. Jadi yang lewat laptop biasanya cuma bagian kecil di awal.

Template: Mulai dari nixos-anywhere-examples

Nix Community menyediakan template flake untuk nixos-anywhere, kita bisa menggunakan template ini dari pada membuat dari awal.

https://github.com/nix-community/nixos-anywhere-examples

Stealing Code

Setup Minimal: Pastikan NixOS Sukses Ter-install

Saat proses migrasi ke NixOS kita bisa melakukan setup seminimal mungkin agar saat terjadi error scope errornya tidak terlalu luas. Setup tersebut seperti melakukan konfigurasi ssh, users, dan packages penting (contoh: curl, vim/neovim, git). Pastikan NixOS benar-benar boot dan bisa di-SSH.

Disk dan Bootloader (untuk legacy BIOS)

Dari pre-flight tadi kita tahu Jetorbit boot lewat legacy BIOS by default. Maka di disk-config.nix, layout cukup partisi BIOS boot (EF02) + root ext4. Tidak perlu partisi ESP (EF00), karena ESP justru bikin GRUB bingung di mode BIOS.

disko.devices.disk.disk1 = {
  device = "/dev/sda";  # sesuaikan dengan disk name dari lsblk
  type = "disk";
  content = {
    type = "gpt";
    partitions = {
      boot = {
        name = "boot";
        size = "1M";
        type = "EF02"; # BIOS boot partition
      };
      root = {
        name = "root";
        size = "100%";
        content = {
          type = "filesystem";
          format = "ext4";
          mountpoint = "/";
        };
      };
    };
  };
};
Enter fullscreen mode Exit fullscreen mode

Lalu di configuration.nix, set GRUB untuk BIOS, bukan EFI:

boot.loader.grub = {
  enable = true;
  efiSupport = false;
};
Enter fullscreen mode Exit fullscreen mode

Networking Statis

Ini bagian paling krusial. Tanpa ini, server tidak akan punya IP setelah reboot. Sehingga saat instalasi selesai kita tidak bisa ssh ke sever dan juga saat melakukan ping ke server akan error Network is unreachable atau Request timeout.

Kita bisa set networkingnya secara statis di configuration.nix:

networking = {
  hostName = "nixos-jetorbit";
  useDHCP = false;
  interfaces.ens3 = {   # SESUAIKAN nama interface
    ipv4.addresses = [
      {
        address = "110.XXX.XXX.XXX";
        prefixLength = 24;        # dari /24
      }
    ];
  };
  defaultGateway = "110.XXX.XXX.1";
  nameservers = [
    "1.1.1.1"
    "8.8.8.8"
  ];
};
Enter fullscreen mode Exit fullscreen mode

Konfigurasi Users

Tambahkan konfigurasi users untuk root dan user baru. Kita bisa menambahkan konfigurasi ini di configuration.nix dengan seperti ini:

users.users.root = {
  openssh.authorizedKeys.keys = [
    "YOUR_SSH AAAAC3Nza..."
  ]
};

users.users.foobar = {
  isNormalUser = true;
  extraGroups = [ "wheel" ];
  openssh.authorizedKeys.keys = [
    "YOUR_SSH AAAAC3NzaC1..."
  ];
};
Enter fullscreen mode Exit fullscreen mode

Aktifkan Flakes

Dengan enable flakes, kita bisa melakukan konfigurasi nix diluar directory /etc/nixos, aktifkan di configuration.nix:

nix.settings.experimental-features = [
  "nix-command"
  "flakes"
];
Enter fullscreen mode Exit fullscreen mode

Complete configuration.nix
{
  modulesPath,
  lib,
  pkgs,
  ...
}@args:
{
  imports = [
    (modulesPath + "/installer/scan/not-detected.nix")
    (modulesPath + "/profiles/qemu-guest.nix")
    ./disk-config.nix
  ];

  boot.loader.grub = {
    enable = true;
    efiSupport = false;
  };

  networking = {
    hostName = "nixos-jetorbit";
    useDHCP = false;
    interfaces.ens3 = {   # SESUAIKAN nama interface
      ipv4.addresses = [
        {
          address = "110.XXX.XXX.XXX";
          prefixLength = 24;  # dari /24
        }
      ];
    };
    defaultGateway = "110.XXX.XXX.1";
    nameservers = [
      "1.1.1.1"
      "8.8.8.8"
    ];
  };

  time.timeZone = "Asia/Jakarta";

  # Aktifkan flakes + perintah "nix" baru
  nix.settings.experimental-features = [
    "nix-command"
    "flakes"
  ];

  # swap via zram, gak perlu partisi swap terpisah, cocok buat disk kecil
  zramSwap.enable = true;

  services.openssh = {
    enable = true;
    settings = {
      PasswordAuthentication = false;
    };
  };

  users.users.root = {
    openssh.authorizedKeys.keys = [
      "YOUR_SSH AAAAC3Nza..."
    ]
  };

  users.users.foobar = {
    isNormalUser = true;
    extraGroups = [ "wheel" ];
    openssh.authorizedKeys.keys = [
      "YOUR_SSH AAAAC3NzaC1..."
    ];
  };

  environment.systemPackages = with pkgs; [
    neovim
    curl
    git
    htop
  ];

  system.stateVersion = "25.11";
}
Enter fullscreen mode Exit fullscreen mode

Update flake.nix

Edit flake.nix dengan menambahkan hostname, disini kita akan menggunakan vps-jetorbit sebagai hostname

{
  description = "NixOS config VPS Jetorbit";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
    disko.url = "github:nix-community/disko";
    disko.inputs.nixpkgs.follows = "nixpkgs";
  };

  outputs =
    { nixpkgs, disko, ... }:
    {
      nixosConfigurations.vps-jetorbit = nixpkgs.lib.nixosSystem {
        system = "x86_64-linux";
        modules = [
          disko.nixosModules.disko
          ./configuration.nix
          ./hardware-configuration.nix
        ];
      };
    };
}
Enter fullscreen mode Exit fullscreen mode

Verifikasi konfigurasi yang telah dilakukan dengan cara

nix flake check
Enter fullscreen mode Exit fullscreen mode

Instalasi NixOS

Setelah konfigurasi minimal selesai kita bisa jalankan nixos-anywhere di laptop:

nix run github:nix-community/nixos-anywhere -- \
  --flake .#vps-jetorbit \
  --generate-hardware-config nixos-generate-config ./hosts/jetorbit/hardware-configuration.nix \
  --target-host root@<IP_VPS> \
  --build-on-remote
Enter fullscreen mode Exit fullscreen mode

Penjelasan flag:

  • --flake .#vps-jetorbit: pakai output nixosConfigurations.vps-jetorbit.
  • --generate-hardware-config: generate konfigurasi hardware-configuration.nix secara otomatis saat instalasi berlangsung. Kalau sudah punya dan tidak mau di-regenerate, flag ini bisa dihapus.
  • --target-host: target VPS.
  • --build-on-remote: build dilakukan di VPS.

Saat proses instalasi berlangsung, VPS akan dipartisi, di-install, lalu reboot ke NixOS.

Setelah proses instalasi selesai koneksi ssh akan terputus karena VPS akan melakukkan reboot, kita bisa menunggu sebentar. Kemudian, verifikasi di laptop:

ping <IP_VPS>
ssh root@<IP_VPS>
ssh foobar@<IP_VPS> # sesuaikan dengan user yang kamu tambahkan
Enter fullscreen mode Exit fullscreen mode

Update Konfigurasi

Setelah proses instalasi selesai dan kita bisa auth via ssh, kita bisa melanjutkan konfigurasi sesuai kebutuhan kita misal enable firewall atau menambahkan packages. Namun sebelum itu, ada baiknya kita commit konfigurasi saat ini ke github.

Kita bisa melakukan rebuild system melalui VPS secara langsung atau melalui laptop kita dengan cara SSH.

  • VPS: konfigurasi melalui VPS dapat dilakukan dengan cara clone konfigurasi yang sudah dipush ke github lalu update configuration.nix bagian environment.systemPackages, misalnya kita menambahkan package baru. Setelah itu kita bisa rebuild dengan menggunakan perintah berikut
sudo nixos-rebuild switch --flake ~/nix#vps-jetorbit
Enter fullscreen mode Exit fullscreen mode
  • Local Laptop: cara konfigurasi melalui laptop sebetulnya sama seperti di VPS, kita bisa update configuration.nix dan yang membedakan adalah cara rebuildnya. Cara rebuild dari local laptop dengan menjalankan perintah berikut
nix run nixpkgs#nixos-rebuild -- switch \
  --flake .#vps-jetorbit \
  --target-host foobar@<IP_VPS> \
  --build-host foobar@<IP_VPS> \
  --use-remote-sudo \
  --ask-sudo-password
Enter fullscreen mode Exit fullscreen mode

Penutup

Instalasi NixOS di VPS akan memberikan pengalaman yang menarik untuk kamu yang baru dan ingin mencobanya, karena dia berbeda dengan OS lainnya. Semua konfigurasinya dibuat secara deklaratif dan kita bisa melakukan verifikasi sebelum instalasi.

Info

Jetorbit juga mendukung untuk merubah dari boot legacy ke uefi.

Jetorbit

Referensi

Top comments (0)