This commit is contained in:
Dobromir Popov
2026-02-12 12:54:35 +02:00
30 changed files with 2310 additions and 1 deletions

View File

@@ -27,6 +27,19 @@ docker pull portainer/helper-reset-password
docker run --rm -v /mnt/storage/docker_volumes/portainer_data:/data portainer/helper-reset-password
# update portainer
<!-- // To update to the latest version of Portainer Server, use the following commands to stop then remove the old version. Your other applications/containers will not be removed. -->
docker stop portainer
docker rm portainer
<!-- start again -->
docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always --pull=always -v /var/run/docker.sock:/var/run/docker.sock -v /mnt/data/docker_vol/portainer:/data portainer/portainer-ce
# start portainer with a database copy (/portainer-database-backup.db)
docker run --rm -v /mnt/data/docker_vol/portainer:/data -v /mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/BACKUPS/20251118-133605:/backup alpine sh -c "rm /data/portainer.db && cp /backup/portainer-database-backup.db /data/portainer.db && ls -lh /data/portainer.db"
# remove backup/broken database
docker run --rm -v /mnt/data/docker_vol/portainer:/data alpine rm /data/portainer.db && echo "Old database removed"
# start
sudo systemctl start docker
sudo systemctl enable docker

View File

@@ -30,3 +30,16 @@ docker exec -u 0 nextcloud php occ trashbin:cleanup --all-users
27.0.2.1 ->> 28.0.14 -> 29.0.10 -> 30.0.4
# NEXTCLOUD AIO
get pass(in container sh):
/mnt/docker-aio-config/data# ls
backupsecret configuration.json session_date_file
a4a2bed68bc4:/mnt/docker-aio-config/data# cat configuration.json | grep pass
citadel showcase turbofan wick shiftless travel woof dicing
backup:
location:/mnt/storage/containers/nextcloud_aio/backup$
pass: 0d760cd12d0c75991344ce9dcb599e2bfb85ef40db3ebe29

View File

@@ -20,3 +20,17 @@ git commit -m "Merged upstream/main"
# remove upstream
git remote remove upstream
git remote -v
#
http://192.168.1.36:9000
Name: localhost
Environment address: 192.168.1.36:9001

View File

@@ -0,0 +1,48 @@
# Portainer Backup - November 18, 2025
This backup was created before resetting the Portainer database due to stale environment configurations causing the UI to show "environment unreachable" errors.
## Contents
### Docker Compose Files
- `all-containers-compose.yml` - Combined compose file for ALL running containers
- `container-*.yml` - Individual compose files for each container
### Database Backups
- `portainer-database-backup.db` - Full Portainer database from before reset (512KB)
- `portainer-automatic-backup.db.bak` - Automatic backup created by Portainer during upgrade
### Running Containers at Backup Time
1. portainer
2. windows
3. rincoin-node2
4. amd-strix-halo-llama-rocm
5. amd-strix-halo-llama-vulkan-radv
6. amd-strix-halo-llama-vulkan-amdvlk
7. docker-model-runner
## Restore Instructions
### To restore Portainer database:
```bash
docker stop portainer
docker run --rm -v /mnt/data/docker_vol/portainer:/data -v $(pwd):/backup alpine \
cp /backup/portainer-database-backup.db /data/portainer.db
docker start portainer
```
### To restore individual containers:
```bash
docker-compose -f container-NAME.yml up -d
```
### To restore all containers:
```bash
docker-compose -f all-containers-compose.yml up -d
```
## Notes
- The Portainer configuration export from the UI was not included (would need to be exported manually)
- These backups were generated using docker-autocompose tool
- Backup created: 2025-11-18 13:36:05

View File

@@ -0,0 +1,487 @@
networks:
amd-strix-halo-network:
external: true
name: "amd-strix-halo-network"
rincoin_default:
external: true
name: "rincoin_default"
windows_default:
external: true
name: "windows_default"
services:
amd-strix-halo-llama-rocm:
command:
- "/bin/bash"
container_name: "amd-strix-halo-llama-rocm"
devices:
- "/dev/kfd:/dev/kfd"
- "/dev/dri:/dev/dri"
environment:
- "DISPLAY=:0"
- "NVIDIA_VISIBLE_DEVICES=all"
- "NVIDIA_DRIVER_CAPABILITIES=all"
- "PATH=/opt/rocm-7.0/bin:/opt/rocm-7.0/llvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
- "container=oci"
- "ROCM_PATH=/opt/rocm-7.0"
- "HIP_PLATFORM=amd"
- "HIP_PATH=/opt/rocm-7.0"
- "HIP_CLANG_PATH=/opt/rocm-7.0/llvm/bin"
- "HIP_INCLUDE_PATH=/opt/rocm-7.0/include"
- "HIP_LIB_PATH=/opt/rocm-7.0/lib"
- "HIP_DEVICE_LIB_PATH=/opt/rocm-7.0/lib/llvm/amdgcn/bitcode"
- "LD_LIBRARY_PATH=/opt/rocm-7.0/lib:/opt/rocm-7.0/lib64:/opt/rocm-7.0/llvm/lib"
- "LIBRARY_PATH=/opt/rocm-7.0/lib:/opt/rocm-7.0/lib64"
- "CPATH=/opt/rocm-7.0/include"
- "PKG_CONFIG_PATH=/opt/rocm-7.0/lib/pkgconfig"
hostname: "2e51d282e4eb"
image: "kyuz0/amd-strix-halo-toolboxes:rocm-7rc-rocwmma"
ipc: "private"
labels:
com.docker.compose.config-hash: "b1864fdd57497c82872e0e6ab2dfe1e8debf08ace59f99770d77e1f6470ceec2"
com.docker.compose.container-number: "1"
com.docker.compose.depends_on: ""
com.docker.compose.image: "sha256:46c514ed4c8812d12463c0f02ade88a6efa5cc5589c68c5fc98d21966116bbba"
com.docker.compose.oneoff: "False"
com.docker.compose.project: "portainer-compose-stacks"
com.docker.compose.project.config_files: "/mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/amd-strix-halo-toolboxes.yml"
com.docker.compose.project.working_dir: "/mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks"
com.docker.compose.service: "amd-strix-halo-llama-rocm"
com.docker.compose.version: "2.39.4"
io.buildah.version: "1.41.3"
license: "MIT"
name: "fedora-minimal"
org.opencontainers.image.license: "MIT"
org.opencontainers.image.name: "fedora-minimal"
org.opencontainers.image.url: "https://fedoraproject.org/"
org.opencontainers.image.vendor: "Fedora Project"
org.opencontainers.image.version: "rawhide"
vendor: "Fedora Project"
version: "rawhide"
logging:
driver: "json-file"
options: {}
networks:
- "amd-strix-halo-network"
ports:
- "8080:8080/tcp"
privileged: true
restart: "unless-stopped"
security_opt:
- "label=disable"
stdin_open: true
tty: true
volumes:
- "/home/db/Downloads:/mnt/dl"
- "/home/db:/home/db"
- "/mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/data:/data"
- "/mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/models:/models"
working_dir: "/models"
amd-strix-halo-llama-vulkan-amdvlk:
command:
- "/bin/bash"
container_name: "amd-strix-halo-llama-vulkan-amdvlk"
devices:
- "/dev/dri:/dev/dri"
environment:
- "DISPLAY=:0"
- "PATH=/usr/local/bin:/usr/bin"
- "container=oci"
hostname: "c8be19c21b4e"
image: "kyuz0/amd-strix-halo-toolboxes:vulkan-amdvlk"
ipc: "private"
labels:
com.docker.compose.config-hash: "1430c92ed79d5a3fc253eda643fa9adf142075a04f23daa62a2dd75d1bc5b7fc"
com.docker.compose.container-number: "1"
com.docker.compose.depends_on: ""
com.docker.compose.image: "sha256:f22a85316fff63e48b37939a242ca9f9c1fe190c9b91edc58d78d2ce8f6b9307"
com.docker.compose.oneoff: "False"
com.docker.compose.project: "portainer-compose-stacks"
com.docker.compose.project.config_files: "/mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/amd-strix-halo-toolboxes.yml"
com.docker.compose.project.working_dir: "/mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks"
com.docker.compose.service: "amd-strix-halo-llama-vulkan-amdvlk"
com.docker.compose.version: "2.39.4"
io.buildah.version: "1.41.3"
license: "MIT"
name: "fedora-minimal"
org.opencontainers.image.license: "MIT"
org.opencontainers.image.name: "fedora-minimal"
org.opencontainers.image.url: "https://fedoraproject.org/"
org.opencontainers.image.vendor: "Fedora Project"
org.opencontainers.image.version: "rawhide"
vendor: "Fedora Project"
version: "rawhide"
logging:
driver: "json-file"
options: {}
networks:
- "amd-strix-halo-network"
ports:
- "8082:8080/tcp"
privileged: true
restart: "unless-stopped"
security_opt:
- "label=disable"
stdin_open: true
tty: true
volumes:
- "/home/db/Downloads:/mnt/dl"
- "/home/db:/home/db"
- "/mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/data:/data"
- "/mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/models:/models"
working_dir: "/models"
amd-strix-halo-llama-vulkan-radv:
command:
- "/bin/bash"
container_name: "amd-strix-halo-llama-vulkan-radv"
devices:
- "/dev/dri:/dev/dri"
environment:
- "DISPLAY=:0"
- "PATH=/usr/local/bin:/usr/bin"
- "container=oci"
hostname: "f16c8811fad8"
image: "kyuz0/amd-strix-halo-toolboxes:vulkan-radv"
ipc: "private"
labels:
com.docker.compose.config-hash: "b8d7ece75362f882f6b566c45be63ddc7ef9196bf9cb4cd751229013cfd7751e"
com.docker.compose.container-number: "1"
com.docker.compose.depends_on: ""
com.docker.compose.image: "sha256:523867cfaf7346460b4857ea164353a3048ef24f844e627535c1639c3f1b1b3f"
com.docker.compose.oneoff: "False"
com.docker.compose.project: "portainer-compose-stacks"
com.docker.compose.project.config_files: "/mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/amd-strix-halo-toolboxes.yml"
com.docker.compose.project.working_dir: "/mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks"
com.docker.compose.service: "amd-strix-halo-llama-vulkan-radv"
com.docker.compose.version: "2.39.4"
io.buildah.version: "1.41.3"
license: "MIT"
name: "fedora-minimal"
org.opencontainers.image.license: "MIT"
org.opencontainers.image.name: "fedora-minimal"
org.opencontainers.image.url: "https://fedoraproject.org/"
org.opencontainers.image.vendor: "Fedora Project"
org.opencontainers.image.version: "rawhide"
vendor: "Fedora Project"
version: "rawhide"
logging:
driver: "json-file"
options: {}
networks:
- "amd-strix-halo-network"
ports:
- "8081:8080/tcp"
privileged: true
restart: "unless-stopped"
security_opt:
- "label=disable"
stdin_open: true
tty: true
volumes:
- "/home/db/Downloads:/mnt/dl"
- "/home/db:/home/db"
- "/mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/data:/data"
- "/mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/models:/models"
working_dir: "/models"
docker-model-runner:
container_name: "docker-model-runner"
entrypoint:
- "/app/model-runner"
environment:
- "MODEL_RUNNER_PORT=12434"
- "MODEL_RUNNER_ENVIRONMENT=moby"
- "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
- "MODEL_RUNNER_SOCK=/var/run/model-runner/model-runner.sock"
- "LLAMA_SERVER_PATH=/app/bin"
- "HOME=/home/modelrunner"
- "MODELS_PATH=/models"
- "LD_LIBRARY_PATH=/app/lib"
hostname: "b1ab3b3c51a3"
image: "docker/model-runner:latest"
ipc: "private"
labels:
com.docker.desktop.service: "model-runner"
com.docker.model-runner.role: "controller"
org.opencontainers.image.ref.name: "ubuntu"
org.opencontainers.image.version: "24.04"
logging:
driver: "json-file"
options: {}
network_mode: "bridge"
ports:
- "127.0.0.1:12434:12434/tcp"
restart: "always"
user: "modelrunner"
volumes:
- "docker-model-runner-models:/models"
working_dir: "/app"
portainer:
container_name: "portainer"
entrypoint:
- "/portainer"
environment:
- "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
hostname: "c64ad6b64b85"
image: "portainer/portainer-ce"
ipc: "private"
labels:
com.docker.desktop.extension.api.version: ">= 0.2.2"
com.docker.desktop.extension.icon: "https://portainer-io-assets.sfo2.cdn.digitaloceanspaces.com/logos/portainer.png"
com.docker.extension.additional-urls: "[{\"title\":\"Website\",\"url\":\"https://www.portainer.io?utm_campaign=DockerCon&utm_source=DockerDesktop\"\
},{\"title\":\"Documentation\",\"url\":\"https://docs.portainer.io\"},{\"title\":\"Support\",\"\
url\":\"https://join.slack.com/t/portainer/shared_invite/zt-txh3ljab-52QHTyjCqbe5RibC2lcjKA\"\
}]"
com.docker.extension.detailed-description: "<p data-renderer-start-pos=\"226\">Portainer&rsquo;s\
\ Docker Desktop extension gives you access to all of Portainer&rsquo;s rich management functionality\
\ within your docker desktop experience.</p><h2 data-renderer-start-pos=\"374\">With Portainer\
\ you can:</h2><ul><li>See all your running containers</li><li>Easily view all of your container\
\ logs</li><li>Console into containers</li><li>Easily deploy your code into containers using a\
\ simple form</li><li>Turn your YAML into custom templates for easy reuse</li></ul><h2 data-renderer-start-pos=\"\
660\">About Portainer&nbsp;</h2><p data-renderer-start-pos=\"680\">Portainer is the worlds&rsquo;\
\ most popular universal container management platform with more than 650,000 active monthly users.\
\ Portainer can be used to manage Docker Standalone, Kubernetes and Docker Swarm environments\
\ through a single common interface. It includes a simple GitOps automation engine and a Kube\
\ API.&nbsp;</p><p data-renderer-start-pos=\"1006\">Portainer Business Edition is our fully supported\
\ commercial grade product for business-wide use. It includes all the functionality that businesses\
\ need to manage containers at scale. Visit <a class=\"sc-jKJlTe dPfAtb\" href=\"http://portainer.io/\"\
\ title=\"http://Portainer.io\" data-renderer-mark=\"true\">Portainer.io</a> to learn more about\
\ Portainer Business and <a class=\"sc-jKJlTe dPfAtb\" href=\"http://portainer.io/take-3?utm_campaign=DockerCon&amp;utm_source=Docker%20Desktop\"\
\ title=\"http://portainer.io/take-3?utm_campaign=DockerCon&amp;utm_source=Docker%20Desktop\"\
\ data-renderer-mark=\"true\">get 3 free nodes.</a></p>"
com.docker.extension.publisher-url: "https://www.portainer.io"
com.docker.extension.screenshots: "[{\"alt\": \"screenshot one\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-1.png\"\
},{\"alt\": \"screenshot two\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-2.png\"\
},{\"alt\": \"screenshot three\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-3.png\"\
},{\"alt\": \"screenshot four\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-4.png\"\
},{\"alt\": \"screenshot five\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-5.png\"\
},{\"alt\": \"screenshot six\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-6.png\"\
},{\"alt\": \"screenshot seven\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-7.png\"\
},{\"alt\": \"screenshot eight\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-8.png\"\
},{\"alt\": \"screenshot nine\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-9.png\"\
}]"
io.portainer.server: "true"
org.opencontainers.image.description: "Docker container management made simple, with the worlds\
\ most popular GUI-based container management platform."
org.opencontainers.image.title: "Portainer"
org.opencontainers.image.vendor: "Portainer.io"
logging:
driver: "json-file"
options: {}
network_mode: "bridge"
ports:
- "8000:8000/tcp"
- "9000:9000/tcp"
restart: "always"
volumes:
- "/mnt/data/docker_vol/portainer:/data"
- "/var/run/docker.sock:/var/run/docker.sock"
working_dir: "/"
rincoin-node2:
command:
- "-datadir=/data"
- "-conf=/data/rincoin.conf"
- "-printtoconsole"
container_name: "rincoin-node2"
entrypoint:
- "/usr/local/bin/rincoind"
environment:
- "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
- "DEBIAN_FRONTEND=noninteractive"
hostname: "9a6d58857cd0"
image: "rincoin-node:latest"
ipc: "private"
labels:
com.docker.compose.config-hash: "c538f569d76e1edec24710e86694448f59d7f59ad1cd83a44d9aaa2ec32e89ca"
com.docker.compose.container-number: "1"
com.docker.compose.depends_on: ""
com.docker.compose.image: "sha256:d0934cced84238cb1b9e090a5b27561dc90355ec108571fc3a8ae687267fa087"
com.docker.compose.oneoff: "False"
com.docker.compose.project: "rincoin"
com.docker.compose.project.config_files: "/data/compose/14/docker-compose.yml"
com.docker.compose.project.working_dir: "/data/compose/14"
com.docker.compose.replace: "6b21373b29365c8eab15f7f7450f47ff5e18984c9c5e11ff2ab468a2e6eda26b"
com.docker.compose.service: "rincoin-node"
com.docker.compose.version: ""
org.opencontainers.image.ref.name: "ubuntu"
org.opencontainers.image.version: "22.04"
logging:
driver: "json-file"
options: {}
networks:
- "rincoin_default"
ports:
- "9555:9555/tcp"
- "9556:9556/tcp"
restart: "unless-stopped"
user: "rin"
volumes:
- "/mnt/data/docker_vol/rincoin/rincoin-node/data:/data"
- "/mnt/data/docker_vol/rincoin/rincoin-node/rincoin.conf:/data/rincoin.conf:ro"
working_dir: "/opt"
windows:
container_name: "windows"
devices:
- "/dev/kvm:/dev/kvm"
- "/dev/net/tun:/dev/net/tun"
- "/dev/nvme0n1p8:/disk2"
entrypoint:
- "/usr/bin/tini"
- "-s"
- "/run/entry.sh"
environment:
- "RAM_SIZE=8G"
- "CPU_CORES=4"
- "VERSION=11"
- "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
- "DISK_SIZE=64G"
hostname: "b54f26e81e8a"
image: "dockurr/windows"
ipc: "private"
labels:
com.docker.compose.config-hash: "946a6f405cd99fc70b051d30032fd67cc15601412a5edd38ae1960a013099d20"
com.docker.compose.container-number: "1"
com.docker.compose.depends_on: ""
com.docker.compose.image: "sha256:df07df026e7d52a3416b557e9e40a829982746ef3d2924e8e5b92787c2e5f269"
com.docker.compose.oneoff: "False"
com.docker.compose.project: "windows"
com.docker.compose.project.config_files: "/data/compose/3/docker-compose.yml"
com.docker.compose.project.working_dir: "/data/compose/3"
com.docker.compose.service: "windows"
com.docker.compose.version: ""
org.opencontainers.image.created: "2025-05-06T04:50:51.502Z"
org.opencontainers.image.description: "Windows inside a Docker container."
org.opencontainers.image.licenses: "MIT"
org.opencontainers.image.revision: "868c8af289a1012cd7c8bf2c9a2bba298eeb8dee"
org.opencontainers.image.source: "https://github.com/dockur/windows"
org.opencontainers.image.title: "Windows"
org.opencontainers.image.url: "https://github.com/dockur/windows"
org.opencontainers.image.version: "4.35"
logging:
driver: "json-file"
options: {}
networks:
- "windows_default"
ports:
- "1433:1433/tcp"
- "3389:3389/tcp"
- "3389:3389/udp"
- "8006:8006/tcp"
privileged: true
restart: "always"
security_opt:
- "label=disable"
volumes:
- "/mnt/data/docker_vol/windows:/storage"
- "/mnt/shared:/data"
working_dir: "/"
version: "3.6"
volumes:
docker-model-runner-models:
external: true

View File

@@ -0,0 +1,93 @@
networks:
amd-strix-halo-network:
external: true
name: "amd-strix-halo-network"
services:
amd-strix-halo-llama-rocm:
command:
- "/bin/bash"
container_name: "amd-strix-halo-llama-rocm"
devices:
- "/dev/kfd:/dev/kfd"
- "/dev/dri:/dev/dri"
environment:
- "DISPLAY=:0"
- "NVIDIA_VISIBLE_DEVICES=all"
- "NVIDIA_DRIVER_CAPABILITIES=all"
- "PATH=/opt/rocm-7.0/bin:/opt/rocm-7.0/llvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
- "container=oci"
- "ROCM_PATH=/opt/rocm-7.0"
- "HIP_PLATFORM=amd"
- "HIP_PATH=/opt/rocm-7.0"
- "HIP_CLANG_PATH=/opt/rocm-7.0/llvm/bin"
- "HIP_INCLUDE_PATH=/opt/rocm-7.0/include"
- "HIP_LIB_PATH=/opt/rocm-7.0/lib"
- "HIP_DEVICE_LIB_PATH=/opt/rocm-7.0/lib/llvm/amdgcn/bitcode"
- "LD_LIBRARY_PATH=/opt/rocm-7.0/lib:/opt/rocm-7.0/lib64:/opt/rocm-7.0/llvm/lib"
- "LIBRARY_PATH=/opt/rocm-7.0/lib:/opt/rocm-7.0/lib64"
- "CPATH=/opt/rocm-7.0/include"
- "PKG_CONFIG_PATH=/opt/rocm-7.0/lib/pkgconfig"
hostname: "2e51d282e4eb"
image: "kyuz0/amd-strix-halo-toolboxes:rocm-7rc-rocwmma"
ipc: "private"
labels:
com.docker.compose.config-hash: "b1864fdd57497c82872e0e6ab2dfe1e8debf08ace59f99770d77e1f6470ceec2"
com.docker.compose.container-number: "1"
com.docker.compose.depends_on: ""
com.docker.compose.image: "sha256:46c514ed4c8812d12463c0f02ade88a6efa5cc5589c68c5fc98d21966116bbba"
com.docker.compose.oneoff: "False"
com.docker.compose.project: "portainer-compose-stacks"
com.docker.compose.project.config_files: "/mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/amd-strix-halo-toolboxes.yml"
com.docker.compose.project.working_dir: "/mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks"
com.docker.compose.service: "amd-strix-halo-llama-rocm"
com.docker.compose.version: "2.39.4"
io.buildah.version: "1.41.3"
license: "MIT"
name: "fedora-minimal"
org.opencontainers.image.license: "MIT"
org.opencontainers.image.name: "fedora-minimal"
org.opencontainers.image.url: "https://fedoraproject.org/"
org.opencontainers.image.vendor: "Fedora Project"
org.opencontainers.image.version: "rawhide"
vendor: "Fedora Project"
version: "rawhide"
logging:
driver: "json-file"
options: {}
networks:
- "amd-strix-halo-network"
ports:
- "8080:8080/tcp"
privileged: true
restart: "unless-stopped"
security_opt:
- "label=disable"
stdin_open: true
tty: true
volumes:
- "/home/db/Downloads:/mnt/dl"
- "/home/db:/home/db"
- "/mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/data:/data"
- "/mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/models:/models"
working_dir: "/models"
version: "3.6"

View File

@@ -0,0 +1,79 @@
networks:
amd-strix-halo-network:
external: true
name: "amd-strix-halo-network"
services:
amd-strix-halo-llama-vulkan-amdvlk:
command:
- "/bin/bash"
container_name: "amd-strix-halo-llama-vulkan-amdvlk"
devices:
- "/dev/dri:/dev/dri"
environment:
- "DISPLAY=:0"
- "PATH=/usr/local/bin:/usr/bin"
- "container=oci"
hostname: "c8be19c21b4e"
image: "kyuz0/amd-strix-halo-toolboxes:vulkan-amdvlk"
ipc: "private"
labels:
com.docker.compose.config-hash: "1430c92ed79d5a3fc253eda643fa9adf142075a04f23daa62a2dd75d1bc5b7fc"
com.docker.compose.container-number: "1"
com.docker.compose.depends_on: ""
com.docker.compose.image: "sha256:f22a85316fff63e48b37939a242ca9f9c1fe190c9b91edc58d78d2ce8f6b9307"
com.docker.compose.oneoff: "False"
com.docker.compose.project: "portainer-compose-stacks"
com.docker.compose.project.config_files: "/mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/amd-strix-halo-toolboxes.yml"
com.docker.compose.project.working_dir: "/mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks"
com.docker.compose.service: "amd-strix-halo-llama-vulkan-amdvlk"
com.docker.compose.version: "2.39.4"
io.buildah.version: "1.41.3"
license: "MIT"
name: "fedora-minimal"
org.opencontainers.image.license: "MIT"
org.opencontainers.image.name: "fedora-minimal"
org.opencontainers.image.url: "https://fedoraproject.org/"
org.opencontainers.image.vendor: "Fedora Project"
org.opencontainers.image.version: "rawhide"
vendor: "Fedora Project"
version: "rawhide"
logging:
driver: "json-file"
options: {}
networks:
- "amd-strix-halo-network"
ports:
- "8082:8080/tcp"
privileged: true
restart: "unless-stopped"
security_opt:
- "label=disable"
stdin_open: true
tty: true
volumes:
- "/home/db/Downloads:/mnt/dl"
- "/home/db:/home/db"
- "/mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/data:/data"
- "/mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/models:/models"
working_dir: "/models"
version: "3.6"

View File

@@ -0,0 +1,79 @@
networks:
amd-strix-halo-network:
external: true
name: "amd-strix-halo-network"
services:
amd-strix-halo-llama-vulkan-radv:
command:
- "/bin/bash"
container_name: "amd-strix-halo-llama-vulkan-radv"
devices:
- "/dev/dri:/dev/dri"
environment:
- "DISPLAY=:0"
- "PATH=/usr/local/bin:/usr/bin"
- "container=oci"
hostname: "f16c8811fad8"
image: "kyuz0/amd-strix-halo-toolboxes:vulkan-radv"
ipc: "private"
labels:
com.docker.compose.config-hash: "b8d7ece75362f882f6b566c45be63ddc7ef9196bf9cb4cd751229013cfd7751e"
com.docker.compose.container-number: "1"
com.docker.compose.depends_on: ""
com.docker.compose.image: "sha256:523867cfaf7346460b4857ea164353a3048ef24f844e627535c1639c3f1b1b3f"
com.docker.compose.oneoff: "False"
com.docker.compose.project: "portainer-compose-stacks"
com.docker.compose.project.config_files: "/mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/amd-strix-halo-toolboxes.yml"
com.docker.compose.project.working_dir: "/mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks"
com.docker.compose.service: "amd-strix-halo-llama-vulkan-radv"
com.docker.compose.version: "2.39.4"
io.buildah.version: "1.41.3"
license: "MIT"
name: "fedora-minimal"
org.opencontainers.image.license: "MIT"
org.opencontainers.image.name: "fedora-minimal"
org.opencontainers.image.url: "https://fedoraproject.org/"
org.opencontainers.image.vendor: "Fedora Project"
org.opencontainers.image.version: "rawhide"
vendor: "Fedora Project"
version: "rawhide"
logging:
driver: "json-file"
options: {}
networks:
- "amd-strix-halo-network"
ports:
- "8081:8080/tcp"
privileged: true
restart: "unless-stopped"
security_opt:
- "label=disable"
stdin_open: true
tty: true
volumes:
- "/home/db/Downloads:/mnt/dl"
- "/home/db:/home/db"
- "/mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/data:/data"
- "/mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/models:/models"
working_dir: "/models"
version: "3.6"

View File

@@ -0,0 +1,37 @@
services:
docker-model-runner:
container_name: "docker-model-runner"
entrypoint:
- "/app/model-runner"
environment:
- "MODEL_RUNNER_PORT=12434"
- "MODEL_RUNNER_ENVIRONMENT=moby"
- "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
- "MODEL_RUNNER_SOCK=/var/run/model-runner/model-runner.sock"
- "LLAMA_SERVER_PATH=/app/bin"
- "HOME=/home/modelrunner"
- "MODELS_PATH=/models"
- "LD_LIBRARY_PATH=/app/lib"
hostname: "b1ab3b3c51a3"
image: "docker/model-runner:latest"
ipc: "private"
labels:
com.docker.desktop.service: "model-runner"
com.docker.model-runner.role: "controller"
org.opencontainers.image.ref.name: "ubuntu"
org.opencontainers.image.version: "24.04"
logging:
driver: "json-file"
options: {}
network_mode: "bridge"
ports:
- "127.0.0.1:12434:12434/tcp"
restart: "always"
user: "modelrunner"
volumes:
- "docker-model-runner-models:/models"
working_dir: "/app"
version: "3.6"
volumes:
docker-model-runner-models:
external: true

View File

@@ -0,0 +1,77 @@
services:
portainer:
container_name: "portainer"
entrypoint:
- "/portainer"
environment:
- "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
hostname: "c64ad6b64b85"
image: "portainer/portainer-ce"
ipc: "private"
labels:
com.docker.desktop.extension.api.version: ">= 0.2.2"
com.docker.desktop.extension.icon: "https://portainer-io-assets.sfo2.cdn.digitaloceanspaces.com/logos/portainer.png"
com.docker.extension.additional-urls: "[{\"title\":\"Website\",\"url\":\"https://www.portainer.io?utm_campaign=DockerCon&utm_source=DockerDesktop\"\
},{\"title\":\"Documentation\",\"url\":\"https://docs.portainer.io\"},{\"title\":\"Support\",\"\
url\":\"https://join.slack.com/t/portainer/shared_invite/zt-txh3ljab-52QHTyjCqbe5RibC2lcjKA\"\
}]"
com.docker.extension.detailed-description: "<p data-renderer-start-pos=\"226\">Portainer&rsquo;s\
\ Docker Desktop extension gives you access to all of Portainer&rsquo;s rich management functionality\
\ within your docker desktop experience.</p><h2 data-renderer-start-pos=\"374\">With Portainer\
\ you can:</h2><ul><li>See all your running containers</li><li>Easily view all of your container\
\ logs</li><li>Console into containers</li><li>Easily deploy your code into containers using a\
\ simple form</li><li>Turn your YAML into custom templates for easy reuse</li></ul><h2 data-renderer-start-pos=\"\
660\">About Portainer&nbsp;</h2><p data-renderer-start-pos=\"680\">Portainer is the worlds&rsquo;\
\ most popular universal container management platform with more than 650,000 active monthly users.\
\ Portainer can be used to manage Docker Standalone, Kubernetes and Docker Swarm environments\
\ through a single common interface. It includes a simple GitOps automation engine and a Kube\
\ API.&nbsp;</p><p data-renderer-start-pos=\"1006\">Portainer Business Edition is our fully supported\
\ commercial grade product for business-wide use. It includes all the functionality that businesses\
\ need to manage containers at scale. Visit <a class=\"sc-jKJlTe dPfAtb\" href=\"http://portainer.io/\"\
\ title=\"http://Portainer.io\" data-renderer-mark=\"true\">Portainer.io</a> to learn more about\
\ Portainer Business and <a class=\"sc-jKJlTe dPfAtb\" href=\"http://portainer.io/take-3?utm_campaign=DockerCon&amp;utm_source=Docker%20Desktop\"\
\ title=\"http://portainer.io/take-3?utm_campaign=DockerCon&amp;utm_source=Docker%20Desktop\"\
\ data-renderer-mark=\"true\">get 3 free nodes.</a></p>"
com.docker.extension.publisher-url: "https://www.portainer.io"
com.docker.extension.screenshots: "[{\"alt\": \"screenshot one\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-1.png\"\
},{\"alt\": \"screenshot two\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-2.png\"\
},{\"alt\": \"screenshot three\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-3.png\"\
},{\"alt\": \"screenshot four\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-4.png\"\
},{\"alt\": \"screenshot five\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-5.png\"\
},{\"alt\": \"screenshot six\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-6.png\"\
},{\"alt\": \"screenshot seven\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-7.png\"\
},{\"alt\": \"screenshot eight\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-8.png\"\
},{\"alt\": \"screenshot nine\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-9.png\"\
}]"
io.portainer.server: "true"
org.opencontainers.image.description: "Docker container management made simple, with the worlds\
\ most popular GUI-based container management platform."
org.opencontainers.image.title: "Portainer"
org.opencontainers.image.vendor: "Portainer.io"
logging:
driver: "json-file"
options: {}
network_mode: "bridge"
ports:
- "8000:8000/tcp"
- "9000:9000/tcp"
restart: "always"
volumes:
- "/mnt/data/docker_vol/portainer:/data"
- "/var/run/docker.sock:/var/run/docker.sock"
working_dir: "/"
version: "3.6"

View File

@@ -0,0 +1,65 @@
networks:
rincoin_default:
external: true
name: "rincoin_default"
services:
rincoin-node2:
command:
- "-datadir=/data"
- "-conf=/data/rincoin.conf"
- "-printtoconsole"
container_name: "rincoin-node2"
entrypoint:
- "/usr/local/bin/rincoind"
environment:
- "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
- "DEBIAN_FRONTEND=noninteractive"
hostname: "9a6d58857cd0"
image: "rincoin-node:latest"
ipc: "private"
labels:
com.docker.compose.config-hash: "c538f569d76e1edec24710e86694448f59d7f59ad1cd83a44d9aaa2ec32e89ca"
com.docker.compose.container-number: "1"
com.docker.compose.depends_on: ""
com.docker.compose.image: "sha256:d0934cced84238cb1b9e090a5b27561dc90355ec108571fc3a8ae687267fa087"
com.docker.compose.oneoff: "False"
com.docker.compose.project: "rincoin"
com.docker.compose.project.config_files: "/data/compose/14/docker-compose.yml"
com.docker.compose.project.working_dir: "/data/compose/14"
com.docker.compose.replace: "6b21373b29365c8eab15f7f7450f47ff5e18984c9c5e11ff2ab468a2e6eda26b"
com.docker.compose.service: "rincoin-node"
com.docker.compose.version: ""
org.opencontainers.image.ref.name: "ubuntu"
org.opencontainers.image.version: "22.04"
logging:
driver: "json-file"
options: {}
networks:
- "rincoin_default"
ports:
- "9555:9555/tcp"
- "9556:9556/tcp"
restart: "unless-stopped"
user: "rin"
volumes:
- "/mnt/data/docker_vol/rincoin/rincoin-node/data:/data"
- "/mnt/data/docker_vol/rincoin/rincoin-node/rincoin.conf:/data/rincoin.conf:ro"
working_dir: "/opt"
version: "3.6"

View File

@@ -0,0 +1,80 @@
networks:
windows_default:
external: true
name: "windows_default"
services:
windows:
container_name: "windows"
devices:
- "/dev/kvm:/dev/kvm"
- "/dev/net/tun:/dev/net/tun"
- "/dev/nvme0n1p8:/disk2"
entrypoint:
- "/usr/bin/tini"
- "-s"
- "/run/entry.sh"
environment:
- "RAM_SIZE=8G"
- "CPU_CORES=4"
- "VERSION=11"
- "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
- "DISK_SIZE=64G"
hostname: "b54f26e81e8a"
image: "dockurr/windows"
ipc: "private"
labels:
com.docker.compose.config-hash: "946a6f405cd99fc70b051d30032fd67cc15601412a5edd38ae1960a013099d20"
com.docker.compose.container-number: "1"
com.docker.compose.depends_on: ""
com.docker.compose.image: "sha256:df07df026e7d52a3416b557e9e40a829982746ef3d2924e8e5b92787c2e5f269"
com.docker.compose.oneoff: "False"
com.docker.compose.project: "windows"
com.docker.compose.project.config_files: "/data/compose/3/docker-compose.yml"
com.docker.compose.project.working_dir: "/data/compose/3"
com.docker.compose.service: "windows"
com.docker.compose.version: ""
org.opencontainers.image.created: "2025-05-06T04:50:51.502Z"
org.opencontainers.image.description: "Windows inside a Docker container."
org.opencontainers.image.licenses: "MIT"
org.opencontainers.image.revision: "868c8af289a1012cd7c8bf2c9a2bba298eeb8dee"
org.opencontainers.image.source: "https://github.com/dockur/windows"
org.opencontainers.image.title: "Windows"
org.opencontainers.image.url: "https://github.com/dockur/windows"
org.opencontainers.image.version: "4.35"
logging:
driver: "json-file"
options: {}
networks:
- "windows_default"
ports:
- "1433:1433/tcp"
- "3389:3389/tcp"
- "3389:3389/udp"
- "8006:8006/tcp"
privileged: true
restart: "always"
security_opt:
- "label=disable"
volumes:
- "/mnt/data/docker_vol/windows:/storage"
- "/mnt/shared:/data"
working_dir: "/"
version: "3.6"

View File

@@ -0,0 +1,88 @@
# Portainer Reset & Backup Summary
**Date:** November 18, 2025, 13:37
**Issue:** Portainer environments showing as "unreachable" due to stale configurations from previous multi-instance setup
## Actions Taken
### 1. Complete Backup Created ✓
Location: `/mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/BACKUPS/20251118-133605/`
**Backup Contents:**
- ✓ Portainer database (portainer-database-backup.db) - 512KB
- ✓ Portainer automatic backup (portainer-automatic-backup.db.bak) - 512KB
- ✓ All containers combined compose file (all-containers-compose.yml) - 17KB
- ✓ Individual container compose files (7 files):
- container-portainer.yml
- container-windows.yml
- container-rincoin-node2.yml
- container-amd-strix-halo-llama-rocm.yml
- container-amd-strix-halo-llama-vulkan-radv.yml
- container-amd-strix-halo-llama-vulkan-amdvlk.yml
- container-docker-model-runner.yml
### 2. Portainer Database Reset ✓
- Old database: 512KB (contained stale environment 3)
- New database: 32KB (fresh installation)
- New instance ID: 1b059c79-d81d-4044-9050-4d90ea85a5ec
- Status: Running and responding correctly
### 3. Tools Installed ✓
- docker-autocompose from https://github.com/Red5d/docker-autocompose
- Dependencies: docker, pyaml Python packages
## Next Steps for User
### 1. Initial Portainer Setup
Visit http://localhost:9000 and complete the initial setup:
- Create new admin username and password
- This is required since the database was reset
### 2. Add Docker Environment
After login, add your local Docker environment:
- Click "Get Started" or "Add Environment"
- Select "Docker" as environment type
- Choose "Socket" connection method
- Socket path: `/var/run/docker.sock`
- Name it "nuc" or "localhost"
### 3. Verify All Containers Are Visible
All your existing containers should appear automatically:
- portainer
- windows
- rincoin-node2
- amd-strix-halo-llama-rocm
- amd-strix-halo-llama-vulkan-radv
- amd-strix-halo-llama-vulkan-amdvlk
- docker-model-runner
### 4. Optional: Export Portainer Configuration
From the Portainer UI:
- Settings → Backup
- Download backup for safekeeping
## Restore Instructions (If Needed)
### To restore old Portainer database:
```bash
docker stop portainer
docker run --rm -v /mnt/data/docker_vol/portainer:/data \
-v /mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/BACKUPS/20251118-133605:/backup \
alpine cp /backup/portainer-database-backup.db /data/portainer.db
docker start portainer
```
### To restore containers from compose files:
```bash
cd /mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/BACKUPS/20251118-133605
# Restore specific container
docker-compose -f container-NAME.yml up -d
# Or restore all containers
docker-compose -f all-containers-compose.yml up -d
```
## Problem Resolution
The issue was caused by stale environment configurations (specifically "environment 3") remaining in the Portainer database even after removal from the UI. These corrupted entries caused Portainer to crash when attempting to connect to non-existent environments. A fresh database resolves this completely.

View File

@@ -0,0 +1,123 @@
# Portainer Edge Agent Setup Guide
## Overview
Edge Agent allows you to connect Docker environments to Portainer over the network instead of using local socket connection. This is useful when having socket connection issues.
Reference: https://downloads.portainer.io/edge_agent_guide.pdf
## Step 1: Access Portainer UI
Access your Portainer instance:
- HTTP: http://localhost:9000
- HTTPS: https://localhost:9443
Complete the initial setup if you haven't already (create admin user).
## Step 2: Add Edge Environment in Portainer UI
1. **Log into Portainer**
2. **Go to Environments** (left sidebar)
3. **Click "Add environment"**
4. **Select "Edge Agent Standard"**
- Choose "Docker Standalone"
- Name: `nuc-edge` (or your preferred name)
5. **Copy the deployment command** shown in the UI
- It will include your `EDGE_ID` and `EDGE_KEY`
- The command looks like:
```bash
docker run -d \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /var/lib/docker/volumes:/var/lib/docker/volumes \
-v /:/host \
-v portainer_agent_data:/data \
--restart always \
-e EDGE=1 \
-e EDGE_ID=xxx \
-e EDGE_KEY=xxx \
-e CAP_HOST_MANAGEMENT=1 \
-e EDGE_INSECURE_POLL=1 \
--name portainer_edge_agent \
portainer/agent:latest
```
6. **Extract EDGE_ID and EDGE_KEY** from the command
## Step 3: Configure Edge Agent
### Option A: Using docker-compose (Recommended)
1. **Copy the example env file:**
```bash
cd /mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks
cp .env.edge-agent.example .env
```
2. **Edit .env file** with your EDGE_ID and EDGE_KEY:
```bash
nano .env
```
3. **Start the Edge Agent:**
```bash
docker-compose -f portainer-edge-agent.yml up -d
```
### Option B: Using the Docker command directly
Just run the command copied from Portainer UI in Step 2.
## Step 4: Verify Connection
1. Go back to Portainer UI → **Environments**
2. Your edge environment should show as **"Connected"** (green)
3. Click on the environment to manage your Docker containers
## Troubleshooting
### Edge Agent not connecting:
1. **Check logs:**
```bash
docker logs portainer-edge-agent
```
2. **Verify Portainer tunnel is accessible:**
```bash
curl http://localhost:8000
```
3. **Check if agent container is running:**
```bash
docker ps | grep edge-agent
```
4. **Ensure firewall allows port 8000** (for Edge polling)
### Environment shows as "Down":
- Wait 30-60 seconds for initial connection
- Check that EDGE_ID and EDGE_KEY are correct
- Restart the agent: `docker restart portainer-edge-agent`
## Cleanup
To remove Edge Agent:
```bash
docker-compose -f portainer-edge-agent.yml down -v
# or
docker stop portainer-edge-agent && docker rm portainer-edge-agent
```
## Notes
- Edge Agent polls Portainer server every 5 seconds by default
- `EDGE_INSECURE_POLL=1` allows connection without TLS (for local testing)
- Port 8000 is used for the Edge tunnel communication
- Port 9001 is the agent API port (optional, for direct access)

View File

@@ -0,0 +1,41 @@
version: '3'
services:
nextcloud-aio-mastercontainer:
container_name: nextcloud-aio-mastercontainer
image: nextcloud/all-in-one:latest
restart: always
#ports:
# - "82:80"
# - "8080:8080"
#- "8444:8444"
volumes:
- nextcloud_aio_mastercontainer:/mnt/docker-aio-config
- /var/run/docker.sock:/var/run/docker.sock:ro
- /mnt/storage/containers/nextcloud_aio:/mnt/host
environment:
- NEXTCLOUD_DATADIR=/mnt/storage/containers/nextcloud_data
- APACHE_PORT=8444
- APACHE_IP_BINDING=0.0.0.0
- APACHE_ADDITIONAL_NETWORK=proxy_proxy_default
- SKIP_DOMAIN_VALIDATION=true
networks:
- nextcloud_network
- proxy_proxy_default
volumes:
nextcloud_aio_mastercontainer:
driver: local
driver_opts:
type: none
o: bind
device: /mnt/storage/containers/nextcloud_config
networks:
nextcloud_network:
driver: bridge
proxy_proxy_default:
external: true
# https://animalabs.ai/

View File

@@ -0,0 +1,27 @@
version: '3.2'
services:
portainer-edge-agent:
image: portainer/agent:latest
container_name: portainer-edge-agent
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /var/lib/docker/volumes:/var/lib/docker/volumes
- /:/host
- portainer_agent_data:/data
environment:
# You need to get these values from Portainer UI after adding an Edge environment
# EDGE_ID and EDGE_KEY will be provided when you create the environment
- EDGE=1
- EDGE_ID=${EDGE_ID}
- EDGE_KEY=${EDGE_KEY}
- EDGE_INSECURE_POLL=1
# Portainer server URL - adjust to your Portainer server address
- PORTAINER_TUNNEL_ADDR=localhost:8000
ports:
- "9001:9001"
volumes:
portainer_agent_data:

View File

@@ -0,0 +1,24 @@
version: "3.8"
services:
rincoin-node:
container_name: rincoin-node2
image: rincoin-node:latest
restart: unless-stopped
ports:
- "9555:9555"
- "9556:9556"
volumes:
- /mnt/data/docker_vol/rincoin/rincoin-node/data:/data
- /mnt/data/docker_vol/rincoin/rincoin-node/rincoin.conf:/data/rincoin.conf:ro
command:
- -datadir=/data
- -conf=/data/rincoin.conf
- -printtoconsole

View File

@@ -0,0 +1,214 @@
# AMD Strix Halo iGPU Passthrough to Windows Container
This guide configures PCI passthrough for the AMD Strix Halo integrated GPU to the Windows Docker container, enabling GPU-accelerated applications.
## Important Note: Manual Binding Approach
This setup uses **manual GPU binding** to avoid host display issues. The GPU remains available to the host by default, and you manually bind it to VFIO only when starting the Windows container. This prevents system freezing at boot on newer kernels.
## Problem
The Windows container was showing "Red Hat VirtIO GPU DOD Controller" instead of the AMD GPU because:
- IOMMU was disabled (`amd_iommu=off`)
- GPU was not passed through at PCI level
- Only `/dev/dri` devices were exposed (insufficient for Windows)
- Early VFIO binding caused host display to freeze
## Solution Overview
1. Enable AMD IOMMU in kernel boot parameters
2. Bind GPU and audio devices to `vfio-pci` driver
3. Configure QEMU to pass through PCI devices
4. Restart container and install AMD drivers in Windows
## Hardware Details
- **GPU**: AMD Strix Halo iGPU (PCI: c5:00.0, ID: 1002:1586)
- **Audio**: HDMI Audio Controller (PCI: c5:00.1, ID: 1002:1640)
## Setup Instructions
### Step 1: Fix GRUB Configuration (If You Had Freezing Issues)
If your system was freezing at login on newer kernels:
```bash
cd /mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/windows
sudo ./fix-grub-remove-vfio-ids.sh
```
This removes early VFIO binding that causes the host to lose GPU access.
### Step 2: Update GRUB and Reboot
```bash
sudo update-grub
sudo reboot
```
**IMPORTANT**: After reboot, IOMMU will be enabled but GPU remains available to host.
### Step 3: Before Starting Windows Container - Bind GPU
Every time you want to use GPU passthrough, run:
```bash
cd /mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/windows
sudo ./bind-gpu-to-vfio.sh
```
This temporarily binds the GPU to VFIO (host display will stop working).
### Step 4: Start Windows Container
```bash
cd /mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/windows
docker compose up -d
```
### Step 5: When Done - Restore GPU to Host
After stopping the Windows container, restore GPU to host:
```bash
cd /mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/windows
sudo ./unbind-gpu-from-vfio.sh
```
This rebinds the GPU to amdgpu driver for host use.
### Step 6: Install AMD Drivers in Windows
1. Connect to Windows via RDP: `localhost:3389`
2. Open Device Manager
3. You should see "AMD Display Adapter" (may show with warning)
4. Download AMD Radeon drivers for Windows 11
5. Install the drivers
6. Reboot Windows
7. Verify GPU in Task Manager → Performance → GPU
## Docker Compose Configuration
The configuration includes:
```yaml
environment:
GPU: "Y"
ARGUMENTS: "-device vfio-pci,host=c5:00.0,addr=0x02,multifunction=on -device vfio-pci,host=c5:00.1,addr=0x02.1"
devices:
- /dev/vfio/vfio
```
This passes through:
- **c5:00.0**: AMD GPU
- **c5:00.1**: HDMI Audio
- **addr=0x02**: Virtual PCI slot in guest
- **multifunction=on**: Allows multiple functions on same slot
## Troubleshooting
### GPU still shows VirtIO after reboot
Check if GPU is bound to vfio-pci:
```bash
lspci -nnk -s c5:00.0
```
Should show: `Kernel driver in use: vfio-pci`
If not, manually bind:
```bash
echo "0000:c5:00.0" | sudo tee /sys/bus/pci/drivers/amdgpu/unbind
echo "1002 1586" | sudo tee /sys/bus/pci/drivers/vfio-pci/new_id
```
### IOMMU not enabled after reboot
Check kernel parameters:
```bash
cat /proc/cmdline | grep iommu
```
Should show: `amd_iommu=on iommu=pt`
If not present:
```bash
sudo nano /etc/default/grub
# Add to GRUB_CMDLINE_LINUX_DEFAULT: amd_iommu=on iommu=pt
sudo update-grub
sudo reboot
```
### Container fails to start
Check logs:
```bash
docker logs windows
```
Common issues:
- VFIO device not found: Run verification script
- Permission denied: Ensure container is `privileged: true`
- Device busy: Another driver may be using the GPU
### GPU not detected in Windows
1. Check Device Manager for unknown devices
2. Try installing AMD Chipset drivers first
3. Use AMD Auto-Detect tool for driver installation
4. Check Windows Event Viewer for driver errors
## Performance Notes
- **Full GPU acceleration**: Direct PCI passthrough provides near-native performance
- **VRAM**: Windows will see the full iGPU VRAM allocation
- **Display output**: Use RDP/VNC (no physical display from container)
- **3D acceleration**: Fully supported (DirectX, OpenGL, Vulkan)
## Limitations
- Host cannot use the iGPU while passed through to the container
- Physical display outputs from the GPU won't work (headless only)
- USB devices may need separate passthrough configuration
- Some GPU features may require CPU pinning for best performance
## Files Modified
- `/etc/default/grub` - IOMMU kernel parameters
- `/etc/modprobe.d/vfio.conf` - VFIO driver binding
- `/etc/initramfs-tools/modules` - VFIO modules in initramfs
- `docker-compose.yml` - PCI passthrough arguments
## Reverting Changes
To restore GPU to host:
1. Remove VFIO configuration:
```bash
sudo rm /etc/modprobe.d/vfio.conf
```
2. Edit GRUB to remove `vfio-pci.ids=...`:
```bash
sudo nano /etc/default/grub
sudo update-grub
```
3. Update initramfs and reboot:
```bash
sudo update-initramfs -u
sudo reboot
```
## References
- [dockurr/windows](https://github.com/dockur/windows) - Windows container image
- [AMD GPU Passthrough Guide](https://wiki.archlinux.org/title/PCI_passthrough_via_OVMF)
- [VFIO Documentation](https://www.kernel.org/doc/html/latest/driver-api/vfio.html)

View File

@@ -0,0 +1,185 @@
# GPU Sharing: Windows vs Linux Explained
## Can You Share GPU Between Host and Container?
**Short Answer**: No, not with VFIO PCI passthrough on Linux.
## Why Windows Can Do It (Hyper-V GPU-PV)
### Windows Hyper-V GPU Paravirtualization
- **Technology**: Microsoft's proprietary GPU virtualization
- **How it works**: GPU stays with Windows host, VMs get "virtual GPU slices"
- **Requirements**:
- Windows host (Server or Pro with Hyper-V)
- Windows guests
- Specific GPU support (mostly newer Intel/AMD/NVIDIA)
- **Benefits**:
- ✓ Multiple VMs share one GPU
- ✓ Host keeps display working
- ✓ Decent performance for most workloads
- **Limitations**:
- Windows only (host + guest)
- Not full GPU performance
- Limited GPU features
## Why Linux QEMU/VFIO Can't Share
### VFIO PCI Passthrough
- **Technology**: Hardware-level device passthrough (Linux kernel feature)
- **How it works**: Entire GPU is "unplugged" from host and given to guest
- **Benefits**:
- ✓ Near-native performance
- ✓ Full GPU features
- ✓ Works cross-platform (any guest OS)
- **Limitations**:
- ✗ Exclusive access only (either host OR guest)
- ✗ Host loses display when GPU passed through
- ✗ Cannot share between multiple VMs
## Your Options for AMD Strix Halo iGPU
### Option 1: Shared Software Rendering (Recommended)
**Configuration**: No GPU passthrough
**How it works**:
- Host uses GPU normally (amdgpu driver)
- Windows container gets VirtIO virtual GPU
- Both host and container work simultaneously
- Software rendering in container (accelerated by host GPU)
**Pros**:
- ✓ Host display works
- ✓ Container auto-starts
- ✓ Both usable at same time
- ✓ Simple, no binding scripts
**Cons**:
- ✗ No native GPU in Windows
- ✗ Limited GPU performance in Windows
- ✗ No GPU-Z, no AMD drivers in Windows
**Best for**:
- General Windows usage
- When you need host display
- Development/testing
- Light workloads in Windows
**Current docker-compose setup**: This is now configured (I just updated it)
---
### Option 2: Exclusive GPU Passthrough
**Configuration**: VFIO PCI passthrough (manual binding)
**How it works**:
1. Bind GPU to VFIO (host display freezes)
2. Start Windows container
3. Windows gets real AMD GPU
4. Stop container and unbind to restore host
**Pros**:
- ✓ Full AMD GPU in Windows
- ✓ Native performance
- ✓ GPU-accelerated apps work
- ✓ AMD drivers install
**Cons**:
- ✗ Host display frozen (no GUI)
- ✗ Exclusive - can't use both
- ✗ Manual binding required
- ✗ Access host via SSH only
**Best for**:
- GPU-intensive Windows apps
- Machine learning in Windows
- Gaming (if that's possible)
- When maximum GPU performance needed
**Workflow**:
```bash
# Start Windows with GPU
sudo ./bind-gpu-to-vfio.sh # Host display goes black!
docker compose -f docker-compose.gpu-passthrough.yml up -d
# Stop and restore
docker compose -f docker-compose.gpu-passthrough.yml down
sudo ./unbind-gpu-from-vfio.sh
```
---
## Technologies That DON'T Work Here
### SR-IOV (Single Root I/O Virtualization)
- Requires GPU hardware support
- Consumer GPUs (like Strix Halo) don't have it
- Mostly enterprise data center GPUs
### AMD MxGPU / NVIDIA vGPU
- Enterprise GPU virtualization
- Requires special drivers + licensed enterprise GPUs
- Not available for consumer iGPUs
### GVT-g (Intel GPU Virtualization)
- Intel only
- Not available for AMD GPUs
### Looking Glass
- Allows viewing GPU output from guest
- Still exclusive passthrough (guest owns GPU)
- Just a viewer, not sharing
## What About DRI/DRM Passthrough?
You might think: "Can we pass `/dev/dri` to share?"
**Tried this already** - it doesn't work for Windows because:
- Windows needs PCI-level GPU access
- `/dev/dri` is Linux-specific (won't work in Windows)
- Windows drivers expect real PCI GPU device
## Comparison Table
| Feature | Shared (VirtIO) | Exclusive (VFIO) | Windows Hyper-V GPU-PV |
|---------|----------------|------------------|------------------------|
| Host display works | ✓ | ✗ | ✓ |
| Container auto-start | ✓ | ✗ | ✓ |
| Both usable together | ✓ | ✗ | ✓ |
| Native GPU in Windows | ✗ | ✓ | ~ (virtual) |
| GPU performance | Low | High | Medium |
| Setup complexity | Easy | Complex | Medium |
| Requires manual binding | ✗ | ✓ | ✗ |
## Recommendation
**For your use case**, I recommend:
### Start with Option 1 (Shared - No Passthrough)
- Container works
- Host works
- Both at same time
- Simple setup
**If Windows GPU performance is too slow**, then consider:
- Adding a second GPU to host (dedicate one to passthrough)
- Running Windows on bare metal for GPU workloads
- Using cloud GPU instances for heavy GPU tasks
## Current Configuration
I've just updated your `docker-compose.yml` to **Option 1 (Shared)**:
- Removed GPU passthrough
- Removed VFIO devices
- Container can auto-start
- Host display continues working
**Want to test it?**
```bash
cd /mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/windows
docker compose up -d
```
Windows will start with VirtIO display. Both host and container will work simultaneously.
**Need GPU passthrough later?** I can create a separate docker-compose file for that use case.

View File

@@ -0,0 +1,79 @@
#!/bin/bash
# Manually bind the AMD GPU to VFIO for Windows container passthrough
# Run this BEFORE starting the Windows container
set -e
if [ "$EUID" -ne 0 ]; then
echo "Please run as root: sudo $0"
exit 1
fi
echo "=== Binding AMD GPU to VFIO ==="
echo ""
GPU_PCI="0000:c5:00.0"
AUDIO_PCI="0000:c5:00.1"
# Check if vfio-pci module is loaded
if ! lsmod | grep -q vfio_pci; then
echo "Loading vfio-pci module..."
modprobe vfio-pci
fi
# Unbind GPU from amdgpu
echo "Unbinding GPU from amdgpu..."
if [ -e /sys/bus/pci/devices/$GPU_PCI/driver ]; then
echo "$GPU_PCI" > /sys/bus/pci/devices/$GPU_PCI/driver/unbind
echo "✓ GPU unbound from amdgpu"
else
echo "GPU not bound to any driver"
fi
# Unbind audio from snd_hda_intel
echo "Unbinding audio from snd_hda_intel..."
if [ -e /sys/bus/pci/devices/$AUDIO_PCI/driver ]; then
echo "$AUDIO_PCI" > /sys/bus/pci/devices/$AUDIO_PCI/driver/unbind
echo "✓ Audio unbound"
else
echo "Audio not bound to any driver"
fi
# Bind to vfio-pci
echo ""
echo "Binding to vfio-pci..."
echo "1002 1586" > /sys/bus/pci/drivers/vfio-pci/new_id 2>/dev/null || echo "GPU ID already registered"
echo "1002 1640" > /sys/bus/pci/drivers/vfio-pci/new_id 2>/dev/null || echo "Audio ID already registered"
sleep 1
# Verify
GPU_DRIVER=$(lspci -nnk -s c5:00.0 | grep "Kernel driver in use" | awk '{print $5}')
AUDIO_DRIVER=$(lspci -nnk -s c5:00.1 | grep "Kernel driver in use" | awk '{print $5}')
echo ""
echo "=== Status ==="
if [ "$GPU_DRIVER" = "vfio-pci" ]; then
echo "✓ GPU bound to vfio-pci"
else
echo "✗ GPU bound to: ${GPU_DRIVER:-none}"
fi
if [ "$AUDIO_DRIVER" = "vfio-pci" ]; then
echo "✓ Audio bound to vfio-pci"
else
echo "✗ Audio bound to: ${AUDIO_DRIVER:-none}"
fi
echo ""
if [ "$GPU_DRIVER" = "vfio-pci" ] && [ "$AUDIO_DRIVER" = "vfio-pci" ]; then
echo "✓ Ready for GPU passthrough!"
echo ""
echo "Now start the Windows container:"
echo " cd /mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/windows"
echo " docker compose up -d"
else
echo "✗ Binding failed. Check errors above."
fi

View File

@@ -0,0 +1,33 @@
services:
windows:
image: dockurr/windows # https://github.com/dockur/windows
container_name: windows-gpu
environment:
VERSION: "11"
RAM_SIZE: "8G"
CPU_CORES: "4"
GPU: "Y"
ARGUMENTS: "-device vfio-pci,host=c5:00.0,addr=0x05,multifunction=on,rombar=0 -device vfio-pci,host=c5:00.1,addr=0x05.1"
devices:
- /dev/kvm
- /dev/net/tun
- /dev/nvme0n1p8:/disk2
- /dev/vfio/vfio
- /dev/vfio/20
- /dev/vfio/21
cap_add:
- NET_ADMIN
privileged: true
ports:
- 445:445
- 1433:1433
- 8006:8006
- 3389:3389/tcp
- 3389:3389/udp
volumes:
# - /dev/nvme0n1p7:/disk1 # blind mount - not working for now
- /mnt/data/docker_vol/windows:/storage # storage (img file)location
- /mnt/shared:/data
restart: "no" # Manual start only - requires GPU binding first
stop_grace_period: 2m

View File

@@ -0,0 +1,32 @@
# Windows Container - Shared Mode (No GPU Passthrough)
# Host and container can both run simultaneously
# Windows gets VirtIO display, host keeps AMD GPU
# For GPU passthrough, use: docker-compose.gpu-passthrough.yml
services:
windows:
image: dockurr/windows # https://github.com/dockur/windows
container_name: windows2
environment:
VERSION: "11"
RAM_SIZE: "8G"
CPU_CORES: "4"
devices:
- /dev/kvm
- /dev/net/tun
- /dev/nvme0n1p8:/disk2
cap_add:
- NET_ADMIN
privileged: true
ports:
- 445:445
- 1433:1433
- 8006:8006
- 3389:3389/tcp
- 3389:3389/udp
volumes:
# - /dev/nvme0n1p7:/disk1 # blind mount - not working for now
- /mnt/data/docker_vol/windows:/storage # storage (img file)location
- /mnt/shared:/data
restart: always
stop_grace_period: 2m

View File

@@ -0,0 +1,43 @@
#!/bin/bash
# Fix GRUB IOMMU conflict - remove amd_iommu=off that's blocking the passthrough
set -e
if [ "$EUID" -ne 0 ]; then
echo "Please run as root: sudo $0"
exit 1
fi
echo "=== Fixing GRUB IOMMU Configuration ==="
echo ""
GRUB_FILE="/etc/default/grub"
# Backup
cp "$GRUB_FILE" "$GRUB_FILE.backup.$(date +%Y%m%d-%H%M%S)"
echo "✓ Backup created"
# Remove the conflicting amd_iommu=off
sed -i 's/ amd_iommu=off//' "$GRUB_FILE"
echo "✓ Removed amd_iommu=off from GRUB config"
echo ""
echo "New GRUB_CMDLINE_LINUX_DEFAULT:"
grep "GRUB_CMDLINE_LINUX_DEFAULT" "$GRUB_FILE"
echo ""
# Update GRUB
echo "Updating GRUB..."
update-grub
echo ""
echo "=== Fix Complete ==="
echo ""
echo "⚠️ REBOOT NOW to apply changes: sudo reboot"
echo ""
echo "After reboot, verify with:"
echo " ./verify-gpu-passthrough.sh"

View File

@@ -0,0 +1,48 @@
#!/bin/bash
# Manual GRUB fix - completely rewrite the GRUB_CMDLINE_LINUX_DEFAULT line
set -e
if [ "$EUID" -ne 0 ]; then
echo "Please run as root: sudo $0"
exit 1
fi
echo "=== Fixing GRUB Configuration (Manual Method) ==="
echo ""
GRUB_FILE="/etc/default/grub"
# Backup
cp "$GRUB_FILE" "$GRUB_FILE.backup.manual.$(date +%Y%m%d-%H%M%S)"
echo "✓ Backup created"
# Replace the entire line with a clean version
sed -i 's|^GRUB_CMDLINE_LINUX_DEFAULT=.*|GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amd_iommu=on iommu=pt vfio-pci.ids=1002:1586,1002:1640 amdgpu.gttsize=131072 ttm.pages_limit=33554432 amdgpu.si_support=1 amdgpu.cik_support=1 radeon.si_support=0 radeon.cik_support=0"|' "$GRUB_FILE"
echo "✓ GRUB configuration updated"
echo ""
echo "New configuration:"
grep "GRUB_CMDLINE_LINUX_DEFAULT" "$GRUB_FILE"
echo ""
# Update GRUB
echo "Updating GRUB..."
update-grub
echo ""
echo "=== Fix Complete ==="
echo ""
echo "Changes made:"
echo " - Removed: amd_iommu=off"
echo " - Added: amd_iommu=on iommu=pt"
echo " - Added: vfio-pci.ids=1002:1586,1002:1640"
echo ""
echo "⚠️ REBOOT REQUIRED: sudo reboot"
echo ""
echo "After reboot, check:"
echo " cat /proc/cmdline | grep amd_iommu"
echo " Should show ONLY: amd_iommu=on"

View File

@@ -0,0 +1,109 @@
#!/bin/bash
# GPU Passthrough Setup for AMD Strix Halo iGPU to Windows Container
# This script enables IOMMU and configures VFIO-PCI for GPU passthrough
set -e
echo "=== AMD Strix Halo GPU Passthrough Setup ==="
echo ""
# Check if running as root
if [ "$EUID" -ne 0 ]; then
echo "Please run as root (sudo)"
exit 1
fi
# GPU PCI IDs
GPU_PCI="0000:c5:00.0"
GPU_AUDIO_PCI="0000:c5:00.1"
GPU_VENDOR_ID="1002"
GPU_DEVICE_ID="1586"
# Check current IOMMU status
echo "Current IOMMU status:"
cat /proc/cmdline | grep -o "amd_iommu=[^ ]*" || echo "IOMMU not configured in kernel parameters"
echo ""
# Step 1: Enable IOMMU in GRUB
echo "Step 1: Checking GRUB configuration..."
GRUB_FILE="/etc/default/grub"
if ! grep -q "amd_iommu=on" "$GRUB_FILE"; then
echo "Adding IOMMU parameters to GRUB..."
cp "$GRUB_FILE" "$GRUB_FILE.backup.$(date +%Y%m%d-%H%M%S)"
# Update GRUB_CMDLINE_LINUX_DEFAULT
sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="\(.*\)"/GRUB_CMDLINE_LINUX_DEFAULT="\1 amd_iommu=on iommu=pt vfio-pci.ids=1002:1586,1002:1640"/' "$GRUB_FILE"
# Clean up double spaces
sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT=" /GRUB_CMDLINE_LINUX_DEFAULT="/' "$GRUB_FILE"
echo "Updating GRUB..."
update-grub
echo ""
echo "✓ GRUB updated. IOMMU will be enabled after reboot."
else
echo "✓ IOMMU already configured in GRUB"
fi
# Step 2: Configure VFIO modules
echo ""
echo "Step 2: Configuring VFIO modules..."
VFIO_CONF="/etc/modprobe.d/vfio.conf"
cat > "$VFIO_CONF" << EOF
# Bind AMD Strix Halo GPU to VFIO for passthrough
options vfio-pci ids=1002:1586,1002:1640
softdep amdgpu pre: vfio-pci
softdep snd_hda_intel pre: vfio-pci
EOF
echo "✓ VFIO configuration created"
# Step 3: Update initramfs
echo ""
echo "Step 3: Adding VFIO modules to initramfs..."
MODULES_FILE="/etc/initramfs-tools/modules"
if ! grep -q "vfio_pci" "$MODULES_FILE"; then
cat >> "$MODULES_FILE" << EOF
# VFIO modules for GPU passthrough
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
EOF
echo "✓ VFIO modules added to initramfs"
else
echo "✓ VFIO modules already in initramfs"
fi
echo ""
echo "Updating initramfs..."
update-initramfs -u
# Step 4: Summary and next steps
echo ""
echo "=== Setup Complete ==="
echo ""
echo "Configuration applied:"
echo " - IOMMU enabled in GRUB (amd_iommu=on iommu=pt)"
echo " - GPU (1002:1586) bound to vfio-pci driver"
echo " - Audio (1002:1640) bound to vfio-pci driver"
echo " - Initramfs updated with VFIO modules"
echo ""
echo "⚠️ REBOOT REQUIRED to apply changes by running: 'sudo update-grub' and 'sudo reboot'"
echo ""
echo "After reboot:"
echo " 1. Verify IOMMU is enabled: dmesg | grep -i iommu"
echo " 2. Check GPU binding: lspci -nnk -d 1002:1586"
echo " 3. Start Windows container: docker-compose up -d"
echo " 4. Install AMD drivers in Windows"
echo ""
echo "To reboot now, run: reboot"

View File

@@ -0,0 +1,82 @@
#!/bin/bash
# Unbind the AMD GPU from VFIO and restore it to the host (amdgpu driver)
# Run this AFTER stopping the Windows container to restore host GPU access
set -e
if [ "$EUID" -ne 0 ]; then
echo "Please run as root: sudo $0"
exit 1
fi
echo "=== Unbinding AMD GPU from VFIO ==="
echo ""
GPU_PCI="0000:c5:00.0"
AUDIO_PCI="0000:c5:00.1"
# Stop Windows container first
echo "Checking if Windows container is running..."
if docker ps | grep -q windows2; then
echo "Stopping Windows container..."
docker stop windows2
echo "✓ Container stopped"
fi
# Unbind from vfio-pci
echo ""
echo "Unbinding from vfio-pci..."
if [ -e /sys/bus/pci/devices/$GPU_PCI/driver ]; then
echo "$GPU_PCI" > /sys/bus/pci/devices/$GPU_PCI/driver/unbind
echo "✓ GPU unbound from vfio-pci"
fi
if [ -e /sys/bus/pci/devices/$AUDIO_PCI/driver ]; then
echo "$AUDIO_PCI" > /sys/bus/pci/devices/$AUDIO_PCI/driver/unbind
echo "✓ Audio unbound from vfio-pci"
fi
# Remove device IDs from vfio-pci
echo "1002 1586" > /sys/bus/pci/drivers/vfio-pci/remove_id 2>/dev/null || true
echo "1002 1640" > /sys/bus/pci/drivers/vfio-pci/remove_id 2>/dev/null || true
sleep 1
# Rebind to host drivers
echo ""
echo "Binding back to host drivers..."
echo "$GPU_PCI" > /sys/bus/pci/drivers_probe
echo "$AUDIO_PCI" > /sys/bus/pci/drivers_probe
sleep 2
# Verify
GPU_DRIVER=$(lspci -nnk -s c5:00.0 | grep "Kernel driver in use" | awk '{print $5}')
AUDIO_DRIVER=$(lspci -nnk -s c5:00.1 | grep "Kernel driver in use" | awk '{print $5}')
echo ""
echo "=== Status ==="
if [ "$GPU_DRIVER" = "amdgpu" ]; then
echo "✓ GPU restored to amdgpu"
else
echo "⚠ GPU bound to: ${GPU_DRIVER:-none}"
fi
if [ "$AUDIO_DRIVER" = "snd_hda_intel" ]; then
echo "✓ Audio restored to snd_hda_intel"
else
echo "⚠ Audio bound to: ${AUDIO_DRIVER:-none}"
fi
echo ""
if [ "$GPU_DRIVER" = "amdgpu" ]; then
echo "✓ GPU restored to host!"
echo ""
echo "You may need to restart your display manager:"
echo " sudo systemctl restart gdm3 # for GNOME"
echo " sudo systemctl restart lightdm # for XFCE/other"
else
echo "⚠ GPU not fully restored. You may need to reboot."
fi

View File

@@ -0,0 +1,96 @@
#!/bin/bash
# Verification script for GPU Passthrough Setup
# Run this after reboot to verify IOMMU and VFIO configuration
echo "=== GPU Passthrough Verification ==="
echo ""
# Check 1: IOMMU enabled
echo "1. Checking IOMMU status..."
if dmesg | grep -qi "AMD-Vi: AMD IOMMUv2 loaded"; then
echo " ✓ IOMMU is enabled"
else
echo " ✗ IOMMU not detected in dmesg"
echo " Boot parameters: $(cat /proc/cmdline | grep -o 'amd_iommu=[^ ]*\|iommu=[^ ]*')"
fi
echo ""
# Check 2: VFIO module loaded
echo "2. Checking VFIO modules..."
if lsmod | grep -q vfio_pci; then
echo " ✓ vfio_pci module loaded"
else
echo " ✗ vfio_pci module not loaded"
echo " Try: modprobe vfio-pci"
fi
echo ""
# Check 3: GPU bound to VFIO
echo "3. Checking GPU (c5:00.0) driver binding..."
GPU_DRIVER=$(lspci -nnk -s c5:00.0 | grep "Kernel driver in use" | awk '{print $5}')
if [ "$GPU_DRIVER" = "vfio-pci" ]; then
echo " ✓ GPU bound to vfio-pci"
else
echo " ✗ GPU bound to: ${GPU_DRIVER:-none}"
echo " Expected: vfio-pci"
fi
lspci -nnk -s c5:00.0 | head -5
echo ""
# Check 4: Audio bound to VFIO
echo "4. Checking GPU Audio (c5:00.1) driver binding..."
AUDIO_DRIVER=$(lspci -nnk -s c5:00.1 | grep "Kernel driver in use" | awk '{print $5}')
if [ "$AUDIO_DRIVER" = "vfio-pci" ]; then
echo " ✓ Audio bound to vfio-pci"
else
echo " ✗ Audio bound to: ${AUDIO_DRIVER:-none}"
echo " Expected: vfio-pci"
fi
lspci -nnk -s c5:00.1 | head -5
echo ""
# Check 5: IOMMU groups
echo "5. Checking IOMMU groups..."
if [ -e /sys/bus/pci/devices/0000:c5:00.0/iommu_group ]; then
GPU_GROUP=$(basename $(readlink /sys/bus/pci/devices/0000:c5:00.0/iommu_group))
echo " ✓ GPU IOMMU group: $GPU_GROUP"
echo " Devices in group:"
ls -1 /sys/bus/pci/devices/0000:c5:00.0/iommu_group/devices/ | sed 's/^/ - /'
else
echo " ✗ IOMMU group not found for GPU"
fi
echo ""
# Check 6: VFIO devices
echo "6. Checking /dev/vfio devices..."
if [ -e /dev/vfio/vfio ]; then
echo " ✓ /dev/vfio/vfio exists"
ls -la /dev/vfio/ | sed 's/^/ /'
else
echo " ✗ /dev/vfio/vfio not found"
fi
echo ""
# Summary
echo "=== Summary ==="
if [ "$GPU_DRIVER" = "vfio-pci" ] && [ "$AUDIO_DRIVER" = "vfio-pci" ] && [ -e /dev/vfio/vfio ]; then
echo "✓ GPU passthrough is configured correctly!"
echo ""
echo "Next steps:"
echo " 1. Start the Windows container: cd /mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/windows && docker-compose up -d"
echo " 2. Connect to Windows via RDP: localhost:3389"
echo " 3. Install AMD Radeon drivers in Windows"
echo " 4. GPU should appear as 'AMD Strix Halo' in Device Manager"
else
echo "✗ GPU passthrough configuration needs attention"
echo ""
echo "If GPU is not bound to vfio-pci:"
echo " - Check /etc/modprobe.d/vfio.conf"
echo " - Run: sudo update-initramfs -u"
echo " - Reboot again"
fi