7.7 KiB
Integrating usda-dash-config with athenix
This guide shows how to properly integrate the usda-vision flake and usda-dash-config module into your athenix infrastructure.
Architecture
athenix/ (main flake)
├── flake.nix
│ └── inputs.usda-vision (flake input)
└── nixos-systems/
└── inventory.nix
└── imports usda-dash-config/default.nix (external module)
└── receives usda-vision packages as parameter
Step 1: Add usda-vision as a flake input in athenix
In your ~/athenix/flake.nix, add usda-vision as an input:
{
description = "Athenix infrastructure";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
# Add usda-vision flake
usda-vision = {
url = "path:/path/to/usda-dash-config/usda-vision";
inputs.nixpkgs.follows = "nixpkgs";
};
# Your other inputs...
};
outputs = { self, nixpkgs, usda-vision, ... }: {
# Your outputs...
};
}
Step 2: Make packages available to NixOS modules
In your athenix flake outputs, ensure the usda-vision packages are available to your NixOS configurations. There are two approaches:
Approach A: Using specialArgs (Recommended)
outputs = { self, nixpkgs, usda-vision, ... }: {
nixosConfigurations.usda-dash = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = {
# Pass usda-vision packages to all modules
usda-vision-packages = usda-vision.packages.x86_64-linux;
};
modules = [
# Your modules...
];
};
}
Approach B: Using _module.args
outputs = { self, nixpkgs, usda-vision, ... }: {
nixosConfigurations.usda-dash = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
# Make packages available as module args
{
_module.args = {
usda-vision-packages = usda-vision.packages.x86_64-linux;
};
}
# Your other modules...
];
};
}
Step 3: Configure secrets with ragenix in athenix
Secrets are managed by ragenix in the athenix flake, not in this flake. Configure your secrets in athenix:
# In your athenix flake or secrets configuration
{
age.secrets.usda-vision-env = {
file = ./secrets/usda-vision/env.age; # Encrypted with ragenix in athenix
mode = "0644";
owner = "root";
group = "root";
};
age.secrets.usda-vision-azure-env = {
file = ./secrets/usda-vision/azure-env.age; # Encrypted with ragenix in athenix
mode = "0644";
owner = "root";
group = "root";
};
}
Step 4: Import usda-dash-config in inventory.nix
In your nixos-systems/inventory.nix (or wherever you import external modules):
{ config, usda-vision-packages, ... }:
{
imports = [
# Import the usda-dash-config module, passing packages and secret paths
(import /path/to/usda-dash-config/default.nix {
inherit usda-vision-packages;
envFile = config.age.secrets.usda-vision-env.path;
azureEnvFile = config.age.secrets.usda-vision-azure-env.path;
})
# Your other imports...
];
}
Or if using nix-lxc devices pattern:
{ config, usda-vision-packages, ... }:
{
nix-lxc = {
devices = {
"usda-dash" =
let
usda-dash-config = builtins.fetchGit {
url = "https://git.factory.uga.edu/MODEL/usda-dash-config.git";
rev = "commit-hash";
submodules = true;
};
in
import "${usda-dash-config}/default.nix" {
inherit usda-vision-packages;
envFile = config.age.secrets.usda-vision-env.path;
azureEnvFile = config.age.secrets.usda-vision-azure-env.path;
};
};
};
}
Complete Example
Here's a complete example of how it all fits together:
~/athenix/flake.nix
{
description = "Athenix infrastructure";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
usda-vision = {
url = "path:/home/engr-ugaif/usda-dash-config/usda-vision";
inputs.nixpkgs.follows = "nixpkgs";
};
agenix.url = "github:ryantm/agenix";
};
outputs = { self, nixpkgs, usda-vision, agenix, ... }: {
nixosConfigurations = {
usda-dash = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = {
usda-vision-packages = usda-vision.packages.x86_64-linux;
};
modules = [
agenix.nixosModules.default
./nixos-systems/inventory.nix
];
};
};
};
}
~/athenix/nixos-systems/inventory.nix
{ config, pkgs, usda-vision-packages, ... }:
{
imports = [
# Import usda-dash-config, passing the packages and secret file paths
(import /home/engr-ugaif/usda-dash-config/default.nix {
inherit usda-vision-packages;
envFile = config.age.secrets.usda-vision-env.path;
azureEnvFile = config.age.secrets.usda-vision-azure-env.path;
})
];
# Configure secrets (managed by ragenix in athenix)
age.secrets.usda-vision-env = {
file = ./secrets/usda-vision/env.age; # Store encrypted secrets in athenix
mode = "0644";
};
age.secrets.usda-vision-azure-env = {
file = ./secrets/usda-vision/azure-env.age; # Azure OAuth config
mode = "0644";
};
# The usda-dash services are now configured and will use the ragenix-managed secrets
}
Local Development vs Production
Local Development (in usda-vision/)
cd /path/to/usda-dash-config/usda-vision
nix develop # Uses the local flake
Production Build (from athenix)
cd ~/athenix
nixos-rebuild switch --flake .#usda-dash
The usda-vision packages are built by athenix and passed to the usda-dash-config module.
Troubleshooting
"usda-vision-packages is null"
The packages aren't being passed correctly. Check:
usda-visionis in your athenix flake inputsspecialArgsor_module.argsincludesusda-vision-packages- The import in inventory.nix uses
inherit usda-vision-packages;
"attribute 'camera-sdk' missing"
The usda-vision flake hasn't been built. Try:
nix flake update # Update the flake lock
nix build /path/to/usda-dash-config/usda-vision#camera-sdk # Test build
Fallback behavior
If usda-vision-packages is not provided, the module falls back to building locally with callPackage. This works for standalone testing but isn't recommended for production.
Benefits of This Approach
- ✅ Pure builds: No
--impureneeded - ✅ Centralized secrets: Secrets managed by ragenix in athenix, not in usda-vision flake
- ✅ Centralized packages: usda-vision is built once by athenix
- ✅ Version control: Lock file in athenix controls versions
- ✅ Clean separation:
- usda-vision flake: package definitions only
- athenix: secrets management and deployment
- usda-dash-config: NixOS module configuration
- ✅ Flexible secrets: Can easily pass different secret files per environment (dev/staging/prod)
Managing Secrets in Athenix
To create and manage secrets in athenix:
# In athenix directory
cd ~/athenix
# Create the secrets directory
mkdir -p secrets/usda-vision
# Create/edit the main environment file secret
ragenix -e secrets/usda-vision/env.age
# Create/edit the Azure environment file secret
ragenix -e secrets/usda-vision/azure-env.age
The content of env.age should match the format of .env.example:
VITE_SUPABASE_URL=http://127.0.0.1:54321
VITE_SUPABASE_ANON_KEY=your-key-here
# ... etc
- usda-vision = flake (build system)
- usda-dash-config = module (configuration)
- athenix = orchestrator (infrastructure)
- ✅ Reusable: Other athenix machines can use the same packages