Cómo implementar una aplicación FastAPI en un VPS

Una guía completa para implementar una aplicación FastAPI en un VPS, que abarca la configuración del servidor, la gestión de dependencias (Python, pip, venv), el servidor ASGI (Gunicorn/Uvicorn), la gestión de procesos (systemd), el proxy inverso (Nginx) y la configuración de SSL.

Intermediate

La implementación de una aplicación FastAPI en un servidor privado virtual (VPS) implica varios pasos para garantizar que funcione de manera eficiente, segura y fiable. Esta guía le guiará a través del proceso utilizando Gunicorn como servidor de aplicaciones y Nginx como proxy inverso, además de proteger su aplicación con HTTPS utilizando Certbot. Las instrucciones están pensadas principalmente para sistemas basados en Ubuntu.

Requisitos previos

Antes de empezar, asegúrese de que dispone de: * Una aplicación FastAPI lista para su implementación, incluido un archivo requirements.txt que enumere todas sus dependencias. * Un VPS que ejecute Ubuntu (u otra distribución basada en Debian). * Acceso SSH a su VPS. * Un nombre de dominio registrado que apunte a la dirección IP de su VPS (opcional, pero muy recomendable para HTTPS).

1. Conéctese a su VPS y actualice el sistema

En primer lugar, conéctese a su VPS a través de SSH y actualice la lista de paquetes de su sistema.

ssh tu_nombre_de_usuario@tu_ip_vps sudo apt update && sudo apt upgrade -y 

2. Instala Python, Pip y Virtual Environment

Instala Python 3, pip (el instalador de paquetes de Python) y el módulo venv para crear entornos virtuales.

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

3. Clona tu aplicación FastAPI

Navega hasta un directorio adecuado (por ejemplo, /var/www/) y clona tu aplicación FastAPI desde tu sistema de control de versiones (por ejemplo, Git).

sudo mkdir -p /var/www/your_fastapi_app
cd /var/www/tu_aplicación_fastapi sudo git clone <tu_url_del_repositorio> . 

Nota: Reemplaza tu_aplicación_fastapi y la URL de Git con los detalles de tu proyecto.

Por motivos de seguridad, se recomienda crear un usuario no root dedicado para tu aplicación.

sudo adduser tu_usuario_de_la_aplicación
sudo usermod -aG sudo tu_usuario_de_la_aplicación
sudo chown -R su_usuario_de_la_aplicación:su_usuario_de_la_aplicación /var/www/nombre_de_su_proyecto_fastapi 

A continuación, cambie a este nuevo usuario:

su - tu_usuario_de_la_aplicación cd /var/www/tu_nombre_de_proyecto_fastapi 

4. Configure un entorno virtual e instale las dependencias

Cree un entorno virtual Python para su proyecto e instale las dependencias de su aplicación, incluyendo FastAPI, Gunicorn y Uvicorn.

python3 -m venv venv
source venv/bin/activate pip install -r requirements.txt pip install gunicorn "uvicorn[standard]" fastapi 

Si no tienes un archivo requirements.txt, puedes crear uno utilizando pip freeze > requirements.txt en tu entorno de desarrollo local.

5. Prueba tu aplicación FastAPI (localmente en VPS)

Antes de configurar Gunicorn y Nginx, comprueba si tu aplicación FastAPI funciona correctamente utilizando Uvicorn.

uvicorn main:app --host 0.0.0.0 --port 8000 

Reemplaza main:app por el módulo real y el nombre de la instancia de la aplicación FastAPI (por ejemplo, tu_carpeta_de_aplicaciones.main:app). Deberías poder acceder a tu aplicación en http://your_vps_ip:8000. Pulsa Ctrl+C para detener el servidor.

6. Configurar Gunicorn

Gunicorn actuará como servidor de aplicaciones, gestionando los trabajadores de Uvicorn para manejar las solicitudes.

Crear un archivo de configuración de Gunicorn (opcional, pero recomendado)

Crea un archivo llamado gunicorn_conf.py en el directorio de tu proyecto.

nano gunicorn_conf.py 

Añada el siguiente contenido:

bind = "127.0.0.1:8000" workers = 4 # Ajústalo en función de los núcleos de tu CPU (lo habitual es recomendar entre 2 y 4 trabajadores por núcleo)
worker_class = "uvicorn.workers.UvicornWorker" 

El valor workers se puede ajustar; una recomendación habitual es (2 * CPU_CORES) + 1.

Probar Gunicorn

Ejecute Gunicorn con su aplicación FastAPI para asegurarse de que se inicia correctamente.

gunicorn -c gunicorn_conf.py main:app 

De nuevo, sustituye main:app por el punto de entrada de tu aplicación.

7. Crear un servicio Systemd para Gunicorn

Para garantizar que su aplicación se inicie automáticamente al arrancar y se pueda gestionar fácilmente, cree un servicio systemd.

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

Añada el siguiente contenido, sustituyendo los marcadores de posición por sus valores reales:

[Unit] Description=Instancia de Gunicorn para servir su aplicación FastAPI
Después de=network.target [Servicio] Usuario=your_app_user
Grupo=tu_usuario_de_la_aplicación Directorio de trabajo=/var/www/tu_nombre_de_proyecto_fastapi ExecStart=/var/www/your_fastapi_project_name/venv/bin/gunicorn -c /var/www/your_fastapi_project_name/gunicorn_conf.py main:app Restart=always
PrivateTmp=true [Instalar] WantedBy=multi-user.target 

Explicación de los campos: * User y Group: El usuario y el grupo no root que ha creado para su aplicación. * WorkingDirectory: La ruta absoluta al directorio de su proyecto FastAPI. * ExecStart: El comando para iniciar Gunicorn, que apunta al ejecutable Gunicorn de su entorno virtual, su archivo de configuración y el punto de entrada de su aplicación. * Restart=always: Garantiza que el servicio se reinicie si se bloquea.

Recargue systemd, inicie el servicio y habilítelo para que se ejecute al arrancar.

sudo systemctl daemon-reload sudo systemctl start your_fastapi_app
sudo systemctl enable your_fastapi_app 

Comprueba el estado y los registros para asegurarte de que funciona sin errores.

sudo systemctl status tu_aplicación_fastapi
sudo journalctl -u tu_aplicación_fastapi -f 

8. Configurar Nginx como proxy inverso

Nginx actuará como un proxy inverso, reenviando las solicitudes a tu aplicación Gunicorn y gestionando los archivos estáticos y SSL.

Instalar Nginx

sudo apt install nginx -y 

Crear un archivo de configuración de Nginx

Crea un nuevo archivo de configuración de bloque de servidor Nginx para tu aplicación.

sudo nano /etc/nginx/sites-available/tu_dominio

Añada el siguiente contenido, sustituyendo su_dominio.com por su nombre de dominio real y /var/www/su_proyecto_fastapi por la ruta de su proyecto:

servidor {  escuchar 80;
 server_name your_domain.com www.your_domain.com;

 ubicación / {
 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;
 proxy_set_header X-Forwarded-Proto $scheme;
 }  # Opcional: servir archivos estáticos directamente a través de Nginx
 # ubicación /static/ {  # alias /var/www/your_fastapi_project_name/static/;
 # } }

Habilitar la configuración de Nginx

Crea un enlace simbólico para habilitar la configuración y comprueba si Nginx tiene errores de sintaxis.

sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/ sudo nginx -t 

Si la prueba tiene éxito, reinicie Nginx.

sudo systemctl restart nginx

9. Configurar el cortafuegos (UFW)

Si tiene un cortafuegos habilitado (por ejemplo, UFW), debe permitir el tráfico en los puertos 80 (HTTP) y 443 (HTTPS).

sudo ufw allow 'Nginx Full' sudo ufw enable 

10. Proteger con HTTPS utilizando Certbot (Let's Encrypt)

Es muy recomendable proteger su aplicación con HTTPS. Certbot automatiza el proceso de obtención y configuración de certificados SSL de Let's Encrypt.

Instalar Certbot

sudo apt install certbot python3-certbot-nginx -y 

Obtener e instalar el certificado SSL

sudo certbot --nginx -d tu_dominio.com -d www.your_domain.com 

Sigue las instrucciones. Certbot modificará automáticamente tu configuración de Nginx y configurará la renovación automática.

11. Comprueba tu implementación

Ahora deberías poder acceder a tu aplicación FastAPI a través de tu nombre de dominio utilizando HTTPS. Abre un navegador web y ve a https://your_domain.com.

Consejos para la resolución de problemas

  • Compruebe los registros de Gunicorn: sudo journalctl -u your_fastapi_app -f
  • Compruebe los registros de errores de Nginx: sudo tail -f /var/log/nginx/error.log
  • Comprueba los registros de acceso de Nginx: sudo tail -f /var/log/nginx/access.log
  • Verifica la configuración de Nginx: sudo nginx -t
  • Asegúrate de que los permisos de los archivos del directorio de tu proyecto y del entorno virtual sean correctos.
  • Problemas con el firewall: comprueba dos veces las reglas de UFW.

Si sigues estos pasos, tendrás una aplicación FastAPI lista para producción implementada en tu VPS con Nginx, Gunicorn y HTTPS.