nixery: add docker-cleanup service and timer #2

merged
opened by oppi.li targeting master from push-voroxwzkvvtt
Changed files
+94
hosts
nixery
+94
hosts/nixery/services/docker-cleanup.nix
···
+
{ config, pkgs, ... }:
+
+
{
+
systemd.services.docker-cleanup = {
+
description = "Docker cleanup service - removes unused containers, networks, images, and volumes";
+
+
serviceConfig = {
+
Type = "oneshot";
+
User = "root";
+
ExecStart = pkgs.writeShellScript "docker-cleanup" ''
+
set -e
+
+
echo "Starting Docker cleanup at $(date)"
+
+
# remove containers running for 15+ minutes
+
echo "Removing containers running for 15+ minutes..."
+
CONTAINERS_TO_REMOVE=$(${pkgs.docker}/bin/docker ps --format "table {{.ID}}\t{{.RunningFor}}" --no-trunc | awk '
+
/minute/ {
+
if ($2 >= 15) print $1
+
}
+
/hour/ {
+
print $1
+
}
+
/day/ {
+
print $1
+
}
+
/week/ {
+
print $1
+
}
+
/month/ {
+
print $1
+
}
+
/year/ {
+
print $1
+
}
+
')
+
+
if [ -n "$CONTAINERS_TO_REMOVE" ]; then
+
echo "Found containers to remove: $CONTAINERS_TO_REMOVE"
+
echo "$CONTAINERS_TO_REMOVE" | xargs -r ${pkgs.docker}/bin/docker rm -f
+
else
+
echo "No containers running for 15+ minutes found"
+
fi
+
+
# remove stopped containers
+
echo "Removing stopped containers..."
+
${pkgs.docker}/bin/docker container prune -f || true
+
+
# remove unused networks (excluding default networks)
+
echo "Removing unused networks..."
+
${pkgs.docker}/bin/docker network prune -f || true
+
+
# remove unused images (dangling images only by default)
+
echo "Removing dangling images..."
+
${pkgs.docker}/bin/docker image prune -f || true
+
+
# remove unused volumes
+
echo "Removing unused volumes..."
+
${pkgs.docker}/bin/docker volume prune -f || true
+
+
echo "Docker cleanup completed at $(date)"
+
'';
+
+
PrivateNetwork = false; # Needs network access for Docker
+
ProtectSystem = "strict";
+
ProtectHome = true;
+
NoNewPrivileges = true;
+
+
# Logging
+
StandardOutput = "journal";
+
StandardError = "journal";
+
};
+
+
# ensure docker is running before cleanup
+
after = [ "docker.service" ];
+
requires = [ "docker.service" ];
+
+
# don't restart on failure
+
restartIfChanged = false;
+
};
+
+
# timer to run the cleanup service every n minutes
+
systemd.timers.docker-cleanup = {
+
description = "Timer for Docker cleanup service";
+
timerConfig = {
+
OnCalendar = "*:0/15"; # run every 15 minutes
+
Persistent = true; # persist timer across reboots
+
WakeSystem = false; # run immediately if the system was powered off when timer should have run
+
};
+
wantedBy = [ "timers.target" ];
+
};
+
+
virtualisation.docker.enable = true;
+
}