Files
Unraid-AppOps-Gateway-Public/Dockerfile
T

71 lines
3.3 KiB
Docker

FROM node:22-bookworm-slim AS frontend-builder
WORKDIR /app
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
RUN corepack enable && pnpm install --frozen-lockfile
COPY index.html postcss.config.js tailwind.config.ts tsconfig.json tsconfig.app.json tsconfig.node.json vite.config.ts components.json ./
COPY public ./public
COPY src ./src
ARG VITE_APPOPS_API_MODE=live
ARG VITE_APPOPS_API_BASE_URL=
ENV VITE_APPOPS_API_MODE=${VITE_APPOPS_API_MODE} \
VITE_APPOPS_API_BASE_URL=${VITE_APPOPS_API_BASE_URL}
RUN pnpm run build
FROM python:3.13-slim AS runtime
ARG APPOPS_BUILD_ID=development
ARG APPOPS_SOURCE_REVISION=development
ARG APPOPS_SOURCE_REPOSITORY=local/unraid-appops-gateway
ARG APPOPS_SOURCE_TREE=development
ARG APPOPS_BUILD_DATE=1970-01-01T00:00:00Z
LABEL org.opencontainers.image.title="Unraid AppOps Gateway" \
org.opencontainers.image.description="Local-first, policy-gated operations gateway for Unraid and connected services" \
org.opencontainers.image.version="${APPOPS_BUILD_ID}" \
org.opencontainers.image.revision="${APPOPS_SOURCE_REVISION}" \
org.opencontainers.image.source="${APPOPS_SOURCE_REPOSITORY}" \
org.opencontainers.image.source-tree="${APPOPS_SOURCE_TREE}" \
org.opencontainers.image.created="${APPOPS_BUILD_DATE}" \
io.itworx.app.version="1.8.0" \
io.itworx.app.user-auth="oidc-rbac" \
org.opencontainers.image.vendor="AppOps" \
net.unraid.docker.managed="dockerman" \
net.unraid.docker.webui="http://[IP]:[PORT:1216]/" \
net.unraid.docker.icon="/boot/config/plugins/dockerMan/images/unraid-appops-gateway.png"
ENV APPOPS_ENV=production \
APPOPS_DEPLOYMENT_MODE=private \
APP_OPS_VOICE_TOKEN_FILE=/data/voice-token \
APPOPS_BIND_HOST=0.0.0.0 \
APPOPS_PORT=1216 \
APPOPS_DATA_DIR=/data \
APPOPS_DB_PATH=/data/appops.db \
APPOPS_STATIC_DIR=/app/dist \
APPOPS_LOG_LEVEL=info \
APPOPS_DISCOVERY_HISTORY_RUNS=48 \
APPOPS_ENABLE_MCP=false \
APPOPS_MCP_TOKEN_FILE=/data/mcp-token \
APPOPS_MCP_ALLOWED_HOSTS=localhost:*,127.0.0.1:* \
APPOPS_ENABLE_N8N=false \
APPOPS_N8N_TOKEN_FILE=/data/n8n-token \
PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1
WORKDIR /app
RUN mkdir -p /etc/appops && printf '%s\n' "$APPOPS_SOURCE_REPOSITORY" "$APPOPS_SOURCE_REVISION" "$APPOPS_SOURCE_TREE" > /etc/appops/source-metadata && chmod 0444 /etc/appops/source-metadata
RUN apt-get update \
&& apt-get install -y --no-install-recommends gosu \
&& rm -rf /var/lib/apt/lists/* \
&& addgroup --system appops && adduser --system --ingroup appops appops \
&& adduser appops users \
&& mkdir -p /data \
&& chown -R appops:appops /data /app
COPY backend/requirements.txt /tmp/requirements.txt
RUN pip install --no-cache-dir -r /tmp/requirements.txt
COPY backend/app ./backend/app
COPY README.md CHANGELOG.md ./
COPY --from=frontend-builder /app/dist ./dist
COPY docker/entrypoint.sh /entrypoint.sh
RUN sed -i 's/\r$//' /entrypoint.sh && chmod +x /entrypoint.sh
EXPOSE 1216
VOLUME ["/data"]
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 CMD python -c "import urllib.request; urllib.request.urlopen('http://127.0.0.1:1216/api/health', timeout=3).read()"
ENTRYPOINT ["/entrypoint.sh"]
CMD ["uvicorn", "backend.app.main:app", "--host", "0.0.0.0", "--port", "1216"]