https://github.com/andreypomortsev/img2pdf
Developed a secure, scalable web service with FastAPI, Celery, and Docker Compose. Features include JWT-based authentication, async image-to-PDF conversion, PDF merging, PostgreSQL ORM, and high test coverage with pytest/HTTPX. Designed for easy deployment and scalable background processing.
https://github.com/andreypomortsev/img2pdf
celery docker fastapi python3 redis
Last synced: about 2 months ago
JSON representation
Developed a secure, scalable web service with FastAPI, Celery, and Docker Compose. Features include JWT-based authentication, async image-to-PDF conversion, PDF merging, PostgreSQL ORM, and high test coverage with pytest/HTTPX. Designed for easy deployment and scalable background processing.
- Host: GitHub
- URL: https://github.com/andreypomortsev/img2pdf
- Owner: andreypomortsev
- License: mit
- Created: 2025-06-23T05:50:28.000Z (about 1 year ago)
- Default Branch: main
- Last Pushed: 2025-07-03T05:46:47.000Z (12 months ago)
- Last Synced: 2026-04-30T22:35:50.803Z (2 months ago)
- Topics: celery, docker, fastapi, python3, redis
- Language: Python
- Homepage:
- Size: 602 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.es.md
- License: LICENSE
Awesome Lists containing this project
README
# Servicio de Conversión de Imagen a PDF
Un servicio web seguro que convierte imágenes a archivos PDF y fusiona múltiples PDFs en un solo documento. Incluye autenticación JWT, un backend de FastAPI y Celery para el procesamiento asíncrono de tareas, todo ejecutándose dentro de contenedores de Docker.
## Características
- **Autenticación JWT**: Acceso seguro a todos los endpoints con autenticación basada en tokens
- **Gestión de Usuarios**: Registro y administración de cuentas con hash seguro de contraseñas
- **Conversión Asíncrona de Imagen a PDF**: Sube una imagen y se convertirá a PDF en segundo plano
- **Fusión Asíncrona de PDFs**: Combina múltiples archivos PDF en un solo documento
- **Seguimiento del Estado de Tareas**: Monitorea el estado de cualquier tarea en segundo plano (conversión o fusión)
- **Contenerizado**: Toda la pila de la aplicación se gestiona con Docker y Docker Compose para una fácil configuración y despliegue
- **Pruebas Integrales**: Incluye pruebas unitarias y de integración con alta cobertura
## Tecnologías Utilizadas
- **Backend**: FastAPI
- **Autenticación**: JWT (JSON Web Tokens)
- **Tareas Asíncronas**: Celery
- **Broker de Mensajes**: Redis
- **Base de Datos**: PostgreSQL con SQLAlchemy ORM
- **Procesamiento de Imágenes**: Pillow, img2pdf
- **Manipulación de PDF**: pypdf
- **Seguridad**: Passlib, OAuth2 con Contraseña (y hashing)
- **Pruebas**: Pytest, HTTPX
- **Contenedores**: Docker, Docker Compose
## Cómo Empezar
### Prerrequisitos
- Docker
- Docker Compose
### Ejecutando la Aplicación
1. **Clona el repositorio:**
```bash
git clone https://github.com/andreypomortsev/img2pdf.git
cd img2pdf
```
2. **Construye y ejecuta los servicios:**
```bash
docker compose up --build -d
```
3. La aplicación estará en funcionamiento y accesible en `http://localhost:8000`.
## Autenticación
### Registrar un Nuevo Usuario
- **URL**: `/api/v1/auth/register`
- **Método**: `POST`
- **Cuerpo**:
```json
{
"email": "usuario@ejemplo.com",
"password": "tu-contraseña-segura"
}
```
- **Respuesta Exitosa**:
```json
{
"email": "usuario@ejemplo.com",
"id": 1,
"is_active": true
}
```
### Iniciar Sesión
- **URL**: `/api/v1/auth/login`
- **Método**: `POST`
- **Cuerpo**:
```json
{
"username": "usuario@ejemplo.com",
"password": "tu-contraseña-segura"
}
```
- **Respuesta Exitosa**:
```json
{
"access_token": "tu-token-jwt",
"token_type": "bearer"
}
```
## Documentación de la API
Todos los endpoints siguientes requieren autenticación. Incluye el token JWT en la cabecera `Authorization`:
```
Authorization: Bearer tu-token-jwt
```
### Archivos
#### Subir una Imagen
- **URL**: `/api/v1/files/upload-image/`
- **Método**: `POST`
- **Cabeceras**: `Authorization: Bearer `
- **Datos del Formulario**: `file` (el archivo de imagen a convertir)
- **Respuesta Exitosa**:
```json
{
"task_id": "",
"status": "PENDING"
}
```
#### Verificar Estado de Tarea
- **URL**: `/api/v1/files/tasks/{task_id}`
- **Método**: `GET`
- **Cabeceras**: `Authorization: Bearer `
- **Respuesta Exitosa**:
```json
{
"task_id": "",
"task_status": "SUCCESS",
"task_result": "static/files/tu_archivo.pdf"
}
```
### Operaciones con PDFs
#### Fusionar PDFs
- **URL**: `/api/v1/pdfs/merge/`
- **Método**: `POST`
- **Cabeceras**: `Authorization: Bearer `
- **Cuerpo**:
```json
{
"file_ids": [1, 2],
"output_filename": "combinado.pdf"
}
```
- **Respuesta Exitosa**:
```json
{
"task_id": "",
"status": "PENDING"
}
```
## Licencia
Este proyecto está bajo la Licencia MIT - consulta el archivo [LICENSE](LICENSE) para más detalles.