Initial Commit

This commit is contained in:
2026-09-15 15:24:03 -04:00
commit 4dc7086e7e
605 changed files with 101380 additions and 0 deletions
+48
View File
@@ -0,0 +1,48 @@
# =====================================================================
# owuitools-vmagent - the sub-agent that drives a VM.
#
# It holds no secrets and can reach exactly one address. Everything
# dangerous is on the other side of two boundaries it cannot cross:
#
# the network owuitools-vmguard owns this container's namespace with a
# default-deny filter whose allowlist is owuitools-vmgw
# and nothing else. vmgw is what holds the Open WebUI
# admin key and the one permitted Ollama path.
#
# the socket /run/owuivm/agent/agent.sock, bind-mounted from the
# host, mode 0660 group owuitools-agent (gid 10001 - this
# container's own uid, since no userns remapping is
# configured here). vmd is on the far side with /dev/kvm,
# the frozen base images and the Gitea token.
#
# Note this image is NOT the code-execution sandbox. Nothing a user or a
# model writes runs here; it runs in a VM. This container runs our own
# loop, which is why it is an ordinary hardened container rather than
# something as locked down as owuitools-octave.
# =====================================================================
FROM python:3.12-slim
# Pillow is used for one thing: re-encoding a PNG screenshot as a small
# JPEG before it is posted into the chat. Every embed is a database write
# in Open WebUI, and a desktop PNG is an order of magnitude larger than
# it needs to be for someone watching a window open. events.py degrades
# gracefully if it is ever absent, so this is an optimisation rather than
# a dependency.
RUN pip install --no-cache-dir --disable-pip-version-check Pillow==11.0.0 \
&& find /usr/local -name '__pycache__' -type d -prune -exec rm -rf {} +
WORKDIR /app
COPY vmagent/app/ /app/
# The socket protocol client is shared with the host's own vmctl, so it
# lives with vmd and is copied in rather than duplicated. One definition
# of the wire format, used by both ends of it.
COPY vm/vmd/client.py /app/client.py
# Same uid as owuitools-api and the owuitools-agent group on the host, so
# the bind-mounted socket directory can be mode 0660 rather than
# world-writable. It grants no privilege of its own.
RUN useradd --uid 10001 --create-home --home-dir /home/agent --shell /usr/sbin/nologin agent
USER 10001:10001
ENV HOME=/home/agent PYTHONUNBUFFERED=1 PYTHONDONTWRITEBYTECODE=1
ENTRYPOINT ["python3", "/app/runner.py"]