FROM ubuntu:22.04 ENV DEBIAN_FRONTEND=noninteractive ENV HOME=/home/missminute ENV PYTHONUNBUFFERED=1 ENV PYTHONDONTWRITEBYTECODE=1 # ── 1. System packages (Lean & Headless) ─────────────────────── RUN apt-get update && apt-get install -y --no-install-recommends \ sudo curl wget git build-essential ca-certificates gnupg \ procps jq \ python3.11 python3.11-venv python3.11-dev python3-pip \ && rm -rf /var/lib/apt/lists/* # ── 2. Node.js 22 (For OpenClaw) ─────────────────────────────── RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \ && apt-get install -y --no-install-recommends nodejs \ && rm -rf /var/lib/apt/lists/* # ── 3. OpenClaw + MCP servers ────────────────────────────────── RUN npm install -g \ openclaw@latest \ @modelcontextprotocol/server-filesystem \ @modelcontextprotocol/server-github # ── 4. Non-root user ─────────────────────────────────────────── RUN useradd -m -s /bin/bash missminute \ && echo "missminute ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers \ && chown -R missminute:missminute /home/missminute USER missminute WORKDIR /home/missminute/app # ── 5. uv (Python package manager) ───────────────────────────── RUN curl -LsSf https://astral.sh/uv/install.sh | sh ENV PATH="/home/missminute/.local/bin:/home/missminute/.cargo/bin:/usr/local/bin:/usr/bin:/bin" # ── 6. Hermes Agent ──────────────────────────────────────────── RUN git clone --depth=1 \ https://github.com/NousResearch/hermes-agent.git \ /home/missminute/hermes-agent RUN uv venv /home/missminute/hermes-venv --python 3.11 --seed --clear \ && /home/missminute/hermes-venv/bin/pip install \ -e "/home/missminute/hermes-agent[all]" \ --quiet --no-cache-dir # ── 7. App dependencies ──────────────────────────────────────── COPY --chown=missminute:missminute requirements.txt . RUN /home/missminute/hermes-venv/bin/pip install \ -r requirements.txt fastapi uvicorn --quiet --no-cache-dir # ── 8. Directory scaffolding ─────────────────────────────────── RUN mkdir -p \ /home/missminute/app/workspace \ /home/missminute/.hermes/skills \ /home/missminute/.openclaw \ /tmp/missminute/logs # ── 9. App files ─────────────────────────────────────────────── COPY --chown=missminute:missminute . . RUN chmod +x setup.sh boot.sh # Expose port 7860 for the Hugging Face FastAPI health check EXPOSE 7860 ENTRYPOINT ["/bin/bash", "setup.sh"]