ui - fix example, subpath behind reverse proxy and add socket proxy rights for swarm

This commit is contained in:
florian 2021-08-07 21:56:08 +02:00
parent 0c1883472d
commit dd7d1a2c78
No known key found for this signature in database
GPG Key ID: 3D80806F12602A7C
6 changed files with 147 additions and 126 deletions

View File

@ -29,6 +29,7 @@ services:
- admin.example.com_USE_REVERSE_PROXY=yes - admin.example.com_USE_REVERSE_PROXY=yes
- admin.example.com_REVERSE_PROXY_URL=/admin/ # change it to something hard to guess - admin.example.com_REVERSE_PROXY_URL=/admin/ # change it to something hard to guess
- admin.example.com_REVERSE_PROXY_HOST=http://myui:5000/ - admin.example.com_REVERSE_PROXY_HOST=http://myui:5000/
- admin.example.com_REVERSE_PROXY_HEADERS=X-Script-Name /admin # must match REVERSE_PROXY_URL
- admin.example.com_USE_MODSECURITY=no - admin.example.com_USE_MODSECURITY=no
labels: labels:
- "bunkerized-nginx.UI" - "bunkerized-nginx.UI"
@ -54,6 +55,8 @@ services:
- /var/run/docker.sock:/var/run/docker.sock:ro - /var/run/docker.sock:/var/run/docker.sock:ro
environment: environment:
- CONTAINERS=1 - CONTAINERS=1
- SWARM=1
- SERVICES=1
volumes: volumes:
autoconf: autoconf:

View File

@ -7,12 +7,14 @@ from flask_wtf.csrf import CSRFProtect, CSRFError
from src.Instances import Instances from src.Instances import Instances
from src.User import User from src.User import User
from src.Config import Config from src.Config import Config
from src.ReverseProxied import ReverseProxied
import utils import utils
import os, json, re, copy, traceback import os, json, re, copy, traceback
# Flask app # Flask app
app = Flask(__name__, static_url_path="/", static_folder="static", template_folder="templates") app = Flask(__name__, static_url_path="/", static_folder="static", template_folder="templates")
app.wsgi_app = ReverseProxied(app.wsgi_app)
# Set variables and instantiate objects # Set variables and instantiate objects
vars = utils.get_variables() vars = utils.get_variables()
@ -50,7 +52,7 @@ def login() :
if request.method == "POST" and "username" in request.form and "password" in request.form : if request.method == "POST" and "username" in request.form and "password" in request.form :
if app.config["USER"].get_id() == request.form["username"] and app.config["USER"].check_password(request.form["password"]) : if app.config["USER"].get_id() == request.form["username"] and app.config["USER"].check_password(request.form["password"]) :
login_user(app.config["USER"]) login_user(app.config["USER"])
return redirect("/") return redirect(app.config["ABSOLUTE_URI"])
else : else :
fail = True fail = True
if fail : if fail :
@ -61,7 +63,7 @@ def login() :
@login_required @login_required
def logout() : def logout() :
logout_user() logout_user()
return redirect("/login") return redirect(app.config["ABSOLUTE_URI"] + "/login")
@app.route('/') @app.route('/')
@app.route('/home') @app.route('/home')

View File

@ -47,7 +47,6 @@ class Instances :
# Docker instances (containers or services) # Docker instances (containers or services)
if self.__docker != None : if self.__docker != None :
if self.__docker.swarm == None :
for instance in self.__docker.containers.list(all=True, filters={"label" : "bunkerized-nginx.UI"}) : for instance in self.__docker.containers.list(all=True, filters={"label" : "bunkerized-nginx.UI"}) :
id = instance.id id = instance.id
name = instance.name name = instance.name
@ -56,8 +55,8 @@ class Instances :
if instance.status == "running" : if instance.status == "running" :
status = "up" status = "up"
instances.append(self.__instance(id, name, type, status, instance)) instances.append(self.__instance(id, name, type, status, instance))
else : if self.__docker.swarm != None :
for instance in self.__docker.services.list(all=True, filters={"label" : "bunkerized-nginx.UI"}) : for instance in self.__docker.services.list(filters={"label" : "bunkerized-nginx.UI"}) :
id = instance.id id = instance.id
name = instance.name name = instance.name
type = "service" type = "service"

17
ui/src/ReverseProxied.py Normal file
View File

@ -0,0 +1,17 @@
class ReverseProxied(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
script_name = environ.get('HTTP_X_SCRIPT_NAME', '')
if script_name:
environ['SCRIPT_NAME'] = script_name
path_info = environ['PATH_INFO']
if path_info.startswith(script_name):
environ['PATH_INFO'] = path_info[len(script_name):]
scheme = environ.get('HTTP_X_SCHEME', '')
if scheme:
environ['wsgi.url_scheme'] = scheme
return self.app(environ, start_response)