mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-12-28 16:43:58 +00:00
4cc5dee048
This is useful for eg. nextcloud to prevent compressing thousands of later unused files which are actually not used by the web server.
146 lines
3.9 KiB
Nix
146 lines
3.9 KiB
Nix
{
|
|
brotli,
|
|
compressDrv,
|
|
lib,
|
|
zopfli,
|
|
zstd,
|
|
}:
|
|
/**
|
|
compressDrvWeb compresses a derivation for common web server use.
|
|
|
|
Useful when one wants to pre-compress certain static assets and pass them to
|
|
the web server.
|
|
|
|
# Inputs
|
|
|
|
`formats` ([String])
|
|
|
|
: List of file extensions to compress.
|
|
|
|
Defaults to common formats that compress well.
|
|
|
|
`extraFindOperands` (String)
|
|
|
|
: See compressDrv for details.
|
|
|
|
`extraFormats` ([ String ])
|
|
|
|
: Extra extensions to compress in addition to `formats`.
|
|
|
|
`compressors` ( { ${fileExtension} :: String })
|
|
|
|
: Map a desired extension (e.g. `gz`) to a compress program.
|
|
|
|
# Type
|
|
|
|
```
|
|
compressDrvWeb :: Derivation -> { formats :: [ String ]; extraFormats :: [ String ]; compressors :: { ${fileExtension} :: String; } } -> Derivation
|
|
```
|
|
|
|
# Examples
|
|
:::{.example}
|
|
## `pkgs.compressDrvWeb` full usage example with `pkgs.gamja` and a webserver
|
|
```nix
|
|
|
|
For example, building `pkgs.gamja` produces the following output:
|
|
|
|
/nix/store/2wn1qbk8gp4y2m8xvafxv1b2dcdqj8fz-gamja-1.0.0-beta.9/
|
|
├── index.2fd01148.js
|
|
├── index.2fd01148.js.map
|
|
├── index.37aa9a8a.css
|
|
├── index.37aa9a8a.css.map
|
|
├── index.html
|
|
└── manifest.webmanifest
|
|
|
|
With `pkgs.compressDrvWeb`, one can compress these files:
|
|
|
|
```nix
|
|
pkgs.compressDrvWeb pkgs.gamja {}
|
|
=>
|
|
«derivation /nix/store/...-gamja-compressed.drv»
|
|
```
|
|
|
|
```bash
|
|
/nix/store/f5ryid7zrw2hid7h9kil5g5j29q5r2f7-gamja-1.0.0-beta.9-compressed
|
|
├── index.2fd01148.js -> /nix/store/2wn1qbk8gp4y2m8xvafxv1b2dcdqj8fz-gamja-1.0.0-beta.9/index.2fd01148.js
|
|
├── index.2fd01148.js.br
|
|
├── index.2fd01148.js.gz
|
|
├── index.2fd01148.js.map -> /nix/store/2wn1qbk8gp4y2m8xvafxv1b2dcdqj8fz-gamja-1.0.0-beta.9/index.2fd01148.js.map
|
|
├── index.2fd01148.js.map.br
|
|
├── index.2fd01148.js.map.gz
|
|
├── index.37aa9a8a.css -> /nix/store/2wn1qbk8gp4y2m8xvafxv1b2dcdqj8fz-gamja-1.0.0-beta.9/index.37aa9a8a.css
|
|
├── index.37aa9a8a.css.br
|
|
├── index.37aa9a8a.css.gz
|
|
├── index.37aa9a8a.css.map -> /nix/store/2wn1qbk8gp4y2m8xvafxv1b2dcdqj8fz-gamja-1.0.0-beta.9/index.37aa9a8a.css.map
|
|
├── index.37aa9a8a.css.map.br
|
|
├── index.37aa9a8a.css.map.gz
|
|
├── index.html -> /nix/store/2wn1qbk8gp4y2m8xvafxv1b2dcdqj8fz-gamja-1.0.0-beta.9/index.html
|
|
├── index.html.br
|
|
├── index.html.gz
|
|
├── manifest.webmanifest -> /nix/store/2wn1qbk8gp4y2m8xvafxv1b2dcdqj8fz-gamja-1.0.0-beta.9/manifest.webmanifest
|
|
├── manifest.webmanifest.br
|
|
└── manifest.webmanifest.gz
|
|
```
|
|
|
|
When the `-compressed` derivation is passed to a properly configured web server,
|
|
it enables direct serving of the pre-compressed files.
|
|
|
|
```shell-session
|
|
$ curl -I -H 'Accept-Encoding: br' https://irc.example.org/
|
|
<...>
|
|
content-encoding: br
|
|
<...>
|
|
```
|
|
|
|
For example, a caddy configuration snippet for gamja to serve
|
|
the static assets (JS, CSS files) pre-compressed:
|
|
|
|
```nix
|
|
{
|
|
virtualHosts."irc.example.org".extraConfig = ''
|
|
root * ${pkgs.compressDrvWeb pkgs.gamja {}}
|
|
file_server browse {
|
|
precompressed br gzip
|
|
}
|
|
'';
|
|
}
|
|
```
|
|
|
|
This feature is also available in nginx via `ngx_brotli` and
|
|
`ngx_http_gzip_static_module`.
|
|
:::
|
|
*/
|
|
drv:
|
|
{
|
|
formats ? [
|
|
"css"
|
|
"eot"
|
|
"htm"
|
|
"html"
|
|
"js"
|
|
"json"
|
|
"map"
|
|
"otf"
|
|
"svg"
|
|
"ttf"
|
|
"txt"
|
|
"webmanifest"
|
|
"xml"
|
|
],
|
|
extraFormats ? [ ],
|
|
compressors ? {
|
|
br = "${lib.getExe brotli} --keep --no-copy-stat {}";
|
|
gz = "${lib.getExe zopfli} --keep {}";
|
|
# --force is required to not fail on symlinks
|
|
# for details on the compression level see
|
|
# https://github.com/NixOS/nixpkgs/pull/332752#issuecomment-2275110390
|
|
zstd = "${lib.getExe zstd} --force --keep --quiet -19 {}";
|
|
},
|
|
extraFindOperands ? "",
|
|
}:
|
|
compressDrv drv {
|
|
formats = formats ++ extraFormats;
|
|
compressors = compressors;
|
|
inherit extraFindOperands;
|
|
}
|