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.