Featured image of post Deploy di FastAPI su VPS (AlmaLinux) con Nginx, Supervisor e Python 3.12

Deploy di FastAPI su VPS (AlmaLinux) con Nginx, Supervisor e Python 3.12

Ecco una guida completa, strutturata come un articolo tecnico, per il deploy di un'applicazione FastAPI su una VPS con AlmaLinux.

In questo articolo vedremo come configurare un ambiente di produzione robusto per FastAPI su una VPS AlmaLinux (versione 9 consigliata).

L’architettura che andremo a costruire segue le best practices DevOps attuali:

  • Nginx: Reverse Proxy e terminazione SSL.

  • Supervisor: Process Manager per assicurare che l’applicazione resti sempre attiva.

  • Gunicorn + Uvicorn: Application Server WSGI/ASGI per gestire le richieste Python in concorrenza.

  • Python 3.12: Runtime environment.

1. Preparazione del Sistema (AlmaLinux)

Prima di tutto, aggiorniamo il sistema e installiamo i repository necessari. AlmaLinux, essendo RHEL-based, utilizza dnf.

Aggiornamento e Repository EPEL

Molti pacchetti utili (come Supervisor e Certbot) si trovano nel repository EPEL (Extra Packages for Enterprise Linux).

1
2
sudo dnf update -y
sudo dnf install epel-release -y

Installazione di Nginx

Nginx è il nostro reverse proxy e gestirà il traffico HTTP/HTTPS.

1
2
3
sudo dnf install nginx -y
sudo systemctl enable nginx
sudo systemctl start nginx

Installazione di Certbot per SSL

Per la crittografia HTTPS, useremo Certbot con il plugin Nginx.

1
sudo dnf install certbot python3-certbot-nginx -y

Installazione di Supervisor

Supervisor è il nostro process manager, che manterrà in esecuzione il nostro server ASGI.

1
2
3
sudo dnf install supervisor -y
sudo systemctl enable supervisord
sudo systemctl start supervisord

Installazione di Python 3.12

AlmaLinux 9 include Python 3.9 per default. Dobbiamo installare Python 3.12 manualmente.

1
2
3
4
5
6
7
sudo dnf install -y gcc openssl-devel bzip2-devel libffi-devel zlib-devel wget make
wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tar.xz
tar -xf Python-3.12.0.tar.xz
cd Python-3.12.0
./configure --enable-optimizations
make -j $(nproc)
sudo make altinstall

Verifichiamo l’installazione:

1
python3.12 --version

2. Preparazione dell’Applicazione FastAPI

Struttura del Progetto

La nostra applicazione FastAPI sarà strutturata come segue:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
my_fastapi_app/
├── app/
│   ├── __init__.py
│   ├── main.py
│   └── requirements.txt
└── config/
    ├── nginx/
    │   └── my_fastapi_app.conf
    └── supervisor/
        └── my_fastapi_app.conf

File main.py

Il nostro file principale FastAPI:

1
2
3
4
5
6
7
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World"}

File requirements.txt

Le dipendenze necessarie:

1
2
fastapi==0.104.0
uvicorn==0.24.0.post1

3. Configurazione di Nginx

File di Configurazione Nginx

Creiamo un file di configurazione per Nginx:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
server {
    listen 80;
    server_name your_domain.com;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

4. Configurazione di Supervisor

File di Configurazione Supervisor

Creiamo un file di configurazione per Supervisor:

1
2
3
4
5
6
7
8
[program:my_fastapi_app]
command=/usr/local/bin/python3.12 -m uvicorn app.main:app --host 0.0.0.0 --port 8000
directory=/path/to/my_fastapi_app
user=your_user
autostart=true
autorestart=true
stderr_logfile=/var/log/my_fastapi_app.err.log
stdout_logfile=/var/log/my_fastapi_app.out.log

5. Deploy dell’Applicazione

Installazione delle Dipendenze

1
2
cd /path/to/my_fastapi_app
python3.12 -m pip install -r requirements.txt

Avvio dell’Applicazione con Supervisor

1
2
3
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start my_fastapi_app

Configurazione di Nginx

1
2
3
sudo cp /path/to/nginx/my_fastapi_app.conf /etc/nginx/conf.d/
sudo nginx -t
sudo systemctl restart nginx

6. Verifica del Deploy

Verifichiamo che l’applicazione sia in esecuzione:

1
curl http://localhost

Dovremmo vedere la risposta JSON: {"message": "Hello World"}.

7. Aggiornamento dell’Applicazione

Per aggiornare l’applicazione, seguiamo questi passaggi:

  1. Aggiorniamo il codice nell’applicazione.
  2. Riavviamo l’applicazione con Supervisor:
1
sudo supervisorctl restart my_fastapi_app

8. Monitoraggio e Logging

Controlliamo i log per eventuali errori:

1
2
tail -f /var/log/my_fastapi_app.err.log
tail -f /var/log/my_fastapi_app.out.log # Per i log di output

9. Gestione dei Certificati SSL (Opzionale)

Se desideriamo utilizzare HTTPS, possiamo configurare un certificato SSL con Let’s Encrypt:

1
2
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d your_domain.com

Questo configurerà automaticamente Nginx per utilizzare HTTPS.

Conclusione

Abbiamo configurato un ambiente di produzione per un’applicazione FastAPI utilizzando Nginx, Supervisor e Uvicorn. Questo setup garantisce che l’applicazione sia sempre disponibile, scalabile e sicura.

Costruito con Hugo e il tema Stack.
Realizzato con Hugo
Tema Stack realizzato da Jimmy