Skip to Content
InstallationPrerequisites

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

RequirementNotes
Host OSLinux 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 + npmNode.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 toolUsed to download and run the release installer. Provide sha256sum or shasum.
PostgreSQLPostgreSQL 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 storageUse 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 riskAutomatic behaviorResult
Operating systemAccepts 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 architectureRecognizes x86_64/amd64 and arm64/aarch64.Other architectures warn and continue as untested.
Node.js and npmReads 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 toolsChecks for curl, tar, and either sha256sum or shasum.A missing tool stops before release download and prints platform-specific installation hints.
Install targetRequires 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 spaceReads 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 integrityDownloads 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 URLRejects 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 preflightRuns 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 permissionsAfter 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 versionPostgreSQL 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 runtimeWhen 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:

ScenarioPractical starting pointWhat is not included
Core application / evaluation2 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 tests2 vCPU, 8 GiB RAM, and about 100 GiB storage.Production datasets or full-size reference databases.
Production pipeline executionSize 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:

ProfileOperating systemCPUNode.jsPostgreSQLScope
Minimum boundaryUbuntu 22.04x6422.13.014Application install
RecommendedUbuntu 24.04x6424.x16Application install

The extended matrix runs weekly and when manually requested:

Operating systemCPUNode.jsPostgreSQLScope
Ubuntu 24.04ARM6424.x17Application install
macOS 15ARM64 and Intel x6424.x16Application install only
Debian 12 containerx6422.x18Application install on Debian userland
Rocky Linux 9 containerx6424.x15Application install on Rocky userland
Ubuntu 24.04x6424.x16Application 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:

OptionBest forWhat the installer can do
Managed PostgreSQLProduction or shared infrastructureProvide DATABASE_URL and optional DIRECT_URL; the installer runs migrations and seed.
Local PostgreSQL with sudoHosts that already run a system PostgreSQL, or where the server package is still missingSudo 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 HomebrewMacBook development or evaluationThe 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 rootThe 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 adminLocked-down servers where you cannot install the PostgreSQL server binariesOnly 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=public

A 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%2Fsocket

The 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=public

After 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/seqdesk

On 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/seqdesk

After 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/seqdesk

Do 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/seqdesk

Take 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.

RequirementNotes
Conda or MinicondaUsed 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 17Required by Nextflow; the installer can provision it in the pipeline environment.
NextflowRequired for running packaged workflows; the installer can provision it.
SlurmOptional. Configure when pipeline jobs should be submitted to a cluster scheduler.
Writable run directoryPipeline 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.