Skip to content

DevOpsTerminal/cloduflare-tunnel-flask-nodejs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 

Repository files navigation

🌟 Cloudflare Tunnel - Setup dla Flask i Node.js z subdomenami

📋 Przykłady

  • api.twoja-domena.pl → Flask API (port 5000)
  • app.twoja-domena.pl → Node.js App (port 3000)
  • Automatyczne SSL
  • Zero konfiguracji DNS

Krok 1: Przygotowanie aplikacji

Flask API (~/flask-api/)

app.py:

from flask import Flask, jsonify
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

@app.route('/')
def home():
    return jsonify({
        "message": "Flask API działa!",
        "service": "api",
        "port": 5000
    })

@app.route('/users')
def users():
    return jsonify({
        "users": [
            {"id": 1, "name": "Jan Kowalski"},
            {"id": 2, "name": "Anna Nowak"}
        ]
    })

@app.route('/health')
def health():
    return jsonify({"status": "healthy", "service": "flask-api"})

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=False)

requirements.txt:

Flask==2.3.3
flask-cors==4.0.0
gunicorn==21.2.0

start.sh:

#!/bin/bash
cd ~/flask-api
source venv/bin/activate
gunicorn --bind 127.0.0.1:5000 --workers 2 app:app

Node.js App (~/node-app/)

app.js:

const express = require('express');
const cors = require('cors');
const app = express();
const PORT = 3000;

app.use(cors());
app.use(express.json());

app.get('/', (req, res) => {
    res.json({
        message: "Node.js App działa!",
        service: "webapp",
        port: 3000
    });
});

app.get('/products', (req, res) => {
    res.json({
        products: [
            { id: 1, name: "Laptop", price: 2999 },
            { id: 2, name: "Telefon", price: 1299 }
        ]
    });
});

app.get('/health', (req, res) => {
    res.json({ status: "healthy", service: "node-app" });
});

app.listen(PORT, '127.0.0.1', () => {
    console.log(`Node.js app running on http://127.0.0.1:${PORT}`);
});

package.json:

{
  "name": "node-app",
  "version": "1.0.0",
  "description": "Simple Node.js app",
  "main": "app.js",
  "scripts": {
    "start": "node app.js",
    "dev": "nodemon app.js"
  },
  "dependencies": {
    "express": "^4.18.2",
    "cors": "^2.8.5"
  },
  "devDependencies": {
    "nodemon": "^3.0.1"
  }
}

start.sh:

#!/bin/bash
cd ~/node-app
npm start

Krok 2: Instalacja aplikacji

Setup Flask API:

# Tworzenie folderu i środowiska
mkdir ~/flask-api
cd ~/flask-api

# Kopiuj pliki app.py, requirements.txt, start.sh

# Tworzenie środowiska wirtualnego
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

# Test aplikacji
python app.py &
curl http://localhost:5000
# Zatrzymaj: pkill -f "python app.py"

Setup Node.js App:

# Instalacja Node.js (jeśli nie masz)
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs

# Tworzenie projektu
mkdir ~/node-app
cd ~/node-app

# Kopiuj pliki app.js, package.json, start.sh

# Instalacja zależności
npm install

# Test aplikacji
npm start &
curl http://localhost:3000
# Zatrzymaj: pkill -f "node app.js"

Krok 3: Instalacja Cloudflare Tunnel

Pobieranie cloudflared:

# Download i instalacja
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb

# Sprawdź wersję
cloudflared --version

Logowanie do Cloudflare:

# Uruchomi przeglądarkę do logowania
cloudflared tunnel login

# Plik credentials zostanie zapisany automatycznie

Krok 4: Konfiguracja tunnel

Tworzenie tunnel:

# Utwórz nowy tunnel
cloudflared tunnel create moje-aplikacje

# Zapisz tunnel ID (pojawi się w output)
# Przykład: Created tunnel moje-aplikacje with id: 12345678-1234-1234-1234-123456789012

Konfiguracja DNS:

# Dodaj DNS rekordy dla subdomen
cloudflared tunnel route dns moje-aplikacje api.twoja-domena.pl
cloudflared tunnel route dns moje-aplikacje app.twoja-domena.pl

Plik konfiguracyjny:

mkdir -p ~/.cloudflared
nano ~/.cloudflared/config.yml

~/.cloudflared/config.yml:

tunnel: 12345678-1234-1234-1234-123456789012  # Twój tunnel ID
credentials-file: /home/junior/.cloudflared/12345678-1234-1234-1234-123456789012.json

ingress:
  # Flask API
  - hostname: api.twoja-domena.pl
    service: http://127.0.0.1:5000
    originRequest:
      httpHostHeader: api.twoja-domena.pl
  
  # Node.js App  
  - hostname: app.twoja-domena.pl
    service: http://127.0.0.1:3000
    originRequest:
      httpHostHeader: app.twoja-domena.pl
  
  # Catch-all (wymagany)
  - service: http_status:404

Krok 5: Skrypty zarządzania

Skrypt startu aplikacji:

nano ~/start-apps.sh
#!/bin/bash

echo "🚀 Uruchamianie aplikacji..."

# Zatrzymaj poprzednie procesy
pkill -f "gunicorn.*5000" 2>/dev/null || true
pkill -f "node.*3000" 2>/dev/null || true

# Uruchom Flask API
echo "📱 Uruchamiam Flask API (port 5000)..."
cd ~/flask-api
source venv/bin/activate
nohup gunicorn --bind 127.0.0.1:5000 --workers 2 app:app > ~/logs/flask-api.log 2>&1 &

# Uruchom Node.js App
echo "🌐 Uruchamiam Node.js App (port 3000)..."
cd ~/node-app
nohup npm start > ~/logs/node-app.log 2>&1 &

echo "✅ Aplikacje uruchomione!"
echo "📊 Sprawdź logi:"
echo "   Flask: tail -f ~/logs/flask-api.log"
echo "   Node.js: tail -f ~/logs/node-app.log"

Skrypt systemd dla tunnel:

sudo nano /etc/systemd/system/cloudflare-tunnel.service
[Unit]
Description=Cloudflare Tunnel
After=network.target

[Service]
Type=simple
User=junior
ExecStart=/usr/local/bin/cloudflared tunnel run
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Skrypt systemd dla aplikacji:

sudo nano /etc/systemd/system/my-apps.service
[Unit]
Description=My Flask and Node.js Apps
After=network.target

[Service]
Type=forking
User=junior
ExecStart=/home/junior/start-apps.sh
ExecStop=/bin/bash -c 'pkill -f "gunicorn.*5000"; pkill -f "node.*3000"'
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Krok 6: Uruchomienie całego systemu

Przygotowanie logów:

mkdir ~/logs
chmod +x ~/start-apps.sh

Włączenie serwisów:

# Włącz i uruchom aplikacje
sudo systemctl daemon-reload
sudo systemctl enable my-apps
sudo systemctl start my-apps

# Sprawdź status
sudo systemctl status my-apps

# Włącz i uruchom tunnel
sudo systemctl enable cloudflare-tunnel
sudo systemctl start cloudflare-tunnel

# Sprawdź status
sudo systemctl status cloudflare-tunnel

Test działania:

# Test lokalny
curl http://localhost:5000
curl http://localhost:3000

# Test przez tunnel (po chwili)
curl https://api.twoja-domena.pl
curl https://app.twoja-domena.pl

Krok 7: Skrypty zarządzania

Monitor aplikacji:

nano ~/monitor.sh
#!/bin/bash

echo "🔍 Status aplikacji:"

# Sprawdź procesy
echo "📱 Flask API (port 5000):"
if pgrep -f "gunicorn.*5000" > /dev/null; then
    echo "   ✅ Działa"
    curl -s http://localhost:5000/health | grep -o '"status":"[^"]*"' || echo "   ⚠️ Nie odpowiada"
else
    echo "   ❌ Nie działa"
fi

echo "🌐 Node.js App (port 3000):"
if pgrep -f "node.*3000" > /dev/null; then
    echo "   ✅ Działa" 
    curl -s http://localhost:3000/health | grep -o '"status":"[^"]*"' || echo "   ⚠️ Nie odpowiada"
else
    echo "   ❌ Nie działa"
fi

echo "☁️ Cloudflare Tunnel:"
if pgrep -f "cloudflared tunnel run" > /dev/null; then
    echo "   ✅ Działa"
else
    echo "   ❌ Nie działa"
fi

echo ""
echo "🌐 Zewnętrzne adresy:"
echo "   https://api.twoja-domena.pl"
echo "   https://app.twoja-domena.pl"

echo ""
echo "📊 Zasoby systemu:"
echo "   CPU: $(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | awk -F'%' '{print $1}')%"
echo "   RAM: $(free | grep Mem | awk '{printf("%.1f%%", $3/$2 * 100.0)}')"

Restart aplikacji:

nano ~/restart-apps.sh
#!/bin/bash

echo "🔄 Restart aplikacji..."

case $1 in
  flask)
    echo "🔄 Restartuję Flask API..."
    pkill -f "gunicorn.*5000"
    cd ~/flask-api
    source venv/bin/activate
    nohup gunicorn --bind 127.0.0.1:5000 --workers 2 app:app > ~/logs/flask-api.log 2>&1 &
    ;;
  node)
    echo "🔄 Restartuję Node.js App..."
    pkill -f "node.*3000"
    cd ~/node-app
    nohup npm start > ~/logs/node-app.log 2>&1 &
    ;;
  tunnel)
    echo "🔄 Restartuję Cloudflare Tunnel..."
    sudo systemctl restart cloudflare-tunnel
    ;;
  all)
    echo "🔄 Restartuję wszystko..."
    sudo systemctl restart my-apps
    sudo systemctl restart cloudflare-tunnel
    ;;
  *)
    echo "Użycie: $0 {flask|node|tunnel|all}"
    ;;
esac
chmod +x ~/monitor.sh ~/restart-apps.sh

Krok 8: Automatyczne uruchamianie po restarcie

# Włącz auto-start
sudo systemctl enable my-apps
sudo systemctl enable cloudflare-tunnel

# Test restartu (opcjonalnie)
sudo reboot

# Po restarcie sprawdź
./monitor.sh

🎯 Podsumowanie Cloudflare Tunnel

✅ Zalety:

  • 5 linii konfiguracji zamiast 50+
  • Automatyczne SSL - zero konfiguracji
  • Darmowe subdomeny na własnej domenie
  • Działa za NAT - nie potrzebujesz publicznego IP
  • Zero reverse proxy - Cloudflare załatwia wszystko

📊 Co osiągnąłeś:

https://api.twoja-domena.pl  → Flask API (localhost:5000)
https://app.twoja-domena.pl  → Node.js App (localhost:3000)

💸 Koszt:

  • Domena: ~$10/rok
  • VPS: ~2 EUR/miesiąc
  • Cloudflare Tunnel: DARMOWY
  • SSL: DARMOWY

🚀 Użycie:

./start-apps.sh      # Uruchom aplikacje
./monitor.sh         # Sprawdź status
./restart-apps.sh all # Restart wszystkiego

To jest najprostrze rozwiązanie na świecie dla subdomen! 🌟

Releases

No releases published

Packages

No packages published