Thank you for updating. Now status panel is {{ ver }} version
+diff --git a/Dockerfile b/Dockerfile index cd67d16..71f9144 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,10 +8,12 @@ RUN groupadd -r -g 2000 status RUN useradd -u 2000 -g 2000 -m -d /home/status -s /bin/bash status && adduser status sudo WORKDIR /app +ENV VERSION 0.1.0 COPY templates templates COPY requirements.txt . COPY app.py . COPY config.json . +COPY static static RUN pip3 install -r requirements.txt ENTRYPOINT ["python3"] diff --git a/app.py b/app.py index 16d9e8a..175550f 100644 --- a/app.py +++ b/app.py @@ -12,8 +12,8 @@ from itsdangerous import URLSafeTimedSerializer, BadSignature, SignatureExpired from requests import get from flask import jsonify -from flask import make_response, send_file -from flask import Flask, Response, redirect, request, session, render_template, abort +from flask import make_response, send_file, jsonify +from flask import Flask, Response, redirect, request, session, render_template from flask_login import LoginManager, UserMixin, login_required, login_user, logout_user log = logging.getLogger(__name__) @@ -145,6 +145,30 @@ def get_ip_address(): return 'undefined' +@app.route('/update') +def update(): + from requests.structures import CaseInsensitiveDict + url = 'http://watchtower:8080/v1/update' + headers = CaseInsensitiveDict() + headers["Authorization"] = "Bearer checkUpdate" + get(url, headers=headers) + return render_template('thanks.html', ver=os.environ.get('VERSION')) + + +@app.route('/checkUpdate') +def check_update(): + now_version = client.containers.get('status').image + dh_version = client.images.pull('trydirect/status', 'latest') + need: bool = False + if now_version.id != dh_version.id: + need = True + return jsonify({ + 'now': now_version.id, + 'hub': dh_version.id, + 'upd': need, + }) + + @app.route('/') @login_required def home(): @@ -157,7 +181,7 @@ def home(): logs = ''.join([lg for lg in container.logs(tail=100, follow=False, stdout=True).decode('utf-8')]) ports = get_self_hosted_services(container.attrs['HostConfig']['PortBindings'], ip) log.debug(ports) - if container.name != 'status': + if container.name not in ['status', 'upd_watcher']: container_list.append({"name": container.name, "status": container.status, "logs": logs, "ports": ports}) try: @@ -169,7 +193,8 @@ def home(): return render_template('index.html', ip=ip, domainIp=domain_ip, can_enable=can_enable, container_list=container_list, ssl_enabled=session['ssl_enabled'], domain=config.get('domain'), apps_info=config.get('apps_info'), - panel_version='0.1.0', ip_help_link=os.environ.get('IP_HELP_LINK'), errors=config_errors) + panel_version=os.environ.get('VERSION'), ip_help_link=os.environ.get('IP_HELP_LINK'), + errors=config_errors) @app.route("/login", methods=["GET", "POST"]) diff --git a/docker-compose.yml b/docker-compose.yml index a31d569..ae00f0d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,13 +1,30 @@ version: '2.2' services: + watchtower: + image: containrrr/watchtower + container_name: upd_watcher + volumes: + - /var/run/docker.sock:/var/run/docker.sock + environment: + - WATCHTOWER_HTTP_API_TOKEN=checkUpdate + - WATCHTOWER_LABEL_ENABLE=true + - WATCHTOWER_MONITOR_ONLY=false + - WATCHTOWER_HTTP_API_METRICS=true + - WATCHTOWER_HTTP_API_PERIODIC_POLLS=false + command: --interval 25 --debug --http-api-update + ports: + - 8080:8080 statuspanel: image: trydirect/status:latest - container_name: statuspanel + #build: . + container_name: status + links: + - watchtower:watchtower ports: - "5001:5000" volumes: - - .:/app +# - .:/app - /var/run/docker.sock:/var/run/docker.sock - /data/encrypted:/data/encrypted # entrypoint: [""] @@ -16,3 +33,5 @@ services: - .env environment: - NGINX_CONTAINER=nginx + labels: + - "com.centurylinklabs.watchtower.enable=true" diff --git a/static/css/style.css b/static/css/style.css index e6b3aa8..3280ba8 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -14,16 +14,14 @@ color:#aaa; margin-bottom:0; } -.nav-buttons{ - float:right; - display:inline-block; - margin:15px 0 0 -} -a.nav-title{ - color:rgba(0,0,0,0.7); - text-decoration:none; +nav{ + background-color: transparent; + box-shadow: none } div.nav-title{ padding:10px 0; font-size:18px; } +.nav-ico{ + color: #26a69a; +} \ No newline at end of file diff --git a/static/js/tab-controller.js b/static/js/tab-controller.js index f0a8dfb..2b6b418 100644 --- a/static/js/tab-controller.js +++ b/static/js/tab-controller.js @@ -12,4 +12,22 @@ function displayTab(tabName) { } document.getElementById(tabName).style.display = "block"; +} + +function checkOnUpdate(url){ + var xhr = new XMLHttpRequest(); + xhr.open("GET", url); + + xhr.setRequestHeader("Accept", "*/*"); + xhr.onreadystatechange = function () { + if (xhr.readyState === 4) { + let r = JSON.parse(xhr.responseText); + if (r["upd"] === true) { + document.getElementById('update_crd').style.display = 'block'; + document.getElementById('notification').innerText = 'new_releases'; + document.getElementById('notifyLink').innerHTML += 'New Messages!'; + } + } + }; + xhr.send() } \ No newline at end of file diff --git a/templates/index.html b/templates/index.html index 841c94a..9c9b4b5 100644 --- a/templates/index.html +++ b/templates/index.html @@ -9,17 +9,31 @@ -
+