From 1affc9183a5733ee652e9b01b1197adb5f553997 Mon Sep 17 00:00:00 2001 From: Doro Wu Date: Mon, 19 Aug 2019 14:07:08 +0800 Subject: [PATCH] feat: add resize endpoint to resize screen size (fix #115) --- Dockerfile | 120 +----------------- README.md | 1 + rootfs/etc/nginx/sites-enabled/default | 20 +-- rootfs/usr/local/lib/web/backend/vnc/app.py | 10 +- rootfs/usr/local/lib/web/backend/vnc/state.py | 3 + 5 files changed, 24 insertions(+), 130 deletions(-) mode change 100644 => 120000 Dockerfile diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 5c54c08..0000000 --- a/Dockerfile +++ /dev/null @@ -1,119 +0,0 @@ -# Built with arch: amd64 flavor: lxde image: ubuntu:18.04 -# -################################################################################ -# base system -################################################################################ - -FROM ubuntu:18.04 as system - - -RUN sed -i 's#http://archive.ubuntu.com/ubuntu/#mirror://mirrors.ubuntu.com/mirrors.txt#' /etc/apt/sources.list; - -# built-in packages -ENV DEBIAN_FRONTEND noninteractive -RUN apt update \ - && apt install -y --no-install-recommends software-properties-common curl apache2-utils \ - && apt update \ - && apt install -y --no-install-recommends --allow-unauthenticated \ - supervisor nginx sudo net-tools zenity xz-utils \ - dbus-x11 x11-utils alsa-utils \ - mesa-utils libgl1-mesa-dri \ - && apt autoclean -y \ - && apt autoremove -y \ - && rm -rf /var/lib/apt/lists/* -# install debs error if combine together -RUN add-apt-repository -y ppa:fcwu-tw/apps \ - && apt update \ - && apt install -y --no-install-recommends --allow-unauthenticated \ - xvfb x11vnc=0.9.16-1 \ - vim-tiny firefox chromium-browser ttf-ubuntu-font-family ttf-wqy-zenhei \ - && add-apt-repository -r ppa:fcwu-tw/apps \ - && apt autoclean -y \ - && apt autoremove -y \ - && rm -rf /var/lib/apt/lists/* - -RUN apt update \ - && apt install -y --no-install-recommends --allow-unauthenticated \ - lxde gtk2-engines-murrine gnome-themes-standard gtk2-engines-pixbuf gtk2-engines-murrine arc-theme \ - && apt autoclean -y \ - && apt autoremove -y \ - && rm -rf /var/lib/apt/lists/* - - - -# Additional packages require ~600MB -# libreoffice pinta language-pack-zh-hant language-pack-gnome-zh-hant firefox-locale-zh-hant libreoffice-l10n-zh-tw - -# tini for subreap -ARG TINI_VERSION=v0.18.0 -ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-amd64 /bin/tini -RUN chmod +x /bin/tini - -# ffmpeg -RUN apt update \ - && apt install -y --no-install-recommends --allow-unauthenticated \ - ffmpeg \ - && rm -rf /var/lib/apt/lists/* \ - && mkdir /usr/local/ffmpeg \ - && ln -s /usr/bin/ffmpeg /usr/local/ffmpeg/ffmpeg - - -# python library -COPY rootfs/usr/local/lib/web/backend/requirements.txt /tmp/ -RUN apt-get update \ - && dpkg-query -W -f='${Package}\n' > /tmp/a.txt \ - && apt-get install -y python-pip python-dev build-essential \ - && pip install setuptools wheel && pip install -r /tmp/requirements.txt \ - && dpkg-query -W -f='${Package}\n' > /tmp/b.txt \ - && apt-get remove -y `diff --changed-group-format='%>' --unchanged-group-format='' /tmp/a.txt /tmp/b.txt | xargs` \ - && apt-get autoclean -y \ - && apt-get autoremove -y \ - && rm -rf /var/lib/apt/lists/* \ - && rm -rf /var/cache/apt/* /tmp/a.txt /tmp/b.txt - - -################################################################################ -# builder -################################################################################ -FROM ubuntu:18.04 as builder - - - -RUN apt-get update \ - && apt-get install -y --no-install-recommends curl ca-certificates gnupg patch - -# nodejs -RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - \ - && apt-get install -y nodejs - -# yarn -RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ - && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \ - && apt-get update \ - && apt-get install -y yarn - -# build frontend -COPY web /src/web -RUN cd /src/web \ - && yarn \ - && yarn build - - - -################################################################################ -# merge -################################################################################ -FROM system -LABEL maintainer="fcwu.tw@gmail.com" - -COPY --from=builder /src/web/dist/ /usr/local/lib/web/frontend/ -COPY rootfs / -RUN ln -sf /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 - -EXPOSE 80 -WORKDIR /root -ENV HOME=/home/ubuntu \ - SHELL=/bin/bash -HEALTHCHECK --interval=30s --timeout=5s CMD curl --fail http://127.0.0.1:6079/api/health -ENTRYPOINT ["/startup.sh"] diff --git a/Dockerfile b/Dockerfile new file mode 120000 index 0000000..0fc2233 --- /dev/null +++ b/Dockerfile @@ -0,0 +1 @@ +Dockerfile.amd64 \ No newline at end of file diff --git a/README.md b/README.md index 80752fb..82b1620 100644 --- a/README.md +++ b/README.md @@ -146,6 +146,7 @@ Troubleshooting and FAQ 3. Autostart, https://github.com/fcwu/docker-ubuntu-vnc-desktop/issues/85 4. x11vnc arguments(multiptr), https://github.com/fcwu/docker-ubuntu-vnc-desktop/issues/101 5. firefox/chrome crash (/dev/shm), https://github.com/fcwu/docker-ubuntu-vnc-desktop/issues/112 +6. resize display size without destroying container, https://github.com/fcwu/docker-ubuntu-vnc-desktop/issues/115#issuecomment-522426037 License ================== diff --git a/rootfs/etc/nginx/sites-enabled/default b/rootfs/etc/nginx/sites-enabled/default index fd0f442..7b7e538 100644 --- a/rootfs/etc/nginx/sites-enabled/default +++ b/rootfs/etc/nginx/sites-enabled/default @@ -13,12 +13,21 @@ server { root /usr/local/lib/web/frontend/; index index.html index.htm; - location /api/ { + location ~ /api/ { try_files $uri @api; } + location ~ /resize$ { + try_files $uri @api; + } + + #_RELATIVE_URL_ROOT_location /_RELATIVE_URL_ROOT_/ { + #_RELATIVE_URL_ROOT_ rewrite /_RELATIVE_URL_ROOT_/(.*) /$1 break; + #_RELATIVE_URL_ROOT_ root /usr/local/lib/web/frontend/; + #_RELATIVE_URL_ROOT_} + location ~ /websockify$ { - #_RELATIVE_URL_ROOT_rewrite /_RELATIVE_URL_ROOT_/(.*) $1 last; + #_RELATIVE_URL_ROOT_rewrite /_RELATIVE_URL_ROOT_/(.*) $1 break; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; @@ -30,17 +39,12 @@ server { } location @api { - #_RELATIVE_URL_ROOT_rewrite /_RELATIVE_URL_ROOT_/(.*) $1 last; + #_RELATIVE_URL_ROOT_rewrite /_RELATIVE_URL_ROOT_/(.*) $1 break; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; proxy_pass http://127.0.0.1:6079; max_ranges 0; } - - #_RELATIVE_URL_ROOT_location /_RELATIVE_URL_ROOT_/ { - #_RELATIVE_URL_ROOT_ rewrite /_RELATIVE_URL_ROOT_/(.*) /$1 last; - #_RELATIVE_URL_ROOT_ root /usr/local/lib/web/frontend/; - #_RELATIVE_URL_ROOT_} } diff --git a/rootfs/usr/local/lib/web/backend/vnc/app.py b/rootfs/usr/local/lib/web/backend/vnc/app.py index d0a434d..753e4e4 100644 --- a/rootfs/usr/local/lib/web/backend/vnc/app.py +++ b/rootfs/usr/local/lib/web/backend/vnc/app.py @@ -9,7 +9,6 @@ from flask import ( Response, jsonify, abort, - url_for, ) from gevent import subprocess as gsp, spawn, sleep from geventwebsocket.exceptions import WebSocketError @@ -28,7 +27,6 @@ app.config.from_object(os.environ.get('CONFIG') or 'config.Development') @app.route('/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() @@ -40,7 +38,6 @@ def apistate(): @app.route('/api/health') def apihealth(): - print(url_for("apihealth")) if state.health: return 'success' abort(503, 'unhealthy') @@ -71,6 +68,13 @@ def reset(): return jsonify({'code': 200}) +@app.route('/resize') +@httperror +def apiresize(): + state.reset_size() + return '' + + @app.route('/api/live.flv') @httperror def liveflv(): diff --git a/rootfs/usr/local/lib/web/backend/vnc/state.py b/rootfs/usr/local/lib/web/backend/vnc/state.py index 88eea50..8f08a3b 100644 --- a/rootfs/usr/local/lib/web/backend/vnc/state.py +++ b/rootfs/usr/local/lib/web/backend/vnc/state.py @@ -113,6 +113,9 @@ class State(object): except gsp.CalledProcessError as e: log.warn('failed to get dispaly size: ' + str(e)) + def reset_size(self): + self.size_changed_count = 0 + @property def w(self): return self._w