From 0282411374146d468ea4c284a18c4d5f1f701d34 Mon Sep 17 00:00:00 2001 From: Lucien Cartier-Tilet Date: Wed, 5 Nov 2025 01:25:55 +0100 Subject: [PATCH] feat: build backend with Nix --- .gitignore | 3 ++ backend/Cargo.toml | 2 +- backend/nix/package.nix | 55 ++++++++++++++++++++++++++++++++++++ backend/nix/rust-version.nix | 6 ++++ backend/{ => nix}/shell.nix | 8 ++---- flake.nix | 4 +-- result | 1 - 7 files changed, 70 insertions(+), 9 deletions(-) create mode 100644 backend/nix/package.nix create mode 100644 backend/nix/rust-version.nix rename backend/{ => nix}/shell.nix (89%) delete mode 120000 result diff --git a/.gitignore b/.gitignore index 37e9c85..1223924 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,6 @@ dist ## Node dependencies node_modules + +# Nix +result diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 2e3f5c6..2f9e463 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -11,7 +11,7 @@ path = "src/lib.rs" [[bin]] path = "src/main.rs" -name = "backend" +name = "phundrak-dot-com-backend" [dependencies] chrono = { version = "0.4.42", features = ["serde"] } diff --git a/backend/nix/package.nix b/backend/nix/package.nix new file mode 100644 index 0000000..cd492fb --- /dev/null +++ b/backend/nix/package.nix @@ -0,0 +1,55 @@ +{ + rust-overlay, + inputs, + system, + ... +}: let + rust = import ./rust-version.nix { inherit rust-overlay inputs system; }; + pkgs = rust.pkgs; + rustPlatform = pkgs.makeRustPlatform { + cargo = rust.version; + rustc = rust.version; + }; + cargoToml = builtins.fromTOML (builtins.readFile ../Cargo.toml); + name = cargoToml.package.name; + version = cargoToml.package.version; + rustBuild = rustPlatform.buildRustPackage { + pname = name; + inherit version; + src = ../.; + cargoLock.lockFile = ../Cargo.lock; + }; + makeDockerImage = tag: + pkgs.dockerTools.buildLayeredImage { + name = "phundrak/${name}"; + inherit tag; + created = "now"; + config = { + Entrypoint = ["${rustBuild}/bin/${name}"]; + Env = [ + "SSL_CERT_FILE=${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt" + ]; + ExposedPorts = { + "3100/tcp" = {}; + }; + Labels = { + "org.opencontainers.image.title" = name; + "org.opencontainers.image.version" = version; + "org.opencontainers.image.description" = "REST API backend for phundrak.com"; + "org.opencontainers.image.authors" = "Lucien Cartier-Tilet "; + "org.opencontainers.image.licenses" = "AGPL-3.0-only"; + "org.opencontainers.image.source" = "https://labs.phundrak.com/phundrak/phundrak.com"; + "org.opencontainers.image.url" = "https://labs.phundrak.com/phundrak/phundrak.com"; + "org.opencontainers.image.documentation" = "https://labs.phundrak.com/phundrak/phundrak.com"; + "org.opencontainers.image.vendor" = "Phundrak"; + }; + }; + contents = [rustBuild pkgs.cacert ../settings]; + }; + dockerImageLatest = makeDockerImage "latest"; + dockerImageVersioned = makeDockerImage version; +in { + backend = rustBuild; + backendDocker = dockerImageVersioned; + backendDockerLatest = dockerImageLatest; +} diff --git a/backend/nix/rust-version.nix b/backend/nix/rust-version.nix new file mode 100644 index 0000000..07e63ae --- /dev/null +++ b/backend/nix/rust-version.nix @@ -0,0 +1,6 @@ +{rust-overlay, inputs, system, ...}: let +overlays = [(import rust-overlay)]; +in rec { + pkgs = import inputs.nixpkgs {inherit system overlays;}; + version = pkgs.rust-bin.stable.latest.default; +} diff --git a/backend/shell.nix b/backend/nix/shell.nix similarity index 89% rename from backend/shell.nix rename to backend/nix/shell.nix index d54105f..203a2ed 100644 --- a/backend/shell.nix +++ b/backend/nix/shell.nix @@ -6,9 +6,7 @@ rust-overlay, ... }: let - overlays = [(import rust-overlay)]; - rustPkgs = import inputs.nixpkgs {inherit system overlays;}; - rustVersion = rustPkgs.rust-bin.stable.latest.default; + rustPlatform = import ./rust-version.nix { inherit rust-overlay inputs system; }; in inputs.devenv.lib.mkShell { inherit inputs pkgs; @@ -20,8 +18,8 @@ in pkgs.lib.mkIf (devenvRootFileContent != "") devenvRootFileContent; } { - packages = with rustPkgs; [ - (rustVersion.override { + packages = with rustPlatform.pkgs; [ + (rustPlatform.version.override { extensions = [ "clippy" "rust-src" diff --git a/flake.nix b/flake.nix index 83563c2..b8542bd 100644 --- a/flake.nix +++ b/flake.nix @@ -33,12 +33,12 @@ forEachSystem = nixpkgs.lib.genAttrs (import systems); in { formatter = forEachSystem (system: alejandra.defaultPackage.${system}); - + packages = forEachSystem (system: import ./backend/nix/package.nix { inherit rust-overlay inputs system; }); devShells = forEachSystem ( system: let pkgs = nixpkgs.legacyPackages.${system}; in { - backend = import ./backend/shell.nix { + backend = import ./backend/nix/shell.nix { inherit inputs pkgs system self rust-overlay; }; frontend = import ./frontend/shell.nix { diff --git a/result b/result deleted file mode 120000 index 663cdaa..0000000 --- a/result +++ /dev/null @@ -1 +0,0 @@ -/nix/store/34vsqr8jlq5rg9rlsgr0kwa80036aq3r-phundrak-dot-com-backend.tar.gz \ No newline at end of file