- Nginx como proxy reverso
- Socket UNIX (mejor rendimiento)
- Swagger protegido con usuario y contraseña
- Systemd para ejecución automática
Objetivo: Tener Swagger accesible solo para administradores y la API funcionando normalmente.
📁 Estructura del proyecto
/opt/factum/
├── app/
│ └── main.py
├── venv/
├── requirements.txt
└── factum_instalacion.py
Socket usado:
/tmp/factum.sock
⚙️ FastAPI
from fastapi import FastAPI
from app.routes import router
app = FastAPI(
title="Factum",
docs_url="/docs",
redoc_url=None,
openapi_url="/openapi.json"
)
app.include_router(router)
Swagger queda disponible en /factum/docs
🧠 Servicio systemd
[Unit]
Description=FastAPI Factum
After=network.target
[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/opt/factum
Environment="PATH=/opt/factum/venv/bin"
ExecStartPre=/usr/bin/rm -f /tmp/factum.sock
ExecStart=/opt/factum/venv/bin/uvicorn app.main:app --uds /tmp/factum.sock
Restart=always
[Install]
WantedBy=multi-user.target
No olvides ejecutar
systemctl daemon-reload después de crear el servicio.
🌐 Configuración Nginx
server {
listen 443 ssl;
server_name japo.click;
ssl_certificate /etc/letsencrypt/live/japo.click/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/japo.click/privkey.pem;
location /factum/ {
rewrite ^/factum/(.*)$ /$1 break;
proxy_pass http://unix:/tmp/factum.sock:;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /factum/docs {
auth_basic "Swagger protegido";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://unix:/tmp/factum.sock:/docs;
}
location /factum/openapi.json {
auth_basic "Swagger protegido";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://unix:/tmp/factum.sock:/openapi.json;
}
}
🔐 Proteger Swagger con contraseña
sudo htpasswd -c /etc/nginx/.htpasswd swagger
El usuario será swagger y la contraseña la defines al momento de crearla.
🔁 Recargar servicios
sudo nginx -t
sudo systemctl reload nginx
sudo systemctl restart factum
✅ Resultado final
| Ruta | Estado |
|---|---|
| /factum/health | ✅ Público |
| /factum/api/* | 🔐 Token |
| /factum/docs | 🔒 Usuario y contraseña |
| /factum/openapi.json | 🔒 Protegido |
✔ Swagger protegido
✔ API segura
✔ Compatible con producción
✔ Fácil mantenimiento
✔ API segura
✔ Compatible con producción
✔ Fácil mantenimiento
📌 Tip final
Si querés aún más seguridad, podés:
- Restringir Swagger por IP
- Ocultarlo en producción
- Usar JWT en los endpoints
Comentarios
Publicar un comentario