# Screenshot Service Unified Node.js service for generating merchandise design screenshots using Puppeteer. ## Overview This service consolidates multiple screenshot generation endpoints that were previously running on separate ports. It now provides a single, well-organized application with proper routing. ## Architecture ``` nodejs/ ├── server.js # Main application entry point ├── config/ │ └── config.js # Configuration (SSL, CORS, URLs) ├── middleware/ │ └── cors.js # CORS middleware ├── routes/ │ ├── jersey.js # Jersey screenshot routes │ ├── tshirt.js # T-Shirt screenshot routes │ ├── merchbay.js # Merchbay screenshot routes │ └── mask.js # Mask screenshot routes ├── utils/ │ └── screenshot.js # Screenshot utility functions └── package.json # Dependencies and scripts ``` ## Installation ```bash npm install ``` ## Configuration ### Environment Variables Create a `.env` file from the example: ```bash cp .env.example .env ``` Key configuration options: - `USE_SSL=false` - Use HTTP (recommended for Traefik deployment) - `USE_SSL=true` - Use HTTPS with direct SSL certificates - `PORT=5955` - Server port - `BASE_URL` - Base URL for generated screenshot links ### Traefik Deployment (Recommended) When deploying behind Traefik with automatic SSL: 1. Set `USE_SSL=false` in your `.env` file 2. The app will run on HTTP 3. Traefik handles SSL termination with automatic Let's Encrypt certificates 4. No SSL certificate files needed ### Direct SSL Deployment If deploying without a reverse proxy: 1. Set `USE_SSL=true` in your `.env` file 2. Configure SSL certificate paths: - `SSL_KEY_PATH=/path/to/key.pem` - `SSL_CERT_PATH=/path/to/cert.pem` ## Usage ### Development ```bash npm run dev ``` ### Production ```bash npm start ``` ## API Endpoints ### Health Check - `GET /health` - Service health status ### Jersey Screenshots - `GET /jersey/:designId` - Generate 4-view screenshots (front, back, right, left) ### T-Shirt Screenshots - `GET /tshirt/:designId` - Generate 4-view screenshots - `GET /tshirt/allover/:designId` - Generate 2-view all-over print screenshots ### Merchbay Screenshots - `GET /merchbay/tshirt/:designId` - Generate 4-view screenshots - `GET /merchbay/allover/:designId` - Generate 2-view all-over print screenshots - `GET /merchbay/legacy/:designId` - Legacy viewer URL format (4 views) ### Mask Screenshots - `GET /mask/:designId` - All-over print mask (single view) - `GET /mask/classic/:designId` - Classic mask (single view, larger) ### Legacy Routes (Backwards Compatible) - `GET /tb/:designId` → Maps to `/jersey/:designId` - `GET /ap/:designId` → Maps to `/tshirt/allover/:designId` ## Response Format All endpoints return JSON/JSONP with the following structure: ```json { "thumb_front": "https://crewsportswear.app:5955/designId-front-thumbnail.png", "thumb_back": "https://crewsportswear.app:5955/designId-back-thumbnail.png", "thumb_right": "https://crewsportswear.app:5955/designId-right-thumbnail.png", "thumb_left": "https://crewsportswear.app:5955/designId-left-thumbnail.png", "time": "2025-12-23T12:00:00.000Z" } ``` ## Features - ✅ **Unified Application**: Single server instead of multiple separate services - ✅ **Organized Routes**: Clean route structure with dedicated modules - ✅ **CORS Support**: Configured allowed origins - ✅ **Caching**: Checks for existing screenshots before regenerating - ✅ **Error Handling**: Proper error handling and logging - ✅ **Backwards Compatibility**: Legacy routes still work - ✅ **HTTPS**: SSL/TLS support - ✅ **Health Check**: Monitoring endpoint - ✅ **Graceful Shutdown**: Proper cleanup on termination ## Configuration Edit `config/config.js` to modify: - SSL certificate paths - Allowed CORS origins - Screenshot output directory - Base URL for generated images - Viewport dimensions - Wait times - Viewer URLs ## Migration from Old Services ### Before (Multiple Services) ``` jersey-screenshot.js → Port 5951 merchbay-tshirt.js → Port 5952 tshirt_ss.js → Port 5952 mask.js → Port 5953 ``` ### After (Single Unified Service) ``` server.js → Port 5955 (configurable) All routes available on the same port ``` ### Updating Laravel Applications Update your `.env` or configuration to point to the new unified service: ```env IMAGES_URL=https://your-domain:5955 ``` Then update API calls: - Old: `https://domain:5951/tb/:designId` - New: `https://domain:5955/jersey/:designId` (or use legacy route `/tb/:designId`) ## Logging The service logs: - Route access - Screenshot generation status - Errors and exceptions - Server startup information ## Environment Variables ### Server - `PORT` - Server port (default: 5955) - `HOST` - Server host (default: 0.0.0.0) - `USE_SSL` - Enable direct SSL (true/false, default: false) ### SSL (only when USE_SSL=true) - `SSL_KEY_PATH` - Path to SSL private key - `SSL_CERT_PATH` - Path to SSL certificate ###Deployment Options ### Option 1: Traefik with Auto SSL (Recommended) 1. Set `USE_SSL=false` 2. Configure Traefik labels in docker-compose 3. Traefik handles SSL with Let's Encrypt 4. App runs on HTTP internally ### Option 2: Direct SSL 1. Set `USE_SSL=true` 2. Provide SSL certificates: - Key: `/etc/httpd/ssl/crewsportswear_app.key` - Cert: `/etc/httpd/ssl/certs/current_cert.crt` 3. App runs on HTTPS directlydefault: 1100) - `WAIT_TIME` - Wait time before screenshot in ms (default: 10000) ## Dependencies - **express**: Web framework - **puppeteer**: Headless browser for screenshots - **nodemon**: Development auto-reload (dev dependency) ## SSL Certificates Ensure SSL certificates are available at: - Key: `/etc/httpd/ssl/crewsportswear_app.key` - Cert: `/etc/httpd/ssl/certs/current_cert.crt` ## Notes - Screenshots are cached in `/var/www/html/images/` - If a screenshot already exists, it returns immediately without regeneration - All routes support JSONP for cross-domain compatibility - Puppeteer runs in headless mode with `--no-sandbox` for Docker compatibility