From 3d4402c88cf2f4b8fa42575899c897d24f4f60a4 Mon Sep 17 00:00:00 2001 From: "n.siegfried" Date: Mon, 15 Jun 2026 10:46:35 -0700 Subject: [PATCH] Switch feedback reverse proxy from IIS to NGINX - Add nginx-wp-suite.conf: static site + /api/feedback proxy to the Power Automate trigger (SNI on, Host header, POST-only, body cap) - Remove IIS web.config - Update feedback-config.js comment and DEPLOYMENT.md to the NGINX setup Co-Authored-By: Claude Opus 4.8 (1M context) --- DEPLOYMENT.md | 31 ++++++++++++-------- favicon.ico | Bin 0 -> 21552 bytes feedback-config.js | 10 +++---- index.html | 1 + nginx-wp-suite.conf | 56 ++++++++++++++++++++++++++++++++++++ web.config | 62 ---------------------------------------- work-package-suite.html | 1 + wp-creation-index.html | 1 + 8 files changed, 83 insertions(+), 79 deletions(-) create mode 100644 favicon.ico create mode 100644 nginx-wp-suite.conf delete mode 100644 web.config diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md index d95c81a..a13c522 100644 --- a/DEPLOYMENT.md +++ b/DEPLOYMENT.md @@ -78,20 +78,27 @@ app.listen(8080); Each line of `feedback.jsonl` is one submission; download it anytime. (PHP/ Python/ASP.NET equivalents are a few lines too.) -#### Option B — Internal IIS reverse proxy → Power Automate (the chosen setup) +#### Option B — Internal NGINX reverse proxy → Power Automate (the chosen setup) -The browser posts to a **same-origin** path `/api/feedback`; IIS forwards that to -the Power Automate trigger. This avoids CORS entirely and keeps the secret +The browser posts to a **same-origin** path `/api/feedback`; NGINX forwards that +to the Power Automate trigger. This avoids CORS entirely and keeps the secret trigger URL off the client. `FEEDBACK_ENDPOINT` is already set to -`/api/feedback`, and [`web.config`](web.config) contains the proxy rule. +`/api/feedback`, and [`nginx-wp-suite.conf`](nginx-wp-suite.conf) contains the +full server block. -**On the IIS box (one-time, server admin):** -1. Install the **URL Rewrite** and **Application Request Routing (ARR)** modules. -2. Enable the proxy: IIS Manager → server node → *Application Request Routing - Cache* → *Server Proxy Settings* → check **Enable proxy**. -3. Bind the site to **HTTPS** with an internal certificate. -4. In `web.config`, replace `POWER_AUTOMATE_TRIGGER_URL` with the real trigger - URL (write every `&` as `&`). +**On the NGINX box (one-time, server admin):** +1. Copy the project files to the web root (e.g. `/var/www/wp-suite`). +2. Install [`nginx-wp-suite.conf`](nginx-wp-suite.conf) (e.g. into + `/etc/nginx/conf.d/`), and set `server_name`, the `ssl_certificate` paths + (internal cert), and the `root`. +3. In the `location = /api/feedback` block, replace the `proxy_pass` URL and the + `Host` header with your real trigger URL / region host (keep the full query + string incl. `sig=`). +4. `sudo nginx -t && sudo systemctl reload nginx`. + +> Two NGINX details that matter: `proxy_ssl_server_name on;` (SNI is required for +> `*.logic.azure.com` or the TLS handshake fails) and the `Host` header set to +> the Azure region host. Both are already in the provided config. **In Power Automate:** 1. Create a flow with the **"When an HTTP request is received"** trigger. @@ -126,7 +133,7 @@ trigger URL off the client. `FEEDBACK_ENDPOINT` is already set to (`POWER_AUTOMATE_TRIGGER_URL`). 5. A Power App (or just the list/Excel) reads that store to show live comments. -Chain: `browser → /api/feedback (IIS proxy) → Power Automate → SharePoint/Dataverse → Power App`. +Chain: `browser → /api/feedback (NGINX proxy) → Power Automate → SharePoint/Dataverse → Power App`. The "downloadable file" is then just the Excel/SharePoint list, viewable live or exported — all inside your corporate cloud. diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9c36420d72b646c180889af643550dc219ac30bc GIT binary patch literal 21552 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 a86HpQ|C4ok|De0^8^>fm-2MLo3I7A_cL9L_ literal 0 HcmV?d00001 diff --git a/feedback-config.js b/feedback-config.js index 4879a34..24bcbdd 100644 --- a/feedback-config.js +++ b/feedback-config.js @@ -16,11 +16,11 @@ Leave it as an empty string to stay fully local (export/import only). See DEPLOYMENT.md for setup details and sample receivers. - This is set to the same-origin path '/api/feedback', which the IIS reverse - proxy (see web.config) forwards to the Power Automate HTTP trigger. Keeping it - relative means no CORS and the secret trigger URL never appears in client - code. Locally (no proxy) the POST simply fails silently and feedback is still - saved/exported from the browser. + This is set to the same-origin path '/api/feedback', which the NGINX reverse + proxy (see nginx-wp-suite.conf) forwards to the Power Automate HTTP trigger. + Keeping it relative means no CORS and the secret trigger URL never appears in + client code. Locally (no proxy) the POST simply fails silently and feedback is + still saved/exported from the browser. ────────────────────────────────────────────────────────────────────────── */ window.FEEDBACK_ENDPOINT = '/api/feedback'; diff --git a/index.html b/index.html index 8c680fe..1ef63a8 100644 --- a/index.html +++ b/index.html @@ -4,6 +4,7 @@ Work Package Suite — Prime Controls +