diff --git a/flake.nix b/flake.nix index 30fb5cb..fe7eefa 100644 --- a/flake.nix +++ b/flake.nix @@ -61,6 +61,7 @@ }; packages.think = pkgs.think-gtcm; packages.think-be = pkgs.think-backend-gtcm; + packages.file-uploader = pkgs.gtcm-file-uploader; }; } ); diff --git a/machines/ramus/think-greater-chiangmai.nix b/machines/ramus/think-greater-chiangmai.nix index 9f1ac58..8611131 100644 --- a/machines/ramus/think-greater-chiangmai.nix +++ b/machines/ramus/think-greater-chiangmai.nix @@ -21,6 +21,8 @@ let R2_BUCKET = config.clan.core.vars.generators.greaterchiangmai-s3.files.bucket.value; R2_ENDPOINT = config.clan.core.vars.generators.greaterchiangmai-s3.files.endpoint.value; + R2_BUCKET_NAME = R2_BUCKET; + LOG_CHANNEL = "stack"; LOG_LEVEL = "debug"; diff --git a/modules/nixos/think-backend-gtcm.nix b/modules/nixos/think-backend-gtcm.nix index e83b5ae..e9e97e5 100644 --- a/modules/nixos/think-backend-gtcm.nix +++ b/modules/nixos/think-backend-gtcm.nix @@ -7,6 +7,30 @@ let cfg = config.services.think-backend-greaterchiangmai; think-backend-gtcm = pkgs.think-backend-gtcm.override { dataDir = cfg.dataDir; }; + file-uploader = pkgs.gtcm-file-uploader.override { dataDir = cfg.dataDir; }; + + nginxNodeProxyConfig = '' + proxy_pass http://127.0.0.1:3000; + + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $host; + proxy_set_header x-webobjects-server-protocol HTTP/1.0; + proxy_set_header x-webobjects-remote-host 127.0.0.1; + proxy_set_header x-webobjects-server-port $server_port; + proxy_set_header x-webobjects-server-name $server_name; + proxy_set_header x-webobjects-server-url $scheme://$host; + proxy_connect_timeout 90; + proxy_send_timeout 90; + proxy_read_timeout 90; + proxy_buffer_size 64k; + proxy_buffers 8 64k; + proxy_busy_buffers_size 64k; + proxy_temp_file_write_size 64k; + client_max_body_size 50m; + client_body_buffer_size 128k; + ''; + defaultUser = "gtcm"; defaultGroup = "gtcm"; @@ -142,6 +166,19 @@ in ''; }; + systemd.services.gtcm-file-uploader = { + description = "File upload service for think-backend.greaterchiangmai.com"; + requiredBy = [ "phpfpm-think-backend-gtcm.service" ]; + before = [ "phpfpm-think-backend-gtcm.service" ]; + serviceConfig = { + User = cfg.user; + WorkingDirectory = "${file-uploader}"; + ExecStart = "${lib.getExe pkgs.nodejs_20} ${file-uploader}/src/be/index.js"; + Restart = "on-failure"; + }; + path = [ pkgs.nodejs_20 ]; + }; + environment.systemPackages = [ artisan-be ]; @@ -244,6 +281,8 @@ in "d ${cfg.dataDir}/storage/framework/views 0700 ${cfg.user} ${cfg.group} - -" "d ${cfg.dataDir}/storage/logs 0700 ${cfg.user} ${cfg.group} - -" "d ${cfg.dataDir}/storage/uploads 0700 ${cfg.user} ${cfg.group} - -" + + "d ${cfg.dataDir}/gtcm-file-uploader/uploads 0700 ${cfg.user} ${cfg.group} - -" ]; networking.firewall.allowedTCPPorts = [ @@ -271,6 +310,12 @@ in "~ \\.(js|css|gif|png|ico|jpg|jpeg)$" = { extraConfig = "expires 365d;"; }; + "^~ /initiate-multipart-upload".extraConfig = nginxNodeProxyConfig; + "^~ /get-presigned-url".extraConfig = nginxNodeProxyConfig; + "^~ /complete-multipart-upload".extraConfig = nginxNodeProxyConfig; + "^~ /generate-presigned-url".extraConfig = nginxNodeProxyConfig; + "^~ /enable-bucket-cors".extraConfig = nginxNodeProxyConfig; + "^~ /upload".extraConfig = nginxNodeProxyConfig; }; }; }; diff --git a/pkgs/gtcm-file-uploader.nix b/pkgs/gtcm-file-uploader.nix new file mode 100644 index 0000000..5c1a955 --- /dev/null +++ b/pkgs/gtcm-file-uploader.nix @@ -0,0 +1,40 @@ +{ + fetchgit, + buildNpmPackage, + pkgs, + dataDir ? "/var/lib/gtcm-file-uploader", +}: +let + repoSrc = fetchgit { + url = "https://git.b4l.co.th/newedge/think-greaterchiangmai"; + rev = "6f8c8d7dfaf5a0c1eb2077de1d6fb35ceaf3d4ec"; + hash = "sha256-2mCdn8xGjWZrANclctGTmxQhkNc43VzlzMTVwVIFJcM="; + }; + src = "${repoSrc}/upload-large-file"; +in +buildNpmPackage { + pname = "gtcm-file-uploader"; + version = "1.0.0"; + + nativeBuildInputs = with pkgs; [ + nodejs_20 + breakpointHook + ]; + + inherit src; + + npmDepsHash = "sha256-JEp2F1CQfuV9fSYZRdRO+BiOE9dy1ReK6doJcqCuxu4="; + + buildPhase = '' + npm install + ''; + + installPhase = '' + runHook preInstall + mkdir -p $out + cp -r * $out + ln -s ${dataDir}/.env $out/.env + ln -s ${dataDir}/gtcm-file-uploader/uploads $out/src/be/uploads + runHook postInstall + ''; +} diff --git a/pkgs/overlay.nix b/pkgs/overlay.nix index d327dd3..03257f0 100644 --- a/pkgs/overlay.nix +++ b/pkgs/overlay.nix @@ -1,4 +1,5 @@ final: prev: { think-gtcm = final.callPackage ./think-gtcm.nix { }; think-backend-gtcm = final.callPackage ./think-backend-gtcm.nix { php = final.php83; }; + gtcm-file-uploader = final.callPackage ./gtcm-file-uploader.nix { }; } diff --git a/vars/per-machine/ramus/greaterchiangmai-s3/endpoint/value b/vars/per-machine/ramus/greaterchiangmai-s3/endpoint/value index f79b7e2..1b0a47b 100644 --- a/vars/per-machine/ramus/greaterchiangmai-s3/endpoint/value +++ b/vars/per-machine/ramus/greaterchiangmai-s3/endpoint/value @@ -1 +1 @@ -fsn1.your-objectstorage.com \ No newline at end of file +https://fsn1.your-objectstorage.com \ No newline at end of file