Setup parameters and services
Every scansuite subcommand, option and environment variable, the .env file, updates, services and the doctor checks.
A ScanSuite Teams server is run with one command, ./scansuite, in /opt/scansuite, and configured in one file, /opt/scansuite/.env. This page lists every subcommand, option and setting, how an update treats your own changes, and what ./scansuite doctor checks. Installing for the first time is described in Install ScanSuite Teams; backups in Backup and restore.
Before you start
Run every command on the server, in the installation directory, as the account that installed ScanSuite. Check that you are in the right place:
ls /opt/scansuite/docker-compose.yml && cd /opt/scansuite && ./scansuite versionExpected: the path of docker-compose.yml, then ScanSuite Teams with the release, images and licence lines. "No ScanSuite installation here" means you are in another directory, or ScanSuite is not installed yet.
| Placeholder | Where the value comes from |
|---|---|
| <LICENCE_CODE> | The six characters at the end of the licence file name in /opt/scansuite/key/ (<name>_<LICENCE_CODE>.lic). Only needed when the licence file is not there yet. |
| <WORKERS> | A number of scan workers, 1 to 100. |
| <SERVICE> | A service name from the Services section below, for example web or worker. |
| <DIRECTORY> | A directory of your choice, for example /media/transfer/scansuite-images. |
The scansuite command
./scansuite without arguments, or with help, --help or -h, prints a summary.
| Command | What it does |
|---|---|
| ./scansuite install [<LICENCE_CODE>] [options] | Installs ScanSuite on the server, or repairs an installation; safe to run again. Without a code, it is read from the licence file in key/. Options: see Install and update options. |
| ./scansuite update [<LICENCE_CODE>] [options] | Fetches the current release and applies it, see Updating. Also spelled upgrade. |
| ./scansuite start [<WORKERS>] | Starts the services and waits until they are healthy. Workers: 1 to 100. A count given here is saved and kept by later starts, restarts, updates and the start at boot; without one, the saved count, else 2. |
| ./scansuite stop | Stops every service. |
| ./scansuite restart [--hard] [<WORKERS>] | Applies changed settings: recreates only the services whose configuration changed. --hard first stops and removes every container. The worker count is as for start. |
| ./scansuite status | The status of every container, then Services needing attention, if any. Also spelled ps. |
| ./scansuite logs [<SERVICE>] [flags] | The last 200 log lines of one service, or of all. Further flags go to docker compose logs: ./scansuite logs worker -f follows the log. |
| ./scansuite doctor | Checks the server and the installation, see Checking the server. Exits 1 when it finds a problem. Also spelled check. |
| ./scansuite version | The release, when it was built, the image tag, the licence file and the images actually running. Also spelled --version. |
| ./scansuite reset [db|dojo] [--yes] | Empties the ScanSuite database (db, the default) or the DefectDojo database (dojo) to start over. Asks for confirmation unless --yes. See Resetting the databases. |
| ./scansuite dojo [password|start|reset] [--yes] | password (the default): prints the DefectDojo administrator password from DefectDojo's first start, then, at a terminal only, offers to change it. start: starts DefectDojo. reset: the same as reset dojo; --yes skips its question. |
| ./scansuite offline save|load <DIRECTORY> | Moves images to a server without registry access, see the last section. |
| ./scansuite --backup-db | --backup-secrets [zip] | Saves the databases, or .env and key/, into a zip. Also spelled backup db and backup secrets. See Backup and restore. |
| ./scansuite --restore-db | --restore-secrets <zip> | Puts a backup back. Also spelled restore db and restore secrets. See Backup and restore. |
| ./scansuite uninstall [--purge] [--yes] | Stops ScanSuite and removes it from start-up. --purge deletes the data as well. Asks for confirmation unless --yes. |
Install and update options
The scanner and DefectDojo choices are saved in .env as SCANSUITE_SCANNERS and SCANSUITE_DOJO; later updates and starts keep to them until you give another option.
| Option | What it does | Default | Kept for later runs |
|---|---|---|---|
| --no-scanners | No external scanner containers: the application and DefectDojo only. | Default on a first install | Saved |
| --static-only | Only the static (code) scanners. | — | Saved |
| --dynamic-only, --infra-only | Only the dynamic (web) and infrastructure scanners. | — | Saved |
| --all-scanners | Every scanner. | — | Saved |
| --scanners=all|static|dynamic|none | The same four choices in one option. | — | Saved |
| --no-static | Removes the static scanners and keeps the dynamic ones as they are. | — | Saved |
| --no-dynamic | Removes the dynamic scanners and keeps the static ones as they are. | — | Saved |
| --no-dojo | Stops DefectDojo and leaves it out; its data is kept. | DefectDojo runs | Saved |
| --with-dojo | Brings DefectDojo back. | — | Saved |
| --offline | Uses images imported with offline load; contacts neither the registry nor the release repository. | Off | This run |
| --workers=<WORKERS> | The number of scan workers, 1 to 100. | The saved count, else 2 | Saved |
| --ntp=<server> | An NTP server to check the clock against before installing (install only). | No check | This run |
| --yes, -y | Answers yes to every question. Install and update normally ask none; it matters for the commands that confirm. | Off | This run |
| --no-pull | Skips fetching the release files. Used by the command itself when it restarts after updating itself; you do not need it. | Off | This run |
Environment variables of the command
Set them in the shell before the command, for example SCANSUITE_ASSUME_YES=1 ./scansuite reset dojo. They are not read from .env, except where the table says so.
| Variable | What it does | Default | When to change it |
|---|---|---|---|
| SCANSUITE_WORKERS | The number of scan workers for start, restart, install, update, reset and restore when none is given. Set in the shell, it wins over the count saved in .env for that command. | The count saved by start <WORKERS> or --workers=, else 2 | Rarely: give the count to start or --workers= instead, which saves it. |
| SCANSUITE_ASSUME_YES | 1 answers yes to every question, like --yes, for every command: reset, dojo reset, uninstall, restore. It never answers the offer of dojo password to change the password. | Unset | In unattended scripts. |
| SCANSUITE_NTP | The NTP server doctor checks the clock against. Without it, doctor uses NTP_SERVER from .env; with neither, the clock check is skipped. | Unset | When the server's clock must be checked. |
| SCANSUITE_BACKUP_PASSWORD | The password of a protected backup, for a restore where nobody types it. | Unset | See Backup and restore. |
| SCANSUITE_HOME | The installation directory, when the command is run from elsewhere. | /opt/scansuite | For an installation in another directory. |
| SCANSUITE_DOCKER | The docker command to use. | docker, or sudo docker when the account is not in the docker group | Rarely: for a docker wrapper of your own. |
| SCANSUITE_PULL_ATTEMPTS | How many times an interrupted image download is tried. | 4 | On an unreliable network. |
The worker count given to start or --workers= is saved in .env as SCANSUITE_WORKERS: restarts, updates, resets, restores and the start at boot keep it. To change it, start with another count, for example ./scansuite start 4.
Updating
- 01Run the update
It reads the licence code from key/. Give it as an argument only when the licence changed.
Shellcd /opt/scansuite && ./scansuite update - 02Read the end of the output
Expected: [+] Updated <old tag> -> <new tag>, then the version block. Warnings ([!]) above it say which of your files were kept or replaced, see below.
- 03Check the installation
Expected last line: [+] No problems found.
Shell./scansuite doctor
If this server has never signed in to the image registry, the update asks for the registry password sent with your licence. A new licence code also comes from the licence a person received.
A person types it in the terminal; an AI agent must not ask for it in the chat.
What the update does, in order:
- saves a copy of
.envas.env.bak-<date>; - fetches the release files. Files you changed in
docker-compose.yml,compose.d/,services/nginx/anddefectdojo/are carried into the new release: your changes and the release's are merged. Where both changed the same lines, or the merged services no longer load, the release's version is put in place and yours is kept in.replaced-<date>.<random>/together with your change alone as<file>.patch; - keeps your TLS certificate and key (
services/nginx/certs/cert.pemandkey.pem) as a pair, exactly as you had them; - replaces any other release file that differs on the server, keeping a copy in
.replaced-<date>.<random>/; - stops without changing anything when the account running it cannot read one of your changed files, for example a
key.pemcopied in as root. The message gives thesudo chowncommand to run before updating again; - continues with the new
scansuitecommand when the update replaced the command itself; - pulls the images your licence and your scanner choice need, refreshes the start-up service, brings the database up to date, and recreates only the services that changed.
The .replaced- directory is removed again when nothing was replaced.
A cron job for a weekly update (edit with sudo crontab -e). It works once the server has signed in to the registry, which the first installation does:
0 3 * * 4 cd /opt/scansuite && ./scansuite update --yes > /var/log/scansuite-update.log 2>&1Update only with ./scansuite update. A plain git pull updates the files but pulls no new images and leaves the database as it was.
Choosing what is installed
By default only the platform is installed: the application and DefectDojo, without the external scanner containers. Add the scanners you need with the options above, on install or on a later update:
./scansuite update --all-scanners # every scanner
./scansuite update --static-only # only the static analysis scanners
./scansuite update --dynamic-only # only the dynamic analysis and infrastructure scanners
./scansuite update --no-scanners # no external scanners (the default)
./scansuite update --no-dojo # stop DefectDojo; its data is kept
./scansuite update --with-dojo # bring DefectDojo backThe static group holds classic code scanners such as Semgrep, KICS, gosec, SpotBugs, Bandit, Brakeman and Flawfinder; the dynamic group holds web and infrastructure scanners such as Wapiti, Nuclei, Dastardly and ZAP, and the OSINT and password-guessing tools. The full lists are scanners.d/static.list and scanners.d/dynamic.list. A first install with scanners needs about 40 GB free for images, a platform-only install about 15 GB.
Check: the update prints External scanners: <all|static|dynamic|none>; DefectDojo: <yes|no>, and grep SCANSUITE_ .env shows the saved choice.
The .env file
The settings of this server live in /opt/scansuite/.env. The installer creates it on the first install: it generates the passwords, takes the time zone from the server and records the release. Only its owner can read it (mode 600). Updates never overwrite it, and it belongs in your backups.

| Setting | What it does | Default | When to change it |
|---|---|---|---|
| SCANSUITE_TAG | The release images installed on the server. | Written by install and update | Never by hand. |
| COMPOSE_FILE, COMPOSE_PATH_SEPARATOR | The Compose files this installation runs: docker-compose.yml, the files in compose.d/, and docker-compose.local.yml when it exists. | Rewritten on every install, update and start | Never by hand: create docker-compose.local.yml instead. |
| IMAGE_PREFIX, IMAGE_WEB, IMAGE_WORKER, IMAGE_POC | The image names of this edition. | Rewritten on every install, update and start | Never by hand. |
| SCANSUITE_SCANNERS, SCANSUITE_DOJO | Which scanners are installed (all, static, dynamic or none) and whether DefectDojo runs (1 or 0). | none, 1 | With the install and update options, not by hand. |
| ENABLE_STATIC_SCANS | False (exactly) refuses every static scan with "Static scans are disabled". | True | On a server that should run only web and infrastructure scans. |
| ENABLE_DYNAMIC_SCANS | False (exactly) refuses every web and infrastructure scan. Not in the file; add it by hand. | True | On a server that should run only code scans. |
| CSRF_PROTECTION | true (or 1, yes, on) protects browser forms and requests against cross-site request forgery. API tokens are not affected. A commented line in the file; remove the # to set it. | Off | Turn it on for any installation a browser reaches. |
| TRUSTED_PROXY_HOPS | How many proxies stand in front of the application; the client address used for rate limits and the sign-in log is read from what the last of them forwards. 1 is the bundled nginx. A commented line in the file. | 1 | Set 2 when a load balancer or another reverse proxy sits in front of the bundled nginx. |
| LOG_FILE | The ScanSuite log file. /var/tmp is mounted into the web and worker containers; to log elsewhere, add the mount in docker-compose.local.yml. | /var/tmp/scansuite.log | Rarely. |
| CELERY_HOST, REDIS_PASSWORD | The Redis host and its password. | redis, generated | The password, see below. |
| PS_DATABASE_HOST, PS_DATABASE_NAME, PS_DATABASE_USER, PS_DATABASE_PASSWORD | The PostgreSQL connection. | postgres, scansuite, scansuite, generated | The password, see below. |
| STORAGE_URL | Where scan files are stored. | http://seaweedfs (the bundled service) | Never on a server installation. |
| TZ | The time zone of logs, reports and schedules. | The server's time zone | When the server's zone is not the one people read. |
| NTP_SERVER | The NTP server ./scansuite doctor checks the clock against. Not in the file; add it by hand. | Unset (no check) | When the server must keep exact time, for example to check licence expiry reliably. |
| SECRET_KEY, SCANSUITE_WRAPPING_KEYS, SCANSUITE_ACTIVE_WRAPPING_KEY | The keys that encrypt stored passwords and API keys. Their source is key/scansuite-secrets.env, copied into .env on every start. | Generated on the first start | Only to rotate keys, see System Settings. |
Single sign-on adds its own settings, see Single sign-on. The Nessus scanner is configured in System Settings, not in .env.
Advanced settings
Not in the file and not needed on a standard server. Add one by hand only for the case in its last column:
| Setting | What it does | Default | When to change it |
|---|---|---|---|
| MAX_UPLOAD_MB | The largest archive or report a person may upload, in MB. | 2000 | For larger uploads. Raise client_max_body_size in services/nginx/default.conf.template (2000M) to match. |
| CSRF_STRICT_REFERRER | false stops comparing the browser's Referer with the host, keeping the other cross-site checks. | true | Only behind a reverse proxy that cannot pass the original host and rejects every form with "The referrer does not match the host". |
| SCHEMA_AUTO_CONFORM | 0 makes the services refuse to start on a database schema that does not match the release, instead of bringing it up to date at start-up. | 1 | Only when support asks for it. |
| PS_DATABASE_PORT | The PostgreSQL port. | 5432 | For an external database. |
| REDIS_PORT, REDIS_TLS, REDIS_CA_CERTS | The Redis port; true for TLS to Redis; a CA bundle for a Redis certificate the system does not trust. | 6379, off, none | For an external Redis. |
| COMPOSE_PROJECT_NAME | The name that prefixes containers and volumes. | The directory name | Do not add it to an existing installation: its volumes would no longer be found and the services would start with empty data. |
Apply a change
- 01Edit .env
For example with sudo nano /opt/scansuite/.env. Keep the file mode 600.
- 02Restart
Only the services whose settings changed are recreated. Expected: [+] All services healthy.
Shellcd /opt/scansuite && ./scansuite restart - 03Check
Expected last line: [+] No problems found.
Shell./scansuite doctor
Keep .env and key/ with your database backups: without the encryption keys, stored credentials cannot be recovered. See Backup and restore.
Database and Redis passwords
PostgreSQL and Redis run as containers of the installation, reachable only on its own Docker network (as postgres and redis) and not published on the server. Both passwords are generated on the first install. To change one, edit PS_DATABASE_PASSWORD or REDIS_PASSWORD and run ./scansuite restart: Redis starts with the new password, and the database account is brought in line with it before the other services start. ./scansuite doctor then reports the database accepts scansuite with the password in .env.
Use only letters and digits, as the generated passwords do. Docker Compose reads a $ in .env as the start of a variable name, so a password containing one reaches the services altered.
Installation files
| Path | What it holds |
|---|---|
| .env | The settings and passwords of this server. Not part of the release; updates never overwrite it. |
| key/ | The licence file, and key/scansuite-secrets.env with the encryption keys (readable by root only, created on the first start). Back it up with ./scansuite --backup-secrets. |
| backups/ | Where the backup commands write when no other place is given. Not part of the release. |
| docker-compose.yml | The services of the release. Changes you make are carried into the next release by update, but docker-compose.local.yml is the safer place for them. |
| docker-compose.local.yml | Your changes for this server, for example publishing web on 127.0.0.1:5000 behind your own reverse proxy, or extra directories. Optional; updates never touch it and every start includes it. |
| compose.d/ | The release's additional services: the database migration job and the PoC worker. Changes are carried over like docker-compose.yml. |
| services/nginx/ | The web server's configuration, and certs/ with its TLS certificate (cert.pem, key.pem). Replace the certificate with your own, see SSL/TLS Setup. |
| defectdojo/ | DefectDojo's own Compose file and certs/ (nginx.crt, nginx.key). |
| scanners.d/ | The scanner images each install option pulls. |
| RELEASE | Which release this is and what it was built from, as ./scansuite version shows. |
| .env.bak-<date>, .replaced-<date>.<random>/ | Left by updates: a copy of .env, and your files the update could not keep in place. Delete them once you no longer need them. |
ScanSuite ships with a self-signed certificate. Browsers warn about it until you install your own, see SSL/TLS Setup.
Services
| Service | What it is |
|---|---|
| nginx | The web server on ports 80 and 443. |
| web | The application. |
| worker | The scan workers, two by default. |
| worker_admin | Background housekeeping, such as the nightly retention clean-up. |
| worker_poc | Runs proofs of concept, isolated from the other services. |
| celery_beat | Starts scheduled work on time. |
| postgres, redis, seaweedfs | The database, the queue and the file storage. |
| migrate | A one-off job that brings the database up to date and then exits; Exited (0) is its normal state. |
web, the workers, worker_admin, worker_poc and celery_beat restart on their own after a crash; a service you stopped stays stopped. A container that keeps restarting is crashing on start: read its log with ./scansuite logs <SERVICE>. At start-up the services also bring the database schema up to date when it is behind, instead of refusing to start. Each container's log is capped at three 20 MB files.
Checking the server
cd /opt/scansuite && ./scansuite doctorEach line starts with [+] (fine), [!] (a warning) or [-] (a problem). The report ends with [+] No problems found (exit code 0) or [-] N problem(s) found (exit code 1). Every check runs, so one failure never hides another.
| Section | What it checks |
|---|---|
| Host | Docker and its Compose plugin; at least 20 GB free where Docker keeps images; at least 10 GB free in /var/tmp, where scans and the log file are written; ports 80 and 443 held by this installation, and no host web server (nginx, apache2, httpd, caddy, lighttpd, haproxy) enabled to take them at boot; the clock against the NTP server, when one is set. |
| Installation | .env exists, is mode 600 (a warning otherwise), has no placeholder password and has SCANSUITE_TAG; the licence file is in key/, and its expiry (a warning within 30 days, a problem once expired); the PoC worker can read the licence; the TLS certificate exists, its key matches it, and how long it is valid; the database accepts the password in .env. |
| Services | The status table of every container, with Services needing attention; how many containers are running; Redis can save its snapshots; the database migration job completed; nginx serves the sign-in page. |
| Recent errors in the logs | Printed when there are any: the last five error lines of each service. |
[*] Host
[+] docker 27.3.1 with the compose plugin
[+] 112G free for docker images
[+] 64G free in /var/tmp for scans and logs
[+] port 80 is served by this installation
[+] port 443 is served by this installation
[+] clock check skipped (no NTP server configured)
[*] Installation
[+] .env is complete
[+] licence demo_a1b2c3.lic
[+] the PoC worker can read the licence
[+] TLS certificate valid for 83 more days
[+] the database accepts scansuite with the password in .env
[*] Services
NAME IMAGE SERVICE STATUS ...
[+] 9 service container(s) running
[+] Redis saves its snapshots
[+] the database migration job completed
[+] nginx serves the application (HTTP 200)
[+] No problems foundWhat to do about each message is described in Troubleshooting.
Start-up
Install and update register a systemd service, so ScanSuite starts with the server:
systemctl status scansuite # expected: enabled
sudo systemctl disable scansuite # remove it from start-upResetting the databases
Resetting a database deletes data for good. On a server in use, a person approves it, after a backup: ./scansuite --backup-db.
./scansuite reset db
Deletes the ScanSuite database: scan results, findings, teams, accounts and application settings. The licence, .env, the encryption keys, the certificates and the stored files stay. ScanSuite then restarts and prints Open https://<this host>/setup in a browser to create the first account: create the first team and its administrator again.
./scansuite reset dojo
Deletes and recreates the DefectDojo database, with a new administrator. Wait a few minutes and get the password with ./scansuite dojo password (at a terminal, answer N to Change the admin password now? to only read it).
After resetting DefectDojo, get a new API key and connect DefectDojo in ScanSuite again, or scan results stop being exported. See Set up DefectDojo.
Uninstalling
./scansuite uninstall asks Continue? [y/N], stops ScanSuite and removes it from start-up. With --purge it also deletes the ScanSuite data: the database, Redis and the file storage. DefectDojo's data and the /opt/scansuite directory stay. Removing the server entirely is described in Troubleshooting.
Moving images to a server without registry access
If the server cannot reach the image registry, prepare the images on one that can. Run the first command there, copy the directory to the target server, load it, and install or update with --offline:
./scansuite offline save /media/transfer/scansuite-images # on a server with registry access
./scansuite offline load /media/transfer/scansuite-images # on the target server
./scansuite install <LICENCE_CODE> --offline # or: ./scansuite update --offlineThe same set of images as a normal installation is saved, as one file per image with a checksum list. offline load verifies the checksums (Bundle checksums verified, then Images loaded), and --offline stops with a list of whatever release image is missing.
The ScanSuite certificate is covered in SSL/TLS Setup; DefectDojo has its own, see Set up DefectDojo.
Last reviewed 2026-10-19