Troubleshooting
Tarsail tries to fail with a specific area tag such as [config:target], [remote:ssh], or [compose:image].
Use the tag to locate the failing layer: config, local Docker, SSH, remote Docker, file transfer, image loading, or Compose startup.
Config file not found
Section titled “Config file not found”Symptom:
[config:load] Config file not found: tarsail.ymlFix:
tarsail initor pass the intended file:
tarsail --config tarsail.production.yml doctorUnknown or unsupported config key
Section titled “Unknown or unsupported config key”Symptom:
[config:parse] Unknown top-level config keyor:
[config:scope] Unsupported Phase 0 config section: targetsFix: use only supported Phase 0 top-level keys:
projecttargetcomposedeployfilessecretsTarsail intentionally rejects future-looking sections until they have real behavior.
Compose service has no image tag
Section titled “Compose service has no image tag”Symptom:
[compose:image] Service "web" has a build section but no explicit image tag.Fix:
services: web: build: . image: my-app-web:${TARSAIL_RELEASE_ID:-local}Then rerun:
tarsail doctorDocker command not found
Section titled “Docker command not found”Symptom:
[local:docker] Docker command not found.Fix:
- install Docker Engine or Docker Desktop;
- ensure
dockeris onPATH; - restart the terminal after installation.
Verify:
docker psdocker compose versionDocker daemon is not reachable
Section titled “Docker daemon is not reachable”Symptom:
Docker daemon reachable: FAILFix:
- start Docker Desktop or Docker Engine;
- confirm your user can access Docker;
- on Linux, confirm group or sudo policy;
- on Windows, confirm Docker Desktop is running in the expected backend.
Verify:
docker psSSH connection fails
Section titled “SSH connection fails”Symptom:
[remote:ssh] Remote command failedCheck direct SSH first:
ssh deploy@example.comIf using a key:
ssh -i ~/.ssh/my-app-deploy-key deploy@example.comThen run:
tarsail --identity-file ~/.ssh/my-app-deploy-key doctorCommon causes:
- wrong
target.host; - wrong
target.user; - wrong
target.port; - server firewall blocks SSH;
- cloud provider security group blocks SSH;
- private key path is wrong;
- password login is disabled;
- host key is not trusted.
Password mode says known_hosts cannot be loaded
Section titled “Password mode says known_hosts cannot be loaded”Symptom:
[remote:ssh] Could not load SSH known_hosts fileFix:
ssh deploy@example.comAccept the host key only after verifying it. Then rerun:
tarsail --ask-password doctorPassword authentication fails
Section titled “Password authentication fails”Symptom:
Password authentication failedCheck:
- the password is correct;
- the server permits password authentication;
- the configured user is allowed to log in;
- the server is not closing password sessions due to rate limits or security policy.
If password login is disabled, use an SSH key.
Target path is rejected
Section titled “Target path is rejected”Symptom:
[config:target] target.path is too broadFix:
target: path: /opt/my-appDo not use broad paths such as /opt, /var, /home, /root, or /tmp.
Target path is not writable
Section titled “Target path is not writable”Symptom:
target path writable: FAILFix on the server:
sudo mkdir -p /opt/my-appsudo chown deploy:deploy /opt/my-appThen:
tarsail doctorIf deploying as root, confirm the path is not blocked by permissions or a read-only filesystem.
Shared env file is missing
Section titled “Shared env file is missing”Symptom:
shared files available: FAILIf compose.env_file.source is omitted, Tarsail expects the remote file to already exist:
compose: env_file: target: shared/.envCreate it on the server or add a local source:
compose: env_file: source: .deploy/prod.env target: shared/.envSecret source is missing
Section titled “Secret source is missing”Symptom:
[config:secrets] secrets[0].source is not availableFix:
- create the local file;
- correct the path;
- keep the path relative to the config file;
- use forward slashes.
Example:
secrets: - source: .deploy/app.key target: shared/secrets/app.keyImage is not available locally
Section titled “Image is not available locally”Symptom:
[docker:image] Image is not available locallyTarsail discovered an image in Compose but could not find it after build.
Fix:
docker compose -p my-app --env-file .deploy/prod.env -f compose.yaml builddocker image lstarsail deployFor images without build:, pull them locally:
docker pull nginx:1.27-alpineRemote Docker is unavailable
Section titled “Remote Docker is unavailable”Symptom:
Docker available: FAILCheck on the server:
docker psdocker compose versionFix:
- install Docker;
- install Docker Compose v2;
- start the Docker daemon;
- add the deploy user to the Docker group if appropriate;
- reconnect after changing group membership.
Compose starts but public access fails
Section titled “Compose starts but public access fails”If tarsail deploy succeeds and containers are running, the remaining issue may be outside Tarsail.
Check on the server:
cd /opt/my-appdocker compose -p my-app --env-file current/.tarsail.env --env-file shared/.env -f current/compose.yaml pscurl -v http://127.0.0.1:8080/healthzss -ltnpCheck from your local machine:
curl -v http://example.com/healthzCommon causes:
- wrong published port in Compose;
- application listens on
127.0.0.1inside the container instead of0.0.0.0; - OS firewall blocks the port;
- cloud provider security group blocks the port;
- DNS points to a different IP;
- reverse proxy config expects HTTPS or a different host;
- another service already owns the port.
Port already in use
Section titled “Port already in use”Symptom from Compose:
bind: address already in useCheck on the server:
ss -ltnp | grep ':80'Fix one of:
- stop the conflicting service;
- change the Compose published port;
- route through an existing reverse proxy;
- remove old orphan containers if they are from a previous Compose shape.
Deployment fails after activation
Section titled “Deployment fails after activation”Symptom:
Deployment failed after activation.Run "tarsail rollback" to restore the previous release.Run:
tarsail rollbacktarsail logs --tail 300Then inspect the failed release manually if needed:
ssh deploy@example.comcd /opt/my-appls -la releasescat current/manifest.jsonRemember that rollback does not undo database migrations or Docker volume changes.