{ description = "Healthchecks"; inputs = { nixpkgs = { url = "nixpkgs/nixos-unstable"; }; }; outputs = { self, nixpkgs }@inputs: let system = "x86_64-linux"; pkgs = import nixpkgs { inherit system; overlays = [ ( self: super: { # sonarr = super.sonarr.overrideAttrs ( # old: # let # version = "3.0.10.1567"; # sha256 = "sha256-6zdp/Bg+9pcrElW5neB+BC16Vn1VhTjhMRRIxGrKhxc="; # in # { # inherit version; # src = pkgs.fetchurl { # url = "https://download.sonarr.tv/v3/main/${version}/Sonarr.main.${version}.linux.tar.gz"; # sha256 = sha256; # }; # } # ); } ) ]; }; py = pkgs.python3.override { packageOverrides = final: prev: { django = prev.django_4; }; }; baseImage = { tag = "latest"; maxLayers = 2; contents = [ pkgs.bash pkgs.coreutils-full ]; config = { User = "5000:5000"; Volumes = { "/static" = { }; "/tmp" = { }; }; WorkingDir = "${self.packages.${system}.healthchecks}/opt/healthchecks"; Env = [ "LANG=en_US.UTF-8" "PYTHONPATH=${self.packages.${system}.healthchecks.pythonPath}" "PYTHONUNBUFFERED=1" "SSL_CERT_FILE=${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt" "STATIC_ROOT=/static" ]; }; }; in { packages.${system} = { healthchecks = let pname = "healthchecks"; version = "2.8.1"; hash = "sha256-lJ0AZJpznet2YKPIyMOx5ZdETZB8de5vp7sydfndxZg="; localSettings = pkgs.writeText "local_settings.py" '' import os STATIC_ROOT = os.getenv("STATIC_ROOT") SECRET_KEY_FILE = os.getenv("SECRET_KEY_FILE") if SECRET_KEY_FILE: with open(SECRET_KEY_FILE, "r") as file: SECRET_KEY = file.readline() ''; propagatedBuildInputs = with py.pkgs; [ apprise cron-descriptor cronsim django django-compressor fido2 minio psycopg2 pycurl pyotp segno statsd whitenoise ]; in py.pkgs.buildPythonApplication { inherit pname version propagatedBuildInputs; format = "other"; src = pkgs.fetchFromGitHub { owner = "healthchecks"; repo = pname; rev = "v${version}"; inherit hash; }; installPhase = '' mkdir -p $out/opt/healthchecks cp -r . $out/opt/healthchecks chmod +x $out/opt/healthchecks/manage.py cp ${localSettings} $out/opt/healthchecks/hc/local_settings.py ''; passthru = { # PYTHONPATH of all dependencies used by the package pythonPath = py.pkgs.makePythonPath propagatedBuildInputs; tests = { inherit (pkgs.nixosTests) healthchecks; }; }; meta = with pkgs.lib; { homepage = "https://github.com/healthchecks/healthchecks"; description = "A cron monitoring tool written in Python & Django "; license = licenses.bsd3; }; }; smtpd = pkgs.dockerTools.buildLayeredImage ( pkgs.lib.attrsets.recursiveUpdate baseImage { name = "healthchecks-smtpd"; config = { Cmd = [ "${self.packages.${system}.healthchecks}/opt/healthchecks/manage.py" "smtpd" "--port" "2525" ]; ExposedPorts = { "2525/tcp" = { }; }; }; } ); sendalerts = pkgs.dockerTools.buildLayeredImage ( pkgs.lib.attrsets.recursiveUpdate baseImage { name = "healthchecks-sendalerts"; config = { Cmd = [ "${self.packages.${system}.healthchecks}/opt/healthchecks/manage.py" "sendalerts" ]; ExposedPorts = { }; }; } ); maintenance = let script = pkgs.writeScript "maintenance" '' CURL_OPTIONS="--fail --silent --show-error --max-time 10 --retry 5 --output /dev/null" ${pkgs.curl}/bin/curl $CURL_OPTIONS http://webserver.healthchecks.svc/ping/$MAINTENANCE_CHECK_UUID/start ${self.packages.${system}.healthchecks}/opt/healthchecks/manage.py prunenotifications ${self.packages.${system}.healthchecks}/opt/healthchecks/manage.py pruneusers ${self.packages.${system}.healthchecks}/opt/healthchecks/manage.py prunetokenbucket ${self.packages.${system}.healthchecks}/opt/healthchecks/manage.py pruneflips ${pkgs.curl}/bin/curl $CURL_OPTIONS http://webserver.healthchecks.svc/ping/$MAINTENANCE_CHECK_UUID ''; in pkgs.dockerTools.buildLayeredImage ( pkgs.lib.attrsets.recursiveUpdate baseImage { name = "healthchecks-maintenance"; config = { Cmd = [ "${script}" ]; ExposedPorts = { }; }; } ); webserver = let uwsgi-ini = pkgs.writeTextFile { name = "uwsgi.ini"; text = '' [uwsgi] master die-on-term http-socket = :8000 harakiri = 10 post-buffering = 4096 processes = 4 enable-threads threads = 1 chdir = ${self.packages.${system}.healthchecks}/opt/healthchecks module = hc.wsgi:application thunder-lock disable-write-exception static-map = /static=${self.packages.${system}.healthchecks}/opt/healthchecks/static-collected buffer-size = 32768 ''; }; in pkgs.dockerTools.buildLayeredImage ( pkgs.lib.attrsets.recursiveUpdate baseImage { name = "healthchecks-webserver"; fakeRootCommands = ''; mkdir /static chmod 0777 /static mkdir /tmp chmod 0777 /tmp ''; config = { Cmd = [ "${pkgs.python3Packages.gunicorn}/bin/gunicorn" "hc.wsgi" "--bind" ":8000" "--pythonpath" self.packages.${system}.healthchecks.pythonPath ]; ExposedPorts = { "8000/tcp" = { }; }; }; } ); }; }; }