Django, Flask, FastAPI, Streamlit, and one-off worker scripts all run cleanly on a Pulsar67 VPS. uv pip install what you need, point gunicorn at it, ship.
Serverless Python makes sense for occasional functions. For Django sessions, FastAPI websockets, Celery workers, and background scrapers, you want a persistent process on a VPS.
A VPS lets you run gunicorn / uvicorn under systemd, redis on the same box, Postgres next door, all on a flat monthly bill. Predictable, fast, no per-invocation pricing.
pyenv-install or uv. Run 3.11 / 3.12 / 3.13 side by side per project.
On the same box, no per-DB markup. Or use the host's network to a private DB later.
Celery / RQ / APScheduler. Run background jobs without a "worker dyno" upcharge.
Your FastAPI process stays warm. Health checks pass, requests are fast.
uv (recommended for new projects)systemd unit so your app restarts after rebootsFlat monthly fee, no "execution time" line item.
Celery, RQ, and APScheduler can run beside your app with no per-worker upcharge.
Database queries don't sit on commodity SATA. Postgres flies.
Compile C extensions, install libpq-dev, run any kernel module you need.
Flat fee, full root, no cold starts. Move off PaaS before the bill bites.
Concrete setup details for the first deploy, the firewall, and the first thing to check when something acts strange.
Run Gunicorn/Uvicorn on localhost, then proxy public traffic through Nginx or Caddy on 80 and 443.
Nano works for small Flask/FastAPI apps. Starter or Pro is better once you add Postgres, Celery, Redis, or image processing.
Use a venv, systemd service, environment file, and a reverse proxy with TLS. Keep migrations scripted.
If requests 502, check the app socket/port, journalctl, proxy upstream, and whether the service user can read the project directory.