Install guides, operator references and recovery playbooks. Everything needed to run Invidtory on your own infrastructure.
Invidtory is a self-hosted inventory and asset management platform for small businesses. This document walks through a complete first-time deployment — from downloading the build to onboarding the first operator — and is the recommended reference for administrators.
Estimated time for a standard Docker install on a modest VPS: 30–45 minutes.
The recommended installation method is Docker Compose. The snippet below is enough to bring Invidtory up on a fresh Linux host:
# 1. Place your license key in .env echo "LICENSE_KEY=INV-XXXX-XXXX-XXXX" > .env # 2. Pull and start the service docker compose pull docker compose up -d # 3. Create the first administrator docker compose exec invidtory inv admin:create \ --email admin@yourcompany.com \ --name "Admin"
On first boot the application runs migrations automatically and writes an install marker to /var/lib/invidtory/state. Subsequent upgrades are non-destructive and re-run pending migrations in place.
Invidtory is designed to run entirely within your network perimeter. There is no outbound phone-home and no forced telemetry. License validation is performed offline against a signed license file.
Terminate TLS at a reverse proxy (Nginx, Caddy, Traefik) and forward plain HTTP to the Invidtory container on port 8080. Example Nginx stanza:
server {
listen 443 ssl http2;
server_name inventory.yourcompany.com;
ssl_certificate /etc/ssl/inv.crt;
ssl_certificate_key /etc/ssl/inv.key;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
The inv backup command produces a self-contained dump including PostgreSQL data, uploaded files and configuration. Schedule it via cron or systemd:
# /etc/cron.daily/invidtory-backup
docker compose exec -T invidtory inv backup:create \
--out /backups/invidtory-$(date +%F).tar.zst
After your first administrator account is created, the suggested order of setup is: locations → units of measure → categories → SKUs → starting balances.
Use Settings → Import or the inv import:inventory CLI to load existing stock from CSV. A starter template is available under Settings → Import → Download template.
Set a safety stock and reorder point per SKU and location. When on-hand drops below the reorder point, Invidtory drafts a purchase order against the primary supplier.
Assets differ from inventory in that each unit is uniquely identified (by serial number or internal asset tag) and has an owner and condition record. Create asset categories first, then register individual assets.
Assets → LabelsA supplier record holds contacts, lead time, payment terms and a versioned price list. A purchase order references a supplier, contains one or more lines, and moves through draft → approved → sent → (partial) received → closed.
When an invoice is uploaded against a received PO, Invidtory runs a three-way match (PO lines, receipt lines, invoice lines) and flags any variance for review before payment is released.
Invidtory generates barcode and QR labels for items, locations and assets. Supported formats: Code 128, EAN-13, UPC-A and QR. Labels can be printed to thermal rolls (50 × 30 mm template) or A4 sheets (3 × 8 layout).
# Generate a label batch from the CLI
inv labels:print --type item --filter "category=fasteners" \
--format qr --template thermal-50x30 --out labels.pdf
Invidtory ships with four built-in roles — Manager, Operator, Auditor, Viewer — and supports custom roles with per-module, per-action toggles. Role scoping can be narrowed to a single location or group of locations.
Enable TOTP-based 2FA from Settings → Security. Enforcement can be applied to any role.
All tables support CSV, XLSX and JSON export. Scheduled exports write to local disk, an SMB share, an SFTP target or an S3-compatible bucket.
The audit log is append-only and records actor, timestamp, IP and field-level diff for every write action. Export the audit log with a chain-of-custody hash via Audit → Export → Signed CSV.
Check that the LICENSE_KEY environment variable matches the key from your purchase email exactly, including dashes. License files are validated offline and do not require network access.
Run docker compose logs db and verify that PostgreSQL is accepting connections on port 5432. Network isolation, SELinux and host firewalls are the most common causes of failures.
Restore a backup with inv backup:restore --in /backups/<file>.tar.zst. The command stops the application, replaces the data volume and replays migrations before restarting.