🌀 Cloudflared + Flask on Raspberry Pi

A simple way to host a Flask app through Cloudflare Tunnel.


🚀 Overview

This guide shows how to:

  1. Install cloudflared on a Raspberry Pi
  2. Run a Flask app with gunicorn
  3. Expose it securely through a Cloudflare Tunnel
  4. Make both start automatically on boot

All secrets and IDs are replaced with placeholders like <UUID> and <domain>.


🧩 Setup Steps

1. Install prerequisites

sudo apt update && sudo apt install -y python3-venv python3-pip curl wget

2. Install cloudflared

Choose your architecture (uname -m):

# 64-bit
wget -O /tmp/cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64
# 32-bit
wget -O /tmp/cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm
sudo mv /tmp/cloudflared /usr/local/bin/cloudflared
sudo chmod +x /usr/local/bin/cloudflared
cloudflared --version

3. Create a Flask app

mkdir -p ~/myflaskapp && cd ~/myflaskapp
python3 -m venv venv
source venv/bin/activate
pip install flask gunicorn

myapp.py

from flask import Flask
app = Flask(__name__)

@app.route('/')
def home():
    return "Hello from Raspberry Pi!"

Test:

venv/bin/gunicorn --bind 127.0.0.1:5001 myapp:app

4. Flask systemd service

/etc/systemd/system/myflask.service

[Unit]
Description=Gunicorn Flask App
After=network.target

[Service]
User=pi
WorkingDirectory=/home/pi/myflaskapp
Environment="PATH=/home/pi/myflaskapp/venv/bin"
ExecStart=/home/pi/myflaskapp/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:5001 myapp:app
Restart=always

[Install]
WantedBy=multi-user.target

Enable:

sudo systemctl daemon-reload
sudo systemctl enable --now myflask.service

5. Cloudflared tunnel setup

Authenticate and create tunnel:

cloudflared tunnel login
cloudflared tunnel create my-pi-tunnel

~/.cloudflared/config.yml

tunnel: <TUNNEL-UUID>
credentials-file: /home/pi/.cloudflared/<TUNNEL-UUID>.json

ingress:
  - hostname: <your-domain.com>
    service: http://127.0.0.1:5001
  - service: http_status:404

Link hostname:

cloudflared tunnel route dns my-pi-tunnel <your-domain.com>

6. Cloudflared systemd service

/etc/systemd/system/cloudflared.service

[Unit]
Description=Cloudflare Tunnel
After=network-online.target myflask.service
Wants=myflask.service

[Service]
User=pi
Environment=HOME=/home/pi
ExecStart=/usr/local/bin/cloudflared tunnel run my-pi-tunnel --config /home/pi/.cloudflared/config.yml
Restart=on-failure

[Install]
WantedBy=multi-user.target

Enable:

sudo systemctl daemon-reload
sudo systemctl enable --now cloudflared.service

🧠 Verify Everything

curl -I http://127.0.0.1:5001
sudo systemctl status myflask.service
sudo systemctl status cloudflared.service

Visit your site: ➡️ https://<your-domain.com>


🧼 Notes