bench: Nix build static linux/amd64 nostr-bench

This commit is contained in:
2026-03-19 14:36:07 +01:00
parent 07953a7608
commit a410e07425
5 changed files with 2439 additions and 76 deletions

View File

@@ -1,11 +1,12 @@
This is a Nostr server written using Elixir and PostgreSQL.
NOTE: Nostr and NIP specs are available in `~/nostr/` and `~/nips/`.
NOTE: NIP specs are available in `./docs/nips/`.
## Project guidelines
- Use `mix precommit` alias when you are done with all changes and fix any pending issues
- Use the already included and available `:req` (`Req`) library for HTTP requests, **avoid** `:httpoison`, `:tesla`, and `:httpc`.
- Use semantic prefixes in commit messages (feat:, fix:, docs:, chore:, test:, build:, ci:, bench:, dev:)
<!-- usage-rules-start -->

View File

@@ -20,12 +20,15 @@
pkgs = import nixpkgs {inherit system;};
lib = pkgs.lib;
parrhesia = pkgs.callPackage ./default.nix {};
nostrBench = pkgs.callPackage ./nix/nostr-bench.nix {};
in
{
default = parrhesia;
inherit parrhesia;
inherit parrhesia nostrBench;
}
// lib.optionalAttrs pkgs.stdenv.hostPlatform.isLinux {
nostrBenchStaticX86_64Musl = pkgs.callPackage ./nix/nostr-bench.nix {staticX86_64Musl = true;};
dockerImage = pkgs.dockerTools.buildLayeredImage {
name = "parrhesia";
tag = "latest";

2326
nix/nostr-bench-static.Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -2,19 +2,38 @@
lib,
fetchFromGitHub,
rustPlatform,
}:
rustPlatform.buildRustPackage rec {
pname = "nostr-bench";
version = "0.4.0";
pkgsCross,
runCommand,
staticX86_64Musl ? false,
}: let
selectedRustPlatform =
if staticX86_64Musl
then pkgsCross.musl64.rustPlatform
else rustPlatform;
src = fetchFromGitHub {
srcBase = fetchFromGitHub {
owner = "rnostr";
repo = pname;
repo = "nostr-bench";
rev = "d3ab701512b7c871707b209ef3f934936e407963";
hash = "sha256-F2qg1veO1iNlVUKf1b/MV+vexiy4Tt+w2aikDDbp7tU=";
};
cargoHash = "sha256-mh9UdYhZl6JVJEeDFnY5BjfcK+PrWBBEn1Qh7/ZX17k=";
src =
if staticX86_64Musl
then
runCommand "nostr-bench-static-src" {} ''
cp -r ${srcBase} $out
chmod -R u+w $out
cp ${./nostr-bench-static.Cargo.lock} $out/Cargo.lock
''
else srcBase;
in
selectedRustPlatform.buildRustPackage (
{
pname = "nostr-bench";
version = "0.4.0";
inherit src;
doCheck = false;
@@ -25,4 +44,13 @@ rustPlatform.buildRustPackage rec {
mainProgram = "nostr-bench";
platforms = platforms.unix;
};
}
}
// lib.optionalAttrs staticX86_64Musl {
cargoHash = "sha256-aL8XSBJ8sHl7CGh9SkOoI+WlAHKrdij2DfvZAWIKgKY=";
CARGO_BUILD_TARGET = "x86_64-unknown-linux-musl";
RUSTFLAGS = "-C target-feature=+crt-static";
}
// lib.optionalAttrs (!staticX86_64Musl) {
cargoHash = "sha256-mh9UdYhZl6JVJEeDFnY5BjfcK+PrWBBEn1Qh7/ZX17k=";
}
)

View File

@@ -91,7 +91,7 @@ Options:
Notes:
- Requires hcloud, ssh, scp, ssh-keygen, git.
- Requires docker locally to build portable nostr-bench binary.
- Tries nix .#nostrBenchStaticX86_64Musl first; falls back to docker-built portable nostr-bench.
- If --parrhesia-image is omitted, requires nix locally.
`);
}
@@ -336,38 +336,57 @@ async function ensureLocalPrereqs(opts) {
}
async function buildNostrBenchBinary(tmpDir) {
const outPath = path.join(tmpDir, "nostr-bench");
const staticLinked = (fileOutput) => fileOutput.includes("statically linked") || fileOutput.includes("static-pie linked");
const copyAndValidateBinary = async (binaryPath, buildMode) => {
const fileOut = await runCommand("file", [binaryPath]);
if (!(fileOut.stdout.includes("/lib64/ld-linux-x86-64.so.2") || staticLinked(fileOut.stdout))) {
throw new Error(`Built nostr-bench binary does not look portable: ${fileOut.stdout.trim()}`);
}
fs.copyFileSync(binaryPath, outPath);
fs.chmodSync(outPath, 0o755);
const copiedFileOut = await runCommand("file", [outPath]);
console.log(`[local] nostr-bench ready (${buildMode}): ${outPath}`);
console.log(`[local] ${copiedFileOut.stdout.trim()}`);
return { path: outPath, buildMode };
};
if (commandExists("nix")) {
try {
console.log("[local] building nostr-bench static binary via nix flake output .#nostrBenchStaticX86_64Musl...");
const nixOut = (
await runCommand("nix", ["build", ".#nostrBenchStaticX86_64Musl", "--print-out-paths", "--no-link"], {
cwd: ROOT_DIR,
})
).stdout.trim();
if (!nixOut) {
throw new Error("nix build did not return an output path");
}
const binaryPath = path.join(nixOut, "bin", "nostr-bench");
return await copyAndValidateBinary(binaryPath, "nix-flake-musl-static");
} catch (error) {
console.warn(`[local] nix static build unavailable, falling back to docker build: ${error.message}`);
}
}
const srcDir = path.join(tmpDir, "nostr-bench-src");
console.log("[local] cloning nostr-bench source...");
console.log("[local] cloning nostr-bench source for docker fallback...");
await runCommand("git", ["clone", "--depth", "1", "https://github.com/rnostr/nostr-bench.git", srcDir], {
stdio: "inherit",
});
let binaryPath = path.join(srcDir, "target", "x86_64-unknown-linux-musl", "release", "nostr-bench");
let buildMode = "nix-musl-static";
const binaryPath = path.join(srcDir, "target", "release", "nostr-bench");
console.log("[local] building nostr-bench (attempt static musl via nix run cargo)...");
let staticOk = false;
if (commandExists("nix")) {
try {
await runCommand(
"nix",
["run", "nixpkgs#cargo", "--", "build", "--release", "--target", "x86_64-unknown-linux-musl"],
{ cwd: srcDir, stdio: "inherit" },
);
const fileOut = await runCommand("file", [binaryPath]);
staticOk = fileOut.stdout.includes("statically linked");
} catch {
staticOk = false;
}
}
if (!staticOk) {
buildMode = "docker-glibc-portable";
binaryPath = path.join(srcDir, "target", "release", "nostr-bench");
console.log("[local] static build unavailable, building portable glibc binary in rust:1-bookworm...");
console.log("[local] building portable glibc binary in rust:1-bookworm...");
await runCommand(
"docker",
@@ -386,21 +405,7 @@ async function buildNostrBenchBinary(tmpDir) {
{ stdio: "inherit" },
);
const fileOut = await runCommand("file", [binaryPath]);
if (!(fileOut.stdout.includes("/lib64/ld-linux-x86-64.so.2") || fileOut.stdout.includes("statically linked"))) {
throw new Error(`Built nostr-bench binary does not look portable: ${fileOut.stdout.trim()}`);
}
}
const outPath = path.join(tmpDir, "nostr-bench");
fs.copyFileSync(binaryPath, outPath);
fs.chmodSync(outPath, 0o755);
const fileOut = await runCommand("file", [outPath]);
console.log(`[local] nostr-bench ready (${buildMode}): ${outPath}`);
console.log(`[local] ${fileOut.stdout.trim()}`);
return { path: outPath, buildMode };
return await copyAndValidateBinary(binaryPath, "docker-glibc-portable");
}
async function buildParrhesiaArchiveIfNeeded(opts, tmpDir) {