Menambahkan Server Binary Cache
Kami telah memperkenalkan konsep Nix Store dan binary cache. Di sini, kita akan melihat cara menambahkan beberapa server cache untuk mempercepat unduhan paket.
Mengapa Menambahkan Server Cache
Nix menyediakan server cache resmi, https://cache.nixos.org, yang menyimpan cache hasil build untuk sebagian besar paket yang umum digunakan. Namun, ini mungkin tidak memenuhi semua kebutuhan pengguna. Dalam kasus berikut, kita perlu menambahkan server cache tambahan:
- Tambahkan server cache untuk beberapa proyek pihak ketiga, seperti server cache nix-community https://nix-community.cachix.org, yang dapat secara signifikan meningkatkan kecepatan build proyek pihak ketiga ini.
- Tambahkan situs mirror server cache yang paling dekat dengan pengguna untuk mempercepat unduhan.
- Tambahkan server cache yang dibangun sendiri untuk mempercepat proses build proyek pribadi.
Cara Menambahkan Server Cache
Di Nix, Anda dapat mengkonfigurasi server cache menggunakan opsi berikut:
- substituters: Ini adalah daftar string, dan setiap string adalah alamat dari server cache. Nix akan mencoba menemukan cache dari server ini dalam urutan yang ditentukan dalam daftar.
- trusted-public-keys: Untuk mencegah serangan berbahaya, opsi require-sigs diaktifkan secara default. Hanya cache dengan tanda tangan yang dapat diverifikasi oleh kunci publik apa pun di
trusted-public-keysakan digunakan oleh Nix. Oleh karena itu, Anda perlu menambahkan kunci publik yang sesuai dengansubstitutersditrusted-public-keys.- Data mirror cache disinkronkan langsung dari server cache resmi. Oleh karena itu, kunci publik mereka sama dengan server cache resmi, dan Anda dapat menggunakan kunci publik server cache resmi tanpa konfigurasi tambahan.
- Mekanisme verifikasi kunci publik berbasis kepercayaan ini sepenuhnya mentransfer tanggung jawab keamanan kepada pengguna. Jika pengguna ingin menggunakan server cache pihak ketiga untuk mempercepat proses build library tertentu, mereka harus menanggung risiko keamanan yang sesuai dan memutuskan apakah akan menambahkan kunci publik server cache tersebut ke
trusted-public-keys. Untuk sepenuhnya menyelesaikan masalah kepercayaan ini, Nix telah memperkenalkan fitur eksperimental ca-derivations, yang tidak bergantung padatrusted-public-keysuntuk verifikasi tanda tangan. Pengguna yang tertarik dapat mengeksplorasinya lebih lanjut.
Anda dapat mengkonfigurasi parameter substituters dan trusted-public-keys dengan cara berikut:
- Konfigurasikan di
/etc/nix/nix.conf, konfigurasi global yang mempengaruhi semua pengguna.- Anda dapat menggunakan
nix.settings.substitutersdannix.settings.trusted-public-keysdi Modul NixOS apa pun untuk secara deklaratif menghasilkan/etc/nix/nix.conf.
- Anda dapat menggunakan
- Konfigurasikan di
flake.nixdari proyek flake menggunakannixConfig.substituters. Konfigurasi ini hanya mempengaruhi flake saat ini. - Atur sementara melalui parameter
--optiondari perintahnix, dan konfigurasi ini hanya berlaku untuk perintah saat ini.
Di antara ketiga metode ini, kecuali konfigurasi global pertama, dua lainnya adalah konfigurasi sementara. Jika beberapa metode digunakan secara bersamaan, konfigurasi kemudian akan langsung menimpa konfigurasi sebelumnya.
Namun, ada risiko keamanan dalam mengatur substituters secara sementara, seperti yang dijelaskan sebelumnya mengenai kekurangan mekanisme verifikasi keamanan berdasarkan trusted-public-keys. Untuk mengatur substituters melalui metode kedua dan ketiga, Anda perlu memenuhi salah satu kondisi berikut:
- Pengguna saat ini termasuk dalam daftar parameter
trusted-usersdi/etc/nix/nix.conf. substitutersyang ditentukan sementara melalui--option substituters "http://xxx"termasuk dalam daftar parametertrusted-substitutersdi/etc/nix/nix.conf.
Berdasarkan informasi di atas, berikut adalah contoh dari tiga metode konfigurasi yang disebutkan sebelumnya.
Pertama, secara deklaratif konfigurasikan substituters dan trusted-public-keys tingkat sistem menggunakan nix.settings di /etc/nixos/configuration.nix atau Modul NixOS apa pun:
{
lib,
...
}: {
# ...
nix.settings = {
# berikan hak kepada pengguna dalam daftar ini untuk menentukan substituters tambahan melalui:
# 1. `nixConfig.substituters` di `flake.nix`
# 2. argumen command line `--options substituters http://xxx`
trusted-users = ["ryan"];
substituters = [
# mirror cache yang terletak di China
# status: https://mirror.sjtu.edu.cn/
"https://mirror.sjtu.edu.cn/nix-channels/store"
# status: https://mirrors.ustc.edu.cn/status/
# "https://mirrors.ustc.edu.cn/nix-channels/store"
"https://cache.nixos.org"
];
trusted-public-keys = [
# kunci publik default dari cache.nixos.org, sudah built-in, tidak perlu ditambahkan di sini
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
];
};
}Metode kedua adalah mengkonfigurasi substituters dan trusted-public-keys menggunakan nixConfig di flake.nix:
Seperti disebutkan sebelumnya, penting untuk mengkonfigurasi
nix.settings.trusted-usersdalam konfigurasi ini. Jika tidak,substitutersyang kita atur di sini tidak akan berlaku.
{
description = "NixOS configuration of Ryan Yin";
# nixConfig di sini hanya mempengaruhi flake itu sendiri, bukan konfigurasi sistem!
nixConfig = {
# timpa substituters default
substituters = [
# mirror cache yang terletak di China
# status: https://mirror.sjtu.edu.cn/
"https://mirror.sjtu.edu.cn/nix-channels/store"
# status: https://mirrors.ustc.edu.cn/status/
# "https://mirrors.ustc.edu.cn/nix-channels/store"
"https://cache.nixos.org"
# server cache nix community
"https://nix-community.cachix.org"
];
trusted-public-keys = [
# kunci publik server cache nix community
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
];
};
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
# menghilangkan beberapa konfigurasi...
};
outputs = inputs@{
self,
nixpkgs,
...
}: {
nixosConfigurations = {
my-nixos = nixpkgs.lib.nixosSystem {
modules = [
./hardware-configuration.nix
./configuration.nix
{
# berikan hak kepada pengguna dalam daftar ini untuk menentukan substituters tambahan melalui:
# 1. `nixConfig.substituters` di `flake.nix`
nix.settings.trusted-users = [ "ryan" ];
}
# menghilangkan beberapa konfigurasi...
];
};
};
};
}Akhirnya, metode ketiga melibatkan penggunaan perintah berikut untuk sementara menentukan substituters dan trusted-public-keys selama deployment:
sudo nixos-rebuild switch --option substituters "https://nix-community.cachix.org" --option trusted-public-keys "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="Pilih salah satu dari tiga metode di atas untuk konfigurasi dan deployment. Setelah deployment berhasil, semua paket berikutnya akan mencari cache dari sumber mirror domestik terlebih dahulu.
Jika hostname sistem Anda bukan
my-nixos, Anda perlu memodifikasi namanixosConfigurationsdiflake.nixatau gunakan--flake /etc/nixos#my-nixosuntuk menentukan nama konfigurasi.
Prefix extra- untuk Parameter Opsi Nix
Seperti disebutkan sebelumnya, substituters yang dikonfigurasi dengan tiga metode akan saling menimpa, tetapi situasi ideal seharusnya:
- Pada tingkat sistem di
/etc/nix/nix.conf, konfigurasikan hanyasubstitutersdantrusted-public-keysyang paling umum, seperti server cache resmi dan sumber mirror domestik. - Di
flake.nixsetiap proyek flake, konfigurasikansubstitutersdantrusted-public-keyskhusus untuk proyek tersebut, seperti server cache non-resmi seperti nix-community. - Saat membangun proyek flake, nix harus menggabungkan
substitutersdantrusted-public-keysyang dikonfigurasi diflake.nixdan/etc/nix/nix.conf.
Nix menyediakan prefix extra- untuk mencapai fungsionalitas penggabungan ini.
Menurut dokumentasi resmi, jika nilai parameter xxx adalah daftar, nilai extra-xxx akan ditambahkan ke akhir parameter xxx:
Dengan kata lain, Anda dapat menggunakannya seperti ini:
{
description = "NixOS configuration of Ryan Yin";
# nixConfig di sini hanya mempengaruhi flake itu sendiri, bukan konfigurasi sistem!
nixConfig = {
# akan ditambahkan ke substituters tingkat sistem
extra-substituters = [
# server cache nix community
"https://nix-community.cachix.org"
];
# akan ditambahkan ke trusted-public-keys tingkat sistem
extra-trusted-public-keys = [
# kunci publik server cache nix community
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
];
};
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
# menghilangkan beberapa konfigurasi...
};
outputs = inputs@{
self,
nixpkgs,
...
}: {
nixosConfigurations = {
my-nixos = nixpkgs.lib.nixosSystem {
modules = [
./hardware-configuration.nix
./configuration.nix
{
# berikan hak kepada pengguna dalam daftar ini untuk menentukan substituters tambahan melalui:
# 1. `nixConfig.substituters` di `flake.nix`
nix.settings.trusted-users = [ "ryan" ];
# substituters & trusted-public-keys tingkat sistem
nix.settings = {
substituters = [
# mirror cache yang terletak di China
# status: https://mirror.sjtu.edu.cn/
"https://mirror.sjtu.edu.cn/nix-channels/store"
# status: https://mirrors.ustc.edu.cn/status/
# "https://mirrors.ustc.edu.cn/nix-channels/store"
"https://cache.nixos.org"
];
trusted-public-keys = [
# kunci publik default dari cache.nixos.org, sudah built-in, tidak perlu ditambahkan di sini
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
];
};
}
# menghilangkan beberapa konfigurasi...
];
};
};
};
}Mempercepat Unduhan Paket melalui Server Proxy
Direferensikan dari Issue: roaming laptop: network proxy configuration - NixOS/nixpkgs Meskipun disebutkan sebelumnya bahwa proxy transparan yang berjalan di router atau mesin lokal Anda dapat sepenuhnya menyelesaikan masalah unduhan paket yang lambat di NixOS, konfigurasinya agak rumit dan sering memerlukan perangkat keras tambahan.
Beberapa pengguna mungkin lebih suka langsung mempercepat unduhan paket dengan menggunakan proxy HTTP/Socks5 yang berjalan di mesin mereka. Berikut cara mengaturnya. Menggunakan metode seperti export HTTPS_PROXY=http://127.0.0.1:7890 di Terminal tidak akan berhasil karena pekerjaan sebenarnya dilakukan oleh proses latar belakang yang disebut nix-daemon, bukan oleh perintah yang langsung dijalankan di Terminal.
Jika Anda hanya perlu menggunakan proxy sementara, Anda dapat mengatur variabel lingkungan proxy dengan perintah berikut:
sudo mkdir -p /run/systemd/system/nix-daemon.service.d/
sudo tee /run/systemd/system/nix-daemon.service.d/override.conf <<EOF
[Service]
Environment="https_proxy=socks5h://localhost:7891"
EOF
sudo systemctl daemon-reload
sudo systemctl restart nix-daemonSetelah men-deploy konfigurasi ini, Anda dapat memeriksa apakah variabel lingkungan telah diatur dengan menjalankan sudo cat /proc/$(pidof nix-daemon)/environ | tr '\0' '\n'.
Pengaturan di /run/systemd/system/nix-daemon.service.d/override.conf akan secara otomatis dihapus saat sistem restart, atau Anda dapat menghapusnya secara manual dan restart layanan nix-daemon untuk mengembalikan pengaturan asli.
Jika Anda ingin mengatur proxy secara permanen, disarankan untuk menyimpan perintah di atas sebagai skrip shell dan menjalankannya setiap kali sistem dimulai. Atau, Anda dapat menggunakan proxy transparan atau TUN dan solusi proxy global lainnya.
Ada juga orang di komunitas yang secara permanen mengatur proxy untuk nix-daemon dengan cara deklaratif menggunakan
systemd.services.nix-daemon.environment. Namun, jika proxy mengalami masalah, akan sangat merepotkan. Nix-daemon tidak akan berfungsi dengan baik, dan sebagian besar perintah Nix tidak akan berjalan dengan benar. Selain itu, konfigurasi systemd itu sendiri diatur untuk perlindungan read-only, membuatnya sulit untuk memodifikasi atau menghapus pengaturan proxy. Jadi, tidak disarankan menggunakan metode ini.
Saat menggunakan beberapa proxy komersial atau publik, Anda mungkin mengalami error HTTP 403 saat mengunduh dari GitHub (seperti yang dijelaskan di nixos-and-flakes-book/issues/74). Dalam kasus seperti itu, Anda dapat mencoba mengubah server proxy atau mengatur access-tokens untuk menyelesaikan masalah.