File size: 3,538 Bytes
eb2f14a
6dabc37
eb2f14a
0690977
6dabc37
eb2f14a
6dabc37
eb2f14a
 
 
 
 
 
 
 
 
 
6dabc37
 
eb2f14a
 
 
 
 
 
 
6dabc37
eb2f14a
6dabc37
eb2f14a
 
 
 
 
 
f4bf626
 
 
eb2f14a
6dabc37
 
 
eb2f14a
 
 
 
 
 
 
 
 
6dabc37
 
eb2f14a
 
 
 
 
 
 
 
 
 
 
f6b8e6a
eb2f14a
f4bf626
f6b8e6a
 
324dfd1
f6b8e6a
6dabc37
f6b8e6a
af6d5de
 
 
eb2f14a
 
6dabc37
 
 
eb2f14a
 
0690977
f6b8e6a
6dabc37
 
 
 
 
 
 
 
 
 
 
eb2f14a
 
0690977
eb2f14a
0690977
eb2f14a
f4bf626
6dabc37
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# =============================================================================
# Multi-stage Dockerfile for Webscout API Server with Auto-Updater (4hr)
# =============================================================================

# -------------------------------------------------------------------
# Stage 1: Builder - Install dependencies and build the application
# -------------------------------------------------------------------
FROM python:3.11-slim as builder

ARG WEBSCOUT_VERSION=latest
ENV PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1 \
    PIP_NO_CACHE_DIR=1 \
    PIP_DISABLE_PIP_VERSION_CHECK=1 \
    PIP_DEFAULT_TIMEOUT=100

RUN apt-get update && apt-get install -y --no-install-recommends \
    build-essential gcc git curl && \
    rm -rf /var/lib/apt/lists/*

RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"

RUN pip install --upgrade pip setuptools wheel

RUN if [ "$WEBSCOUT_VERSION" = "latest" ]; then \
        pip install "webscout[api] @ git+https://github.com/OEvortex/Webscout.git"; \
    else \
        pip install "webscout[api] @ git+https://github.com/OEvortex/Webscout.git@${WEBSCOUT_VERSION}"; \
    fi

RUN pip install \
    gunicorn[gthread] \
    uvicorn[standard] \
    prometheus-client \
    structlog \
    motor \
    pymongo

# -------------------------------------------------------------------
# Stage 2: Runtime - Minimal secure image with auto-updater
# -------------------------------------------------------------------
FROM python:3.11-slim as runtime

ARG BUILD_DATE
ARG VCS_REF
ARG VERSION

LABEL maintainer="OEvortex" \
      org.label-schema.name="webscout-api" \
      org.label-schema.version=$VERSION \
      org.label-schema.vcs-url="https://github.com/OEvortex/Webscout" \
      org.label-schema.build-date=$BUILD_DATE

RUN groupadd --gid 1000 webscout && \
    useradd --uid 1000 --gid webscout --shell /bin/bash --create-home webscout

ENV PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1 \
    PYTHONPATH=/app \
    PATH="/opt/venv/bin:$PATH" \
    PYTHONHASHSEED=random \
    MALLOC_ARENA_MAX=2 \
    WEBSCOUT_HOST=0.0.0.0 \
    WEBSCOUT_PORT=7860 \
    WEBSCOUT_WORKERS=1 \
    WEBSCOUT_LOG_LEVEL=info \
    WEBSCOUT_NO_AUTH=true \
    WEBSCOUT_NO_RATE_LIMIT=true \
    WEBSCOUT_DATA_DIR=/app/data \
    WEBSCOUT_API_TITLE="Webscout API" \
    WEBSCOUT_API_DESCRIPTION="OpenAI-compatible LLM API" \
    WEBSCOUT_API_VERSION="0.3.0" \
    WEBSCOUT_API_DOCS_URL="/docs" \
    WEBSCOUT_API_REDOC_URL="/redoc" \
    WEBSCOUT_API_OPENAPI_URL="/openapi.json"

RUN apt-get update && apt-get install -y --no-install-recommends \
    git libffi8 libssl3 curl procps && \
    rm -rf /var/lib/apt/lists/* && apt-get clean

COPY --from=builder /opt/venv /opt/venv

WORKDIR /app
RUN mkdir -p /app/logs /app/data && \
    chown -R webscout:webscout /app

# Auto-update script (every 4 hours) using background process
RUN echo '#!/bin/bash\n\
(pip install -U "webscout[api] @ git+https://github.com/OEvortex/Webscout.git" && echo "[INFO] Webscout updated at start") &\n\
while true; do\n\
    sleep 14400\n\
    echo "[INFO] Auto-updating Webscout..."\n\
    pip install -U "webscout[api] @ git+https://github.com/OEvortex/Webscout.git"\n\
done &\n\
exec "$@"' > /entrypoint.sh && chmod +x /entrypoint.sh

USER webscout

EXPOSE $WEBSCOUT_PORT

HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
    CMD curl -f http://localhost:${WEBSCOUT_PORT:-8000}/health || exit 1
ENTRYPOINT ["/entrypoint.sh"]
CMD ["python", "-m", "webscout.auth.server"]