Prerequisites
SeqDesk runs on standard Linux servers and can also run as a local MacBook
instance for development or evaluation. It needs Node.js/npm plus PostgreSQL 14
or newer. In most cases you do not have to supply a database: when the
connection target is local, the installer first tries to reuse a running server,
and otherwise creates and runs its own socket-only PostgreSQL cluster under
~/.seqdesk/postgres as your normal login user — no root, no sudo, and no
launchd/systemd service. Pipeline execution is optional and adds Conda,
Nextflow, and possibly Slurm requirements.
Required
| Requirement | Notes |
|---|---|
| Host OS | Linux or a local macOS application install on x64 or arm64. The installer recognizes Ubuntu/Debian and RHEL-family distributions. Native Windows is unsupported; WSL is guidance only and is not currently CI-tested. |
| Node.js + npm | Node.js >=22.13.0 <23 or >=24 <25. Node.js 24 is recommended; Node 23, 25, and future majors are not supported until explicitly added. |
| Bash, curl, tar, checksum tool | Used to download and run the release installer. Provide sha256sum or shasum. |
| PostgreSQL | PostgreSQL 14 or newer. You usually do not need to prepare a database yourself: when no reusable local server is found, the installer runs initdb/pg_ctl and creates a private cluster owned by your user. What must be available is either an external DATABASE_URL, or the PostgreSQL 14+ server binaries (initdb, pg_ctl) — installed with Homebrew on macOS, or sudo apt-get install postgresql / sudo dnf install postgresql-server on Linux. Majors 14 through 18 are represented in the CI matrix. SQLite is rejected outright: a file: DATABASE_URL or DIRECT_URL stops the install. |
| Install target and storage | Use a new, writable install directory with at least the larger of 2 GB or three times the release-archive size free. Data and optional pipeline run directories must also be writable. |
What the installer checks
The guided command downloads the public installer over HTTPS. The installer then runs staged checks so failures that can be detected early happen before it downloads a release, replaces a target, or migrates anything.
| Requirement or risk | Automatic behavior | Result |
|---|---|---|
| Operating system | Accepts Linux and macOS. Native Windows is rejected by the launcher. An unrecognized Linux distribution is mapped through /etc/os-release when possible. | Unsupported operating systems stop. An unrecognized Linux distribution warns and continues. |
| CPU architecture | Recognizes x86_64/amd64 and arm64/aarch64. | Other architectures warn and continue as untested. |
| Node.js and npm | Reads the installed Node.js version and checks for npm. | Missing npm or a Node.js version outside >=22.13.0 <23 and >=24 <25 stops the install. |
| Release tools | Checks for curl, tar, and either sha256sum or shasum. | A missing tool stops before release download and prints platform-specific installation hints. |
| Install target | Requires a new directory unless reconfigure or intentional overwrite mode is selected; checks the target or parent is writable. | An unsafe existing target or unwritable path stops before download. |
| Install free space | Reads free space with df and requires the larger of 2 GB or three times the release archive size. | Insufficient space stops before download. If space cannot be measured, the installer warns and continues. |
| Release integrity | Downloads the release manifest and archive, then compares the archive’s SHA-256 digest with the published checksum. | A missing/invalid manifest, failed download, or checksum mismatch stops extraction. |
| PostgreSQL URL | Rejects SQLite and non-PostgreSQL URL schemes. The guided wizard performs a bounded host/port reachability check for a managed database. | An invalid URL stops. Wizard reachability is an early signal, not a credential check. |
| Local PostgreSQL preflight | Runs on macOS and Linux, but only when the target is local (an empty URL, or host 127.0.0.1, localhost, ::1, or an absolute socket path); a remote or managed URL is never touched. It tries, in order: reuse a healthy server on the configured host/port (default 127.0.0.1:5432); reuse a local Unix socket it can administer (the socket file must be owned by your user and you must be a PostgreSQL 14+ superuser there); on macOS, start an already-registered non-root Homebrew service; otherwise create its own private, socket-only cluster. The last two rungs are deliberately skipped when you supplied an explicit DATABASE_URL. | An explicit URL is never silently replaced with a different database. If your explicit URL is unreachable, macOS prints a protocol diagnosis and stops; Linux defers to the existing system PostgreSQL setup and can still fail later at the connection probe. A DIRECT_URL supplied without a DATABASE_URL stops immediately. |
| PostgreSQL connection and permissions | After runtime dependencies are present, connects with the configured credentials, runs a query, reports the server version, tests temporary-table creation, and warns when existing SeqDesk users/orders are detected. It then runs Prisma migrations. | Authentication, network, query, write-permission, or migration failure stops. Existing data warns because migrations preserve and update it. |
| PostgreSQL major version | PostgreSQL 14+ is the supported and tested baseline. The connection probe reports the detected version but does not compare the major with 14; the local-socket reuse path does enforce it, adopting a candidate socket only when the server reports server_version_num >= 140000 and you are a superuser there. | A pre-14 server reached over a local Unix socket is not adopted. A pre-14 server reached over TCP, or a remote/managed server, is not rejected by the preflight solely because of its version; a later migration or runtime incompatibility may still fail. Check the version yourself before install. |
| Optional pipeline runtime | When enabled, discovery checks an explicitly configured Conda base, a working conda on PATH, and standard user bases before provisioning Miniconda. A valid base is reused. An unusable default ~/miniconda3 is preserved and an unused ~/seqdesk-miniconda3 fallback is selected. | Explicit existing invalid paths and multiple conflicting prefixes stop with recovery instructions. Slurm itself is not provisioned. After installation, the Admin infrastructure check validates Conda, Java, Nextflow, Slurm when enabled, the data path, and the writable run directory. |
The installer does not benchmark CPU, RAM, storage throughput, available capacity for sequencing data/reference databases/pipeline work, or scheduler capacity. It also does not validate your institution’s firewall policy, reverse proxy, TLS termination, backup strategy, or public-exposure safety. Those are deployment decisions, not properties the installer can infer.
seqdesk doctor is a post-install diagnostic, not a replacement for this
preflight. It checks the installed layout and configuration, PostgreSQL
reachability — over a Unix socket when the configured URL carries an absolute
host= parameter, which is the normal shape for a SeqDesk-managed or
socket-reused install, and over TCP otherwise — and optional application HTTP
endpoints. It does not re-check the supported Node.js range, enforce the
PostgreSQL major, size hardware/storage, or validate the complete pipeline
toolchain. See
seqdesk doctor for its exact checks.
While the install runs, the detailed narration of these checks goes to the
installer log only — /tmp/seqdesk-install-<timestamp>.log, or the path you set
in SEQDESK_LOG. Pass --verbose (or set SEQDESK_VERBOSE=1) to promote that
diagnostic detail to the terminal as well.
Capacity planning (not enforced)
SeqDesk has no universal CPU/RAM minimum because the web application and bioinformatics workflows have very different resource profiles. Use these as planning starting points, not compatibility guarantees:
| Scenario | Practical starting point | What is not included |
|---|---|---|
| Core application / evaluation | 2 vCPU, 4 GiB RAM, and about 40 GiB host storage. The installer itself enforces only the install-space floor above. | Sequencing files, backups, and pipeline/reference data. |
| Application plus small pipeline smoke tests | 2 vCPU, 8 GiB RAM, and about 100 GiB storage. | Production datasets or full-size reference databases. |
| Production pipeline execution | Size CPU, RAM, scratch/work storage, and wall time per installed workflow and input volume; use Slurm or another appropriately managed compute host for large jobs. | The installer cannot predict workload growth or shared-filesystem performance. |
Keep sequencing data, pipeline work, results, and reference databases on storage with enough headroom and I/O performance for the facility’s workload. The install-directory disk check does not cover those separate filesystems.
Compatibility evidence
These two clean-install profiles are required on every pull request, main
push, merge-queue candidate, and release:
| Profile | Operating system | CPU | Node.js | PostgreSQL | Scope |
|---|---|---|---|---|---|
| Minimum boundary | Ubuntu 22.04 | x64 | 22.13.0 | 14 | Application install |
| Recommended | Ubuntu 24.04 | x64 | 24.x | 16 | Application install |
The extended matrix runs weekly and when manually requested:
| Operating system | CPU | Node.js | PostgreSQL | Scope |
|---|---|---|---|---|
| Ubuntu 24.04 | ARM64 | 24.x | 17 | Application install |
| macOS 15 | ARM64 and Intel x64 | 24.x | 16 | Application install only |
| Debian 12 container | x64 | 22.x | 18 | Application install on Debian userland |
| Rocky Linux 9 container | x64 | 24.x | 15 | Application install on Rocky userland |
| Ubuntu 24.04 | x64 | 24.x | 16 | Application plus packaged pipeline toolchain |
An extended row is compatibility evidence only when its individual job is green. The native Windows job verifies that the launcher rejects Windows with WSL guidance; it does not test a WSL installation. Real Slurm execution remains a separate private integration test. See the full compatibility statement for the exact assertions and limitations.
PostgreSQL options
Use one of these approaches:
| Option | Best for | What the installer can do |
|---|---|---|
| Managed PostgreSQL | Production or shared infrastructure | Provide DATABASE_URL and optional DIRECT_URL; the installer runs migrations and seed. |
| Local PostgreSQL with sudo | Hosts that already run a system PostgreSQL, or where the server package is still missing | Sudo covers only two things: installing the PostgreSQL server package when it is absent, and administering a pre-existing system server. The role and database are created through sudo -n -u postgres psql, so passwordless sudo is required — without it the install warns and then aborts at the connection probe. Sudo is never used for PostgreSQL on macOS. |
| Local PostgreSQL with Homebrew | MacBook development or evaluation | The installer can use Homebrew PostgreSQL and create the role/database as the current macOS user. |
| SeqDesk-managed PostgreSQL (default when nothing reusable is found) | Laptops, single-host installs, and shared servers where you have no root | The installer runs initdb itself and creates a private cluster under SEQDESK_PG_HOME (default ~/.seqdesk/postgres), started with pg_ctl as your own user. It needs only the PostgreSQL 14+ server binaries on PATH — no sudo, no admin. Re-running the installer starts the existing cluster and never rebuilds it. |
| Ask an admin | Locked-down servers where you cannot install the PostgreSQL server binaries | Only needed when initdb/pg_ctl are absent and you have neither Homebrew (macOS) nor root/passwordless sudo for apt/dnf (Linux) — or when the only local server answers on a socket owned by another user, for example a distro PostgreSQL on /var/run/postgresql owned by postgres. That last case is a hard failure: SeqDesk will not send generated credentials to an endpoint it does not own. Ask for the package install, or for a DATABASE_URL/DIRECT_URL you can pass explicitly. |
Running the installer as root (including sudo bash install.sh) disables the
managed cluster: it refuses to create a PostgreSQL instance owned by root and
tells you to rerun as a normal user or pass --database-url.
The application user does not need sudo after PostgreSQL is prepared. It only needs a valid connection string such as:
postgresql://seqdesk:<password>@127.0.0.1:5432/seqdesk?schema=publicA SeqDesk-managed cluster (or a reused local socket) never opens a TCP port, so
its URL is socket-shaped instead. The installer generates it for you and stores
it in the protected settings.json:
postgresql://seqdesk:<password>@localhost:5432/seqdesk?schema=public&host=%2FUsers%2Fyou%2F.seqdesk%2Fpostgres%2FsocketThe database is not automatically isolated by install directory. If that URL already contains SeqDesk tables, a fresh application-directory install will connect to and migrate the existing data. The installer reports the PostgreSQL server version and warns when existing SeqDesk users/orders are detected. Use a different database or schema when you need a clean evaluation instance.
The SeqDesk-managed cluster
When the installer creates its own PostgreSQL, everything lives under
SEQDESK_PG_HOME (default $HOME/.seqdesk/postgres, mode 0700) with data/,
socket/, and server.log. Keep that path at 85 characters or fewer — the
macOS Unix-socket path limit — or set a shorter SEQDESK_PG_HOME before
installing.
The cluster is socket-only: listen_addresses is empty, pg_hba.conf rejects
every host/hostssl line, and the socket directory is mode 0700, so nothing
outside your account can reach it. Authentication is local peer and the
cluster superuser is your own OS user.
It is deliberately not registered with launchd or systemd. Instead, the
installation’s start.sh checks the cluster with pg_ctl status on every start
and starts it when it is not running, so a PM2-resurrected app brings its own
database up after a reboot. If the cluster cannot start, start.sh warns and
names server.log.
Admin request for AlmaLinux/RHEL
You only need this when the host has no PostgreSQL server binaries
(initdb, pg_ctl) and you cannot install them yourself. If those binaries are
already present, SeqDesk creates and runs its own private cluster as your user
and no admin request is needed — the minimal ask is then just
sudo dnf install -y postgresql-server postgresql-contrib. If a full system
server is what you want, send this to the server administrator and replace
<password> with the value you want in DATABASE_URL:
Please prepare PostgreSQL for a local SeqDesk instance on this AlmaLinux/RHEL host.
Install and start PostgreSQL:
sudo dnf install -y postgresql-server postgresql-contrib
sudo postgresql-setup --initdb
sudo systemctl enable --now postgresql
Create the SeqDesk role and database:
sudo -u postgres psql <<'SQL'
CREATE ROLE seqdesk LOGIN PASSWORD '<password>';
CREATE DATABASE seqdesk OWNER seqdesk;
SQL
Please make sure local password authentication from 127.0.0.1 works for:
postgresql://seqdesk:<password>@127.0.0.1:5432/seqdesk?schema=publicAfter the admin confirms, run:
npx -y seqdesk@latest --interactive --dir "$HOME/seqdesk"Choose Existing/managed PostgreSQL in the wizard and paste the connection
string the administrator prepared. This is a normal fresh install, so the target
must not exist and --reconfigure must not be used.
Installer PostgreSQL bootstrap
The installer can perform the local PostgreSQL setup as a separate bootstrap
step. This is only needed for a system PostgreSQL server, which requires sudo
on Linux; a SeqDesk-managed private cluster needs no sudo and is created
automatically during a normal install. On a fresh host with no existing
install, --prepare-postgres needs the target connection string, so pass
SEQDESK_DATABASE_URL (or --database-url); otherwise it exits with
No DATABASE_URL found.
On macOS, run it as your normal login user — PostgreSQL setup never uses sudo there, and as root the installer refuses to create a cluster:
env SEQDESK_DATABASE_URL="postgresql://seqdesk:<password>@127.0.0.1:5432/seqdesk?schema=public" \
npx -y seqdesk@latest -y --prepare-postgres --dir /path/to/seqdeskOn Linux, for a system PostgreSQL server:
sudo env PATH="$PATH" SEQDESK_DATABASE_URL="postgresql://seqdesk:<password>@127.0.0.1:5432/seqdesk?schema=public" \
npx -y seqdesk@latest -y --prepare-postgres --dir /path/to/seqdeskAfter preparing PostgreSQL for a fresh target, continue with the normal installation command and the same private connection string:
SEQDESK_DATABASE_URL="postgresql://seqdesk:<password>@127.0.0.1:5432/seqdesk?schema=public" \
npx -y seqdesk@latest -y --dir /path/to/seqdeskDo not add --reconfigure: that mode requires an existing SeqDesk installation
directory. The normal fresh install applies migrations and seed data.
If you point --prepare-postgres --dir at an existing SeqDesk install, the
URL is read from its protected configuration and the explicit
SEQDESK_DATABASE_URL can be omitted. After preparation, resume that existing
installation with:
npx -y seqdesk@latest -y --reconfigure --reseed-db --dir /path/to/seqdeskTake and verify a database backup before using --reseed-db. If the existing
database is already initialized and only configuration needs to be reapplied,
omit --reseed-db.
If sudo does not preserve access to npx, install the SeqDesk launcher
system-wide or ask the admin to run the SQL setup directly.
macOS prerequisites
For a local MacBook install, pin Node.js 24 with Homebrew:
brew install node@24
export PATH="$(brew --prefix node@24)/bin:$PATH"For the local-database choice, the guided installer first reuses an
already-running PostgreSQL 14–18 server: on 127.0.0.1:5432, on a local socket
you own, or as an already-registered non-root Homebrew service. If none is
available it installs the PostgreSQL server binaries with Homebrew and creates
its own socket-only cluster under ~/.seqdesk/postgres (override with
SEQDESK_PG_HOME), started with pg_ctl as your macOS login user. PostgreSQL
setup on macOS always runs as your normal login user: do not use sudo, and do
not run sudo brew services start for PostgreSQL — a service registered as a
root LaunchDaemon is detected and refused with repair steps. Homebrew is
required for this path; without it, supply --database-url instead.
Then run the downloaded guided installer—see the
macOS install guide, which uses a local ~/seqdesk
directory, port 8000, and local PostgreSQL.
Optional pipeline prerequisites
Pipeline support is optional and disabled on a fresh install unless a profile
enables it. Add --with-pipelines only on hosts where SeqDesk should run or
submit bioinformatics workflows.
| Requirement | Notes |
|---|---|
| Conda or Miniconda | Used to create pipeline runtime environments. The installer reuses a working configured, PATH, or standard user-base installation; otherwise it provisions Miniconda only in an unused directory. It does not delete or overwrite an invalid existing prefix. |
| Java 17 | Required by Nextflow; the installer can provision it in the pipeline environment. |
| Nextflow | Required for running packaged workflows; the installer can provision it. |
| Slurm | Optional. Configure when pipeline jobs should be submitted to a cluster scheduler. |
| Writable run directory | Pipeline work and result files should live on storage with enough quota for sequencing workloads. |
For locked-down HPC systems, ask the admin which Conda path, Slurm partition, memory limits, and writable run directory should be used before creating the settings.json.