From 175d7a8517f1c9d7b1fe0d7da8dd1428a82a34bc Mon Sep 17 00:00:00 2001 From: Tobias Stein Date: Wed, 26 Jun 2019 11:56:29 +0200 Subject: [PATCH] Add ENV variable PREFIX_PATH to backend and web project --- Dockerfile | 2 +- image/etc/nginx/sites-enabled/default | 12 ++++++++++-- image/etc/supervisor/conf.d/supervisord.conf | 12 ++++++++---- image/startup.sh | 4 ++-- image/usr/local/lib/web/backend/vnc/app.py | 16 ++++++++++------ web/config/dev.env.js | 3 ++- web/config/index.js | 6 ++++-- web/config/prod.env.js | 3 ++- web/src/components/Vnc.vue | 12 +++++++----- web/src/router/index.js | 4 +++- 10 files changed, 49 insertions(+), 25 deletions(-) diff --git a/Dockerfile b/Dockerfile index b6be35f..030542a 120000 --- a/Dockerfile +++ b/Dockerfile @@ -94,7 +94,7 @@ RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ && apt-get update \ && apt-get install -y yarn -ENV PREFIX_PATH = "APP" +ENV PREFIX_PATH "/app" # build frontend COPY web /src/web diff --git a/image/etc/nginx/sites-enabled/default b/image/etc/nginx/sites-enabled/default index 718e553..6f785b9 100644 --- a/image/etc/nginx/sites-enabled/default +++ b/image/etc/nginx/sites-enabled/default @@ -13,11 +13,19 @@ server { root /usr/local/lib/web/frontend/; index index.html index.htm; - location ~ ^/APP/api { + location = /app { + try_files $uri @rewrites; + } + + location @rewrites { + rewrite ^(.+)$ /index.html last; + } + + location ~ ^/app/api { try_files $uri @api; } - location = /APP/websockify { + location = /app/websockify { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; diff --git a/image/etc/supervisor/conf.d/supervisord.conf b/image/etc/supervisor/conf.d/supervisord.conf index 2b538da..61e850f 100644 --- a/image/etc/supervisor/conf.d/supervisord.conf +++ b/image/etc/supervisor/conf.d/supervisord.conf @@ -7,6 +7,10 @@ directory=/root [program:nginx] priority=10 command=nginx -c /etc/nginx/nginx.conf -g 'daemon off;' +stdout_logfile=/dev/fd/1 +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/fd/1 +stderr_logfile_maxbytes=0 [program:web] priority=10 @@ -41,8 +45,6 @@ user=%USER% environment=DISPLAY=":1",HOME="%HOME%",USER="%USER%" - - [program:xvfb] priority=10 command=/usr/local/bin/xvfb.sh @@ -52,8 +54,10 @@ stopsignal=KILL priority=20 command=x11vnc -display :1 -xkb -forever -shared -repeat + [program:novnc] priority=25 -directory=/usr/local/lib/web/frontend/static/novnc -command=bash /usr/local/lib/web/frontend/static/novnc/utils/launch.sh --listen 6081 +directory=/usr/local/lib/web/frontend%(ENV_PREFIX_PATH)s/static/novnc +command=bash /usr/local/lib/web/frontend%(ENV_PREFIX_PATH)s/static/novnc/utils/launch.sh --listen 6081 stopasgroup=true + diff --git a/image/startup.sh b/image/startup.sh index 875519d..539490a 100755 --- a/image/startup.sh +++ b/image/startup.sh @@ -60,8 +60,8 @@ if [ -n "$HTTP_PASSWORD" ]; then fi # novnc websockify -ln -s /usr/local/lib/web/frontend/static/websockify /usr/local/lib/web/frontend/static/novnc/utils/websockify -chmod +x /usr/local/lib/web/frontend/static/websockify/run +ln -s "/usr/local/lib/web/frontend$PREFIX_PATH/static/websockify" "/usr/local/lib/web/frontend$PREFIX_PATH/static/novnc/utils/websockify" +chmod +x "/usr/local/lib/web/frontend$PREFIX_PATH/static/websockify/run" # clearup PASSWORD= diff --git a/image/usr/local/lib/web/backend/vnc/app.py b/image/usr/local/lib/web/backend/vnc/app.py index 40f8d5a..eed936b 100644 --- a/image/usr/local/lib/web/backend/vnc/app.py +++ b/image/usr/local/lib/web/backend/vnc/app.py @@ -2,13 +2,14 @@ from __future__ import ( absolute_import, division, print_function, with_statement ) import re -from os import environ +import os from flask import ( Flask, request, Response, jsonify, abort, + url_for, ) from gevent import subprocess as gsp, spawn, sleep from geventwebsocket.exceptions import WebSocketError @@ -21,12 +22,14 @@ from .log import log # Flask app app = Flask('novnc2') app.config.from_object('config.Default') -app.config.from_object(environ.get('CONFIG') or 'config.Development') +app.config.from_object(os.environ.get('CONFIG') or 'config.Development') +PREFIX = os.getenv("PREFIX_PATH") -@app.route('/api/state') +@app.route(PREFIX+'/api/state') @httperror def apistate(): + print(url_for("apistate")) state.wait(int(request.args.get('id', -1)), 30) state.switch_video(request.args.get('video', 'false') == 'true') mystate = state.to_dict() @@ -36,14 +39,15 @@ def apistate(): }) -@app.route('/api/health') +@app.route(PREFIX+'/api/health') def apihealth(): + print(url_for("apihealth")) if state.health: return 'success' abort(503, 'unhealthy') -@app.route('/api/reset') +@app.route(PREFIX+'/api/reset') def reset(): if 'w' in request.args and 'h' in request.args: args = { @@ -68,7 +72,7 @@ def reset(): return jsonify({'code': 200}) -@app.route('/api/live.flv') +@app.route(PREFIX+'/api/live.flv') @httperror def liveflv(): def generate(): diff --git a/web/config/dev.env.js b/web/config/dev.env.js index 1e22973..58376c3 100644 --- a/web/config/dev.env.js +++ b/web/config/dev.env.js @@ -3,5 +3,6 @@ const merge = require('webpack-merge') const prodEnv = require('./prod.env') module.exports = merge(prodEnv, { - NODE_ENV: '"development"' + NODE_ENV: '"development"', + PREFIX_PATH: '"/app"' }) diff --git a/web/config/index.js b/web/config/index.js index f363a2e..d74e596 100644 --- a/web/config/index.js +++ b/web/config/index.js @@ -5,7 +5,9 @@ const path = require('path') const BACKEND = process.env.BACKEND || 'http://127.0.0.1:6080' -const PREFIX_PATH = process.env.PREFIX_PATH +const PREFIX_PATH = process.env.PREFIX_PATH || '/app' + +console.log(`within /config/index.js: ${process.env.PREFIX_PATH}`) const api_key = `${PREFIX_PATH}/api` const websockify_key = `${PREFIX_PATH}/websockfiy` @@ -67,7 +69,7 @@ module.exports = { // Paths assetsRoot: path.resolve(__dirname, '../dist'), - assetsSubDirectory: 'static', + assetsSubDirectory: PREFIX_PATH.substr(1)+'/static', assetsPublicPath: '/', /** diff --git a/web/config/prod.env.js b/web/config/prod.env.js index a6f9976..e865d72 100644 --- a/web/config/prod.env.js +++ b/web/config/prod.env.js @@ -1,4 +1,5 @@ 'use strict' module.exports = { - NODE_ENV: '"production"' + NODE_ENV: '"production"', + PREFIX_PATH: '"/app"' } diff --git a/web/src/components/Vnc.vue b/web/src/components/Vnc.vue index 12f5042..fcaf9e5 100644 --- a/web/src/components/Vnc.vue +++ b/web/src/components/Vnc.vue @@ -56,7 +56,7 @@ export default { 'h': h } try { - const response = await this.$http.get(process.env.PREFIX_PATH + '/api/state', {params: params}) + const response = await this.$http.get(`${process.env.PREFIX_PATH}` + '/api/state', {params: params}) const body = response.data if (body.code !== 200) { this.stateErrorCount += 1 @@ -71,7 +71,7 @@ export default { // adaptive resolution if (!body.data.config.fixedResolution && body.data.config.sizeChangedCount === 0) { - const response = await this.$http.get(process.env.PREFIX_PATH + '/api/reset', {params: params}) + const response = await this.$http.get(`${process.env.PREFIX_PATH}` + '/api/reset', {params: params}) const body = response.data if (body.code !== 200) { this.stateErrorCount += 1 @@ -136,7 +136,9 @@ export default { // console.trace() console.log(`connecting...`) this.errorMessage = '' - let websockifyPath = process.env.PREFIX_PATH + '/websockify' + let prefixName = `${process.env.PREFIX_PATH}`.substr(1) + console.log(prefixName) + let websockifyPath = prefixName + '/websockify' if (force || this.vncState === 'stopped') { this.vncState = 'connecting' let hostname = window.location.hostname @@ -144,7 +146,7 @@ export default { if (!port) { port = window.location.protocol[4] === 's' ? 443 : 80 } - let url = 'static/vnc.html?' + let url = prefixName + '/static/vnc.html?' url += 'autoconnect=1&' url += `host=${hostname}&port=${port}&` url += `path=${websockifyPath}&title=novnc2&` @@ -155,7 +157,7 @@ export default { if (force || this.videoState === 'stopped') { const w = this.$refs.vncFrame.clientWidth const h = this.$refs.vncFrame.clientHeight - let url = `static/video.html?width=${w}&height=${h}&base=${window.location.host}` + let url = prefixName + `/static/video.html?width=${w}&height=${h}&base=${window.location.host}` this.$refs.videoFrame.setAttribute('src', url) this.videoState = 'connecting' } diff --git a/web/src/router/index.js b/web/src/router/index.js index 21e095f..f1156f1 100644 --- a/web/src/router/index.js +++ b/web/src/router/index.js @@ -4,9 +4,11 @@ import Vnc from '@/components/Vnc' Vue.use(Router) +console.log(`within (router) /src/index.js: ${process.env.PREFIX_PATH}`) + export default new Router({ mode: 'history', - base: process.env.PREFIX_PATH, + base: `${process.env.PREFIX_PATH}`, routes: [ { path: '/',