jam-cloud/websocket-gateway/flake.nix

127 lines
3.9 KiB
Nix

{
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;
}
);
};
}