6.9 KiB
Skinbase Enhance Worker
This service is the private HTTP worker for the Skinbase Enhance external_worker engine. Laravel remains responsible for job state, permissions, queueing, moderation, storage, and cleanup. The worker only downloads the copied Enhance source image, upscales it, exposes a temporary result, and deletes that temporary result when Laravel is done.
Local build and run
cd services/enhance-worker
docker compose -f docker-compose.example.yml up --build
curl http://127.0.0.1:8095/health
The example compose file uses WORKER_ENGINE=pillow so local development works without Real-ESRGAN weights.
Real-ESRGAN ncnn runtime
The worker supports these engine values:
WORKER_ENGINE=pillowWORKER_ENGINE=realesrgan-ncnnWORKER_ENGINE=realesrgan
realesrgan currently aliases to the ncnn-vulkan CLI path. Pillow mode remains the safe local and CI fallback.
The worker expects the Real-ESRGAN ncnn runtime at /app/bin/realesrgan-ncnn-vulkan and model files under /app/models. These files are not committed. Keep bin/ and models/ private to your deployment or local environment.
Endpoints
GET /healthPOST /v1/upscalewithAuthorization: Bearer <WORKER_TOKEN>GET /v1/results/{filename}for temporary internal result downloadDELETE /v1/results/{filename}with bearer token for Laravel cleanup
Worker env
WORKER_HOST=0.0.0.0
WORKER_PORT=8095
WORKER_TOKEN=change-this-token
WORKER_ENGINE=pillow
WORKER_DEVICE=cpu
WORKER_MAX_UPLOAD_MB=20
WORKER_MAX_INPUT_WIDTH=4096
WORKER_MAX_INPUT_HEIGHT=4096
WORKER_MAX_OUTPUT_WIDTH=8192
WORKER_MAX_OUTPUT_HEIGHT=8192
WORKER_TMP_DIR=/app/storage/tmp
WORKER_OUTPUT_DIR=/app/storage/output
WORKER_RESULT_TTL_MINUTES=60
WORKER_MODEL_DIR=/app/app/models
WORKER_DEFAULT_MODEL=realesrgan-x4plus
WORKER_REALESRGAN_BIN=/app/bin/realesrgan-ncnn-vulkan
WORKER_REALESRGAN_MODEL_DIR=/app/models
WORKER_REALESRGAN_DEFAULT_MODEL=realesrgan-x4plus
WORKER_REALESRGAN_ANIME_MODEL=realesrgan-x4plus-anime
WORKER_REALESRGAN_TILE=0
WORKER_REALESRGAN_TTA=false
WORKER_REALESRGAN_VERBOSE=false
WORKER_REALESRGAN_TIMEOUT_SECONDS=900
WORKER_REALESRGAN_PREPROCESS_MAX_PIXELS=16777216
WORKER_REALESRGAN_OUTPUT_EXT=webp
WORKER_REALESRGAN_ALLOW_MODEL_FALLBACK=true
Laravel env
ENHANCE_ENGINE=external_worker
ENHANCE_WORKER_URL=http://127.0.0.1:8095
ENHANCE_WORKER_TIMEOUT=600
ENHANCE_WORKER_TOKEN=change-this-token
ENHANCE_WORKER_MAX_DOWNLOAD_MB=60
ENHANCE_QUEUE=enhance
After updating Laravel env:
php artisan config:clear
php artisan enhance:health
php artisan queue:work --queue=enhance,default
php artisan test --filter=EnhanceExternalWorker
Example request
curl -X POST http://127.0.0.1:8095/v1/upscale \
-H "Authorization: Bearer change-this-token" \
-H "Content-Type: application/json" \
-d '{
"job_id": 1,
"source_url": "https://example.com/test.webp",
"scale": 2,
"mode": "artwork",
"output_format": "webp"
}'
Installing runtime files
cd services/enhance-worker
bash scripts/download-realesrgan-ncnn.sh
bash scripts/verify-realesrgan.sh
You can override the upstream release tag with:
bash scripts/download-realesrgan-ncnn.sh --version v0.2.0
If you already manage the binary and models yourself, place them in bin/ and models/ instead of using the helper script.
Model files
Expected examples:
realesrgan-x4plus.paramrealesrgan-x4plus.binrealesrgan-x4plus-anime.paramrealesrgan-x4plus-anime.bin
Illustration mode prefers the anime model. If that model is missing and WORKER_REALESRGAN_ALLOW_MODEL_FALLBACK=true, the worker falls back to the default model and records the fallback in response metadata.
Running in Pillow mode
docker compose -f docker-compose.example.yml up --build- health should report
engine: pillow - metadata reports
real_ai_upscale: false
Running in Real-ESRGAN mode
cd services/enhance-worker
docker compose -f docker-compose.realesrgan.example.yml up --build
curl http://127.0.0.1:8095/health
If the binary or models are missing, health will report status: degraded and the worker will return a safe unavailable error for upscale requests.
Health checks
GET /health returns general worker status for every engine.
When using realesrgan-ncnn, health also reports:
- whether the binary is configured
- whether the binary exists
- whether it is executable
- whether the model directory exists
- the available model list
- the configured default model
Engines
WORKER_ENGINE=pillow: local development and tests. Metadata reportsreal_ai_upscale: false.WORKER_ENGINE=realesrgan-ncnn: runs the ncnn-vulkan CLI through a safesubprocess.run(..., shell=False)path.WORKER_ENGINE=realesrgan: alias torealesrgan-ncnn.
2x handling uses the 4x model output and a deterministic high-quality downsample. 4x requests return the native model scale.
CPU and GPU
CPU mode is supported by default.
Optional GPU deployment later:
- install NVIDIA Container Toolkit
- use a CUDA-compatible image and runtime
- set
WORKER_DEVICE=cuda - install Real-ESRGAN and its GPU-capable dependencies
Do not remove CPU fallback.
For realesrgan-ncnn, WORKER_DEVICE=vulkan is the intended production setting when the host has compatible drivers and GPU access.
Performance notes
- 2x requests still pay much of the 4x cost because the worker currently runs the 4x model then downsamples.
- Very large images may need tiling.
WORKER_REALESRGAN_TILE=0keeps the runtime default behavior. WORKER_REALESRGAN_TTA=truemay improve quality but is slower.- CPU-only Real-ESRGAN is suitable for verification and low-volume use, but usually too slow for production.
- Start production with conservative input limits and a dedicated
enhancequeue.
Security notes
- Keep the worker on
127.0.0.1or a private container network. - Do not expose the worker publicly.
- Use a strong
WORKER_TOKEN. - The worker only accepts
httpandhttpssource URLs. - The result endpoint only serves sanitized filenames from the worker output directory.
- Temporary inputs are deleted after processing, and stale temporary outputs are pruned by TTL.
- Real-ESRGAN model names are selected from an internal allowlist only. Users cannot inject arbitrary CLI flags.
- The worker uses
subprocess.runwithoutshell=True.
Troubleshooting
401 Unauthorized: checkWORKER_TOKENand LaravelENHANCE_WORKER_TOKEN.Upscale engine is not available...: the worker is inrealesrgan-ncnnmode but the binary or models are missing, not executable, or the CLI run failed.Worker rejected the image.: invalid mode, scale, output format, MIME type, dimensions, or download size.status: degradedon/health: usebash scripts/verify-realesrgan.shand either fix the runtime files or switch back toWORKER_ENGINE=pillow.- Jobs stuck in
queued: ifENHANCE_QUEUE=enhance, make sure workers or Horizon consume theenhancequeue.