FROM ghcr.io/astral-sh/uv:bookworm-slim AS uv FROM python:3.12 as dev # Set environment variables ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 ENV PYTHONPATH /app ENV UV_CACHE_DIR /app/.cache/uv ENV UV_VENV_DIRECTORY /app/.venv # Set work directory WORKDIR /app # Copy pyproject.toml COPY pyproject.toml uv.lock ./ # Install system dependencies and uv RUN apt-get update && apt-get install -y \ build-essential \ curl \ gcc \ nodejs \ npm \ gettext \ && rm -rf /var/lib/apt/lists/* COPY --from=uv /usr/local/bin/uv /usr/local/bin/uv RUN uv sync --no-dev --frozen --no-install-project # Copy project COPY . . # Install Tailwind CSS dependencies RUN uv run manage.py tailwind install # Build Tailwind CSS RUN uv run manage.py tailwind build # Collect static files RUN uv run manage.py collectstatic --noinput # Compile translation messages RUN uv run manage.py compilemessages --locale=zh_Hans # Create data directory for SQLite database RUN mkdir -p /app/data && chmod 777 /app/data FROM python:3.12-slim ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 ENV PYTHONPATH /app ENV UV_CACHE_DIR /app/.cache/uv ENV UV_VENV_DIRECTORY /app/.venv COPY --from=uv /usr/local/bin/uv /usr/local/bin/uv COPY --from=dev /app /app WORKDIR /app RUN apt-get update && apt-get install -y \ curl \ wget \ gnupg \ chromium \ chromium-driver \ fonts-arphic-ukai \ && rm -rf /var/lib/apt/lists/* # Create a non-root user RUN mkdir -p /app/data/media/screenshots \ && useradd -m -u 1000 appuser \ && chown -R appuser:appuser /app USER appuser # Install dependencies using uv RUN uv venv /app/.venv ENV PATH="/app/.venv/bin:$PATH" ENV VIRTUAL_ENV=/app/.venv RUN uv sync --no-dev --frozen --no-install-project # Expose port 8000 EXPOSE 8000 # Run the application CMD ["uv", "run", "gunicorn", "--chdir", "/app", "core.wsgi:application", "--bind", "0.0.0.0:8000"]