Un servidor de optimización de imágenes en tiempo real construido con Go que permite redimensionar, comprimir y servir imágenes desde cualquier URL con un sistema de caché inteligente.
- 🚀 Optimización en tiempo real - Redimensiona y comprime imágenes al vuelo
- 📦 Sistema de caché inteligente - Almacena imágenes procesadas para respuestas ultra-rápidas
- 🌐 Soporte multi-formato - JPEG, PNG, GIF, WebP
- ⚡ Alto rendimiento - Respuestas en microsegundos para imágenes cacheadas
- 🔧 Configuración flexible - Parámetros de calidad y tamaño personalizables
- 🛡️ Headers inteligentes - Evita bloqueos de CORS y referer
git clone <repository-url>
cd serve-img-optimized
go mod tidy
go run main.goCrea un archivo .env en la raíz del proyecto:
TIME_CACHE=1h
CACHE_DIR=./cache/images
MAX_CACHE_SIZE=1000
API_TOKEN=your-secret-api-token-here
PORT=4440http://localhost:4000/api/image/[parámetros]/[url-de-imagen]
w_[número]- Ancho en píxeles (máximo 2000)q_[número]- Calidad JPEG (1-100)origin=[dominio]- Dominio de origen para headers
# Redimensionar a 400px de ancho con calidad 90% (con autenticación)
curl -H "Authorization: Bearer your-api-token" \
"http://localhost:4000/api/image/w_400,q_90/example.com/image.jpg"
# Solo redimensionar (calidad por defecto 90%)
curl -H "Authorization: Bearer your-api-token" \
"http://localhost:4000/api/image/w_300/example.com/photo.png"
# Solo cambiar calidad (ancho por defecto 400px)
curl -H "Authorization: Bearer your-api-token" \
"http://localhost:4000/api/image/q_75/example.com/picture.webp"
# Ruta sin autenticación (Desactivado) Habilitar para Testing Only
http://localhost:4000/w_400,q_90/example.com/image.jpg| Endpoint | Método | Autenticación | Descripción |
|---|---|---|---|
/api/image/* |
GET | ✅ Requerida | Optimiza y sirve imágenes |
/api/info?url=[url] |
GET | ✅ Requerida | Obtiene información de una imagen |
/api/cache/stats |
GET | ✅ Requerida | Estadísticas del sistema de caché |
/api/health |
GET | ✅ Requerida | Estado del servidor |
/* |
GET | ❌ No requerida | Optimización sin autenticación (Desactivado) |
Las rutas /api/* requieren autenticación mediante token Bearer:
# Formato del header
Authorization: Bearer your-api-token
# Ejemplo de uso
curl -H "Authorization: Bearer your-api-token" \
"http://localhost:4000/api/health"{
"width": 1920,
"height": 1080,
"format": "jpeg"
}{
"cache_size": "45.67 MB",
"cache_dir": "./cache/images"
}- JPEG (.jpg, .jpeg)
- PNG (.png)
- GIF (.gif)
- WebP (.webp)
- JPEG optimizado (mejor rendimiento y compatibilidad)
| Variable | Descripción | Valor por Defecto |
|---|---|---|
TIME_CACHE |
Duración del caché | 1h |
CACHE_DIR |
Directorio de caché | ./cache/images |
MAX_CACHE_SIZE |
Tamaño máximo en MB | 1000 |
API_TOKEN |
Token de seguridad para API | (opcional) |
PORT |
Puerto del servidor | 4441 |
Formatos soportados para TIME_CACHE:
30min- 30 minutos2h- 2 horas1d- 1 día1w- 1 semana1m- 1 mes1y- 1 año
El sistema automáticamente:
- Elimina archivos expirados según
TIME_CACHE - Libera espacio cuando se alcanza
MAX_CACHE_SIZE - Mantiene los archivos más recientes
- Primera petición: ~1-2 segundos (descarga + procesamiento)
- Peticiones cacheadas: ~1ms (desde disco)
- Throughput: Miles de imágenes por segundo
- Memoria: Uso eficiente con streaming
- Protección de endpoints: Todas las rutas
/api/*requieren autenticación - Token Bearer: Formato estándar
Authorization: Bearer <token> - Configuración flexible: Token opcional para desarrollo, obligatorio para producción
- Respuestas de error claras: Mensajes específicos para diferentes tipos de errores de autenticación
- Validación de URLs de entrada
- Límites de tamaño de imagen
- Headers CORS configurados
- Timeouts de descarga
- Sanitización de parámetros
- Rutas de compatibilidad sin autenticación para migración gradual
github.com/go-chi/chi/v5- Router HTTPgithub.com/disintegration/imaging- Procesamiento de imágenesgithub.com/joho/godotenv- Variables de entornogolang.org/x/image/webp- Soporte WebP
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
Este proyecto está bajo la Licencia MIT - ver el archivo LICENSE para más detalles.
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY . .
RUN go mod tidy && go build -o main .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/main .
EXPOSE 4441
CMD ["./main"]⭐ ¡Dale una estrella si te gusta el proyecto!