Implement self-hosted document scanner and media processing tools as an alternative to CamScanner/ilovepdf without third-party uploads. Backend: Rust Axum gateway + worker pool with NATS JetStream queue Frontend: Next.js 16 + shadcn/ui + Tailwind v4 + Framer Motion Pipeline: Canny edge detection -> DLT homography warp -> Sauvola binarization -> Hough deskew -> Tesseract OCR -> searchable PDF Phase 1 (MVP) delivers: - Document scanner with perspective correction and OCR - Image compress/resize/convert tools - PDF merge/split/compress tools - Real-time WebSocket progress updates - Rate limiting, auto-cleanup, Prometheus metrics - Full CI/CD pipeline with Docker multi-stage build Co-Authored-By: Kilo <kilo@kilo.ai>
45 lines
1.0 KiB
YAML
45 lines
1.0 KiB
YAML
services:
|
|
tools:
|
|
container_name: tools
|
|
image: ghcr.io/asepharyana/asepharyana-hub/tools:sha-xxxxxxx
|
|
restart: always
|
|
networks:
|
|
app-shared-net:
|
|
aliases:
|
|
- tools
|
|
env_file:
|
|
- ../../.env
|
|
environment:
|
|
- REDIS_URL=redis://redis:6379
|
|
- NATS_URL=nats://nats:4222
|
|
- STORAGE_PATH=/data/tools
|
|
- GATEWAY_PORT=3001
|
|
- TOOLS_WORKER_CONCURRENCY=4
|
|
- RUST_LOG=info
|
|
volumes:
|
|
- tools_data:/data/tools
|
|
ports:
|
|
- "3001:3001"
|
|
depends_on:
|
|
redis:
|
|
condition: service_started
|
|
nats:
|
|
condition: service_started
|
|
labels:
|
|
- 'prometheus.io/scrape=true'
|
|
- 'prometheus.io/port=3001'
|
|
- 'prometheus.io/path=/metrics'
|
|
healthcheck:
|
|
test: ['CMD-SHELL', 'curl -so /dev/null --connect-timeout 5 http://localhost:3001/health || test $? -eq 22']
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 5
|
|
start_period: 30s
|
|
|
|
volumes:
|
|
tools_data:
|
|
|
|
networks:
|
|
app-shared-net:
|
|
name: app-shared-net
|
|
external: true |