Initial commit of a working Chucya flake?
This commit is contained in:
commit
76efcf6748
10 changed files with 4186 additions and 0 deletions
188
chuckya/default.nix
Normal file
188
chuckya/default.nix
Normal file
|
@ -0,0 +1,188 @@
|
|||
{
|
||||
stdenv,
|
||||
nodejs-slim,
|
||||
bundlerEnv,
|
||||
defaultGemConfig,
|
||||
yarn-berry,
|
||||
callPackage,
|
||||
ruby,
|
||||
writeShellScript,
|
||||
brotli,
|
||||
openssl,
|
||||
}:
|
||||
|
||||
let
|
||||
|
||||
# optimally, updates only need to touch `version_data.nix`, and nothing else should be in there
|
||||
versionData = import ./version_data.nix;
|
||||
|
||||
# use the first 7 characters of the chuckya commit hash as version string
|
||||
version = builtins.substring 0 7 versionData.rev;
|
||||
|
||||
# the patched chuckya source
|
||||
src = callPackage ./source.nix { };
|
||||
|
||||
# ruby gems, built from `gemset.nix`, which is generated by bundix in `update.sh` from the source Gemfile
|
||||
mastodonGems = bundlerEnv {
|
||||
name = "chuckya-gems-${version}"; # bundlerEnv breaks when pname is set instead
|
||||
inherit version;
|
||||
ruby = ruby;
|
||||
gemset = ./gemset.nix;
|
||||
gemdir = src;
|
||||
/*
|
||||
See:
|
||||
- https://wiki.nixos.org/wiki/Packaging/Ruby#Adding_a_global_override_for_a_gem
|
||||
- https://nixos.org/manual/nixpkgs/stable/#gem-specific-configurations-and-workarounds
|
||||
*/
|
||||
gemConfig = defaultGemConfig // {
|
||||
hiredis-client = attrs: {
|
||||
buildInputs = [ openssl ];
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
# fetches JS dependencies via yarn based on the lockfile in the source
|
||||
mastodonYarnDeps = yarn-berry.fetchYarnBerryDeps {
|
||||
inherit src;
|
||||
hash = versionData.yarnHash;
|
||||
missingHashes = ./missing-hashes.json;
|
||||
};
|
||||
|
||||
# builds the node modules for mastodon using the previously fetched yarn deps
|
||||
mastodonModules = stdenv.mkDerivation {
|
||||
pname = "chuckya-modules";
|
||||
inherit version src;
|
||||
|
||||
yarnOfflineCache = mastodonYarnDeps;
|
||||
missingHashes = ./missing-hashes.json;
|
||||
|
||||
nativeBuildInputs = [
|
||||
nodejs-slim
|
||||
yarn-berry
|
||||
yarn-berry.yarnBerryConfigHook
|
||||
brotli
|
||||
mastodonGems
|
||||
mastodonGems.wrappedRuby
|
||||
];
|
||||
|
||||
RAILS_ENV = "production";
|
||||
NODE_ENV = "production";
|
||||
|
||||
/*
|
||||
So it seems that somehow a change in Linux 6.9 changed something that broke libuv, an IO lib
|
||||
used by Node. This undocumented env var disables the broken IO feature in libuv and it works
|
||||
again.
|
||||
|
||||
- https://lore.kernel.org/lkml/d7003b6e-b8e3-41c4-9e6e-2b9abd0c5572@gmail.com/t/
|
||||
- https://github.com/nodejs/node/issues/53051#issuecomment-2124940205
|
||||
- https://github.com/nodejs/docker-node/issues/1912#issuecomment-1594233686
|
||||
*/
|
||||
UV_USE_IO_URING = "0";
|
||||
|
||||
buildPhase = ''
|
||||
runHook preBuild
|
||||
|
||||
export SECRET_KEY_BASE_DUMMY=1
|
||||
|
||||
patchShebangs bin
|
||||
|
||||
bundle exec rails assets:precompile
|
||||
|
||||
rm -rf node_modules/.cache
|
||||
|
||||
# Remove workspace "package" as it contains broken symlinks
|
||||
# See https://github.com/NixOS/nixpkgs/issues/380366
|
||||
rm -rf node_modules/@mastodon
|
||||
|
||||
# Remove execute permissions
|
||||
find public/assets -type f ! -perm 0555 \
|
||||
-exec chmod 0444 {} ';'
|
||||
|
||||
# Create missing static gzip and brotli files
|
||||
# see: https://git.catgirl.cloud/999eagle/dotfiles-nix/-/blob/5d0da33c4f6b52b48777b404593c68a13e292721/overlay/mastodon/glitch/default.nix#L30
|
||||
# see: https://code.hackerspace.pl/ar/nibylandia/src/commit/7bbb773554204026644fb98c9463fd15726976e9/pkgs/chuckya/modules.nix#L52
|
||||
find public/assets public/packs -type f -regextype posix-extended -iregex '.*\.(css|html|js|js.map|json|svg)' \
|
||||
-exec gzip --best --keep --force {} ';' \
|
||||
-exec brotli --best --keep {} ';'
|
||||
|
||||
runHook postBuild
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
mkdir -p $out/public
|
||||
cp -r node_modules $out/node_modules
|
||||
cp -r public/assets $out/public
|
||||
cp -r public/packs $out/public
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
};
|
||||
|
||||
# the actual main chuckya package
|
||||
|
||||
in stdenv.mkDerivation {
|
||||
|
||||
pname = "chuckya";
|
||||
inherit version src mastodonGems mastodonModules;
|
||||
|
||||
propagatedBuildInputs = [ mastodonGems.wrappedRuby ];
|
||||
nativeBuildInputs = [ brotli ];
|
||||
buildInputs = [ mastodonGems nodejs-slim ];
|
||||
|
||||
buildPhase = ''
|
||||
runHook preBuild
|
||||
|
||||
ln -s $mastodonModules/node_modules node_modules
|
||||
ln -s $mastodonModules/public/assets public/assets
|
||||
ln -s $mastodonModules/public/packs public/packs
|
||||
|
||||
patchShebangs bin/
|
||||
for b in $(ls $mastodonGems/bin/)
|
||||
do
|
||||
if [ ! -f bin/$b ]; then
|
||||
ln -s $mastodonGems/bin/$b bin/$b
|
||||
fi
|
||||
done
|
||||
|
||||
# Remove execute permissions
|
||||
chmod 0444 public/emoji/*.svg
|
||||
|
||||
# Create missing static gzip and brotli files
|
||||
find public -maxdepth 1 -type f -regextype posix-extended -iregex '.*\.(css|js|svg|txt|xml)' \
|
||||
-exec gzip --best --keep --force {} ';' \
|
||||
-exec brotli --best --keep {} ';'
|
||||
find public/emoji -type f -name '.*.svg' \
|
||||
-exec gzip --best --keep --force {} ';' \
|
||||
-exec brotli --best --keep {} ';'
|
||||
ln -s assets/500.html.gz public/500.html.gz
|
||||
ln -s assets/500.html.br public/500.html.br
|
||||
ln -s packs/sw.js.gz public/sw.js.gz
|
||||
ln -s packs/sw.js.br public/sw.js.br
|
||||
ln -s packs/sw.js.map.gz public/sw.js.map.gz
|
||||
ln -s packs/sw.js.map.br public/sw.js.map.br
|
||||
|
||||
rm -rf log
|
||||
ln -s /var/log/mastodon log
|
||||
ln -s /tmp tmp
|
||||
|
||||
runHook postBuild
|
||||
'';
|
||||
|
||||
installPhase = let
|
||||
run-streaming = writeShellScript "run-streaming.sh" ''
|
||||
# NixOS helper script to consistently use the same NodeJS version the package was built with.
|
||||
${nodejs-slim}/bin/node ./streaming
|
||||
'';
|
||||
in ''
|
||||
runHook preInstall
|
||||
|
||||
mkdir -p $out
|
||||
cp -r * $out/
|
||||
ln -s ${run-streaming} $out/run-streaming.sh
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue