diff --git a/default.nix b/default.nix index f2bd688..c9d9107 100644 --- a/default.nix +++ b/default.nix @@ -65,8 +65,17 @@ let ls -la $src/ || true # Process docker-compose.yml first and create it in a temp location + # Replace .env paths AND volume mount paths to use writable directory if [ -f $src/docker-compose.yml ]; then - ${pkgs.gnused}/bin/sed 's|env_file:.*management-dashboard-web-app/\.env|env_file: /var/lib/usda-vision/.env|g; s|\./management-dashboard-web-app/\.env|/var/lib/usda-vision/.env|g' \ + ${pkgs.gnused}/bin/sed \ + -e 's|env_file:.*management-dashboard-web-app/\.env|env_file: /var/lib/usda-vision/.env|g' \ + -e 's|\./management-dashboard-web-app/\.env|/var/lib/usda-vision/.env|g' \ + -e 's|\./management-dashboard-web-app|/var/lib/usda-vision/management-dashboard-web-app|g' \ + -e 's|\./media-api|/var/lib/usda-vision/media-api|g' \ + -e 's|\./video-remote|/var/lib/usda-vision/video-remote|g' \ + -e 's|\./scheduling-remote|/var/lib/usda-vision/scheduling-remote|g' \ + -e 's|\./vision-system-remote|/var/lib/usda-vision/vision-system-remote|g' \ + -e 's|\./camera-management-api|/var/lib/usda-vision/camera-management-api|g' \ $src/docker-compose.yml > $TMPDIR/docker-compose.yml fi @@ -223,6 +232,15 @@ in }; preStart = '' + # Copy application code to writable directory if not already present or if source is newer + echo "Syncing application code to /var/lib/usda-vision..." + ${pkgs.rsync}/bin/rsync -av --delete \ + --exclude='node_modules' \ + --exclude='.env' \ + --exclude='__pycache__' \ + --exclude='.venv' \ + ${usda-vision-app}/opt/usda-vision/ /var/lib/usda-vision/ + # 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 @@ -236,18 +254,18 @@ in serviceConfig = { Type = "oneshot"; RemainAfterExit = true; - WorkingDirectory = "${usda-vision-app}/opt/usda-vision"; + WorkingDirectory = "/var/lib/usda-vision"; User = "root"; Group = "root"; - # Start: pull latest images and start containers - ExecStart = "${pkgs.docker-compose}/bin/docker-compose -f ${usda-vision-app}/opt/usda-vision/docker-compose.yml up -d --build"; + # Start: pull latest images and start containers from writable directory + ExecStart = "${pkgs.docker-compose}/bin/docker-compose -f /var/lib/usda-vision/docker-compose.yml up -d --build"; # Stop: gracefully stop containers - ExecStop = "${pkgs.docker-compose}/bin/docker-compose -f ${usda-vision-app}/opt/usda-vision/docker-compose.yml down"; + ExecStop = "${pkgs.docker-compose}/bin/docker-compose -f /var/lib/usda-vision/docker-compose.yml down"; # Reload: restart containers - ExecReload = "${pkgs.bash}/bin/bash -c '${pkgs.docker-compose}/bin/docker-compose -f ${usda-vision-app}/opt/usda-vision/docker-compose.yml down && ${pkgs.docker-compose}/bin/docker-compose -f ${usda-vision-app}/opt/usda-vision/docker-compose.yml up -d --build'"; + ExecReload = "${pkgs.bash}/bin/bash -c '${pkgs.docker-compose}/bin/docker-compose -f /var/lib/usda-vision/docker-compose.yml down && ${pkgs.docker-compose}/bin/docker-compose -f /var/lib/usda-vision/docker-compose.yml up -d --build'"; TimeoutStartSec = 300; TimeoutStopSec = 120;