{ description = "SOTA Rails 8 Native Environment & OCI Image for JamKazam Admin - Cache Bust 2"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; nix2container.url = "github:nlewo/nix2container"; }; outputs = { self, nixpkgs, nix2container }: let supportedSystems = [ "x86_64-linux" "aarch64-linux" "aarch64-darwin" ]; forAllSystems = nixpkgs.lib.genAttrs supportedSystems; in { # Track 1: The Native Inner Loop (for 8GB RAM Macs) devShells = forAllSystems (system: { default = let pkgs = import nixpkgs { inherit system; }; in pkgs.mkShell { buildInputs = with pkgs; [ ruby_3_4 postgresql_16.lib jemalloc libyaml vips bun # for ci/watch.ts git ]; shellHook = '' export RUBY_YJIT_ENABLE=1 export RAILS_ENV=development # macOS uses .dylib, Linux uses .so if [ "$(uname)" = "Darwin" ]; then export LD_PRELOAD="${pkgs.jemalloc}/lib/libjemalloc.dylib" else export LD_PRELOAD="${pkgs.jemalloc}/lib/libjemalloc.so" fi echo "🚀 SOTA Shell Ready (YJIT + jemalloc enabled)" ''; }; }); # Track 2: The Production OCI Image packages = forAllSystems (system: let pkgs = import nixpkgs { inherit system; }; n2c = nix2container.packages.${system}; # 1. Define the Ruby Environment with common native gems pre-installed rubyEnv = pkgs.ruby_3_4.withPackages (ps: with ps; [ psych pg nokogiri ]); # 2. Join dev and lib outputs for common dependencies libyaml-joined = pkgs.symlinkJoin { name = "libyaml-joined"; paths = [ pkgs.libyaml pkgs.libyaml.dev ]; }; openssl-joined = pkgs.symlinkJoin { name = "openssl-joined"; paths = [ pkgs.openssl pkgs.openssl.dev ]; }; postgres-joined = pkgs.symlinkJoin { name = "postgres-joined"; paths = [ pkgs.postgresql_16 pkgs.postgresql_16.lib ]; }; # 3. Aggregate all dependencies into a single environment allDeps = pkgs.buildEnv { name = "jam-admin-env"; paths = with pkgs; [ rubyEnv postgres-joined libyaml-joined openssl-joined zlib.dev zlib libiconv libxml2 libxml2.dev libxslt libxslt.dev jemalloc vips bash coreutils git gnumake gcc pkg-config binutils ]; }; # 4. A startup script to ensure we are in the right place start-jam-admin = pkgs.writeShellScriptBin "start-jam-admin" '' export PATH=${allDeps}/bin:$PATH export LD_LIBRARY_PATH=${allDeps}/lib:$LD_LIBRARY_PATH export PKG_CONFIG_PATH=${allDeps}/lib/pkgconfig cd /jam-cloud/admin echo "🔧 Configuring bundler for native extensions..." bundle config build.psych --with-yaml-dir=${libyaml-joined} bundle config build.pg --with-pg-config=${postgres-joined}/bin/pg_config echo "💎 Installing gems..." bundle install echo "🚀 Starting Rails..." exec bundle exec rails server -b 0.0.0.0 ''; appImage = pkgs.dockerTools.buildLayeredImage { name = "jamkazam-admin-v3"; tag = "local"; config = { Cmd = [ "${start-jam-admin}/bin/start-jam-admin" ]; Env = [ "RUBY_YJIT_ENABLE=1" "LD_PRELOAD=${pkgs.jemalloc}/lib/libjemalloc.so" "RAILS_ENV=production" "RAILS_SERVE_STATIC_FILES=true" "PKG_CONFIG_PATH=${allDeps}/lib/pkgconfig" ]; ExposedPorts = { "3000/tcp" = {}; }; }; contents = [ allDeps start-jam-admin pkgs.libyaml.dev pkgs.openssl.dev pkgs.postgresql_16.lib pkgs.zlib.dev ]; }; in { inherit appImage; appImageTarball = appImage; } ); }; }