{ description = "atashdotdev - Astro application with Nix build"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; }; outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; # Build the Astro application atashdotdev = pkgs.stdenv.mkDerivation rec { pname = "atashdotdev"; version = "1.1.0"; src = ./.; nativeBuildInputs = with pkgs; [ nodejs_24 nodePackages.pnpm cacert ]; configurePhase = '' export HOME=$TMPDIR export SSL_CERT_FILE=${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt pnpm config set store-dir $TMPDIR/pnpm-store ''; buildPhase = '' pnpm install --frozen-lockfile pnpm build ''; installPhase = '' mkdir -p $out/lib/atashdotdev cp -r dist $out/lib/atashdotdev/ cp package.json $out/lib/atashdotdev/ cp pnpm-lock.yaml $out/lib/atashdotdev/ cd $out/lib/atashdotdev pnpm install --prod --frozen-lockfile mkdir -p $out/bin cat > $out/bin/atashdotdev << 'EOF' #!/bin/sh cd $out/lib/atashdotdev exec ${pkgs.nodejs_24}/bin/node ./dist/server/entry.mjs "$@" EOF chmod +x $out/bin/atashdotdev ''; }; # Container image containerImage = pkgs.dockerTools.buildLayeredImage { name = "atashdotdev"; tag = "latest"; contents = with pkgs; [ atashdotdev nodejs_24 bash coreutils cacert ]; config = { Cmd = [ "${atashdotdev}/bin/atashdotdev" ]; ExposedPorts = { "4321/tcp" = {}; }; Env = [ "NODE_ENV=production" "HOST=0.0.0.0" "PORT=4321" ]; WorkingDir = "${atashdotdev}/lib/atashdotdev"; }; }; in { # Dev shell devShells.default = pkgs.mkShell { packages = with pkgs; [ nodejs_24 nodePackages.pnpm ]; }; # Default package is the container packages = { default = containerImage; atashdotdev = atashdotdev; containerImage = containerImage; }; # Dev server app apps.default = { type = "app"; program = "${pkgs.writeShellScript "dev" '' export PATH="${pkgs.nodejs_24}/bin:${pkgs.nodePackages.pnpm}/bin:$PATH" if [ ! -d "node_modules" ]; then pnpm install --frozen-lockfile fi pnpm dev ''}"; }; }); }