Spaces:
Sleeping
Sleeping
| # Multi-stage: build Vite app then serve with nginx (HF Space port 7860, UID 1000) | |
| # Stage 1: Build | |
| FROM node:20-alpine AS builder | |
| WORKDIR /app | |
| ARG VITE_HF_TOKEN | |
| ARG VITE_TINYLLAMA_PROVIDER=auto | |
| ARG VITE_TINYLLAMA_API_URL | |
| ARG VITE_TINYLLAMA_VERCEL_URL | |
| ARG VITE_FIREBASE_API_KEY | |
| ARG VITE_FIREBASE_AUTH_DOMAIN | |
| ARG VITE_FIREBASE_PROJECT_ID | |
| ARG VITE_FIREBASE_STORAGE_BUCKET | |
| ARG VITE_FIREBASE_MESSAGING_SENDER_ID | |
| ARG VITE_FIREBASE_APP_ID | |
| ENV VITE_HF_TOKEN=$VITE_HF_TOKEN \ | |
| VITE_TINYLLAMA_PROVIDER=$VITE_TINYLLAMA_PROVIDER \ | |
| VITE_TINYLLAMA_API_URL=$VITE_TINYLLAMA_API_URL \ | |
| VITE_TINYLLAMA_VERCEL_URL=$VITE_TINYLLAMA_VERCEL_URL \ | |
| VITE_FIREBASE_API_KEY=$VITE_FIREBASE_API_KEY \ | |
| VITE_FIREBASE_AUTH_DOMAIN=$VITE_FIREBASE_AUTH_DOMAIN \ | |
| VITE_FIREBASE_PROJECT_ID=$VITE_FIREBASE_PROJECT_ID \ | |
| VITE_FIREBASE_STORAGE_BUCKET=$VITE_FIREBASE_STORAGE_BUCKET \ | |
| VITE_FIREBASE_MESSAGING_SENDER_ID=$VITE_FIREBASE_MESSAGING_SENDER_ID \ | |
| VITE_FIREBASE_APP_ID=$VITE_FIREBASE_APP_ID | |
| COPY package.json package-lock.json ./ | |
| RUN npm ci | |
| COPY . . | |
| ENV NODE_ENV=production | |
| RUN npm run build | |
| # Stage 2: Serve (HF Spaces run as UID 1000) | |
| FROM nginx:1.27-alpine | |
| LABEL maintainer="text-transformer" \ | |
| description="T3XT TR4N5F0RM3R – Vite app + nginx, HF inference proxy on /api/hf-inference, TinyLlama/Ollama support" | |
| RUN adduser -D -u 1000 appuser | |
| COPY --from=builder /app/dist /usr/share/nginx/html | |
| COPY entrypoint.sh /entrypoint.sh | |
| RUN echo 'server { \ | |
| listen 7860; \ | |
| location /api/hf-inference/ { \ | |
| resolver 127.0.0.11 8.8.8.8 valid=30s; \ | |
| set $hf_upstream https://router.huggingface.co; \ | |
| rewrite ^/api/hf-inference/(.*)$ /$1 break; \ | |
| proxy_pass $hf_upstream; \ | |
| proxy_http_version 1.1; \ | |
| proxy_set_header Host router.huggingface.co; \ | |
| proxy_set_header Authorization "Bearer __VITE_HF_TOKEN__"; \ | |
| proxy_pass_request_headers on; \ | |
| proxy_buffering off; \ | |
| proxy_ssl_server_name on; \ | |
| proxy_ssl_protocols TLSv1.2 TLSv1.3; \ | |
| proxy_connect_timeout 30s; \ | |
| proxy_read_timeout 120s; \ | |
| proxy_send_timeout 120s; \ | |
| proxy_intercept_errors off; \ | |
| } \ | |
| location / { \ | |
| root /usr/share/nginx/html; \ | |
| index index.html index.htm; \ | |
| try_files $uri $uri/ /index.html; \ | |
| } \ | |
| }' > /etc/nginx/conf.d/default.conf.tpl | |
| RUN sed 's#__VITE_HF_TOKEN__##g' /etc/nginx/conf.d/default.conf.tpl > /etc/nginx/conf.d/default.conf | |
| RUN chmod +x /entrypoint.sh && \ | |
| chown -R appuser:appuser /usr/share/nginx/html /var/cache/nginx /var/log/nginx /etc/nginx/conf.d && \ | |
| touch /var/run/nginx.pid && chown appuser:appuser /var/run/nginx.pid | |
| USER appuser | |
| EXPOSE 7860 | |
| HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=2 \ | |
| CMD nginx -t 2>/dev/null || exit 1 | |
| ENTRYPOINT ["/entrypoint.sh"] | |