Pipeline Runtime
Pipeline Runtime decides where a Nextflow workflow runs and what environment it runs in. It is the second required piece of infrastructure after Data Storage: without a usable run directory no pipeline can start, and without Conda most packages cannot resolve their tools.
The screen is Pipeline Runtime (/admin/pipeline-runtime). It has no
sidebar entry; reach it from Settings → Infrastructure, or from the
Pipeline Runtime button on Data Storage. It is split into Required
Configuration (always visible) and Advanced Configuration (behind a
Show button).
Values supplied through settings.json or a SEQDESK_*
environment variable are applied on top of whatever this
screen saved. If a runtime value is pinned at one of those layers, editing the
field here has no effect on execution. Check Info → Configuration
sources when a change does not take.
Choosing local or SLURM
| Target | What happens | Good for |
|---|---|---|
| Local | Nextflow runs as a child process on the SeqDesk host and executes tasks there | Small utilities, single-sample work, any host without a scheduler |
| SLURM | Nextflow submits work through sbatch and tracks it with squeue and sacct | Assembly, binning, classification — anything that needs a cluster |
SLURM is entirely optional. sbatch, squeue and sacct are only invoked for
runs that resolve to SLURM; a purely local instance never needs them installed.
The common production shape is a local global default with SLURM for the heavy packages, set through per-pipeline overrides rather than by flipping the whole instance.
How the target for one run is decided
SeqDesk resolves the execution target per run, in this order — the first match wins:
Run override
A facility admin can pick local or slurm in the launch dialog. The API
accepts executionMode of default, local or slurm; anything else is
rejected with executionMode must be one of: default, local, slurm.
Per-pipeline default
The Per-Pipeline Defaults table on this page. Each installed pipeline can be
Inherit, Local, or SLURM, with its own queue, cores, memory, hours,
options and Nextflow profile.
Global setting
The Use SLURM switch under Required Configuration.
Local
The built-in fallback.
Each run records the resolved mode, the source of that decision (run,
pipeline or global) and a non-secret snapshot of the scheduler settings, so
you can still explain an old run after the global settings have changed.
Required Configuration
| Field | Config key | Env variable | Default |
|---|---|---|---|
| Use SLURM | pipelines.execution.slurm.enabled (or mode) | SEQDESK_SLURM_ENABLED, SEQDESK_PIPELINE_MODE | false / local |
| Queue/Partition | pipelines.execution.slurm.queue | SEQDESK_SLURM_QUEUE | cpu |
| Pipeline Run Directory | pipelines.execution.runDirectory | SEQDESK_PIPELINE_RUN_DIR | /data/pipeline_runs |
| Conda Installation Path | pipelines.execution.conda.path | SEQDESK_CONDA_PATH | empty |
| Conda Environment Name | pipelines.execution.conda.environment | SEQDESK_CONDA_ENV | seqdesk-pipelines |
Queue/Partition only appears when Use SLURM is on.
The test buttons
Each required field has a Test button that probes the live host through
POST /api/admin/settings/pipelines/test-setting. They run against the value
currently in the box, so you can validate before saving.
| Button | What it checks | Typical failure |
|---|---|---|
| Test next to Use SLURM | Runs sinfo --version, then lists the available partitions | Not available — “SLURM commands not found. Disable SLURM in settings to run locally.” |
| Test next to Pipeline Run Directory | The directory exists and is writable | No path provided, or a permission error |
| Test next to Conda Installation Path | <path>/bin/conda or <path>/condabin/conda exists and reports a version | Conda not found at path, listing both paths it tried |
| Auto next to Conda Installation Path | Detects the Conda base and environment from the server process and fills both fields in | No conda environment detected in the server process. |
The Conda test also reports whether the defaults channel is usable, warning
“defaults channel not usable without ToS” when Anaconda’s terms have not been
accepted for that installation. Pipelines that pull from conda-forge and
bioconda are unaffected.
Advanced Configuration
SLURM resources
Shown only when Use SLURM is on.
| Field | Config key | Env variable | Default |
|---|---|---|---|
| CPU Cores | pipelines.execution.slurm.cores | SEQDESK_SLURM_CORES | 4 |
| Memory | pipelines.execution.slurm.memory | SEQDESK_SLURM_MEMORY | 64GB |
| Time Limit (hours) | pipelines.execution.slurm.timeLimit | SEQDESK_SLURM_TIME | 12 |
| Additional SLURM Options | pipelines.execution.slurm.options | — | empty |
The time limit is in hours, not minutes. It is written into
the job script as #SBATCH -t <N>:0:0. Setting
60 therefore asks for 60 hours, which most partitions refuse:
the job sits PENDING forever with reason
(PartitionTimeLimit) and nothing in SeqDesk reports an error.
Use small whole hours.
Additional SLURM Options is appended verbatim to the submission, so it is
the right place for --account=…, --constraint=…, or a QOS flag.
Nextflow Profile Override
pipelines.execution.nextflowProfile, empty by default. When set, it replaces
the profile SeqDesk would otherwise choose (for example slurm,conda). Leave it
empty unless a package needs a profile the default logic does not produce.
There is no Nextflow path setting. The nextflow binary is resolved from
the runtime PATH, or from inside the configured Conda environment.
Per-Pipeline Defaults
A table with one row per installed pipeline package:
| Column | Meaning |
|---|---|
| Pipeline | Display name, package id and category |
| Target | Inherit (Local/SLURM), Local, or SLURM |
| Queue, Cores, Memory, Hours, Options | SLURM settings for this package; blank means inherit the global value, which is shown as the placeholder |
| Profile | Nextflow profile override for this package |
Setting the target to Local disables the SLURM columns for that row. The table
is empty with “No pipeline packages are installed.” until you install packages
on Settings → Pipelines.
The same policy expressed in settings.json:
{
"pipelines": {
"enabled": true,
"execution": {
"mode": "local",
"runDirectory": "/data/pipeline_runs",
"conda": {
"path": "/opt/conda",
"environment": "seqdesk-pipelines",
"cacheDir": "/net/shared/nextflow-conda"
},
"slurm": {
"enabled": true,
"queue": "cpu",
"cores": 8,
"memory": "64GB",
"timeLimit": 12
},
"pipelineOverrides": {
"mag": {
"mode": "slurm",
"slurm": { "queue": "long", "cores": 16, "memory": "128GB", "timeLimit": 48 }
},
"metaxpath": {
"mode": "slurm",
"slurm": { "queue": "long", "cores": 16, "memory": "128GB", "timeLimit": 48 }
}
}
}
}
}Small per-order utilities such as simulate-reads, fastq-checksum and
fastqc are normally left to inherit local.
Weblog
| Field | Description |
|---|---|
| Nextflow Weblog URL | Your SeqDesk base URL plus /api/pipelines/weblog |
| Weblog Secret | Optional shared token sent with each callback |
Nextflow POSTs run and task events to this URL as they happen, which is what drives live progress and the DAG view. The Test button probes the URL from the app host.
Weblog callbacks come from wherever the tasks run. On a cluster whose compute
nodes cannot reach the application, no weblog events arrive at all. That is a
supported configuration: the pipeline-monitor background worker
reconciles run state from the scheduler and the Nextflow trace file instead.
Leaving the weblog URL empty is only flagged as recommended, never
required.
Conda cache directory
pipelines.execution.conda.cacheDir (SEQDESK_CONDA_CACHE_DIR) points
Nextflow’s per-process Conda environments at a shared directory, keyed by
content hash. On a cluster where compute nodes have no internet access, build
the environments once from a host that does — for example by running the
pipeline locally first — and the SLURM nodes reuse them from the shared path.
Infrastructure readiness
The sidebar’s Infrastructure entry carries a badge driven by
GET /api/admin/infrastructure/readiness:
| Item | Severity | Considered missing when |
|---|---|---|
| Data storage path | Required | Unset |
| Pipeline run directory | Required | Unset, or literally / |
| Conda path | Recommended | Unset |
| Weblog URL | Recommended | Unset |
A red ! means at least one required item is missing; an amber triangle means
only recommended items are pending. Clicking the badge jumps to the first gap.
The same summary is rendered inline at the top of both Data Storage and Pipeline
Runtime.
The Infrastructure page itself (/admin/data-compute) is a hub: two cards
linking to the editable screens, plus an Import settings.json panel that can
Load example, upload or paste a configuration, Validate JSON as a dry
run, and then apply it. It accepts flat keys such as dataBasePath as well as
nested ones such as site.dataBasePath, which makes it convenient for cloning a
known-good setup onto a second instance.
Verifying the runtime end to end
On a dev or production-like Linux server, the command-line smoke test exercises the whole path over HTTP and the filesystem — no browser needed.
SEQDESK_RUNTIME_E2E_BASE_URL="https://your-seqdesk.example.org" \
SEQDESK_RUNTIME_E2E_EMAIL="admin@example.com" \
SEQDESK_RUNTIME_E2E_PASSWORD="admin-password" \
npm run pipeline:e2e:runtime -- --ensure-dummy-data| Step | What it proves |
|---|---|
| Login | Facility-admin API login works |
| Sequencing order selection | Uses the admin dummy-data order, or creates it with --ensure-dummy-data |
| Local run | simulate-reads starts locally and emits no SLURM directives |
| SLURM run | simulate-reads submits through sbatch, records a numeric job id, and writes SLURM logs |
| Output check | pipeline.out and output/summary/simulation-summary.tsv exist |
Useful variants:
# Local-only check on a host without SLURM
npm run pipeline:e2e:runtime -- --skip-slurm --ensure-dummy-data
# SLURM-only check
npm run pipeline:e2e:runtime -- --skip-local --ensure-dummy-data
# Assert the configured default policy for the selected pipeline
npm run pipeline:e2e:runtime -- --include-default-policy --expect-default-mode slurm
# Use a specific sequencing order instead of the dummy-data one
npm run pipeline:e2e:runtime -- --order-id <order-id>For the full local + SLURM run the host must have sbatch, squeue and
sacct, and must be able to write the configured run directory.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
SLURM Test reports Not available | sinfo is missing on the app host, or the daemon is unreachable | Install the SLURM client and confirm sinfo --version works as the service account |
A submitted job stays PENDING with (PartitionTimeLimit) | The time limit is in hours and exceeds the partition maximum | Lower Time Limit (hours) |
Conda not found at path | The path is not a Conda base directory | Use Auto, or point at the directory containing bin/conda |
Runs fail immediately with Process requirement exceeds available CPUs | The package declares more CPUs than the allocation grants | Raise the SLURM cores for that pipeline, or cap the package’s own thread parameters |
| A run directory test fails | Missing directory or no write permission | Create it and grant write access to the service account |
| Live progress never updates | Compute nodes cannot reach the weblog URL | Expected on isolated clusters — rely on pipeline-monitor; see Monitoring |
| A saved runtime value has no effect | A SEQDESK_* variable or settings.json outranks the database | Change it at the winning layer; see Configuration Sources |
| The Per-Pipeline Defaults table is empty | No packages installed | Install them on Settings → Pipelines |
See also
- Running a Pipeline — the launch flow that consumes these settings
- Monitoring & DAG Visualization — what the weblog and the monitor worker do
- Data Storage — the other required infrastructure setting
- Configuration Sources — which layer wins