Common installation problems
Start with the final error line and the protected installer log path printed
near the beginning and end of every run. Remove database URLs, passwords,
tokens, and profile codes before sharing a log.
Do not drop or reinitialize PostgreSQL, delete a lockfile, recursively change
ownership of a system directory, or add --overwrite-existing merely to make an
error disappear. Diagnose the reported boundary first.
The installer prints a Troubleshooting: URL after recognized failures. That
link points to the most specific recovery section available. Unexpected failures
use this page as the safe starting point; the URL never contains credentials or
other installer settings.
Choose the symptom
| Symptom | First safe action | Detailed instructions |
|---|---|---|
npm i -g fails with EACCES | Use npx -y seqdesk@latest --interactive --dir "$HOME/seqdesk" or a user-managed Node.js installation | npm launcher permissions |
| Node.js is rejected | Install 22.13.0+ on the 22.x line or a 24.x release | Preflight failures |
| A required command is missing | Install the exact curl, tar, or checksum package named by the installer | Prerequisite matrix |
| Target exists, is unwritable, or lacks space | Choose a new writable target; do not use overwrite as a retry switch | Target-directory recovery |
| PostgreSQL is unreachable or migration fails | If you passed no --database-url, SeqDesk manages the database itself: check pg_ctl -D "${SEQDESK_PG_HOME:-$HOME/.seqdesk/postgres}/data" status and the cluster’s server.log. Only check service health, credentials, SSL, network policy, and the direct migration URL when you supplied an explicit --database-url/--database-direct-url | SeqDesk manages its own PostgreSQL, PostgreSQL diagnosis |
| Installation completes but the app does not answer | Run seqdesk doctor, PM2 status/logs, and a localhost health request; if SeqDesk provisioned its own cluster, confirm the database came up — start.sh starts it with pg_ctl before the app, and failures are named in the cluster’s server.log | Application health |
No interactive TTY detected from curl ... | bash | Piping leaves no TTY. Download the script and run it with --interactive, or pass -y plus every required value | Shell fallback limitations |
Homebrew PostgreSQL will not start, old postmaster.pid errors appear, or TCP says no response while /tmp works | Do not require TCP. Without an explicit --database-url, let the installer adopt the working /tmp socket or provision its own socket-only cluster; nothing needs to answer on 127.0.0.1:5432. With an explicit URL, re-point it at the socket (append ?host=%2Ftmp, or the Homebrew socket directory) rather than repairing TCP. Inspect the service owner, PID, log timestamps, pg_hba.conf, and local security filtering only when you must keep a Homebrew server listening on 127.0.0.1 | macOS socket-versus-TCP recovery |
| Config JSON is ignored | Use an absolute path and check whether a CLI or SEQDESK_* value overrides it | Unattended troubleshooting |
| Slurm work remains queued | Check scheduler services, partition/resources, shared paths, and one-node nested-job behavior | AWS/Slurm troubleshooting |
| Download times out or TLS fails | Verify the required HTTPS endpoints, proxy variables and corporate CA trust; do not disable certificate checks | Proxy and firewall checklist |
Could not connect to SeqDesk server or version information cannot be parsed | Test install.sh and /api/version from the same account and network; inspect proxy or TLS interception | Proxy and firewall checklist |
| Release checksum does not match | Do not bypass verification; retry on a trusted connection and report a repeatable mismatch with the expected and received digests | Collect a useful diagnostic |
Install Miniconda failed or a Conda prefix already exists | Check whether the existing base is usable; current installers reuse it outside PATH or preserve it and choose a separate fallback | Conda-prefix recovery |
| Conda environment, Java, or Nextflow setup fails | Pipeline setup only runs after an explicit opt-in or profile setting. Re-run with --without-pipelines for an application-only host, or repair the pipeline toolchain explicitly | Optional pipeline prerequisites |
SeqDesk will not send generated database credentials to a server it does not own (a warning) | The local socket is owned by another operating-system user, typically a distribution PostgreSQL on /var/run/postgresql owned by postgres. Do nothing: the installer skips that socket and continues, normally provisioning its own private cluster. Supply --database-url/--database-direct-url, or re-run as the socket’s owner, only if you want that server used | SeqDesk manages its own PostgreSQL |
SeqDesk will not create a PostgreSQL instance owned by root | You ran the installer as root or through sudo. Re-run as your normal non-root user, or pass --database-url for a database you already manage | SeqDesk manages its own PostgreSQL |
The SeqDesk PostgreSQL socket path is too long for this system | Set a shorter SEQDESK_PG_HOME and re-run. The limit applies to $SEQDESK_PG_HOME/socket (85 characters), so SEQDESK_PG_HOME itself must be 78 or fewer. The error prints the offending path and its length | SeqDesk manages its own PostgreSQL |
seqdesk doctor reports PostgreSQL TCP ... unreachable and exits 1 | Expected on a SeqDesk-managed install: the check is a TCP connect and the cluster is socket-only. Verify with pg_ctl status and pg_isready -h "$SEQDESK_PG_HOME/socket" instead of changing anything | SeqDesk manages its own PostgreSQL |
The selected database already contains SeqDesk accounts and the printed credentials do not work | Expected on a second install against the same database. Existing accounts keep the passwords they already had; nothing was generated for them. Sign in with the credentials that database was set up with, or replace one account’s password | The install attached to a database that already had accounts |
| Nobody knows the administrator password | Replace the password of one account from the command line. There is no reset link in the app | Reset a password |
The terminal only reports Install failed | Use the printed command, exit code, and protected log path to identify the first failing boundary | Collect a useful diagnostic |
The install attached to a database that already had accounts
This is the most common surprise on a second install, and it is not a
failure. The install directory and the PostgreSQL database have separate
lifetimes. Reinstalling, replacing the directory with --overwrite-existing,
or pointing a new host at the same --database-url all reuse the existing
database — schema updated, every account, sequencing order and record kept.
The seed deliberately never overwrites an account that already exists. If it did, anyone able to run the installer against a connection string could reset that database’s administrator password. So the installer detects the situation and says what it did and did not do:
The selected database already contains SeqDesk accounts.
Existing admin account: admin@example.org (password left unchanged)
Sign in with the credentials this database was set up with. This install
neither generated nor stored a password for an account that already exists,
because the seed leaves such an account untouched and any password shown
here would not work.The closing Login block repeats it in the form you act on — for example
Admin admin@example.org / existing password (unchanged) — and, when only one
of the two bootstrap accounts already existed, still prints the freshly
generated password for the other one.
What to do, in order of preference:
-
Sign in with the credentials that database was originally set up with. They still work; nothing changed them.
-
If they are lost, replace one account’s password. See Reset a password:
npx -y seqdesk@latest reset-password admin@example.org --dir "$HOME/seqdesk" -
If you actually wanted a clean instance, install against a different database — a new
--database-url, or a differentSEQDESK_PG_HOMEso the installer creates a fresh cluster it owns.
Two related messages mean something narrower:
This database already held N user account(s) before this install.— the database had users, but none at a bootstrap address, so this install created its own account alongside them. Nothing existing was changed.Unverified: this install could not check whether the database already had SeqDesk accounts.— the pre-install probe failed. The credentials printed are the ones this install generated; if the database already held those accounts, they were left alone and the printed values do not open it.
Answering Backup and replace? at the prompt (or passing
--overwrite-existing) never touches the database. It moves
<dir> to <dir>.backup.<timestamp> and nothing else — no database is backed
up, dropped or reset, and existing accounts keep their passwords.
SeqDesk manages its own PostgreSQL
You usually do not have to provide a database. When you pass no
--database-url, the installer works down a ladder: it reuses a healthy
server on the configured connection; then a healthy local Unix socket it can
administer; on macOS it starts an already-registered but idle Homebrew
service; and otherwise it creates its own cluster.
That private cluster lives in ${SEQDESK_PG_HOME:-$HOME/.seqdesk/postgres}
(data/, socket/, and server.log) and is socket-only: listen_addresses
is empty, pg_hba.conf rejects every host and hostssl line, and no TCP
port is opened, so pg_isready -h 127.0.0.1 will never answer for it. Point
pg_isready and psql at the socket directory instead, which is why the
generated URL carries a host=<socket dir> parameter. Your operating-system
account is the cluster superuser through peer authentication.
The cluster is deliberately not registered with launchd or systemd. Instead,
start.sh in the installation directory checks pg_ctl status and starts the
cluster before launching the app, so the database returns after a reboot
together with the SeqDesk process. Startup failures are reported by that
wrapper and logged to the cluster’s server.log.
Set SEQDESK_PG_HOME to relocate the cluster and keep it short. The installer’s
length check is on the socket directory it creates inside it,
$SEQDESK_PG_HOME/socket, which must be 85 characters or fewer — so
SEQDESK_PG_HOME itself has a 78-character budget. Re-running the installer
never rebuilds an initialized cluster, and the cluster must be created by your
normal login user, never with sudo.
A local socket owned by a different account is skipped with a warning rather than treated as an error: SeqDesk declines to send generated credentials to a server it does not own, then continues down the ladder and normally ends up creating its own cluster. No action is required.
Because the cluster has no TCP listener, seqdesk doctor — whose database check
is a TCP connect to the host and port in databaseUrl — reports
PostgreSQL TCP: localhost:5432 unreachable and exits 1 on a perfectly
healthy install. Check the cluster directly instead:
PGROOT="${SEQDESK_PG_HOME:-$HOME/.seqdesk/postgres}"
pg_ctl -D "$PGROOT/data" status
pg_isready -h "$PGROOT/socket"An explicit --database-url or SEQDESK_DATABASE_URL is never silently
retargeted. When that endpoint is unreachable, macOS reports it and stops
while Linux defers to the existing system setup. PostgreSQL 14+ is enforced
when a socket is adopted, and SQLite is rejected.
Miniconda says the prefix already exists
This usually means a Conda directory exists but its executable is not on
PATH. Check the base without changing or deleting it:
"$HOME/miniconda3/bin/conda" --version
"$HOME/miniconda3/condabin/conda" --versionOnly one command needs to succeed. The current installer checks an explicitly
configured base (SEQDESK_EXEC_CONDA_PATH) first, then a working conda on
PATH, then an executable CONDA_EXE, and finally these standard user bases in
order: ~/miniconda3, ~/seqdesk-miniconda3, ~/miniforge3, ~/mambaforge,
~/anaconda3. A working base is reused and saved in the SeqDesk pipeline
settings even when it was not on PATH.
If ~/miniconda3 exists but is not a working Conda base, SeqDesk leaves it
untouched and installs into the unused fallback ~/seqdesk-miniconda3. If both
locations already exist but are unusable, the installer stops before
downloading SeqDesk and prints a fresh path to use. It never deletes, overwrites,
or performs an in-place Miniconda update.
SEQDESK_EXEC_CONDA_PATH is authoritative. Point it either to a working Conda
base containing bin/conda or condabin/conda, or to a path that does not yet
exist:
SEQDESK_EXEC_CONDA_PATH="$HOME/miniconda3" \
seqdesk --interactive --dir "$HOME/seqdesk"
# If that base is incomplete, choose a new unused path instead:
SEQDESK_EXEC_CONDA_PATH="$HOME/seqdesk-miniconda3-new" \
seqdesk --interactive --dir "$HOME/seqdesk"An explicitly selected path that already exists but is unusable causes an
actionable stop; SeqDesk does not silently redirect an operator-provided path.
If Miniconda starts and then fails, it may leave a partial directory at the new
target. Reuse that directory only when its bin/conda or condabin/conda
command succeeds; otherwise choose another unused path. Use
--without-pipelines when this host only needs the core application.
Collect a useful diagnostic
For a completed host installation, run the read-only checker against the installation root:
seqdesk doctor --dir "$HOME/seqdesk" --url http://127.0.0.1:8000For an installer failure, re-run with --verbose (or SEQDESK_VERBOSE=1) to
promote the installer’s diagnostic narration from the log to the terminal, and
inspect the most recent log:
ls -1t /tmp/seqdesk-install-*.log | head -n 1
tail -n 120 /tmp/seqdesk-install-YYYYMMDD-HHMMSS.logReplace the example log filename with the path printed by the first command.
The default location is /tmp/seqdesk-install-<timestamp>.log; if you set
SEQDESK_LOG, read that file instead. The
seqdesk doctor reference lists every check and
exit code.
Proxy and firewall checklist
The installer needs outbound DNS and HTTPS (TCP 443) to:
registry.npmjs.orgfor the launcher, runtime dependencies and optional PM2;seqdesk.org/install.shandseqdesk.org/api/version;- the exact release
downloadUrlreturned by the version API; and - when pipelines are enabled,
repo.anaconda.comandconda.anaconda.org(Conda Forge/Bioconda), plus any private pipeline package URL configured by your install profile.
The running app needs outbound access to a PostgreSQL host and port (normally
TCP 5432) only when you supplied a remote --database-url. A default install
reaches PostgreSQL over a local Unix socket — the SeqDesk-owned cluster opens
no TCP port at all — so no firewall or egress rule is involved. For remote
users, allow inbound HTTPS to your reverse proxy and proxy it to
127.0.0.1:8000; the SeqDesk port itself does not need to be public when the
proxy is on the same host. Note that SeqDesk binds 0.0.0.0 by default, so the
app port is reachable on every interface until you set
SEQDESK_BIND_HOST=127.0.0.1 at install or start time; set it, or add a host
firewall rule, when only the reverse proxy should reach it. Set
--nextauth-url to the public HTTPS origin and preserve the original Host
and X-Forwarded-Proto headers at the proxy.
Before retrying, test from the SeqDesk service account and host:
curl -fsSI https://seqdesk.org/install.sh
curl -fsS https://seqdesk.org/api/version >/dev/null
npm ping
# Remote or TCP database only:
pg_isready -h <database-host> -p 5432
# SeqDesk-managed or socket-based install (no TCP listener):
pg_isready -h "${SEQDESK_PG_HOME:-$HOME/.seqdesk/postgres}/socket"Export your organization’s HTTPS_PROXY, HTTP_PROXY, and an appropriate
NO_PROXY before running the launcher when an egress proxy is required. If
TLS inspection is in use, install the organization’s CA in the operating
system, Node/npm and Conda trust stores. Do not work around certificate errors
with curl -k, NODE_TLS_REJECT_UNAUTHORIZED=0, or npm
strict-ssl=false; ask the network administrator to allow the endpoint or fix
the trust chain instead.
Know when to involve an administrator
Ask the host or database administrator when:
- your account cannot create the intended service directory;
- a pre-existing system PostgreSQL must be administered, or the PostgreSQL
server package must be installed on Linux — both need root or passwordless
sudo. SeqDesk’s own cluster needs no privileged change, and on macOS PostgreSQL setup always runs as your normal login user, never withsudo; pg_hba.conf, TLS, DNS, or firewall policy blocks the configured database;- the service needs a trusted-network route, reverse proxy, or TLS certificate;
- sequencing, reference-database, pipeline-work, or backup storage must be provisioned; or
- Slurm clients, shared paths, identities, and compute-node access are not already working from the SeqDesk host.
SeqDesk should run as a non-root service account after those prerequisites are prepared.