mirror of
https://github.com/BillyOutlast/openwebui-ollama-rocm-podman-mcp.git
synced 2026-07-01 09:46:36 -04:00
feat: add ai-stack pod configuration and update related service files
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
The `quadlets/` directory contains rootless Podman Quadlets with a shared network:
|
||||
|
||||
- `ai-shared.network`
|
||||
- `ai-stack.pod`
|
||||
- `ollama-rocm.container`
|
||||
- `open-webui.container`
|
||||
- `podman-mcp-server.container`
|
||||
@@ -62,6 +63,7 @@ sudo REMOVE_DATA=true bash ./uninstall-rootful.sh
|
||||
```powershell
|
||||
mkdir "$HOME/.config/containers/systemd" -Force
|
||||
copy .\quadlets\*.network "$HOME/.config/containers/systemd\"
|
||||
copy .\quadlets\*.pod "$HOME/.config/containers/systemd\"
|
||||
copy .\quadlets\*.container "$HOME/.config/containers/systemd\"
|
||||
```
|
||||
|
||||
@@ -72,6 +74,8 @@ systemctl --user daemon-reload
|
||||
systemctl --user start --no-block ai-shared-network.service
|
||||
systemctl --user enable podman.socket
|
||||
systemctl --user start --no-block podman.socket
|
||||
systemctl --user enable ai-stack-pod.service
|
||||
systemctl --user start --no-block ai-stack-pod.service
|
||||
systemctl --user enable ollama-rocm.service
|
||||
systemctl --user enable open-webui.service
|
||||
systemctl --user enable podman-mcp-server.service
|
||||
@@ -203,7 +207,6 @@ sudo systemctl restart ollama-rocm.service
|
||||
## Notes
|
||||
|
||||
- `podman-mcp-server` is launched via `npx` inside a Node container because the upstream project is distributed as binary/npm package.
|
||||
- `podman-mcp-server.container` uses `Pull=missing` to avoid repeated Docker Hub pulls on every restart.
|
||||
- The Ollama unit mirrors your ROCm `docker run` flags.
|
||||
- If this host is not Linux with ROCm devices (`/dev/kfd`, `/dev/dri/renderD*`), `ollama` will fail to start.
|
||||
- Installers automatically replace the generic `/dev/dri` mapping with explicit detected nodes (for example `/dev/dri/renderD128`) to avoid Podman hosts that reject directory device mappings.
|
||||
|
||||
+4
-1
@@ -58,6 +58,7 @@ mkdir -p "${TARGET_DIR}"
|
||||
mkdir -p "${OPEN_WEBUI_DATA_DIR}"
|
||||
|
||||
cp "${QUADLETS_DIR}"/*.network "${TARGET_DIR}/"
|
||||
cp "${QUADLETS_DIR}"/*.pod "${TARGET_DIR}/"
|
||||
cp "${QUADLETS_DIR}"/*.container "${TARGET_DIR}/"
|
||||
configure_ollama_dri_devices
|
||||
|
||||
@@ -83,7 +84,8 @@ if ! systemctl start ai-shared-network.service; then
|
||||
fi
|
||||
fi
|
||||
|
||||
systemctl reset-failed ollama-rocm.service open-webui.service podman-mcp-server.service >/dev/null 2>&1 || true
|
||||
systemctl reset-failed ai-stack-pod.service ollama-rocm.service open-webui.service podman-mcp-server.service >/dev/null 2>&1 || true
|
||||
systemctl start --no-block ai-stack-pod.service
|
||||
|
||||
OLLAMA_READY=true
|
||||
|
||||
@@ -113,6 +115,7 @@ echo
|
||||
echo "Installed and started rootful services:"
|
||||
echo " - ai-shared-network.service"
|
||||
echo " - podman.socket"
|
||||
echo " - ai-stack-pod.service"
|
||||
if [[ "${OLLAMA_READY}" == "true" ]]; then
|
||||
echo " - ollama-rocm.service"
|
||||
else
|
||||
|
||||
@@ -128,6 +128,7 @@ mkdir -p "${TARGET_DIR}"
|
||||
mkdir -p "${OPEN_WEBUI_DATA_DIR}"
|
||||
|
||||
cp "${QUADLETS_DIR}"/*.network "${TARGET_DIR}/"
|
||||
cp "${QUADLETS_DIR}"/*.pod "${TARGET_DIR}/"
|
||||
cp "${QUADLETS_DIR}"/*.container "${TARGET_DIR}/"
|
||||
configure_ollama_dri_devices
|
||||
|
||||
@@ -135,6 +136,8 @@ systemctl --user daemon-reload
|
||||
systemctl --user start --no-block ai-shared-network.service
|
||||
systemctl --user enable podman.socket
|
||||
systemctl --user start --no-block podman.socket
|
||||
systemctl --user enable ai-stack-pod.service
|
||||
systemctl --user start --no-block ai-stack-pod.service
|
||||
systemctl --user enable ollama-rocm.service
|
||||
systemctl --user enable open-webui.service
|
||||
systemctl --user enable podman-mcp-server.service
|
||||
@@ -165,6 +168,7 @@ echo
|
||||
echo "Installed and started services:"
|
||||
echo " - ai-shared-network.service"
|
||||
echo " - podman.socket"
|
||||
echo " - ai-stack-pod.service"
|
||||
if [[ "${OLLAMA_READY}" == "true" ]]; then
|
||||
echo " - ollama-rocm.service"
|
||||
else
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
[Unit]
|
||||
Description=Shared Pod for Ollama + Open WebUI + Podman MCP
|
||||
After=network-online.target ai-shared-network.service
|
||||
Wants=network-online.target ai-shared-network.service
|
||||
|
||||
[Pod]
|
||||
PodName=ai-stack
|
||||
Network=ai-shared.network
|
||||
PublishPort=11434:11434
|
||||
PublishPort=3000:8080
|
||||
PublishPort=8080:8080
|
||||
|
||||
[Install]
|
||||
WantedBy=default.target
|
||||
@@ -1,13 +1,12 @@
|
||||
[Unit]
|
||||
Description=Ollama ROCm API
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
After=network-online.target ai-stack-pod.service
|
||||
Wants=network-online.target ai-stack-pod.service
|
||||
|
||||
[Container]
|
||||
ContainerName=ollama
|
||||
Image=docker.io/ollama/ollama:rocm
|
||||
Network=ai-shared.network
|
||||
PublishPort=11434:11434
|
||||
Pod=ai-stack.pod
|
||||
Volume=ollama:/root/.ollama:Z
|
||||
PodmanArgs=--device=/dev/kfd
|
||||
PodmanArgs=--device=/dev/dri
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
[Unit]
|
||||
Description=Open WebUI
|
||||
After=network-online.target ollama-rocm.service
|
||||
Wants=network-online.target ollama-rocm.service
|
||||
After=network-online.target ai-stack-pod.service ollama-rocm.service
|
||||
Wants=network-online.target ai-stack-pod.service ollama-rocm.service
|
||||
|
||||
[Container]
|
||||
ContainerName=open-webui
|
||||
Image=ghcr.io/open-webui/open-webui:main
|
||||
Network=ai-shared.network
|
||||
PublishPort=3000:8080
|
||||
Pod=ai-stack.pod
|
||||
Volume=%h/.local/share/open-webui:/app/backend/data:Z
|
||||
Environment=OLLAMA_BASE_URL=http://ollama:11434
|
||||
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
[Unit]
|
||||
Description=Podman MCP Server (HTTP mode)
|
||||
After=network-online.target podman.socket
|
||||
Wants=network-online.target podman.socket
|
||||
After=network-online.target podman.socket ai-stack-pod.service
|
||||
Wants=network-online.target podman.socket ai-stack-pod.service
|
||||
|
||||
[Container]
|
||||
ContainerName=podman-mcp-server
|
||||
Image=docker.io/library/node:current-alpine
|
||||
Network=ai-shared.network
|
||||
PublishPort=8080:8080
|
||||
Pod=ai-stack.pod
|
||||
Volume=%t/podman/podman.sock:/run/podman/podman.sock
|
||||
Environment=CONTAINER_HOST=unix:///run/podman/podman.sock
|
||||
Exec=npx -y podman-mcp-server@latest --port 8080 --podman-impl=api
|
||||
|
||||
@@ -12,6 +12,7 @@ REMOVE_DATA="${REMOVE_DATA:-false}"
|
||||
|
||||
services=(
|
||||
ai-shared-network.service
|
||||
ai-stack-pod.service
|
||||
ollama-rocm.service
|
||||
open-webui.service
|
||||
podman-mcp-server.service
|
||||
@@ -22,6 +23,7 @@ for svc in "${services[@]}"; do
|
||||
done
|
||||
|
||||
rm -f "${TARGET_DIR}/ai-shared.network"
|
||||
rm -f "${TARGET_DIR}/ai-stack.pod"
|
||||
rm -f "${TARGET_DIR}/ollama-rocm.container"
|
||||
rm -f "${TARGET_DIR}/open-webui.container"
|
||||
rm -f "${TARGET_DIR}/podman-mcp-server.container"
|
||||
|
||||
@@ -25,6 +25,7 @@ ensure_user_bus
|
||||
|
||||
services=(
|
||||
ai-shared-network.service
|
||||
ai-stack-pod.service
|
||||
ollama-rocm.service
|
||||
open-webui.service
|
||||
podman-mcp-server.service
|
||||
@@ -35,6 +36,7 @@ for svc in "${services[@]}"; do
|
||||
done
|
||||
|
||||
rm -f "${TARGET_DIR}/ai-shared.network"
|
||||
rm -f "${TARGET_DIR}/ai-stack.pod"
|
||||
rm -f "${TARGET_DIR}/ollama-rocm.container"
|
||||
rm -f "${TARGET_DIR}/open-webui.container"
|
||||
rm -f "${TARGET_DIR}/podman-mcp-server.container"
|
||||
|
||||
Reference in New Issue
Block a user