{ inputs, ... }: # ============================================================================ # USDA Dashboard External System Module # ============================================================================ # External system configuration for usda-dash # This module can be referenced from nixos-systems/inventory.nix using: # # nix-lxc = { # devices = { # "usda-dash" = builtins.fetchGit { # url = "https://git.factory.uga.edu/MODEL/usda-dash-config.git"; # rev = "commit-hash"; # }; # }; # }; { config, lib, pkgs, ... }: let # Create a derivation that packages the usda-vision directory usda-vision-app = pkgs.stdenv.mkDerivation { pname = "usda-vision"; version = "1.0.0"; # Use the directory from this repository src = ./usda-vision; nativeBuildInputs = [ pkgs.makeWrapper ]; installPhase = '' mkdir -p $out/opt/usda-vision # Copy all application files cp -r $src/* $out/opt/usda-vision/ # Create convenience scripts mkdir -p $out/bin cat > $out/bin/usda-vision-start <<'EOF' #!/usr/bin/env bash cd $out/opt/usda-vision ${pkgs.docker-compose}/bin/docker-compose up -d --build EOF cat > $out/bin/usda-vision-stop <<'EOF' #!/usr/bin/env bash cd $out/opt/usda-vision ${pkgs.docker-compose}/bin/docker-compose down EOF cat > $out/bin/usda-vision-logs <<'EOF' #!/usr/bin/env bash cd $out/opt/usda-vision ${pkgs.docker-compose}/bin/docker-compose logs -f "$@" EOF cat > $out/bin/usda-vision-restart <<'EOF' #!/usr/bin/env bash cd $out/opt/usda-vision ${pkgs.docker-compose}/bin/docker-compose restart "$@" EOF chmod +x $out/bin/usda-vision-* ''; meta = { description = "USDA Vision camera management system"; maintainers = [ "UGA Innovation Factory" ]; }; }; in { # ========== Module Configuration ========== config = { # System packages specific to usda-dash environment.systemPackages = with pkgs; [ # Core tools git vim htop curl wget # Docker and Docker Compose for running usda-vision docker docker-compose # USDA Vision application package with convenience scripts usda-vision-app ]; # Enable Docker service virtualisation.docker = { enable = true; autoPrune.enable = true; }; # Configure users athenix.users.sv22900.enable = true; athenix.users.hdh20267.enable = true; # Add users to docker group users.users.sv22900.extraGroups = [ "docker" ]; # Create persistent directories and .env file location systemd.tmpfiles.rules = [ "d /var/lib/usda-vision 0755 root root -" "f /var/lib/usda-vision/.env 0644 root root -" "L+ ${usda-vision-app}/opt/usda-vision/management-dashboard-web-app/.env - - - - /var/lib/usda-vision/.env" ]; # Systemd service to manage usda-vision docker compose systemd.services.usda-vision = { description = "USDA Vision Docker Compose Stack"; after = [ "docker.service" "network-online.target" "systemd-tmpfiles-setup.service" ]; wants = [ "network-online.target" ]; wantedBy = [ "multi-user.target" ]; preStart = '' # Ensure .env file exists with defaults if empty if [ ! -s /var/lib/usda-vision/.env ]; then if [ -f ${usda-vision-app}/opt/usda-vision/.env.example ]; then echo "Copying .env.example to /var/lib/usda-vision/.env" cp ${usda-vision-app}/opt/usda-vision/.env.example /var/lib/usda-vision/.env echo "Please edit /var/lib/usda-vision/.env with your configuration" fi fi ''; serviceConfig = { Type = "oneshot"; RemainAfterExit = true; WorkingDirectory = "${usda-vision-app}/opt/usda-vision"; User = "root"; Group = "root"; # Start: pull latest images and start containers ExecStart = "${pkgs.docker-compose}/bin/docker-compose up -d --build"; # Stop: gracefully stop containers ExecStop = "${pkgs.docker-compose}/bin/docker-compose down"; # Reload: restart containers ExecReload = "${pkgs.bash}/bin/bash -c '${pkgs.docker-compose}/bin/docker-compose down && ${pkgs.docker-compose}/bin/docker-compose up -d --build'"; TimeoutStartSec = 300; TimeoutStopSec = 120; }; }; # Firewall configuration # networking.firewall.allowedTCPPorts = [ 80 443 ]; # Any other usda-dash specific configuration }; }