Servicio en Rust (Actix Web) para generación de PDFs y envío de emails con gestión asíncrona de operaciones.
-
Generación de PDFs:
- Conversión de HTML a PDF usando chromiumoxide
- Soporte para diferentes tamaños de papel y orientaciones
- Configuración de márgenes personalizada
- Modo headless optimizado
-
Gestión de Emails:
- Envío de correos vía SMTP
- Soporte para envío asíncrono
- Seguimiento de estado de envío
- Reintentos automáticos configurables
-
Sistema de Operaciones:
- Gestión de estados (pending/running/done/failed)
- Almacenamiento en SQLite
- API REST completa
- Paginación y filtrado
-
El servicio usa chromiumoxide, el cual lanza Chrome/Chromium en modo headless
-
Instalación:
Linux (Debian/Ubuntu)
sudo apt-get update sudo apt-get install chromium-browser # o en algunos sistemas: sudo apt-get install chromiumLinux (Fedora)
sudo dnf install chromium chromium-headless chromedriver
Linux (CentOS 7)
# Habilitar EPEL repository sudo yum install epel-release # Instalar Chromium sudo yum install chromium chromium-headless chromedriver
Linux (CentOS 8/Rocky Linux/AlmaLinux)
# Habilitar EPEL repository sudo dnf install epel-release # Instalar Chromium sudo dnf install chromium chromium-headless chromedriver
Linux (Arch/Manjaro)
sudo pacman -S chromium
Linux (openSUSE)
sudo zypper install chromium chromium-headless
macOS
brew install chromium
- Base de datos para registro de operaciones y emails
- Archivo por defecto:
./data/operations.db - Permisos necesarios de lectura/escritura en
./data/
- Versión 1.60+ (recomendado 1.83.0)
- Componentes: cargo, rustc
- (Opcional) dotenv para variables de entorno
- Clonar el repositorio:
git clone https://tu-repo.git
cd pdf_service- Instalar dependencias:
Linux (Debian/Ubuntu)
sudo apt-get update
sudo apt-get install -y \
libssl-dev \
pkg-config \
chromium-browser \
sqlite3 \
build-essential \
curl \
gcc \
makeLinux (Fedora)
sudo dnf install \
openssl-devel \
pkg-config \
chromium \
sqlite \
sqlite-devel \
gcc \
make \
curl \
perl-coreLinux (CentOS 7)
# Habilitar EPEL
sudo yum install epel-release
# Instalar dependencias
sudo yum install \
openssl-devel \
pkg-config \
chromium \
sqlite \
sqlite-devel \
gcc \
make \
curl \
perl-coreLinux (CentOS 8/Rocky Linux/AlmaLinux)
# Habilitar EPEL
sudo dnf install epel-release
# Instalar dependencias
sudo dnf install \
openssl-devel \
pkg-config \
chromium \
sqlite \
sqlite-devel \
gcc \
make \
curl \
perl-coreLinux (Arch/Manjaro)
sudo pacman -S \
openssl \
pkg-config \
chromium \
sqlite \
base-devel \
curlLinux (openSUSE)
sudo zypper install \
libopenssl-devel \
pkg-config \
chromium \
sqlite3 \
sqlite3-devel \
gcc \
make \
curlmacOS (Homebrew)
brew install \
openssl \
pkg-config \
chromium \
sqlite- Compilar y Ejecutar:
cargo build --release
./target/release/pdf_service# Construir imagen
docker build -t pdf-service .
# Ejecutar contenedor
docker run -p 5022:5022 \
-v $(pwd)/data:/usr/src/app/data \
-v $(pwd)/migrations:/usr/src/app/migrations \
pdf-serviceGenera un PDF a partir de HTML.
Request:
{
"html": "<h1>Hola mundo</h1><p>Contenido del PDF</p>",
"orientation": "portrait",
"paper_size": {
"width": 8.5,
"height": 11.0
},
"margins": {
"top": 0.5,
"bottom": 0.5,
"left": 0.5,
"right": 0.5
},
"size_category": "small"
}Response: Binary PDF file
Envía un email, opcionalmente de forma asíncrona.
Request:
{
"smtp_host": "smtp.gmail.com",
"smtp_port": 587,
"smtp_user": "your-email@gmail.com",
"smtp_pass": "your-app-password",
"recipient": "destination@example.com",
"subject": "Test Email",
"body": "Email content",
"async_send": true
}Response:
{
"operation_id": "abc123...",
"message": "Email queued for delivery"
}Lista todas las operaciones con paginación.
Query Parameters:
page: Número de página (default: 1)page_size: Elementos por página (default: 10)
Obtiene detalles de una operación específica.
Crea un archivo .env en la raíz del proyecto:
# Server Configuration
SERVER_HOST=127.0.0.1
SERVER_PORT=5022
# Email Configuration
SMTP_DEFAULT_HOST=smtp.gmail.com
SMTP_DEFAULT_PORT=587
# Database Configuration
DATABASE_PATH=./data/operations.db
# PDF Generation
CHROME_PATH=/usr/bin/chromiumPara sistemas Linux, ejemplo de configuración systemd:
[Unit]
Description=PDF Service in Rust
After=network.target
[Service]
ExecStart=/usr/local/bin/pdf_service
WorkingDirectory=/usr/local/bin
Restart=always
User=www-data
Group=www-data
Environment=RUST_LOG=info
[Install]
WantedBy=multi-user.targetpdf_service/
├── src/
│ ├── main.rs # Punto de entrada
│ ├── config/ # Configuración
│ ├── services/ # Lógica de negocio
│ ├── handlers/ # Endpoints HTTP
│ ├── models/ # Modelos de datos
│ └── tests/ # Tests
├── migrations/ # SQL migrations
├── Dockerfile # Configuración Docker
├── .env.example # Template variables de entorno
└── README.md # Este archivo
# Ejecutar todos los tests
cargo test
# Ejecutar tests con logs
RUST_LOG=debug cargo test
# Tests específicos
cargo test email_service- Fork el proyecto
- Crea tu Feature Branch (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push al Branch (
git push origin feature/AmazingFeature) - Abre un Pull Request
- Implementación inicial
- Soporte para generación de PDFs
- Sistema de envío de emails
- API REST completa
Este proyecto está bajo la Licencia MIT - ver el archivo LICENSE para detalles.