Deployment Files and Directories
The installer runs inside a deployment directory with a fixed set of files, and the CLI generates them on the host itself — nothing has to be downloaded on another machine and copied over. soln install then creates .env from .env.example when it is missing.
Step 1: Install the CLI
npm install -g @soln/cli
- Success: the command finishes without an
EACCESor404error EACCES: permission denied— installs may need a user-level prefix:npm install -g @soln/cli --prefix "$HOME/.local", then add$HOME/.local/bintoPATH; or keep usingnpx @soln/clifor every command instead of a global install404 Not Found— the configured npm registry does not carry@soln/cli; checknpm config get registryor ask your administrator for the internal registry
sl help
- Success: the usage text lists
sl prepare,sl install,sl doctor,sl status,sl upgrade, andsl rollback command not found: sl— the global bin directory is not onPATH; runnpm prefix -gand add itsbindirectory, or prefix every command withnpx @soln/cli
Every command used on this page is documented with the rest of the CLI in Soln CLI; that page also lists soln version, the deployment commands (deployment register, deployment prepare, doctor, install, status, upgrade, rollback), and the exit codes.
Step 2: Create the Deployment Directory
This-computer deployment (Docker Desktop, no sudo):
mkdir -p "$HOME/soln-tenant-runtime"
cd "$HOME/soln-tenant-runtime"
Windows (PowerShell) equivalent:
New-Item -ItemType Directory -Force "$HOME\soln-tenant-runtime"
Set-Location "$HOME\soln-tenant-runtime"
Server deployment (Linux):
sudo mkdir -p /opt/soln-tenant-runtime
sudo chown "$USER" /opt/soln-tenant-runtime
cd /opt/soln-tenant-runtime
How to write the --dir path
Every deployment command (deployment register, deployment prepare, doctor, install, status, upgrade, rollback) takes --dir <path>, and that path is the deployment directory itself — the directory that holds docker-compose.yml and .env. It is not a file.
deployment register, deployment prepare, and deployment origin require an explicit --dir. Lifecycle commands use the current working directory when --dir is omitted, so after the cd above, sl doctor and soln doctor --dir "$HOME/soln-tenant-runtime" are the same thing.
# this-computer deployment, the directory from step 2
soln doctor --dir "$HOME/soln-tenant-runtime"
# server deployment
soln doctor --dir /opt/soln-tenant-runtime
soln doctor --dir "$HOME\soln-tenant-runtime"
soln doctor --dir "D:\soln\tenant-runtime"
- A relative path is resolved against your current directory; an absolute path is used as it is
- Quote the path when it contains spaces:
--dir "/Users/me/Soln Tenant Runtime" - Do not put
~inside quotes:--dir "~/soln-tenant-runtime"looks for a directory literally named~. Use--dir "$HOME/soln-tenant-runtime", or leave it unquoted as~/soln-tenant-runtime - A wrong path shows up as
<dir>/docker-compose.yml(No such file or directory) and a missing<dir>/.envin thesl doctoroutput; it does not mean the host is broken
Step 3: Register and Generate Files Through the CLI
Sign in and register the target Runtime using CLI Deployment Registration, then run:
sl deployment prepare --dir '<deployment-directory>'
This generates files from the Control Plane registration and .soln-install-setup.json, without manually copying tenant IDs, Runtime IDs, or Agent secrets. Select --deployment-target local|server and --deployment-mode singleMachine|externalServices during registration; this-computer deployment supports single-machine mode only.
Existing files are not overwritten by default. Review them before using prepare --force. Use sl upgrade for an installed directory. Resolve registration mismatches instead of manually editing identity fields in the setup file.
Step 4: Confirm the Files
ls -l docker-compose.yml .env.example reverse-proxy.conf \
cloudflared-config.yml agent.config.json
- Success: all five files are listed
No such file or directory—preparedid not run in this directory; repeat step 3
| File | Content |
|---|---|
docker-compose.yml | the four Soln products and the reverse proxy, plus PostgreSQL, Temporal, and MinIO in single-machine mode |
.env.example | every environment value the deployment needs, written with mode 0600; installation creates .env from it |
reverse-proxy.conf | the nginx configuration for the same-origin reverse proxy |
cloudflared-config.yml | the optional Cloudflare Named Tunnel ingress; the hostname stays a placeholder until the Runtime Origin is known |
storage-iam-policy.example.json | a starting point for the bucket policy in external services mode |
README.md | the generated deployment notes |
The tunnel credentials live in a secrets directory that Compose mounts; create it up front:
mkdir -p secrets
chmod 0700 secrets
Any other runtime directory the Compose file mounts is created by the CLI during installation; it does not need to be prepared by hand.
State and Generated Secrets
After installing, the CLI writes its deployment state to .soln/deployment.json with mode 0600; that file never contains the Agent secret and must not be edited by hand. Missing or placeholder secrets are replaced during installation: RUNTIME_SESSION_ENCRYPTION_KEY, SOLN_BACKUP_ENCRYPTION_KEY, TENANT_RUNTIME_INTERNAL_SECRET, LUNA_TOOL_APPROVAL_SECRET, and, in single-machine mode, the bundled PostgreSQL and MinIO passwords. Keep .env at mode 0600.