Skip to content

DevOpsTerminal/caddy-flask

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 

Repository files navigation

Deployment aplikacji Flask na VPS z Caddy - Kompletny tutorial

1. Kupno i konfiguracja VPS

Wybór providera

  • IONOS: ~2 EUR/miesiąc za podstawowy VPS
  • Hetzner: ~3 EUR/miesiąc
  • DigitalOcean: ~4 USD/miesiąc

Specyfikacja VPS (wystarczająca dla 4 projektów Flask):

  • 1 vCPU
  • 1GB RAM
  • 20GB SSD
  • Ubuntu 22.04 LTS

2. Pierwsza konfiguracja serwera

Połączenie z serwerem

ssh root@TWÓJ_IP_SERWERA

Aktualizacja systemu

apt update && apt upgrade -y

Utworzenie użytkownika (bezpieczeństwo)

adduser flask_user usermod -aG sudo flask_user

Przejście na nowego użytkownika

su - flask_user

3. Instalacja niezbędnych pakietów

Python i pip

sudo apt install python3 python3-pip python3-venv git -y

Instalacja Caddy

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list sudo apt update sudo apt install caddy

4. Przygotowanie struktury katalogów

mkdir -p ~/apps/{projekt1,projekt2,projekt3,projekt4} mkdir ~/logs

5. Deployment pierwszej aplikacji Flask

Przykład dla projekt1

cd ~/apps/projekt1

Klonowanie repozytorium (lub upload plików)

git clone https://github.com/twoj-username/projekt1.git . # lub scp -r ./projekt1 flask_user@TWÓJ_IP:~/apps/projekt1/

Tworzenie środowiska wirtualnego

python3 -m venv venv source venv/bin/activate pip install -r requirements.txt

Instalacja Gunicorn

pip install gunicorn

Test aplikacji

gunicorn --bind 0.0.0.0:5001 app:app

6. Konfiguracja systemd dla każdej aplikacji

Tworzenie pliku serwisu dla projekt1

sudo nano /etc/systemd/system/projekt1.service

Zawartość pliku serwisu:

[Unit] Description=Projekt1 Flask Application After=network.target [Service] Type=simple User=flask_user WorkingDirectory=/home/flask_user/apps/projekt1 ExecStart=/home/flask_user/apps/projekt1/venv/bin/gunicorn --bind 127.0.0.1:5001 app:app Restart=always RestartSec=3 Environment=FLASK_ENV=production [Install] WantedBy=multi-user.target

Uruchomienie serwisu

sudo systemctl daemon-reload sudo systemctl enable projekt1 sudo systemctl start projekt1 sudo systemctl status projekt1

Powtórz dla pozostałych projektów (porty 5002, 5003, 5004)

7. Konfiguracja Caddy

Edycja Caddyfile

sudo nano /etc/caddy/Caddyfile

Zawartość Caddyfile:

# Projekt 1 projekt1.twoja-domena.pl { reverse_proxy localhost:5001 log { output file /var/log/caddy/projekt1.log } } # Projekt 2 projekt2.twoja-domena.pl { reverse_proxy localhost:5002 log { output file /var/log/caddy/projekt2.log } } # Projekt 3 projekt3.twoja-domena.pl { reverse_proxy localhost:5003 log { output file /var/log/caddy/projekt3.log } } # Projekt 4 projekt4.twoja-domena.pl { reverse_proxy localhost:5004 log { output file /var/log/caddy/projekt4.log } } # Alternatywnie - wszystko na jednej domenie z ścieżkami: # twoja-domena.pl { # handle /projekt1/* { # reverse_proxy localhost:5001 # } # handle /projekt2/* { # reverse_proxy localhost:5002 # } # handle /projekt3/* { # reverse_proxy localhost:5003 # } # handle /projekt4/* { # reverse_proxy localhost:5004 # } # } 

Restart Caddy

sudo systemctl reload caddy

8. Konfiguracja domeny

Opcja 1: Własna domena

  1. Kup domenę (np. na nazwa.pl, OVH)
  2. Ustaw rekordy DNS:
    • A record: projekt1.twoja-domena.pl → IP_SERWERA
    • A record: projekt2.twoja-domena.pl → IP_SERWERA
    • itd.

Opcja 2: Darmowa subdomena

  • Użyj serwisów jak FreeDNS, No-IP
  • Lub skonfiguruj Cloudflare Tunnel

Opcja 3: Dostęp przez IP (do testów)

# W Caddyfile użyj IP zamiast domeny: IP_SERWERA:80 { handle /projekt1/* { reverse_proxy localhost:5001 } # itd... } 

9. Automatyzacja deploymentu

Skrypt update.sh

nano ~/update_app.sh
#!/bin/bash APP_NAME=$1 cd ~/apps/$APP_NAME git pull origin main source venv/bin/activate pip install -r requirements.txt sudo systemctl restart $APP_NAME echo "Aplikacja $APP_NAME została zaktualizowana!"
chmod +x ~/update_app.sh

Użycie:

./update_app.sh projekt1

10. Monitorowanie i logi

Sprawdzanie statusu aplikacji

sudo systemctl status projekt1 sudo systemctl status projekt2 # itd...

Oglądanie logów

sudo journalctl -u projekt1 -f sudo tail -f /var/log/caddy/projekt1.log

Sprawdzanie zasobów

htop df -h free -h

11. Bezpieczeństwo

Konfiguracja firewall

sudo ufw allow ssh sudo ufw allow 80 sudo ufw allow 443 sudo ufw enable

Automatyczne aktualizacje bezpieczeństwa

sudo apt install unattended-upgrades sudo dpkg-reconfigure unattended-upgrades

12. Backup

Prosty skrypt backup

nano ~/backup.sh
#!/bin/bash DATE=$(date +%Y%m%d_%H%M%S) tar -czf ~/backup_$DATE.tar.gz ~/apps/ echo "Backup utworzony: backup_$DATE.tar.gz"

Podsumowanie kosztów

  • VPS IONOS: ~2 EUR/miesiąc
  • Domena: ~10-15 EUR/rok (opcjonalnie)
  • Łącznie: ~2-3 EUR/miesiąc

Zalety tego rozwiązania

✅ Bardzo niski koszt
✅ Pełna kontrola nad serwerem
✅ Automatyczne SSL (Caddy)
✅ Łatwe zarządzanie wieloma aplikacjami
✅ Dobra wydajność
✅ Możliwość skalowania

Wsparcie

Jeśli masz problemy z którymś krokiem, sprawdź:

  • Logi systemd: sudo journalctl -u nazwa_serwisu
  • Logi Caddy: sudo journalctl -u caddy
  • Status serwisów: sudo systemctl status nazwa_serwisu

Powodzenia z deploymentem! 🚀

Releases

No releases published

Packages

No packages published