52 lines
1.7 KiB
Docker
52 lines
1.7 KiB
Docker
FROM ghcr.io/astral-sh/uv:python3.14-bookworm-slim
|
|
|
|
WORKDIR /app
|
|
|
|
ARG APT_MIRROR="https://mirrors.ustc.edu.cn/debian"
|
|
ARG UV_INDEX_URL="https://pypi.mirrors.ustc.edu.cn/simple/"
|
|
|
|
ENV UV_INDEX_URL="${UV_INDEX_URL}" \
|
|
PYTHONUNBUFFERED=1 \
|
|
PYXRAY_HOST=0.0.0.0 \
|
|
PYXRAY_PORT=8080 \
|
|
PYXRAY_XRAY_DIR=/config/xray
|
|
|
|
RUN if [ -f /etc/apt/sources.list.d/debian.sources ]; then \
|
|
sed -i "s|http://deb.debian.org/debian|${APT_MIRROR}|g; s|http://deb.debian.org/debian-security|${APT_MIRROR}-security|g" /etc/apt/sources.list.d/debian.sources; \
|
|
fi \
|
|
&& if [ -f /etc/apt/sources.list ]; then \
|
|
sed -i "s|http://deb.debian.org/debian|${APT_MIRROR}|g; s|http://security.debian.org/debian-security|${APT_MIRROR}-security|g" /etc/apt/sources.list; \
|
|
fi \
|
|
&& apt-get update \
|
|
&& apt-get install -y --no-install-recommends \
|
|
ca-certificates \
|
|
curl \
|
|
iproute2 \
|
|
iptables \
|
|
nftables \
|
|
unzip \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
COPY pyproject.toml uv.lock README.md ./
|
|
COPY pyxray ./pyxray
|
|
|
|
RUN uv sync --frozen --no-dev \
|
|
&& uv pip install --python /app/.venv/bin/python gunicorn==23.0.0
|
|
|
|
RUN printf '%s\n' \
|
|
'#!/bin/sh' \
|
|
'set -eu' \
|
|
'mkdir -p "$PYXRAY_XRAY_DIR"' \
|
|
'exec /app/.venv/bin/gunicorn --bind "$PYXRAY_HOST:$PYXRAY_PORT" --workers 1 --threads 8 --timeout 120 --access-logfile - --error-logfile - "pyxray.web.server:create_app(\"$PYXRAY_XRAY_DIR\")"' \
|
|
> /usr/local/bin/pyxray-entrypoint \
|
|
&& chmod 0755 /usr/local/bin/pyxray-entrypoint
|
|
|
|
VOLUME ["/config"]
|
|
|
|
EXPOSE 8080
|
|
|
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
|
|
CMD curl -fsS "http://127.0.0.1:${PYXRAY_PORT}/" >/dev/null || exit 1
|
|
|
|
CMD ["/usr/local/bin/pyxray-entrypoint"]
|