🌀 Cloudflared + Flask on Raspberry Pi
A simple way to host a Flask app through Cloudflare Tunnel.
🚀 Overview
This guide shows how to:
- Install cloudflared on a Raspberry Pi
- Run a Flask app with gunicorn
- Expose it securely through a Cloudflare Tunnel
- 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
- Keep
~/.cloudflared/<UUID>.jsonprivate. - Don’t post your tunnel UUIDs or domain credentials online.
- Systemd automatically restarts both on boot or crash.
- Use
journalctl -u <service>.service -fto watch logs live.