every.channel/flake.nix
2026-04-03 02:01:34 -07:00

263 lines
8.9 KiB
Nix

{
description = "every.channel development environment";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
rust-overlay.url = "github:oxalica/rust-overlay";
agenix.url = "github:ryantm/agenix";
};
outputs = { self, nixpkgs, flake-utils, rust-overlay, agenix }:
let
nixosModules = rec {
ec-node = import ./nix/modules/ec-node.nix;
ec-runner = import ./nix/modules/ec-runner.nix;
ec-netboot = import ./nix/modules/ec-netboot.nix;
ec-ipxe-qemu = import ./nix/modules/ec-ipxe-qemu.nix;
ec-ethereum = import ./nix/modules/ec-ethereum.nix;
ec-op-stack = import ./nix/modules/ec-op-stack.nix;
ec-publisher-guest = import ./nix/modules/ec-publisher-guest.nix;
default = ec-node;
};
in
{
inherit nixosModules;
nixosConfigurations =
let
mkRunner = system: extraModules:
nixpkgs.lib.nixosSystem {
inherit system;
specialArgs = { inherit self; };
modules = [
./nix/nixos/ec-runner.nix
] ++ extraModules;
};
mkPublisher = system: extraModules:
nixpkgs.lib.nixosSystem {
inherit system;
specialArgs = { inherit self; };
modules = [
./nix/nixos/ec-runner.nix
self.nixosModules.ec-publisher-guest
] ++ extraModules;
};
in
{
# Base runner system (for normal installs).
ec-runner-aarch64 = mkRunner "aarch64-linux" [ ];
ec-runner-x86_64 = mkRunner "x86_64-linux" [ ];
ec-publisher-x86_64 = mkPublisher "x86_64-linux" [ ];
# Sovereign forge host (git.every.channel) managed from every.channel.
ecp-forge = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = { inherit self; };
modules = [
agenix.nixosModules.default
self.nixosModules.ec-node
self.nixosModules.ec-netboot
self.nixosModules.ec-ipxe-qemu
self.nixosModules.ec-ethereum
self.nixosModules.ec-op-stack
./nix/nixos/ecp-forge.nix
];
};
# Netboot artifacts (iPXE/PXE).
ec-runner-aarch64-netboot = mkRunner "aarch64-linux" [
({ modulesPath, ... }: {
imports = [ (modulesPath + "/installer/netboot/netboot-minimal.nix") ];
})
({ ... }: {
services.every-channel.runner.overlayRoot.enable = false;
})
({ config, pkgs, ... }: {
# Convenience output dir: { kernel, initrd, netboot.ipxe }.
system.build.netboot = pkgs.linkFarm "ec-runner-netboot" [
{
name = "kernel";
path = "${config.system.build.kernel}/${config.system.boot.loader.kernelFile}";
}
{
name = "initrd";
path = "${config.system.build.netbootRamdisk}/initrd";
}
{
name = "netboot.ipxe";
path = "${config.system.build.netbootIpxeScript}/netboot.ipxe";
}
];
})
];
ec-runner-x86_64-netboot = mkRunner "x86_64-linux" [
({ modulesPath, ... }: {
imports = [ (modulesPath + "/installer/netboot/netboot-minimal.nix") ];
})
({ ... }: {
services.every-channel.runner.overlayRoot.enable = false;
})
({ config, pkgs, ... }: {
system.build.netboot = pkgs.linkFarm "ec-runner-netboot" [
{
name = "kernel";
path = "${config.system.build.kernel}/${config.system.boot.loader.kernelFile}";
}
{
name = "initrd";
path = "${config.system.build.netbootRamdisk}/initrd";
}
{
name = "netboot.ipxe";
path = "${config.system.build.netbootIpxeScript}/netboot.ipxe";
}
];
})
];
ec-publisher-x86_64-netboot = mkPublisher "x86_64-linux" [
({ modulesPath, ... }: {
imports = [ (modulesPath + "/installer/netboot/netboot-minimal.nix") ];
})
({ ... }: {
services.every-channel.runner.overlayRoot.enable = false;
})
({ config, pkgs, ... }: {
system.build.netboot = pkgs.linkFarm "ec-publisher-netboot" [
{
name = "kernel";
path = "${config.system.build.kernel}/${config.system.boot.loader.kernelFile}";
}
{
name = "initrd";
path = "${config.system.build.netbootRamdisk}/initrd";
}
{
name = "netboot.ipxe";
path = "${config.system.build.netbootIpxeScript}/netboot.ipxe";
}
];
})
];
# Installer ISO (primarily for x86_64 bring-up).
ec-runner-x86_64-iso = mkRunner "x86_64-linux" [
({ modulesPath, ... }: {
imports = [ (modulesPath + "/installer/cd-dvd/installation-cd-minimal.nix") ];
})
({ ... }: {
services.every-channel.runner.overlayRoot.enable = false;
})
];
# aarch64 SD image (useful for quick ARM bring-up and as a "real image" build target).
ec-runner-aarch64-sdimage = mkRunner "aarch64-linux" [
({ modulesPath, ... }: {
imports = [ (modulesPath + "/installer/sd-card/sd-image-aarch64.nix") ];
})
({ ... }: {
services.every-channel.runner.overlayRoot.enable = false;
})
];
};
}
// flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs {
inherit system;
overlays = [ (import rust-overlay) ];
};
rust = pkgs.rust-bin.stable.latest.default.override {
targets = [ "wasm32-unknown-unknown" ];
};
agenixPkg =
if pkgs ? agenix then pkgs.agenix
else agenix.packages.${system}.default;
webkitgtk =
if pkgs ? webkitgtk_4_1 then pkgs.webkitgtk_4_1
else if pkgs ? webkitgtk_4_0 then pkgs.webkitgtk_4_0
else throw "nixpkgs is missing webkitgtk_4_1/webkitgtk_4_0 (required for tauri on Linux)";
linuxTauriDeps = with pkgs; [
gtk3
webkitgtk
librsvg
libappindicator
libsoup_3
glib
pango
gdk-pixbuf
];
in
{
packages = {
agenix = agenixPkg;
fj = pkgs.forgejo-cli;
foundry = pkgs.foundry;
solc = pkgs.solc;
ec-node = pkgs.callPackage ./nix/pkgs/ec-node.nix { };
ec-cli = pkgs.callPackage ./nix/pkgs/ec-cli.nix { };
};
devShells.default = pkgs.mkShell {
buildInputs = with pkgs; [
rust
cargo
cargo-tauri
cargo-llvm-cov
llvmPackages.llvm
clang
pkg-config
openssl
ffmpeg
nodejs_22
nodePackages.wrangler
agenixPkg
forgejo-cli
foundry
solc
uv
git
just
cargo-watch
wasm-bindgen-cli
trunk
] ++ lib.optionals stdenv.isLinux linuxTauriDeps;
shellHook = ''
# Ensure nix-provided tools win over any host-local installs (e.g. a wrong-arch trunk).
export PATH=${pkgs.trunk}/bin:$PATH
export FFMPEG_INCLUDE_DIR=${pkgs.ffmpeg.dev}/include
export FFMPEG_LIB_DIR=${pkgs.ffmpeg.lib}/lib
export LLVM_COV=${pkgs.llvmPackages.llvm}/bin/llvm-cov
export LLVM_PROFDATA=${pkgs.llvmPackages.llvm}/bin/llvm-profdata
'';
};
# Minimal shell for headless publishers/relays (e.g. remote boxes).
# Avoid pulling in node/wrangler/trunk/tauri deps.
devShells.rust = pkgs.mkShell {
buildInputs = with pkgs; [
rust
cargo
llvmPackages.llvm
clang
pkg-config
openssl
ffmpeg
agenixPkg
forgejo-cli
foundry
solc
git
];
shellHook = ''
export FFMPEG_INCLUDE_DIR=${pkgs.ffmpeg.dev}/include
export FFMPEG_LIB_DIR=${pkgs.ffmpeg.lib}/lib
export LLVM_COV=${pkgs.llvmPackages.llvm}/bin/llvm-cov
export LLVM_PROFDATA=${pkgs.llvmPackages.llvm}/bin/llvm-profdata
'';
};
});
}