← Back to Blog

Deploy Python Web Apps for Free: Complete Guide

Python Web App Deployment · 959 words

---

title: "Deploy Python Web Apps for Free: Complete Guide"

description: "Step-by-step guide to deploy Python web apps for free using Railway, Render, Fly.io, Cloudflare Tunnel, and Docker. Production deployment tutorial."

date: "2026-07-03"

category: "python"

tags: ["python", "deployment", "docker", "railway", "render", "flyio", "cloudflare"]

---

Deploying Python web apps used to require expensive servers and complex configurations. Today, platforms like Railway, Render, and Fly.io offer generous free tiers. This guide walks you through deploying on every major platform.

What You'll Build

Working deployments of a Python web application on Railway, Render, Fly.io, and Cloudflare Tunnel. You'll understand the tradeoffs of each platform and choose the best option for your needs.

Why Deploy for Free?

Free deployment tiers let you:

Full Tutorial

Step 1: Prepare Your Application


# app.py
from flask import Flask, jsonify
import os

app = Flask(__name__)

@app.route("/")
def home():
    return jsonify({
        "app": "Python Deploy Demo",
        "version": "1.0.0",
        "status": "running"
    })

@app.route("/health")
def health():
    return jsonify({"status": "healthy"}), 200

if __name__ == "__main__":
    port = int(os.environ.get("PORT", 8000))
    app.run(host="0.0.0.0", port=port)

# requirements.txt
flask==3.0.0
gunicorn==21.2.0

# .gitignore
__pycache__/
*.pyc
.env
.venv/
*.egg-info/
dist/
build/

Step 2: Deploy to Railway

Railway offers a frictionless deployment experience with automatic HTTPS.


# railway.json
{
  "build": {
    "builder": "nixpacks"
  },
  "deploy": {
    "startCommand": "gunicorn app:app",
    "healthcheckPath": "/health",
    "restartPolicyType": "on_failure",
    "restartPolicyMaxRetries": 3
  }
}

# Deploy with Railway CLI
npm install -g @railway/cli
railway login
railway init
railway up

# Set environment variables
railway variables set SECRET_KEY=your-secret-key
railway variables set DATABASE_URL=your-db-url

# Check deployment
railway logs
railway status

Step 3: Deploy to Render

Render provides free static sites and web services with auto-deploy from GitHub.


# render.yaml
services:
  - type: web
    name: python-app
    runtime: python
    buildCommand: pip install -r requirements.txt
    startCommand: gunicorn app:app
    envVars:
      - key: PYTHON_VERSION
        value: "3.12.0"
      - key: SECRET_KEY
        generateValue: true
    healthCheckPath: /health
    autoDeploy: true

Steps:

1. Push code to GitHub

2. Go to render.com → New → Web Service

3. Connect your GitHub repo

4. Render auto-detects Python and deploys

5. Free tier includes 750 hours/month

Step 4: Deploy to Fly.io

Fly.io offers container-based deployment with global edge distribution.


# Install flyctl
curl -L https://fly.io/install.sh | sh
fly auth signup
fly auth login

# Initialize and deploy
fly launch
fly deploy

# Set secrets
fly secrets set SECRET_KEY=your-secret-key
fly secrets set DATABASE_URL=your-db-url

# Check status
fly status
fly logs

Step 5: Docker Configuration


# Dockerfile
FROM python:3.12-slim

WORKDIR /app

# Install dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Copy application
COPY . .

# Create non-root user
RUN useradd --create-home appuser
USER appuser

EXPOSE 8000

CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--workers", "4", "app:app"]

# docker-compose.yml
version: '3.8'
services:
  web:
    build: .
    ports:
      - "8000:8000"
    environment:
      - SECRET_KEY=${SECRET_KEY}
      - DATABASE_URL=${DATABASE_URL}
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
      interval: 30s
      timeout: 10s
      retries: 3

# Run locally with Docker
docker build -t python-app .
docker run -p 8000:8000 --env-file .env python-app

# Or with docker-compose
docker-compose up -d
docker-compose logs -f

Step 6: Cloudflare Tunnel (Free HTTPS)

Cloudflare Tunnel exposes your local or server app to the internet with free HTTPS.


# Install cloudflared
# macOS
brew install cloudflared

# Linux
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
chmod +x cloudflared-linux-amd64
sudo mv cloudflared-linux-amd64 /usr/local/bin/cloudflared

# Quick tunnel (no account needed)
cloudflared tunnel --url http://localhost:8000

# Named tunnel (persistent URL)
cloudflared tunnel create my-app
cloudflared tunnel route dns my-app myapp.example.com
cloudflared tunnel run --url http://localhost:8000 my-app

Step 7: Deployment Comparison

| Feature | Railway | Render | Fly.io | Cloudflare |

|---------|---------|--------|--------|------------|

| Free tier | $5/month credit | 750 hrs/month | 3 shared VMs | Unlimited tunnels |

| HTTPS | Auto | Auto | Auto | Auto |

| Custom domain | Yes | Yes | Yes | Yes |

| Database | Yes (paid) | Yes (paid) | Yes (paid) | No |

| Ease of use | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |

| Best for | Full-stack apps | Simple web apps | Global edge | Local dev sharing |

Step 8: Production Best Practices


# config.py
import os
from datetime import timedelta

class Config:
    SECRET_KEY = os.environ.get("SECRET_KEY", "dev-key-change-in-production")
    SESSION_COOKIE_SECURE = True
    SESSION_COOKIE_HTTPONLY = True
    SESSION_COOKIE_SAMESITE = "Lax"
    PERMANENT_SESSION_LIFETIME = timedelta(hours=24)

    # Database
    SQLALCHEMY_DATABASE_URI = os.environ.get("DATABASE_URL")
    SQLALCHEMY_TRACK_MODIFICATIONS = False

    # Rate limiting
    RATELIMIT_DEFAULT = "100/hour"
    RATELIMIT_STORAGE_URI = "memory://"

class ProductionConfig(Config):
    DEBUG = False
    TESTING = False

class DevelopmentConfig(Config):
    DEBUG = True

# wsgi.py
from app import create_app

app = create_app()

if __name__ == "__main__":
    app.run()

Deployment Checklist

Get the Code

Ready to use these tools? Browse our collection of tested, production-ready Python scripts:

🔗 Browse Products: [Anna's Digital Products](https://reply-continues-exams-confidential.trycloudflare.com)

All products include:

---

Get the Production-Ready Version

Don't want to build it yourself? We have production-ready versions of these tools at [https://reply-continues-exams-confidential.trycloudflare.com](https://reply-continues-exams-confidential.trycloudflare.com).

What you get:

[Browse the collection →](https://reply-continues-exams-confidential.trycloudflare.com)

🛒 Ready to deploy?

Browse 120+ Python tools with crypto payments and instant delivery.

Browse Products →