{ nixConfig = { trusted-substituters = "https://cache.nixos.org/"; trusted-public-keys = "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="; extra-experimental-features = "nix-command flakes"; }; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.11"; flake-utils.url = "github:numtide/flake-utils"; geoip2-asn = { url = "https://dl.jakstys.lt/_/2024.01.10/GeoLite2-ASN.mmdb"; flake = false; }; geoip2-city = { url = "https://dl.jakstys.lt/_/2024.01.10/GeoLite2-City.mmdb"; flake = false; }; geoip2-country = { url = "https://dl.jakstys.lt/_/2024.01.10/GeoLite2-Country.mmdb"; flake = false; }; }; outputs = { self, nixpkgs, flake-utils, geoip2-asn, geoip2-city, geoip2-country, ... }: flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs {inherit system;}; gunicornPort = 8001; appDeps = with pkgs; [ python3Packages.django_5 python3Packages.django-compressor ]; runtimeDeps = with pkgs; [ python3Packages.geoip2 libmaxminddb ] ++ appDeps; buildDeps = [pkgs.dart-sass] ++ appDeps; geoip = pkgs.stdenv.mkDerivation { name = "geoip"; srcs = [geoip2-asn geoip2-city geoip2-country]; dontUnpack = true; installPhase = '' mkdir -p $out cp ${geoip2-asn} $out/GeoLite2-ASN.mmdb cp ${geoip2-city} $out/GeoLite2-City.mmdb cp ${geoip2-country} $out/GeoLite2-Country.mmdb ''; }; in rec { packages.e11sync-static = pkgs.stdenv.mkDerivation { name = "e11sync-static"; src = self; nativeBuildInputs = buildDeps; buildPhase = '' mkdir -p $out/static export E11SYNC_STATIC_ROOT=$out/static export E11SYNC_DEBUG= export E11SYNC_COMPRESS_OFFLINE=1 ${pkgs.python3}/bin/python3 ${self}/app/manage.py collectstatic ${pkgs.python3}/bin/python3 ${self}/app/manage.py compress ${pkgs.findutils}/bin/find $out/static/CACHE -name '*.css' | \ ${pkgs.findutils}/bin/xargs -P8 -I{} sh -c \ "${pkgs.zopfli}/bin/zopfli {} && ${pkgs.brotli}/bin/brotli {}" ''; }; packages.e11sync-gunicorn = pkgs.stdenv.mkDerivation { name = "e11sync-gunicorn"; propagatedBuildInputs = [runtimeDeps]; nativeBuildInputs = [pkgs.makeWrapper]; src = self; dontUnpack = true; buildPhase = '' mkdir -p $out; cp -r ${self}/app $out makeWrapper ${pkgs.python3Packages.gunicorn}/bin/gunicorn $out/bin/entrypoint \ --chdir $out/app \ --set E11SYNC_DEBUG "" \ --set E11SYNC_COMPRESS_OFFLINE 1 \ --set GEOIP_PATH "${geoip}" \ --add-flags --bind=127.0.0.1:${toString gunicornPort} \ --add-flags e11sync.wsgi ''; passthru.tests = { simple = pkgs.runCommand "e11sync-test" { src = self; buildInputs = runtimeDeps ++ buildDeps; } '' mkdir -p $out cd ${self}/app export GEOIP_PATH="${geoip}" ${pkgs.python3}/bin/python3 ./manage.py test ''; }; }; apps.e11sync-gunicorn = { type = "app"; name = "e11sync-gunicorn"; program = "${packages.e11sync-gunicorn}/bin/entrypoint"; }; devShells.default = pkgs.mkShellNoCC { LOCALE_ARCHIVE = "${pkgs.glibcLocales}/lib/locale/locale-archive"; GEOIP_PATH = "${geoip}"; E11SYNC_DEBUG = "1"; packages = [pkgs.python3Packages.django-debug-toolbar] ++ runtimeDeps ++ buildDeps; }; formatter = pkgs.alejandra; }); }