Installation (self-hosted)

Notory runs as a container stack. Recommended: PostgreSQL or MariaDB. SQLite is only for testing without a separate database.

Requirements

1. Environment variables (.env)

# Database (choose one line)
DATABASE_URL=postgresql://inv:secret@db:5432/notory
# DATABASE_URL=mariadb://inv:secret@db:3306/notory

# Security
SECRET_KEY=please-set-a-long-random-value

# License (optional - without a key it runs Community, max 30 assets)
LICENSE_KEY=
# The public verification key is bundled with the product;
# alternatively your own path/content:
# LICENSE_PUBLIC_KEY_PATH=/keys/license_public.pem

2. docker-compose.yml

services:
  db:
    image: postgres:16
    environment:
      POSTGRES_USER: inv
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: notory
    volumes: [ "dbdata:/var/lib/postgresql/data" ]

  backend:
    image: notory/backend:latest
    env_file: .env
    depends_on: [ db ]

  web:
    image: notory/web:latest
    ports: [ "8080:80" ]   # nginx reverse proxy
    depends_on: [ backend ]

volumes:
  dbdata:

MariaDB instead of PostgreSQL: switch the db service to mariadb:11 and set the DATABASE_URL accordingly.

3. Start & migrations

docker compose up -d
# Create/update the database schema:
docker compose exec backend alembic upgrade head

The interface is then available at http://SERVER:8080. On first launch, create the first tenant and admin.

4. TLS / reverse proxy

For production, put a reverse proxy with a certificate in front (Let's Encrypt). Route HTTPS to the web service (port 8080).

5. Apply a license

Enter the LICENSE_KEY in the .env and restart the backend service. Check the status under Admin → License. See Licensing.

Note: image names/tags are placeholders - you receive the actual sources with your order. Questions?