Compare commits

..

3 commits

Author SHA1 Message Date
eda6d8396b
Merge branch 'fix/upload-limits' 2026-07-06 22:10:07 +03:00
757be61f59
set upload limits 2026-07-04 21:24:05 +03:00
ec956c1ca8
test upload limits 2026-07-04 21:24:05 +03:00
7 changed files with 104 additions and 13 deletions

2
.gitignore vendored
View file

@ -2,3 +2,5 @@
/.reference/ /.reference/
/backend/.phpunit.cache/ /backend/.phpunit.cache/
/.postgres/ /.postgres/
/result
/result-*

View file

@ -12,12 +12,18 @@
}: }:
let let
nixosModule = import ./nix/nixos-module.nix; nixosModule = import ./nix/nixos-module.nix;
uploadLimits = import ./nix/upload-limits.nix;
in in
utils.lib.eachDefaultSystem ( utils.lib.eachDefaultSystem (
system: system:
let let
pkgs = nixpkgs.legacyPackages.${system}; pkgs = nixpkgs.legacyPackages.${system};
packages = import ./nix/packages { inherit pkgs; }; devPhp = pkgs.php.buildEnv {
extraConfig = uploadLimits.phpOptions;
};
packages = import ./nix/packages {
inherit pkgs uploadLimits;
};
in in
{ {
inherit packages; inherit packages;
@ -28,12 +34,37 @@
inherit nixpkgs system; inherit nixpkgs system;
module = nixosModule; module = nixosModule;
}; };
dev-php-upload-limits =
pkgs.runCommand "rabbi-gerzi-dev-php-upload-limits"
{
preferLocalBuild = true;
}
''
actual_upload_max_filesize="$(
${devPhp}/bin/php -r 'echo ini_get("upload_max_filesize");'
)"
actual_post_max_size="$(
${devPhp}/bin/php -r 'echo ini_get("post_max_size");'
)"
if [ "$actual_upload_max_filesize" != "${uploadLimits.phpUploadLimit}" ]; then
echo "upload_max_filesize was $actual_upload_max_filesize" >&2
exit 1
fi
if [ "$actual_post_max_size" != "${uploadLimits.phpUploadLimit}" ]; then
echo "post_max_size was $actual_post_max_size" >&2
exit 1
fi
echo "$actual_upload_max_filesize" > $out
'';
}; };
devShells.default = pkgs.mkShell { devShells.default = pkgs.mkShell {
buildInputs = with pkgs; [ buildInputs = with pkgs; [
onefetch onefetch
php devPhp
phpPackages.composer phpPackages.composer
phpPackages.php-codesniffer phpPackages.php-codesniffer
vscode-langservers-extracted vscode-langservers-extracted

View file

@ -7,7 +7,9 @@
}: }:
let let
evaluatedHostName = uploadLimits = import ../upload-limits.nix;
evaluatedConfig =
(nixpkgs.lib.nixosSystem { (nixpkgs.lib.nixosSystem {
inherit system; inherit system;
modules = [ modules = [
@ -25,13 +27,48 @@ let
}; };
} }
]; ];
}).config.services.rabbi-gerzi.backend.hostName; }).config;
evaluatedHostName = evaluatedConfig.services.rabbi-gerzi.backend.hostName;
backendVirtualHost = evaluatedConfig.services.nginx.virtualHosts.${evaluatedHostName};
phpOptions = evaluatedConfig.services.phpfpm.pools.rabbi-gerzi.phpOptions;
expectedUploadMaxFilesize = "upload_max_filesize = ${uploadLimits.phpUploadLimit}";
expectedPostMaxSize = "post_max_size = ${uploadLimits.phpUploadLimit}";
expectedNginxClientMaxBodySize = "client_max_body_size ${uploadLimits.nginxClientMaxBodySize};";
assertions = [
{
passed = lib.hasInfix expectedUploadMaxFilesize phpOptions;
message = "php-fpm upload_max_filesize is not 6M";
}
{
passed = lib.hasInfix expectedPostMaxSize phpOptions;
message = "php-fpm post_max_size is not 6M";
}
{
passed = lib.hasInfix expectedNginxClientMaxBodySize backendVirtualHost.extraConfig;
message = "nginx client_max_body_size is not 6m";
}
];
failedAssertions = lib.filter (assertion: !assertion.passed) assertions;
in in
pkgs.runCommand "rabbi-gerzi-module-eval" pkgs.runCommand "rabbi-gerzi-module-eval"
{ {
failures = lib.concatMapStringsSep "\n" (assertion: assertion.message) failedAssertions;
value = evaluatedHostName; value = evaluatedHostName;
preferLocalBuild = true; preferLocalBuild = true;
} }
'' ''
if [ -n "$failures" ]; then
printf '%s\n' "$failures" >&2
exit 1
fi
echo "$value" > $out echo "$value" > $out
'' ''

View file

@ -13,6 +13,7 @@ let
appDir = "${backendPackage}/share/php/rabbi-gerzi-backend"; appDir = "${backendPackage}/share/php/rabbi-gerzi-backend";
phpPackage = backendPackage.passthru.php; phpPackage = backendPackage.passthru.php;
poolName = "rabbi-gerzi"; poolName = "rabbi-gerzi";
uploadLimits = import ./upload-limits.nix;
storagePath = "${cfg.stateDir}/storage"; storagePath = "${cfg.stateDir}/storage";
cachePath = "${cfg.cacheDir}/bootstrap-cache"; cachePath = "${cfg.cacheDir}/bootstrap-cache";
setupService = "rabbi-gerzi-setup"; setupService = "rabbi-gerzi-setup";
@ -239,6 +240,7 @@ in
services.phpfpm.pools.${poolName} = { services.phpfpm.pools.${poolName} = {
inherit (cfg) user group; inherit (cfg) user group;
inherit phpPackage; inherit phpPackage;
phpOptions = uploadLimits.phpOptions;
settings = { settings = {
"catch_workers_output" = true; "catch_workers_output" = true;
"clear_env" = "no"; "clear_env" = "no";
@ -316,6 +318,9 @@ in
cfg.backend.nginx cfg.backend.nginx
{ {
root = "${appDir}/public"; root = "${appDir}/public";
extraConfig = ''
client_max_body_size ${uploadLimits.nginxClientMaxBodySize};
'';
locations = { locations = {
"/" = { "/" = {
index = "index.php"; index = "index.php";

View file

@ -2,16 +2,19 @@
lib, lib,
makeWrapper, makeWrapper,
php, php,
uploadLimits ? import ../upload-limits.nix,
}: }:
let let
phpPackage = php.withExtensions ( phpPackage = php.buildEnv {
extensions =
{ enabled, all }: { enabled, all }:
enabled enabled
++ [ ++ [
all.pdo_pgsql all.pdo_pgsql
] ];
); extraConfig = uploadLimits.phpOptions;
};
in in
phpPackage.buildComposerProject2 (finalAttrs: { phpPackage.buildComposerProject2 (finalAttrs: {
pname = "rabbi-gerzi-backend"; pname = "rabbi-gerzi-backend";

View file

@ -1,7 +1,12 @@
{ pkgs }: {
pkgs,
uploadLimits ? import ../upload-limits.nix,
}:
rec { rec {
backend = pkgs.callPackage ./backend.nix { }; backend = pkgs.callPackage ./backend.nix {
inherit uploadLimits;
};
frontend = pkgs.callPackage ./frontend.nix { }; frontend = pkgs.callPackage ./frontend.nix { };
default = frontend; default = frontend;
} }

8
nix/upload-limits.nix Normal file
View file

@ -0,0 +1,8 @@
{
nginxClientMaxBodySize = "6m";
phpUploadLimit = "6M";
phpOptions = ''
upload_max_filesize = 6M
post_max_size = 6M
'';
}