Spaces:
Running
Running
| # FarmRPG Pro Brain v2.1.0 - ONE FILE Hugging Face Docker build | |
| # This Dockerfile embeds the complete runtime (app/, knowledge/, server.py, | |
| # requirements.txt), so no folder upload is required. | |
| FROM python:3.12-slim | |
| ENV PYTHONDONTWRITEBYTECODE=1 \ | |
| PYTHONUNBUFFERED=1 \ | |
| APP_HOST=0.0.0.0 \ | |
| APP_PORT=7860 \ | |
| DATA_DIR=/data \ | |
| DB_PATH=/data/farmrpg_brain.sqlite3 \ | |
| LOG_LEVEL=INFO \ | |
| LOG_FORMAT=json \ | |
| HEARTBEAT_SECONDS=30 \ | |
| STALE_HEARTBEAT_MULTIPLIER=4 \ | |
| BACKUP_SECONDS=900 \ | |
| BACKUP_KEEP=48 \ | |
| PROTECT_SENSITIVE_READS=true \ | |
| ALLOW_PUBLIC_WRITES=false | |
| WORKDIR /app | |
| # Reconstruct the complete application from the embedded archive. | |
| RUN python - <<'PY' | |
| import base64 | |
| import io | |
| import tarfile | |
| PAYLOAD = """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""" | |
| raw = base64.b64decode(PAYLOAD, validate=True) | |
| with tarfile.open(fileobj=io.BytesIO(raw), mode="r:gz") as archive: | |
| # Archive is generated from our reviewed runtime only. | |
| archive.extractall("/app") | |
| PY | |
| RUN pip install --no-cache-dir -r /app/requirements.txt && \ | |
| mkdir -p /data/logs /data/backups && \ | |
| useradd --create-home --uid 1000 appuser && \ | |
| chown -R appuser:appuser /app /data | |
| USER appuser | |
| EXPOSE 7860 | |
| HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \ | |
| CMD python -c "import urllib.request; urllib.request.urlopen('http://127.0.0.1:7860/health/ready', timeout=3).read()" || exit 1 | |
| CMD ["python", "/app/server.py"] | |