{ description = "SOTA Rails 8 Native Environment & OCI Image for JamKazam WebSocket Gateway"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; }; outputs = { self, nixpkgs }: let supportedSystems = [ "x86_64-linux" "aarch64-linux" "aarch64-darwin" ]; forAllSystems = nixpkgs.lib.genAttrs supportedSystems; in { 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 git libxml2 libxslt pkg-config ]; shellHook = '' export RUBY_YJIT_ENABLE=1 export RAILS_ENV=development if [ "$(uname)" = "Darwin" ]; then export LD_PRELOAD="${pkgs.jemalloc}/lib/libjemalloc.dylib" else export LD_PRELOAD="${pkgs.jemalloc}/lib/libjemalloc.so" fi echo "🚀 SOTA WebSocket Shell Ready" ''; }; }); packages = forAllSystems (system: let pkgs = import nixpkgs { inherit system; }; rubyEnv = pkgs.ruby_3_4.withPackages (ps: with ps; [ psych pg nokogiri ]); 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 ]; }; allDeps = pkgs.buildEnv { name = "jam-ws-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 ]; }; start-jam-ws = pkgs.writeShellScriptBin "start-jam-ws" '' export PATH=${allDeps}/bin:$PATH export LD_LIBRARY_PATH=${allDeps}/lib:$LD_LIBRARY_PATH export PKG_CONFIG_PATH=${allDeps}/lib/pkgconfig cd /jam-cloud/websocket-gateway echo "🔧 Configuring bundler..." 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 WebSocket Gateway..." # TODO: Add actual start command if different from Rails exec bundle exec ruby bin/server ''; appImage = pkgs.dockerTools.buildLayeredImage { name = "jamkazam-ws"; tag = "local"; config = { Cmd = [ "${start-jam-ws}/bin/start-jam-ws" ]; Env = [ "RUBY_YJIT_ENABLE=1" "LD_PRELOAD=${pkgs.jemalloc}/lib/libjemalloc.so" "RAILS_ENV=production" "PKG_CONFIG_PATH=${allDeps}/lib/pkgconfig" ]; }; contents = [ allDeps start-jam-ws pkgs.libyaml.dev pkgs.openssl.dev pkgs.postgresql_16.lib pkgs.zlib.dev ]; }; in { inherit appImage; appImageTarball = appImage; } ); }; }