Gunicorn, static files and migrations on an Always Free ARM VM — with a real filesystem and no cold starts. Built for Ampere A1 (arm64), listens on port 8000, and starts with gunicorn config.wsgi:application --bind 0.0.0.0:8000.
FROM python:3.12-slim
WORKDIR /app
ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1
RUN apt-get update && apt-get install -y --no-install-recommends build-essential libpq-dev \
&& rm -rf /var/lib/apt/lists/*
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt gunicorn
COPY . .
RUN python manage.py collectstatic --noinput
EXPOSE 8000
CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:8000", "--workers", "3"]Every wheel Django needs (psycopg, Pillow, cryptography) ships an aarch64 build, so installs are fast. Size workers as (2 x OCPU) + 1 — three workers on a 1 OCPU instance is a sensible default.
Cheaploy builds this image on your own Oracle Always Free VM, opens the ports, issues HTTPS and rolls back if health checks fail.