74 lines
3.4 KiB
Docker
74 lines
3.4 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.operator-auth="http-only-session" \
|
|
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 \
|
|
APPOPS_REQUIRE_OPERATOR_AUTH=false \
|
|
APPOPS_OPERATOR_TOKEN_FILE=/data/operator-token \
|
|
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 docs ./docs
|
|
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"]
|