diff --git a/flake.nix b/flake.nix index dab1e2f..aacdca7 100644 --- a/flake.nix +++ b/flake.nix @@ -29,10 +29,12 @@ imports = [ ./nix/wasm-bindgen.nix - ./nix/wordle-solver.nix - ./nix/wordle-solver-wasm.nix + ./nix/wordle-solver-docker.nix ./nix/wordle-solver-wasm-pkg.nix + ./nix/wordle-solver-wasm.nix + ./nix/wordle-solver-web-docker.nix ./nix/wordle-solver-web.nix + ./nix/wordle-solver.nix ]; perSystem = { diff --git a/nix/wordle-solver-docker.nix b/nix/wordle-solver-docker.nix new file mode 100644 index 0000000..83855e5 --- /dev/null +++ b/nix/wordle-solver-docker.nix @@ -0,0 +1,39 @@ +let + drv = { + buildEnv, + dockerTools, + wordle-solver, + runCommand, + ... + }: + dockerTools.buildImage { + name = "wordle-solver"; + created = "now"; + copyToRoot = buildEnv { + name = "image-root"; + paths = [ + wordle-solver + (runCommand "wordle-data" {} '' + mkdir -p $out/pwd + cp ${../valid-words.txt} $out/pwd/valid-words.txt + cp ${../answers.txt} $out/pwd/answers.txt + '') + ]; + pathsToLink = ["/bin" "/pwd"]; + }; + config = { + Cmd = ["/bin/wordle-solver"]; + WorkingDir = "/pwd"; + }; + }; +in { + perSystem = { + pkgs, + self', + ... + }: { + packages.wordle-solver-docker = pkgs.callPackage drv { + inherit (self'.packages) wordle-solver; + }; + }; +} diff --git a/nix/wordle-solver-wasm.nix b/nix/wordle-solver-wasm.nix index 4d6cb17..3dc17b7 100644 --- a/nix/wordle-solver-wasm.nix +++ b/nix/wordle-solver-wasm.nix @@ -1,12 +1,14 @@ { perSystem = {pkgs, ...}: let utils = import ./utils.nix; + rust-toolchain = utils.rust-toolchain pkgs; toolchain-crosspkgs = utils.toolchain-crosspkgs pkgs; drv = { rustPlatform, buildPackages, lld, name ? "wordle-solver", + removeReferencesTo, ... }: rustPlatform.buildRustPackage { @@ -23,6 +25,7 @@ buildPackages.stdenv.cc lld # Needed for wasm-ld ]; + nativeBuildInputs = [removeReferencesTo]; cargoBuildFlags = [ "--lib" @@ -31,17 +34,23 @@ ]; # Configure rustc for WASM - env = { - RUSTFLAGS = ''--cfg=web_sys_unstable_apis -C linker=wasm-ld''; - }; + RUSTFLAGS = ''--cfg=web_sys_unstable_apis -C linker=wasm-ld -C strip=debuginfo -C debuginfo=0''; # Copy the WASM file to the output installPhase = '' mkdir -p $out/lib cp target/wasm32-unknown-unknown/release/*.wasm $out/lib/ + + runHook postInstall + ''; + + # Remove toolchain from closure (store paths are debug artifacts) + postInstall = '' + remove-references-to -t ${rust-toolchain} $out/lib/*.wasm ''; }; in { + packages.toolchain = rust-toolchain; packages.wordle-solver-wasm = toolchain-crosspkgs.callPackage drv {}; }; } diff --git a/nix/wordle-solver-web-docker.nix b/nix/wordle-solver-web-docker.nix new file mode 100644 index 0000000..e9ca8e1 --- /dev/null +++ b/nix/wordle-solver-web-docker.nix @@ -0,0 +1,69 @@ +let + drv = { + buildEnv, + dockerTools, + fakeNss, + nginx, + runCommand, + wordle-solver-web, + writeShellScriptBin, + ... + }: + dockerTools.buildImage { + name = "wordle-solver-web"; + created = "now"; + copyToRoot = buildEnv { + name = "image-root"; + paths = [ + nginx + (fakeNss.override { + extraGroupLines = [ + "nogroup:x:65534:" + ]; + }) + (writeShellScriptBin "start" '' + echo "Start serving worlde-solver at port 80..." + /bin/nginx -c /etc/nginx.conf + '') + (runCommand "nginx-conf" {} '' + mkdir -p $out/etc + + cat < $out/etc/nginx.conf + events {} + + error_log /dev/stderr; + + http { + include ${nginx}/conf/mime.types; + + server { + listen 80; + root ${wordle-solver-web}; + access_log /dev/stdout; + } + } + + daemon off; + EOF + '') + ]; + pathsToLink = ["/bin" "/etc"]; + }; + runAsRoot = '' + mkdir -p /var/log/nginx + ''; + config = { + Cmd = ["/bin/start"]; + }; + }; +in { + perSystem = { + pkgs, + self', + ... + }: { + packages.wordle-solver-web-docker = pkgs.callPackage drv { + inherit (self'.packages) wordle-solver-web; + }; + }; +}