Koillection logo

Koillection

Self-hosted service to manage and catalog any kind of collection

Alternative to: collectorz, sortly


Koillection lets you track physical collections of any kind — books, stamps, wine, board games, or anything else — with fully custom fields, tags, and templates instead of relying on pre-built metadata. It supports multi-user access, custom HTML scrapers for pulling item data, and runs against PostgreSQL, MariaDB, or MySQL.

Koillection Docker Compose example

Self-host Koillection on your own server, homelab, or VPS starting from this Docker Compose example. It runs Koillection in Docker containers using the official koillection/koillection:latest, postgres:16 images, with persistent volumes and automatic restarts preconfigured. Review the environment variables and adjust them to your setup, save the file as compose.yml (or docker-compose.yml), and start the stack with docker compose up -d.

services:
  koillection:
    image: koillection/koillection:latest
    depends_on:
      db:
        condition: service_healthy
    volumes:
      - uploads:/uploads
    environment:
      # Application environment: "prod" enables production optimizations.
      APP_ENV: "prod"
      # Disable verbose debug output in production (0 = off, 1 = on).
      APP_DEBUG: "0"
      # Force generation of https:// URLs. Leave 0 for plain http access; the
      # reverse proxy in front sets X-Forwarded-Proto so scheme is auto-detected.
      HTTPS_ENABLED: "0"
      # Maximum size for a single uploaded file.
      UPLOAD_MAX_FILESIZE: "20M"
      # PHP memory limit for the application process.
      PHP_MEMORY_LIMIT: "512M"
      # Timezone used by the application (tz database name, e.g. "Europe/Berlin").
      PHP_TZ: "UTC"
      # Proxies whose forwarded headers are trusted (needed behind a reverse proxy).
      SYMFONY_TRUSTED_PROXIES: "private_ranges"
      # Forwarded headers Symfony is allowed to read from the trusted proxy.
      SYMFONY_TRUSTED_HEADERS: "forwarded,x-forwarded-for,x-forwarded-host,x-forwarded-proto,x-forwarded-port,x-forwarded-prefix"
      # Regex of origins allowed to call the API (CORS).
      CORS_ALLOW_ORIGIN: "^https?://(localhost|127\\.0\\.0\\.1)(:[0-9]+)?$"
      # Paths to the JWT keypair; the entrypoint auto-generates these on first boot.
      JWT_SECRET_KEY: "%kernel.project_dir%/config/jwt/private.pem"
      JWT_PUBLIC_KEY: "%kernel.project_dir%/config/jwt/public.pem"
      # Database driver (pdo_pgsql for PostgreSQL).
      DB_DRIVER: "pdo_pgsql"
      # Database host (the db service on the compose network).
      DB_HOST: "db"
      # Database port.
      DB_PORT: "5432"
      # Database name.
      DB_NAME: "koillection"
      # Database user.
      DB_USER: "koillection"
      # Database password.
      DB_PASSWORD: "changeme"
      # Major version of the database server, must match the db image.
      DB_VERSION: "16"
    restart: unless-stopped

  db:
    image: postgres:16
    volumes:
      - db_data:/var/lib/postgresql/data
    environment:
      # Must match DB_NAME above.
      POSTGRES_DB: "koillection"
      # Must match DB_USER above.
      POSTGRES_USER: "koillection"
      # Must match DB_PASSWORD above.
      POSTGRES_PASSWORD: "changeme"
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "koillection", "-d", "koillection"]
      interval: 10s
      timeout: 5s
      retries: 5
    restart: unless-stopped

volumes:
  uploads:
  db_data:

Values set to changeme are required — replace them with your own values before starting Koillection.

Prefer a managed setup? WinterFlow installs, configures, and updates Koillection for you using this same Docker Compose configuration.