feat: add ai-stack pod configuration and update related service files

This commit is contained in:
John Doe
2026-02-28 12:00:18 -05:00
parent e012dca9b2
commit e2946301cd
9 changed files with 39 additions and 14 deletions
+4 -1
View File
@@ -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
View File
@@ -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
+4
View File
@@ -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
+14
View File
@@ -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
+3 -4
View File
@@ -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
+3 -4
View File
@@ -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
+3 -4
View File
@@ -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
+2
View File
@@ -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"
+2
View File
@@ -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"