<rss version="2.0">
  <channel>
    <title>fnordig - posts tagged with 'nix'</title>
    <link>https://fnordig.de</link>
    <description>fnordig - post tagged with 'nix'</description>
    <item>
      <title>Old Ruby on modern Nix</title>
      <link>https://fnordig.de/2023/07/24/old-ruby-on-modern-nix</link>
      <description>&lt;p&gt;The other day I had to deploy an old Ruby 2.7 application.
As I&#39;ve recently started experimenting with NixOS I used this as an opportunity to figure out how to reliably and consistently deploy this application.
Along the way I had to figure out a couple of things and the available Nix documentation was either outdated or things didn&#39;t work as specified.&lt;/p&gt;
&lt;h2&gt;A dev shell for old Ruby&lt;/h2&gt;
&lt;p&gt;To get started all I wanted was a dev shell with the right Ruby version available.
So I started with &lt;a href=&quot;https://github.com/inscapist/ruby-nix&quot;&gt;ruby-nix&lt;/a&gt;:&lt;/p&gt;
&lt;pre style=&quot;background-color:#ffffff;&quot;&gt;
&lt;code&gt;&lt;span style=&quot;color:#323232;&quot;&gt;nix flake init -t github:inscapist/ruby-nix/main
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That got me a basic &lt;code&gt;flake.nix&lt;/code&gt; installing Ruby 3.2.
I trimmed that down just slightly and swapped in Ruby 2.7 (here&#39;s the &lt;a href=&quot;https://github.com/bobvanderlinden/nixpkgs-ruby/blob/master/ruby/versions.json&quot;&gt;list of available Ruby version&lt;/a&gt;):&lt;/p&gt;
&lt;pre style=&quot;background-color:#ffffff;&quot;&gt;
&lt;code&gt;&lt;span style=&quot;color:#323232;&quot;&gt;{
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;  description = &amp;quot;An old Ruby application&amp;quot;;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;  nixConfig = {
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;    extra-substituters = &amp;quot;https://nixpkgs-ruby.cachix.org&amp;quot;;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;    extra-trusted-public-keys =
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;      &amp;quot;nixpkgs-ruby.cachix.org-1:vrcdi50fTolOxWCZZkw0jakOnUI1T19oYJ+PRYdK4SM=&amp;quot;;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;  };
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;  inputs = {
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;    nixpkgs.url = &amp;quot;nixpkgs&amp;quot;;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;    ruby-nix = {
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;      url = &amp;quot;github:inscapist/ruby-nix&amp;quot;;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;      inputs.nixpkgs.follows = &amp;quot;nixpkgs&amp;quot;;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;    };
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;    fu.url = &amp;quot;github:numtide/flake-utils&amp;quot;;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;    bob-ruby = {
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;      url = &amp;quot;github:bobvanderlinden/nixpkgs-ruby&amp;quot;;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;      inputs.nixpkgs.follows = &amp;quot;nixpkgs&amp;quot;;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;    };
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;  };
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;  outputs = { self, nixpkgs, fu, ruby-nix, bob-ruby }:
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;    with fu.lib;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;    eachDefaultSystem (system:
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;      let
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;        pkgs = import nixpkgs {
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;          inherit system;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;          overlays = [ bob-ruby.overlays.default ];
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;        };
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;        rubyNix = ruby-nix.lib pkgs;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;        ruby = pkgs.&amp;quot;ruby-2.7.8&amp;quot;;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;      in rec {
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;        inherit (rubyNix {
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;          inherit ruby;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;          name = &amp;quot;old-ruby-app&amp;quot;;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;        })
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;          env;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;        devShells = rec {
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;          default = dev;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;          dev = pkgs.mkShell {
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;            buildInputs = [ env ];
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;          };
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;        };
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;      });
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The important line is this:&lt;/p&gt;
&lt;pre style=&quot;background-color:#ffffff;&quot;&gt;
&lt;code&gt;&lt;span style=&quot;color:#323232;&quot;&gt;ruby = pkgs.&amp;quot;ruby-2.7.8&amp;quot;;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;pkgs&lt;/code&gt; contains the &lt;code&gt;bob-ruby&lt;/code&gt; overlay and so the previously listed Ruby versions are all directly available.&lt;/p&gt;
&lt;p&gt;Now on to installing it into a shell:&lt;/p&gt;
&lt;pre style=&quot;background-color:#ffffff;&quot;&gt;
&lt;code&gt;&lt;span style=&quot;color:#323232;&quot;&gt;nix develop
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And boom:&lt;/p&gt;
&lt;pre style=&quot;background-color:#ffffff;&quot;&gt;
&lt;code&gt;&lt;span style=&quot;color:#323232;&quot;&gt;error: Package ‘openssl-1.1.1u’ in /nix/store/b1l1kkp1g07gy67wglfpwlwaxs1rqkpx-source/pkgs/development/libraries/openssl/default.nix:210 is marked as insecure, refusing to evaluate.
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;Known issues:
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt; - OpenSSL 1.1 is reaching its end of life on 2023/09/11 and cannot be supported through the NixOS 23.05 release cycle. https://www.openssl.org/blog/blog/2023/03/28/1.1.1-EOL/
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;You can install it anyway by allowing this package, using the
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;following methods:
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;a) To temporarily allow all insecure packages, you can use an environment
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;   variable for a single invocation of the nix tools:
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;     $ export NIXPKGS_ALLOW_INSECURE=1
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt; Note: For `nix shell`, `nix build`, `nix develop` or any other Nix 2.4+
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt; (Flake) command, `--impure` must be passed in order to read this
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt; environment variable.
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;b) for `nixos-rebuild` you can add ‘openssl-1.1.1u’ to
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;   `nixpkgs.config.permittedInsecurePackages` in the configuration.nix,
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;   like so:
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;     {
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;       nixpkgs.config.permittedInsecurePackages = [
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;         &amp;quot;openssl-1.1.1u&amp;quot;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;       ];
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;     }
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;c) For `nix-env`, `nix-build`, `nix-shell` or any other Nix command you can add
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;   ‘openssl-1.1.1u’ to `permittedInsecurePackages` in
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;   ~/.config/nixpkgs/config.nix, like so:
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;     {
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;       permittedInsecurePackages = [
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;         &amp;quot;openssl-1.1.1u&amp;quot;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;       ];
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;     }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&#39;s ... unfortunate, but at least it tells us what to do:&lt;/p&gt;
&lt;pre style=&quot;background-color:#ffffff;&quot;&gt;
&lt;code&gt;&lt;span style=&quot;color:#323232;&quot;&gt;NIXPKGS_ALLOW_INSECURE=1 nix develop --impure
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And that works:&lt;/p&gt;
&lt;pre style=&quot;background-color:#ffffff;&quot;&gt;
&lt;code&gt;&lt;span style=&quot;color:#323232;&quot;&gt;$ NIXPKGS_ALLOW_INSECURE=1 nix develop --impure
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;(nix:nix-shell-env)
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;; ruby -v
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;ruby 2.7.8p225 (2023-03-30 revision 1f4d455848) [arm64-darwin22]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Partial success!&lt;/p&gt;
&lt;h2&gt;A failed attempt to deploy this on NixOS&lt;/h2&gt;
&lt;p&gt;I set up a server running NixOS recently and wanted to deploy something like the above to it.
So I added my custom flake as an input and then references it in my &lt;code&gt;configuration.nix&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Lo and behold, it failed with an error message like the one above.
But hey, option b) in there said what to do:&lt;/p&gt;
&lt;pre style=&quot;background-color:#ffffff;&quot;&gt;
&lt;code&gt;&lt;span style=&quot;color:#323232;&quot;&gt;{
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt; nixpkgs.config.permittedInsecurePackages = [
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;   &amp;quot;openssl-1.1.1u&amp;quot;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt; ];
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Except no matter where, when and how I added this in my configuration it did not work.
I spent a couple of hours trying out every solution I could find on the internet.
None of them worked and neither the error messages nor the documentation could clear this up.&lt;/p&gt;
&lt;p&gt;Failure.&lt;/p&gt;
&lt;h2&gt;The hack: Ignoring vulnerabilities&lt;/h2&gt;
&lt;p&gt;Vulnerabilities in &lt;code&gt;nixpkgs&lt;/code&gt; are declared by adding a &lt;code&gt;meta.knownVulnerabilities&lt;/code&gt; list.
That&#39;s what triggers the error above and the erorr message includes the custom description.
For OpenSSL 1.1 this Vulnerability is declared in &lt;a href=&quot;https://github.com/NixOS/nixpkgs/blob/12303c652b881435065a98729eb7278313041e49/pkgs/development/libraries/openssl/default.nix#L237-L241&quot;&gt;&lt;code&gt;pkgs/development/libraries/openssl/default.nix&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Knowing this I later stumbled upon a StackOverflow question: &lt;a href=&quot;https://stackoverflow.com/questions/53566342/nixos-set-permittedinsecurepackages-only-for-one-package-build-in-an-overl&quot;&gt;Nix(OS): Set &quot;permittedInsecurePackages&quot; only for one package build (in an overlay?)&lt;/a&gt;,
which had an answer: Patch the package to just contain an empty &lt;code&gt;knownVulnerabilities&lt;/code&gt; list.&lt;/p&gt;
&lt;p&gt;So I changed my &lt;code&gt;flake.nix&lt;/code&gt; in the Ruby app to override that just for the Ruby version:&lt;/p&gt;
&lt;pre style=&quot;background-color:#ffffff;&quot;&gt;
&lt;code&gt;&lt;span style=&quot;color:#323232;&quot;&gt;ignoringVulns = x: x // { meta = (x.meta // { knownVulnerabilities = []; }); };
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;ruby = pkgs.&amp;quot;ruby-2.7.8&amp;quot;.override {
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;  openssl = pkgs.openssl_1_1.overrideAttrs ignoringVulns;
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;};
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And now it works without any issues:&lt;/p&gt;
&lt;pre style=&quot;background-color:#ffffff;&quot;&gt;
&lt;code&gt;&lt;span style=&quot;color:#323232;&quot;&gt;$ nix develop
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;(nix:nix-shell-env)
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;; ruby -v
&lt;/span&gt;&lt;span style=&quot;color:#323232;&quot;&gt;ruby 2.7.8p225 (2023-03-30 revision 1f4d455848) [arm64-darwin22]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No more changes to my NixOS configuration required. Only this particular flake overrides the &lt;code&gt;openssl&lt;/code&gt; version and that&#39;s good enough for this deployment.&lt;/p&gt;
&lt;p&gt;Success.&lt;/p&gt;
</description>
      <guid>https://fnordig.de/2023/07/24/old-ruby-on-modern-nix</guid>
      <pubDate>Mon, 24 Jul 2023 14:40:00 +0200</pubDate>
    </item>
    
  </channel>
</rss>
