From 0d96852947f2d6bc8514c0ea14bd3f105050230e Mon Sep 17 00:00:00 2001 From: njomac Date: Tue, 28 Jul 2026 16:57:49 +0200 Subject: [PATCH] fix: Web GUI je vracao 404 iza nginx prefiksa Flask slusa na rootu, a nginx ga proxira na ${GUI_PATH} (/guacadmin/). Bez SCRIPT_NAME-a svi redirecti i url_for pozivi generirali su putanje izvan prefiksa - / je redirectao na /login, sto nginx ne poznaje, pa je GUI bio potpuno nedostupan (404 odmah nakon otvaranja). Dodan PrefixMiddleware koji postavlja SCRIPT_NAME iz nove GUI_PATH env varijable; systemd unit je sad prosljedjuje. Isto primijenjeno na webgui/app.py i na inline kopiju u install.sh. Provjereno: /guacadmin/ -> /guacadmin/login -> login -> /guacadmin/dashboard (200), svi navigacijski linkovi ostaju pod prefiksom. Co-Authored-By: Claude Opus 5 --- install.sh | 23 +++++++++++++++++++++++ webgui/app.py | 22 ++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/install.sh b/install.sh index 9ffa9ad..1cdf6a3 100755 --- a/install.sh +++ b/install.sh @@ -644,6 +644,28 @@ NGINX_CONFS = ['/etc/nginx/sites-available/guacamole', app = Flask(__name__, template_folder='templates') app.secret_key = os.environ.get('SECRET_KEY', secrets.token_hex(32)) + +class PrefixMiddleware: + """Nginx proxira GUI_PATH (npr. /guacadmin/) na Flask koji slusa na + rootu. Bez SCRIPT_NAME-a url_for i redirecti generiraju putanje izvan + prefiksa (/login umjesto /guacadmin/login) i nginx vraca 404.""" + + def __init__(self, wsgi_app, prefix=''): + self.wsgi_app = wsgi_app + prefix = (prefix or '').strip('/') + self.prefix = '/' + prefix if prefix else '' + + def __call__(self, environ, start_response): + if self.prefix: + environ['SCRIPT_NAME'] = self.prefix + path = environ.get('PATH_INFO', '') + if path.startswith(self.prefix): + environ['PATH_INFO'] = path[len(self.prefix):] or '/' + return self.wsgi_app(environ, start_response) + + +app.wsgi_app = PrefixMiddleware(app.wsgi_app, os.environ.get('GUI_PATH', '')) + def load_config(): if os.path.exists(CONFIG_FILE): with open(CONFIG_FILE) as f: @@ -1713,6 +1735,7 @@ User=root WorkingDirectory=${WEBGUI_DIR} Environment=PORT=${GUI_PORT} Environment=SECRET_KEY=${GUI_SECRET} +Environment=GUI_PATH=${GUI_PATH} ExecStart=${WEBGUI_DIR}/venv/bin/python3 ${WEBGUI_DIR}/app.py Restart=on-failure RestartSec=5 diff --git a/webgui/app.py b/webgui/app.py index a4ac67f..7b2e458 100644 --- a/webgui/app.py +++ b/webgui/app.py @@ -24,6 +24,28 @@ SELFSIGNED_DIR = '/etc/ssl/guacamole' app = Flask(__name__, template_folder='templates') app.secret_key = os.environ.get('SECRET_KEY', secrets.token_hex(32)) + +class PrefixMiddleware: + """Nginx proxira GUI_PATH (npr. /guacadmin/) na Flask koji slusa na + rootu. Bez SCRIPT_NAME-a url_for i redirecti generiraju putanje izvan + prefiksa (/login umjesto /guacadmin/login) i nginx vraca 404.""" + + def __init__(self, wsgi_app, prefix=''): + self.wsgi_app = wsgi_app + prefix = (prefix or '').strip('/') + self.prefix = '/' + prefix if prefix else '' + + def __call__(self, environ, start_response): + if self.prefix: + environ['SCRIPT_NAME'] = self.prefix + path = environ.get('PATH_INFO', '') + if path.startswith(self.prefix): + environ['PATH_INFO'] = path[len(self.prefix):] or '/' + return self.wsgi_app(environ, start_response) + + +app.wsgi_app = PrefixMiddleware(app.wsgi_app, os.environ.get('GUI_PATH', '')) + # ── helpers ────────────────────────────────────────────────────────────────── def load_config():