Compare commits

...

10 Commits
v4.05 ... v4.09

Author SHA1 Message Date
Kroese
bca8cb6817 build: Update qemu-docker to v6.13 (#1010) 2025-01-15 23:45:30 +01:00
ncheng89
d9c7983bb5 feat: Support more shared directories (#987)
* Support more shared directories

Control the sharing of more directories through environment variables instead of hard-coding more shared directories
2025-01-08 15:55:17 +01:00
James Nguyen
28f6e9c76b feat: Allow symlinks in shared folder (#1001) 2025-01-08 15:38:51 +01:00
Kroese
1081855571 feat: Update download links (#996) 2025-01-06 19:26:45 +01:00
Kroese
57193b0f59 fix: Follow download redirects (#981) 2024-12-20 18:32:26 +01:00
Kroese
6825b6a45a fix: Update download links (#980) 2024-12-20 15:43:37 +01:00
Kroese
c82725ec61 docs: Readme (#958) 2024-12-06 11:19:42 +01:00
Kroese
1f0cdc9bd1 build: Update qemu-docker to v6.11 (#946) 2024-12-03 12:12:47 +01:00
Kilian von Pflugk
9654a945fb docs: Add TUN device (#940) 2024-12-01 17:07:23 +01:00
renovate[bot]
a4fdfbdf91 chore(deps): update qemux/qemu-docker docker tag to v6.10 (#929) 2024-11-26 20:16:47 +01:00
7 changed files with 105 additions and 58 deletions

View File

@@ -1,7 +1,7 @@
ARG VERSION_ARG="latest" ARG VERSION_ARG="latest"
FROM scratch AS build-amd64 FROM scratch AS build-amd64
COPY --from=qemux/qemu-docker:6.09 / / COPY --from=qemux/qemu-docker:6.13 / /
ARG DEBCONF_NOWARNINGS="yes" ARG DEBCONF_NOWARNINGS="yes"
ARG DEBIAN_FRONTEND="noninteractive" ARG DEBIAN_FRONTEND="noninteractive"
@@ -29,8 +29,7 @@ RUN set -eu && \
COPY --chmod=755 ./src /run/ COPY --chmod=755 ./src /run/
COPY --chmod=755 ./assets /run/assets COPY --chmod=755 ./assets /run/assets
ADD --chmod=755 https://raw.githubusercontent.com/christgau/wsdd/v0.8/src/wsdd.py /usr/sbin/wsdd ADD --chmod=664 https://github.com/qemus/virtiso-whql/releases/download/v1.9.44-0/virtio-win-1.9.44.tar.xz /drivers.txz
ADD --chmod=664 https://github.com/qemus/virtiso-whql/releases/download/v1.9.43-0/virtio-win-1.9.43.tar.xz /drivers.txz
FROM dockurr/windows-arm:${VERSION_ARG} AS build-arm64 FROM dockurr/windows-arm:${VERSION_ARG} AS build-arm64
FROM build-${TARGETARCH} FROM build-${TARGETARCH}

View File

@@ -6,6 +6,7 @@ services:
VERSION: "11" VERSION: "11"
devices: devices:
- /dev/kvm - /dev/kvm
- /dev/net/tun
cap_add: cap_add:
- NET_ADMIN - NET_ADMIN
ports: ports:

View File

@@ -1,10 +1,11 @@
---
apiVersion: v1 apiVersion: v1
kind: PersistentVolumeClaim kind: PersistentVolumeClaim
metadata: metadata:
name: windows-pvc name: windows-pvc
spec: spec:
accessModes: accessModes:
- ReadWriteOnce - ReadWriteOnce
resources: resources:
requests: requests:
storage: 64Gi storage: 64Gi
@@ -16,59 +17,61 @@ metadata:
labels: labels:
name: windows name: windows
spec: spec:
terminationGracePeriodSeconds: 120 # the Kubernetes default is 30 seconds and it may be not enough
containers: containers:
- name: windows - name: windows
image: dockurr/windows image: dockurr/windows
ports: env:
- containerPort: 8006 - name: VERSION
protocol: TCP value: "11"
- containerPort: 3389 - name: RAM_SIZE
protocol: TCP value: "4G"
- containerPort: 3389 - name: CPU_CORES
protocol: UDP value: "2"
securityContext: - name: DISK_SIZE
privileged: true value: "64G"
env: ports:
- name: VERSION - containerPort: 8006
value: "11" - containerPort: 3389
- name: RAM_SIZE - containerPort: 3389
value: "4G" protocol: UDP
- name: CPU_CORES securityContext:
value: "2" capabilities:
- name: DISK_SIZE add:
value: "64G" - NET_ADMIN
volumeMounts: privileged: true
- mountPath: /storage volumeMounts:
name: storage - mountPath: /storage
- mountPath: /dev/kvm name: storage
name: dev-kvm - mountPath: /dev/kvm
name: dev-kvm
- mountPath: /dev/net/tun
name: dev-tun
terminationGracePeriodSeconds: 120
volumes: volumes:
- name: storage - name: storage
persistentVolumeClaim: persistentVolumeClaim:
claimName: windows-pvc claimName: windows-pvc
- name: dev-kvm - hostPath:
hostPath: path: /dev/kvm
path: /dev/kvm name: dev-kvm
- hostPath:
path: /dev/net/tun
type: CharDevice
name: dev-tun
--- ---
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
metadata: metadata:
name: windows name: windows
spec: spec:
type: NodePort ports:
- name: tcp-8006
port: 8006
- name: tcp-3389
port: 3389
- name: udp-3389
port: 3389
protocol: UDP
selector: selector:
name: windows name: windows
ports: type: NodePort
- name: tcp-8006
protocol: TCP
port: 8006
targetPort: 8006
- name: tcp-3389
protocol: TCP
port: 3389
targetPort: 3389
- name: udp-3389
protocol: UDP
port: 3389
targetPort: 3389

View File

@@ -37,6 +37,7 @@ services:
VERSION: "11" VERSION: "11"
devices: devices:
- /dev/kvm - /dev/kvm
- /dev/net/tun
cap_add: cap_add:
- NET_ADMIN - NET_ADMIN
ports: ports:
@@ -49,7 +50,7 @@ services:
Via Docker CLI: Via Docker CLI:
```bash ```bash
docker run -it --rm -p 8006:8006 --device=/dev/kvm --cap-add NET_ADMIN --stop-timeout 120 dockurr/windows docker run -it --rm -p 8006:8006 --device=/dev/kvm --device=/dev/net/tun --cap-add NET_ADMIN --stop-timeout 120 dockurr/windows
``` ```
Via Kubernetes: Via Kubernetes:
@@ -176,7 +177,9 @@ kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/mas
### How do I run a script after installation? ### How do I run a script after installation?
To run your own script after installation, you can create a file called `install.bat` and place it in a folder together with any additional files it needs (software to be installed for example). Then bind that folder in your compose file like this: To run your own script after installation, you can create a file called `install.bat` and place it in a folder together with any additional files it needs (software to be installed for example).
Then bind that folder in your compose file like this:
```yaml ```yaml
volumes: volumes:

View File

@@ -502,7 +502,10 @@ fromFile() {
local file="${1,,}" local file="${1,,}"
local arch="${PLATFORM,,}" local arch="${PLATFORM,,}"
case "${file// /_}" in file="${file//-/_}"
file="${file// /_}"
case "$file" in
*"_x64_"* | *"_x64."*) *"_x64_"* | *"_x64."*)
arch="x64" arch="x64"
;; ;;
@@ -517,7 +520,7 @@ fromFile() {
local add="" local add=""
[[ "$arch" != "x64" ]] && add="$arch" [[ "$arch" != "x64" ]] && add="$arch"
case "${file// /_}" in case "$file" in
"win7"* | "win_7"* | *"windows7"* | *"windows_7"* ) "win7"* | "win_7"* | *"windows7"* | *"windows_7"* )
id="win7${arch}" id="win7${arch}"
;; ;;

View File

@@ -613,19 +613,21 @@ getMG() {
local body="" local body=""
[[ "$DEBUG" == [Yy1]* ]] && echo "Parsing download page: ${url}" [[ "$DEBUG" == [Yy1]* ]] && echo "Parsing product page: ${url}"
body=$(curl --silent --max-time 30 --user-agent "$user_agent" --location --max-filesize 1M --fail --proto =https --tlsv1.2 --http1.1 -- "$url") || { body=$(curl --silent --max-time 30 --user-agent "$user_agent" --location --max-filesize 1M --fail --proto =https --tlsv1.2 --http1.1 -- "$url") || {
handle_curl_error "$?" "Massgrave" handle_curl_error "$?" "Massgrave"
return $? return $?
} }
local list="" local list=""
list=$(echo "$body" | grep -Eo "(http|https)://[a-zA-Z0-9./?=_%:-]*" | grep -i '\.iso$') list=$(echo "$body" | xmllint --html --nonet --xpath "//a[contains(text(), '.iso')]" - 2>/dev/null)
local result="" local result=""
result=$(echo "$list" | grep -i "${platform}" | grep "${pattern}" | grep -i -m 1 "${locale,,}_") result=$(echo "$list" | grep -i "${platform}" | grep "${pattern}" | grep -i -m 1 "${locale,,}_")
result=$(echo "$result" | sed -r 's/.*href="([^"]+).*/\1/g')
local page="$result"
if [ -z "$result" ]; then if [ -z "$page" ]; then
if [[ "${lang,,}" != "en" ]] && [[ "${lang,,}" != "en-"* ]]; then if [[ "${lang,,}" != "en" ]] && [[ "${lang,,}" != "en-"* ]]; then
error "No download in the $language language available for $desc!" error "No download in the $language language available for $desc!"
else else
@@ -634,7 +636,33 @@ getMG() {
return 1 return 1
fi fi
MG_URL="$result" [[ "$DEBUG" == [Yy1]* ]] && echo "Parsing download page: ${page}"
result=$(curl --silent --max-time 30 --request GET --user-agent "$user_agent" --referer "$url" --head --proto =https --tlsv1.2 --http1.1 -- "$page") || {
handle_curl_error "$?" "Massgrave"
return $?
}
if [[ "${result,,}" == *"content-type: text"* ]]; then
body=$(curl --silent --max-time 30 --user-agent "$user_agent" --referer "$url" --location --max-filesize 1M --fail --proto =https --tlsv1.2 --http1.1 -- "$page") || {
handle_curl_error "$?" "Massgrave"
return $?
}
list=$(echo "$body" | xmllint --html --nonet --xpath "//a[contains(@href, '.iso')]" - 2>/dev/null)
list=$(echo "$list" | sed -r 's/.*href="([^"]+).*/\1/g')
page=$(echo "$list" | sed 's/&/\&/g;')
if [ -z "$page" ]; then
if [[ "${lang,,}" != "en" ]] && [[ "${lang,,}" != "en-"* ]]; then
error "No download in the $language language available for $desc!"
else
error "Failed to parse download link for $desc! Please report this at $SUPPORT/issues."
fi
return 1
fi
fi
MG_URL="$page"
return 0 return 0
} }

View File

@@ -71,6 +71,9 @@ addShare() {
echo " guest account = nobody" echo " guest account = nobody"
echo " map to guest = Bad User" echo " map to guest = Bad User"
echo " server min protocol = NT1" echo " server min protocol = NT1"
echo " follow symlinks = yes"
echo " wide links = yes"
echo " unix extensions = no"
echo "" echo ""
echo " # disable printing services" echo " # disable printing services"
echo " load printers = no" echo " load printers = no"
@@ -89,6 +92,13 @@ addShare "$share" "Data" "Shared" || error "Failed to create shared folder!"
[ -d "/data2" ] && addShare "/data2" "Data2" "Shared" [ -d "/data2" ] && addShare "/data2" "Data2" "Shared"
[ -d "/data3" ] && addShare "/data3" "Data3" "Shared" [ -d "/data3" ] && addShare "/data3" "Data3" "Shared"
IFS=',' read -r -a dirs <<< "${SHARES:-}"
for dir in "${dirs[@]}"; do
[ ! -d "$dir" ] && continue
dir_name=$(basename "$dir")
addShare "$dir" "$dir_name" "Shared $dir_name" || error "Failed to create shared folder for $dir!"
done
if ! smbd; then if ! smbd; then
error "Samba daemon failed to start!" error "Samba daemon failed to start!"
smbd -i --debug-stdout || true smbd -i --debug-stdout || true