# Dockerfile for Fester # ============================================================ # Multi-stage build: installs Python deps, copies code, runs uvicorn. # # Build: # docker build -t fester . # # Run: # docker run -p 8080:8080 \ # -v fester-db:/var/lib/fester \ # -v fester-config:/etc/fester \ # fester # # Or with docker-compose (see docker-compose.yml): # docker-compose up # ============================================================ FROM python:3.12-slim AS base # Install system dependencies (optional tools activate features when present) RUN apt-get update && apt-get install -y --no-install-recommends \ tmux \ mosh \ openssh-client \ qemu-utils \ rsync \ btrfs-progs \ curl \ && rm -rf /var/lib/apt/lists/* # Create fester user + directories RUN useradd -m -u 1000 fester && \ mkdir -p /var/lib/fester/cas /var/lib/fester/snapshots /var/lib/fester/cache /etc/fester && \ chown -R fester:fester /var/lib/fester /etc/fester WORKDIR /app # Copy pyproject.toml first (better layer caching) COPY pyproject.toml ./ # Install Python dependencies RUN pip install --no-cache-dir \ "fastapi>=0.128" \ "uvicorn[standard]>=0.30" \ "websockets>=12" \ "pydantic>=2" \ "aiohttp>=3.9" \ "minio>=7.2" \ "prometheus-client>=0.20" \ "PyYAML>=6" \ "requests>=2.31" \ "websocket-client>=1.7" # Copy the rest of the code COPY --chown=fester:fester . . # Make scripts executable RUN chmod +x run.sh cli/fester.py 2>/dev/null || true # Switch to non-root user USER fester # Default config (can be overridden via volume mount at /etc/fester/config.yaml) ENV FESTER_DB_PATH=/var/lib/fester/fester.db ENV FESTER_CONFIG=/app/config.yaml ENV FESTER_NO_DRIFT=0 ENV FESTER_AUTOBUILD=0 # Expose the backend port EXPOSE 8080 # Health check HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ CMD curl -f http://localhost:8080/api/health || exit 1 # Run the backend CMD ["python3", "-m", "uvicorn", "backend.main:app", "--host", "0.0.0.0", "--port", "8080"]