Pryv.io platform validation guide

This guide describes how to validate that a Pryv.io platform is up and running after install or after an upgrade.

Since v2 (2026) Pryv.io is a single binary serving registration, core API, HFS and — in multi-core mode — DNS. Validation is therefore one short checklist instead of four (DNS + register + core + NGINX). In multi-core mode, run the checklist against every core.

Table of contents

  1. Variables
  2. Tools
  3. Checklist
    1. 1. Process is up
    2. 2. Public URL responds
    3. 3. Registration / rqlite reachable
    4. 4. DNS (multi-core only)
    5. 5. Base storage (PostgreSQL / MongoDB) reachable
    6. 6. (Optional) HFS port reachable
    7. 7. mTLS handshake on Raft (multi-core only)
  4. Troubleshoot
    1. Core does not start
    2. 502 / 504 from the reverse proxy
    3. rqlite cluster split-brain or not converging
    4. DNS does not resolve user subdomains
    5. Base storage connection fails
    6. Permission denied on data directories

Variables

Replace these placeholders:

Tools

Checklist

1. Process is up

2. Public URL responds

curl -i ${PUBLIC_URL}/reg/service/info

Expected: HTTP 200 with a JSON body listing api, register, access, name, version.

Common failures:

3. Registration / rqlite reachable

Forces a round-trip through the rqlite platform DB:

curl -i ${PUBLIC_URL}/reg/testuser/check_username

Expected: HTTP 200 with a JSON body telling you whether testuser is reserved.

If this returns 500, inspect the core logs for rqlited errors — see the rqlite troubleshooting section.

4. DNS (multi-core only)

Skip in dnsLess mode.

Verify that your domain’s nameservers point to the cores:

dig NS +trace +nodnssec ${DOMAIN}

The last hop should return NS records that resolve to your core IPs. Then confirm a user subdomain resolves (use any registered username, or create one first):

dig A someuser.${DOMAIN}

Expected: an ANSWER SECTION with an A record for one of the cores.

5. Base storage (PostgreSQL / MongoDB) reachable

The core logs a fatal error and exits if it cannot connect to its base storage on startup — step 1 catches this. To double-check the connection independently:

6. (Optional) HFS port reachable

Only if your deployment uses HFS (high-frequency series):

curl -i -X OPTIONS ${PUBLIC_URL}/someuser/events/abc/series

Expected: a 2xx or a documented 4xx from the HFS stack. A 502/504 means the reverse proxy can’t reach port 4000.

7. mTLS handshake on Raft (multi-core only)

Skip in single-core mode and in multi-core deployments that opted out of mTLS (storages.engines.rqlite.tls: null).

For deployments configured by the bootstrap CLI, the cluster CA cert is at /etc/pryv/tls/ca.crt on every core, and rqlite’s HTTP API speaks the same cert chain. Verify a peer’s cert chains to the bundled CA:

# On core-a, against core-b's rqlite HTTP port (default 4001).
# Replace <core-b-host> with what core-b's node cert SAN advertises (its
# hostname or IP).
curl --cacert /etc/pryv/tls/ca.crt \
     --resolve <core-b-host>:4001:<core-b-ip> \
     https://<core-b-host>:4001/status

Expected: an HTTP 200 with rqlited’s status JSON. A TLS handshake failure (certificate verify failed, unknown CA) means either the CA cert on this host is wrong, the peer is not actually using the cluster CA, or verifyClient: true is rejecting your client cert (in which case add --cert /etc/pryv/tls/node.crt --key /etc/pryv/tls/node.key).

If dig/curl lookups don’t resolve <core-b-host> from this machine, use --resolve (as shown) to short-circuit DNS.

Troubleshoot

Core does not start

Inspect the logs:

docker logs -f --tail 200 pryvio_open_pryv_io
# or
journalctl -u pryv-core -f

Common causes:

Export the tail of the log if you need to escalate:

docker logs --tail 200 pryvio_open_pryv_io > $(date -I)-pryv-core.log

502 / 504 from the reverse proxy

rqlite cluster split-brain or not converging

Only in multi-core mode. Symptoms: /reg/* returns 500, registrations fail, /system/admin/cores times out.

DNS does not resolve user subdomains

Only in multi-core mode with embedded DNS (dns.active: true).

Base storage connection fails

Permission denied on data directories

The core process must own (or at least be able to write to) ${DATA_DIR}/users, ${DATA_DIR}/previews and ${DATA_DIR}/rqlite-data. Typical fix:

sudo chown -R <pryv-user>:<pryv-user> ${DATA_DIR}

For Docker: the default image runs as root, so permissions are usually only an issue when host-mounted volumes were pre-created by another user.