Skip to content

Make magic frame packageable with nix - #92

Open
ibizaman wants to merge 2 commits into
jeremiaa:mainfrom
ibizaman:main
Open

Make magic frame packageable with nix#92
ibizaman wants to merge 2 commits into
jeremiaa:mainfrom
ibizaman:main

Conversation

@ibizaman

Copy link
Copy Markdown

With the modifications enclosed in this PR, I could package magic-frame with the following nix code. Note I use my fork in the following snippet.

Are you willing to merge this? If not, I'd be happy to talk about solutions. It's also possible for me to patch magic-frame inside the nix code but I'd like to avoid it if possible.

It provides 3 binaries magic-frame, magic-frame-prisma and magic-frame-bootstrap. Using them looks like so:

mkdir -p .tmp/pg
nix shell nixpkgs#postgresql --command initdb   -D .tmp/pg   --auth=trust
nix shell nixpkgs#postgresql --command postgres   -D .tmp/pg   -k "$PWD/.tmp"   -p 5433

nix-build -A magic-fram

./result/bin/magic-frame-prisma db push
./result/bin/magic-frame-bootstrap
./result/bin/magic-frame
{
  lib,
  buildNpmPackage,
  fetchFromGitHub,
  nodejs_24,
  openssl,
  makeWrapper,
  prisma-engines,
}:

buildNpmPackage (finalAttrs: {
  pname = "magic-frame";
  version = "1.5.2";

  src = fetchFromGitHub {
    owner = "ibizaman";
    repo = "magic-frame";
    rev = "1f82477114bdc11e3c52f61fcd7e9c04963ee45c";
    hash = "sha256-s6n4HockwlvAASCVp5jOkySWQpQH8mieUXMIjU8TPAI=";
  };

  nodejs = nodejs_24;

  npmDepsHash = "sha256-x/xiXZmsxlLDF6arZ4xp6/tI/0TtmMQuCuk7p1EOG9Y=";

  nativeBuildInputs = [
    openssl
    makeWrapper
    prisma-engines
  ];

  env = {
    PRISMA_CLI_QUERY_ENGINE_TYPE = "binary";
    PRISMA_SKIP_POSTINSTALL_GENERATE = "true";
    PRISMA_QUERY_ENGINE_BINARY = "${prisma-engines}/bin/query-engine";
    PRISMA_SCHEMA_ENGINE_BINARY = "${prisma-engines}/bin/schema-engine";
  };

  # Needed because the Docker build creates this before prisma generate
  preBuild = ''
    echo "DATABASE_URL=postgresql://dummy:dummy@localhost:5432/dummy" > .env
    npx prisma generate
  '';

  npmBuildScript = "build";

  installPhase = ''
    runHook preInstall

    mkdir -p $out/lib/magic-frame

    cp -r \
      .next \
      next.config.* \
      node_modules \
      package.json \
      prisma \
      prisma.config.ts \
      public \
      scripts \
      server.js \
      src \
      $out/lib/magic-frame/

    makeWrapper ${finalAttrs.nodejs}/bin/node \
      $out/bin/magic-frame \
      --chdir $out/lib/magic-frame \
      --set NODE_ENV production \
      --add-flags server.js

    makeWrapper ${finalAttrs.nodejs}/bin/node \
      $out/bin/magic-frame-prisma \
      --chdir $out/lib/magic-frame \
      --set NODE_ENV production \
      --set OPENSSL_DIR ${openssl.dev} \
      --set PRISMA_SCHEMA_ENGINE_BINARY "${prisma-engines}/bin/schema-engine" \
      --set PRISMA_QUERY_ENGINE_BINARY "${prisma-engines}/bin/query-engine" \
      --add-flags node_modules/prisma/build/index.js

    makeWrapper ${finalAttrs.nodejs}/bin/node \
      $out/bin/magic-frame-bootstrap \
      --chdir $out/lib/magic-frame \
      --set NODE_ENV production \
      --add-flags scripts/bootstrap.mjs

    runHook postInstall
  '';

  meta = {
    description = "Magic Frame self-hosted family dashboard and picture frame";
    homepage = "https://github.com/jeremiaa/magic-frame";
    license = lib.licenses.mit;
    platforms = lib.platforms.linux;
  };
})

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant