123 lines
3.9 KiB
Docker
123 lines
3.9 KiB
Docker
FROM node:22-bookworm-slim AS frontend-builder
|
|
|
|
ARG BUILD_HTTP_PROXY=""
|
|
ARG BUILD_HTTPS_PROXY=""
|
|
ARG BUILD_ALL_PROXY=""
|
|
|
|
ENV HTTP_PROXY=${BUILD_HTTP_PROXY} \
|
|
HTTPS_PROXY=${BUILD_HTTPS_PROXY} \
|
|
ALL_PROXY=${BUILD_ALL_PROXY} \
|
|
http_proxy=${BUILD_HTTP_PROXY} \
|
|
https_proxy=${BUILD_HTTPS_PROXY} \
|
|
all_proxy=${BUILD_ALL_PROXY}
|
|
|
|
WORKDIR /build/frontend
|
|
RUN npm install --global pnpm@10.28.0
|
|
COPY frontend/package.json frontend/pnpm-lock.yaml frontend/pnpm-workspace.yaml ./
|
|
RUN pnpm install --frozen-lockfile
|
|
COPY frontend/ ./
|
|
RUN pnpm build
|
|
|
|
FROM node:22-bookworm-slim AS bitwarden-builder
|
|
|
|
ARG BUILD_HTTP_PROXY=""
|
|
ARG BUILD_HTTPS_PROXY=""
|
|
ARG BUILD_ALL_PROXY=""
|
|
|
|
ENV HTTP_PROXY=${BUILD_HTTP_PROXY} \
|
|
HTTPS_PROXY=${BUILD_HTTPS_PROXY} \
|
|
ALL_PROXY=${BUILD_ALL_PROXY} \
|
|
http_proxy=${BUILD_HTTP_PROXY} \
|
|
https_proxy=${BUILD_HTTPS_PROXY} \
|
|
all_proxy=${BUILD_ALL_PROXY}
|
|
|
|
RUN npm install --global --omit=dev @bitwarden/cli@2026.7.0
|
|
|
|
FROM ghcr.io/astral-sh/uv:0.8.4-python3.12-bookworm-slim AS backend-builder
|
|
|
|
ARG BUILD_HTTP_PROXY=""
|
|
ARG BUILD_HTTPS_PROXY=""
|
|
ARG BUILD_ALL_PROXY=""
|
|
|
|
ENV UV_LINK_MODE=copy \
|
|
UV_PROJECT_ENVIRONMENT=/opt/venv \
|
|
HTTP_PROXY=${BUILD_HTTP_PROXY} \
|
|
HTTPS_PROXY=${BUILD_HTTPS_PROXY} \
|
|
ALL_PROXY=${BUILD_ALL_PROXY} \
|
|
http_proxy=${BUILD_HTTP_PROXY} \
|
|
https_proxy=${BUILD_HTTPS_PROXY} \
|
|
all_proxy=${BUILD_ALL_PROXY}
|
|
|
|
WORKDIR /build/backend
|
|
COPY backend/pyproject.toml backend/uv.lock backend/README.md ./
|
|
COPY backend/src ./src
|
|
RUN uv sync --locked --no-dev --no-editable
|
|
|
|
FROM python:3.12-slim-bookworm
|
|
|
|
ARG UID=1000
|
|
ARG GID=1000
|
|
ARG BUILD_HTTP_PROXY=""
|
|
ARG BUILD_HTTPS_PROXY=""
|
|
ARG BUILD_ALL_PROXY=""
|
|
ARG BUILD_APT_MIRROR=""
|
|
|
|
ENV PYTHONUNBUFFERED=1 \
|
|
PYTHONDONTWRITEBYTECODE=1 \
|
|
PATH=/opt/venv/bin:$PATH \
|
|
MEMRELAY_DATA_DIR=/data/memrelay \
|
|
MEMRELAY_FRONTEND_DIR=/app/frontend \
|
|
BITWARDENCLI_APPDATA_DIR=/data/memrelay/bitwarden \
|
|
HTTP_PROXY="" \
|
|
HTTPS_PROXY="" \
|
|
ALL_PROXY="" \
|
|
http_proxy="" \
|
|
https_proxy="" \
|
|
all_proxy="" \
|
|
NO_PROXY="basic-memory,localhost,127.0.0.1"
|
|
|
|
RUN HTTP_PROXY="$BUILD_HTTP_PROXY" \
|
|
HTTPS_PROXY="$BUILD_HTTPS_PROXY" \
|
|
ALL_PROXY="$BUILD_ALL_PROXY" \
|
|
http_proxy="$BUILD_HTTP_PROXY" \
|
|
https_proxy="$BUILD_HTTPS_PROXY" \
|
|
all_proxy="$BUILD_ALL_PROXY" \
|
|
sh -c 'if [ -n "$BUILD_APT_MIRROR" ]; then sed -i "s|http://deb.debian.org|${BUILD_APT_MIRROR%/}|g" /etc/apt/sources.list.d/debian.sources; fi' \
|
|
&& \
|
|
apt-get update \
|
|
&& apt-get install --yes --no-install-recommends \
|
|
ca-certificates \
|
|
git \
|
|
gosu \
|
|
libstdc++6 \
|
|
openssh-client \
|
|
poppler-utils \
|
|
tesseract-ocr \
|
|
tesseract-ocr-chi-sim \
|
|
&& rm -rf /var/lib/apt/lists/* \
|
|
&& groupadd --gid "$GID" appgroup \
|
|
&& useradd --uid "$UID" --gid "$GID" --create-home --shell /usr/sbin/nologin appuser \
|
|
&& mkdir -p /app/backend /app/frontend /data/memrelay \
|
|
&& chown -R appuser:appgroup /app /data
|
|
|
|
COPY --from=backend-builder /opt/venv /opt/venv
|
|
COPY backend/alembic.ini /app/backend/alembic.ini
|
|
COPY backend/migrations /app/backend/migrations
|
|
COPY --from=frontend-builder /build/frontend/dist /app/frontend
|
|
COPY --from=bitwarden-builder /usr/local/bin/node /usr/local/bin/node
|
|
COPY --from=bitwarden-builder /usr/local/lib/node_modules/@bitwarden/cli /usr/local/lib/node_modules/@bitwarden/cli
|
|
COPY deploy/memrelay/entrypoint.sh /usr/local/bin/memrelay-entrypoint
|
|
RUN ln -s /usr/local/lib/node_modules/@bitwarden/cli/build/bw.js /usr/local/bin/bw \
|
|
&& chmod +x /usr/local/bin/memrelay-entrypoint
|
|
|
|
WORKDIR /app/backend
|
|
USER root
|
|
|
|
EXPOSE 8080
|
|
|
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
|
|
CMD python -c "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8080/api/v1/health/ready', timeout=3).read()" || exit 1
|
|
|
|
ENTRYPOINT ["memrelay-entrypoint"]
|
|
CMD ["uvicorn", "memrelay.app:app", "--host", "0.0.0.0", "--port", "8080", "--proxy-headers", "--forwarded-allow-ips", "*"]
|