163 lines
4.6 KiB
Nix
163 lines
4.6 KiB
Nix
{ 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
|
|
};
|
|
}
|