Skip to content

Docker Image

SnapOtter ships as a Docker image that runs alongside PostgreSQL 17 and Redis 8 in a Compose stack. The app image works on all platforms.

Quick start

bash
docker run -d --name SnapOtter -p 1349:1349 -v SnapOtter-data:/data snapotter/snapotter:latest

GPU acceleration

The image includes CUDA support on amd64. If you have an NVIDIA GPU with the NVIDIA Container Toolkit installed, add --gpus all:

bash
docker run -d --name SnapOtter --gpus all -p 1349:1349 -v SnapOtter-data:/data snapotter/snapotter:latest

The image auto-detects your GPU at runtime. Without --gpus all, it runs on CPU. Same image either way.

Benchmarks

Tested on an NVIDIA RTX 4070 (12 GB VRAM) with a 572x1024 JPEG portrait.

Warm performance

ToolCPUGPUSpeedup
Background removal (u2net)2,415ms879ms2.7x
Background removal (isnet)2,457ms1,137ms2.2x
Upscale 2x350ms309ms1.1x
Upscale 4x910ms310ms2.9x
OCR (PaddleOCR)137ms94ms1.5x
Face blur139ms122ms1.1x

Cold start (first request after container start)

ToolCPUGPUSpeedup
Background removal22,286ms4,792ms4.7x
Upscale 2x3,957ms2,318ms1.7x
OCR (PaddleOCR)1,469ms1,090ms1.3x

GPU health check

After the first AI request, the admin health endpoint reports GPU status:

GET /api/v1/admin/health
{"ai": {"gpu": true}}

Docker Compose

The full Compose stack includes the app, PostgreSQL 17, and Redis 8. See Deployment for the complete docker-compose.yml. A minimal example:

yaml
services:
  SnapOtter:
    image: snapotter/snapotter:latest
    ports:
      - "1349:1349"
    volumes:
      - SnapOtter-data:/data
      - SnapOtter-workspace:/tmp/workspace
    environment:
      - DATABASE_URL=postgres://snapotter:snapotter@postgres:5432/snapotter
      - REDIS_URL=redis://redis:6379
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    restart: unless-stopped
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

  postgres:
    image: postgres:17-alpine
    environment:
      POSTGRES_USER: snapotter
      POSTGRES_PASSWORD: snapotter
      POSTGRES_DB: snapotter
    volumes:
      - SnapOtter-pgdata:/var/lib/postgresql/data
    restart: unless-stopped
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U snapotter"]
      interval: 10s
      timeout: 5s
      retries: 12

  redis:
    image: redis:8-alpine
    command: ["redis-server", "--maxmemory-policy", "noeviction", "--appendonly", "yes"]
    volumes:
      - SnapOtter-redisdata:/data
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 12

volumes:
  SnapOtter-data:
  SnapOtter-workspace:
  SnapOtter-pgdata:
  SnapOtter-redisdata:

For GPU acceleration via Docker Compose, add the deploy section to the SnapOtter service:

yaml
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]

Version pinning

TagDescription
latestLatest release
1.11.0Exact version
1.11Latest patch in 1.11.x
1Latest minor in 1.x

Platforms

ArchitectureGPU supportNotes
linux/amd64NVIDIA CUDAFull GPU acceleration for AI tools
linux/arm64CPU onlyRaspberry Pi 4/5, Apple Silicon via Docker Desktop

Migration from previous tags

If you were using the :cuda tag, switch to :latest and keep --gpus all. Same GPU support, unified image.

Your data and settings are preserved in the volumes.