Operate

When something breaks

View as Markdown

Start here when the server is misbehaving. You’re reading this on the web rather than on the server for a reason: the machine that’s broken is the worst place to keep its own troubleshooting guide.

Almost everything below needs a terminal on the server, over SSH or at the keyboard.

Is it running?

sudo systemctl status virtues

The server runs as a systemd unit called virtues, restarts itself on failure, and waits for PostgreSQL before starting. If it’s in a restart loop, the reason is in the log:

sudo journalctl -u virtues -n 100 --no-pager

Everything logs to the journal. There is no Virtues log file to hunt for.

A restart fixes more than it should:

sudo systemctl restart virtues

What the server thinks of itself

virtues status

Identity, subscription, and paired devices in one screen. When you want to hand someone the whole picture rather than describe it, virtues status --json prints the same thing in a stable form that’s easy to paste.

virtues doctor

Reports how the inference stack resolved on this hardware — which accelerator was found, whether this build links CUDA, and whether each model is present or would need downloading. It doesn’t touch the database, so it still answers when other things are broken.

These commands read the database, and the database belongs to the virtues service user. You don’t have to think about that: run them as yourself and they re-launch themselves as the right user, printing a line to say so.

The pieces

Beyond the main service, a server runs the inference sidecars — and on hardware with an NPU, one daemon replaces both:

UnitWhat it is
virtuesthe server itself, on port 8000
virtues-embedembedding model, on local port 18181
virtues-rerankreranking model, on local port 18182
virtues-qnndon NPU hardware, replaces both sidecars and serves both ports
virtues-displaythe on-server screen, if your server has one

If search returns nothing or feels broken while the server is otherwise healthy, suspect a sidecar:

systemctl status virtues-embed
journalctl -u virtues-embed -n 50

If the on-server screen shows an old version of the interface after an upgrade, it’s the kiosk holding a cached copy rather than anything deeper:

sudo systemctl restart virtues-display

Where things live

WhatPath
Everything the server owns/var/lib/virtues
Configuration and secrets/var/lib/virtues/virtues.env
Your files and recordings/var/lib/virtues/lake
Models/var/lib/virtues/models
Backups/var/lib/virtues/backups
Release channel/var/lib/virtues/channel
The binary/usr/local/bin/virtues

The binary is a symlink into the currently active release, which is what lets an upgrade swap versions atomically and roll back with one flip.

An upgrade went wrong

The upgrade path is built so that failures before the switch leave the server untouched, and failures after it flip straight back. If you’re on a release that’s misbehaving:

sudo virtues rollback

That returns the binary, the web app, and the actions runtime together. The database is not rolled back — migrations only move forward, and the previous release tolerates a newer schema. Upgrading has the full model.

You can’t reach the server

If the server is healthy but your phone or laptop can’t get to it, that’s a different problem with its own page — see Reaching your server. The short version: check that the device is still on the allowlist with virtues device ls, and re-pair with virtues pair if it isn’t.

Search results are wrong or empty

If the server reports a model fingerprint or dimension mismatch — usually after changing models — the index was built by a different model than the one now answering:

virtues configure-inference

To rebuild the index from your source data:

virtues reindex

Your data isn’t touched by either. The index is derived, so rebuilding it is recoverable by definition, just slow.

Starting over

virtues restore replaces the server’s state from a backup. It’s destructive and there’s no dry run, so read Backup & restore before reaching for it — particularly the part about needing the key you were shown once.

To remove Virtues from the machine entirely, sudo virtues uninstall prints everything it found before touching any of it and asks you to type the server’s hostname to confirm.

Updated 2026-08-28T00:00:00.000Z