feat: Replace websockify by nginx (#340)

This commit is contained in:
Kroese 2024-01-17 19:51:22 +01:00 committed by GitHub
parent d1e289eb12
commit a19b245b1e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 94 additions and 36 deletions

View file

@ -10,6 +10,7 @@ RUN apt-get update \
wget \ wget \
ovmf \ ovmf \
socat \ socat \
nginx \
procps \ procps \
iptables \ iptables \
iproute2 \ iproute2 \
@ -20,10 +21,18 @@ RUN apt-get update \
ca-certificates \ ca-certificates \
netcat-openbsd \ netcat-openbsd \
qemu-system-x86 \ qemu-system-x86 \
&& novnc="v1.4.0" \
&& wget https://github.com/novnc/noVNC/archive/refs/tags/$novnc.tar.gz -O /tmp/novnc.tar.gz -q \
&& tar -xf /tmp/novnc.tar.gz -C /tmp/ \
&& cd /tmp/noVNC-$novnc \
&& mkdir -p /usr/share/novnc \
&& mv app core vendor package.json *.html /usr/share/novnc \
&& apt-get clean \ && apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
COPY ./src /run/ COPY ./src /run/
COPY nginx.conf /etc/nginx/sites-enabled/novnc.conf
RUN chmod +x /run/*.sh RUN chmod +x /run/*.sh
VOLUME /storage VOLUME /storage

View file

@ -1,22 +1,20 @@
version: "3" version: "3"
services: services:
qemu: qemu:
container_name: qemu container_name: qemu
image: qemux/qemu-docker:latest image: qemux/qemu-docker
environment: environment:
DISPLAY: "vnc" RAM_SIZE: "1G"
RAM_SIZE: "1G" CPU_CORES: "1"
CPU_CORES: "1" DISK_SIZE: "16G"
DISK_SIZE: "16G" BOOT: "https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/x86_64/alpine-virt-3.19.0-x86_64.iso"
BOOT: "https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/x86_64/alpine-virt-3.19.0-x86_64.iso" devices:
devices: - /dev/kvm
- /dev/kvm device_cgroup_rules:
device_cgroup_rules: - 'c *:* rwm'
- 'c *:* rwm' cap_add:
cap_add: - NET_ADMIN
- NET_ADMIN ports:
ports: - 8006:8006
- 2222:22 stop_grace_period: 2m
- 5900:5900 restart: unless-stopped
stop_grace_period: 2m
restart: unless-stopped

49
nginx.conf Normal file
View file

@ -0,0 +1,49 @@
server {
listen 8006 default_server;
listen [::]:8006 default_server;
autoindex on;
server_name _;
tcp_nodelay on;
server_tokens off;
error_log /dev/null;
access_log /dev/null;
include /etc/nginx/mime.types;
location / {
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 5;
gzip_min_length 500;
gzip_disable "msie6";
gzip_types text/css text/javascript text/xml text/plain text/x-component application/javascript application/json application/xml application/rss+xml font/truetype font/opentype application/vnd.ms-fontobject image/svg+xml;
add_header Cache-Control "no-cache";
root /usr/share/novnc;
index vnc.html;
if ($request_uri = "/") {
return 301 /?resize=scale&autoconnect=true;
}
}
location /websockify {
proxy_pass http://127.0.0.1:5700/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_read_timeout 61s;
proxy_connect_timeout 61s;
proxy_send_timeout 61s;
}
}

View file

@ -1,4 +1,4 @@
<h1 align="center">QEMU in Docker<br /> <h1 align="center">QEMU<br />
<div align="center"> <div align="center">
<img src="https://github.com/qemus/qemu-docker/raw/master/.github/logo.png" title="Logo" style="max-width:100%;" width="128" /> <img src="https://github.com/qemus/qemu-docker/raw/master/.github/logo.png" title="Logo" style="max-width:100%;" width="128" />
</div> </div>
@ -32,15 +32,13 @@ services:
container_name: qemu container_name: qemu
image: qemux/qemu-docker image: qemux/qemu-docker
environment: environment:
DISPLAY: "vnc"
BOOT: "https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/x86_64/alpine-virt-3.19.0-x86_64.iso" BOOT: "https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/x86_64/alpine-virt-3.19.0-x86_64.iso"
devices: devices:
- /dev/kvm - /dev/kvm
cap_add: cap_add:
- NET_ADMIN - NET_ADMIN
ports: ports:
- 2222:22 - 8006:8006
- 5900:5900
stop_grace_period: 2m stop_grace_period: 2m
restart: unless-stopped restart: unless-stopped
``` ```
@ -48,7 +46,7 @@ services:
Via `docker run` Via `docker run`
```bash ```bash
docker run -it --rm -e "DISPLAY=vnc" -e "BOOT=http://example.com/image.iso" -p 5900:5900 --device=/dev/kvm --cap-add NET_ADMIN qemux/qemu-docker docker run -it --rm -e "BOOT=http://example.com/image.iso" -p 8006:8006 --device=/dev/kvm --cap-add NET_ADMIN qemux/qemu-docker
``` ```
## FAQ ## FAQ
@ -166,7 +164,7 @@ docker run -it --rm -e "DISPLAY=vnc" -e "BOOT=http://example.com/image.iso" -p 5
Please note that in this mode, the container and the VM will each have their own separate IPs. The container will keep the macvlan IP, and the VM will be reachable via the DHCP IP. Please note that in this mode, the container and the VM will each have their own separate IPs. The container will keep the macvlan IP, and the VM will be reachable via the DHCP IP.
* ### How do I pass-through a disk? * ### How do I pass-through a disk?
It is possible to pass-through disk devices directly by adding them to your compose file in this way: It is possible to pass-through disk devices directly by adding them to your compose file in this way:

View file

@ -3,20 +3,22 @@ set -Eeuo pipefail
# Docker environment variables # Docker environment variables
: "${GPU:="N"}" # GPU passthrough : "${GPU:="N"}" # GPU passthrough
: "${DISPLAY:="none"}" # Display type : "${VGA:="virtio"}" # VGA adaptor
: "${DISPLAY:="web"}" # Display type
case "${DISPLAY,,}" in case "${DISPLAY,,}" in
vnc) vnc)
DISPLAY_OPTS="-display vnc=:0 -vga virtio" DISPLAY_OPTS="-display vnc=:0 -vga $VGA"
;; ;;
web) web)
addPackage "novnc" "web-based VNC client" DISPLAY_OPTS="-display vnc=:0,websocket=5700 -vga $VGA"
ln -sfn /usr/share/novnc/vnc_lite.html /usr/share/novnc/index.html ;;
DISPLAY_OPTS="-display vnc=:0 -vga virtio" none)
DISPLAY_OPTS="-display none -vga none"
;; ;;
*) *)
DISPLAY_OPTS="-display $DISPLAY -vga none" DISPLAY_OPTS="-display $DISPLAY -vga $VGA"
;; ;;
esac esac
@ -24,8 +26,10 @@ if [[ "$GPU" != [Yy1]* ]] || [[ "$ARCH" != "amd64" ]]; then
return 0 return 0
fi fi
DISPLAY_OPTS="-display egl-headless,rendernode=/dev/dri/renderD128 -vga virtio" DISPLAY_OPTS="-display egl-headless,rendernode=/dev/dri/renderD128 -vga $VGA"
[[ "${DISPLAY,,}" == "vnc" || "${DISPLAY,,}" == "web" ]] && DISPLAY_OPTS="$DISPLAY_OPTS -vnc :0"
[[ "${DISPLAY,,}" == "vnc" ]] && DISPLAY_OPTS="$DISPLAY_OPTS -vnc :0"
[[ "${DISPLAY,,}" == "web" ]] && DISPLAY_OPTS="$DISPLAY_OPTS -vnc :0,websocket=5700"
[ ! -d /dev/dri ] && mkdir -m 755 /dev/dri [ ! -d /dev/dri ] && mkdir -m 755 /dev/dri

View file

@ -18,7 +18,7 @@ cd /run
trap - ERR trap - ERR
if [[ "${DISPLAY,,}" == "web" ]]; then if [[ "${DISPLAY,,}" == "web" ]]; then
websockify -D --web /usr/share/novnc/ 8006 localhost:5900 2>/dev/null nginx -e stderr
fi fi
info "Booting image using $VERS..." info "Booting image using $VERS..."