Beginner25 minModule 3 of 5

Deploy & Logs

Trigger deployments, stream real-time logs, check project status, and debug failed deploys without leaving your terminal.

What you'll be able to do after this module

Ship a deployment from the terminal, watch it happen in real time, switch to live container logs, and work through common failures without touching the web console.


Prerequisites

  • Module 1 and 2 complete
  • At least one app exists in your linked project (skytells apps ls to confirm)

Trigger a deployment

skytells deploy <app>

You can use either the app ID or its name:

skytells deploy abc123
skytells deploy my-api

After triggering a deployment, monitor its progress with deployment logs (covered below).


Check project status

Before and after a deployment, status gives you a quick bird's-eye view of everything running:

skytells status
Project: my-project (abc123)
Status: active

Apps:
┌──────────┬──────────────┬──────────┬───────────┐
│ ID       │ Name         │ Status   │ Uptime    │
├──────────┼──────────────┼──────────┼───────────┤
│ app-001  │ api-server   │ running  │ 5d 12h    │
│ app-002  │ worker       │ running  │ 3d 8h     │
│ app-003  │ cron-job     │ stopped  │ —         │
└──────────┴──────────────┴──────────┴───────────┘

Logs

Skytells separates two types of logs for each app:

TypeWhat it containsWhen to use it
deploymentBuild steps, image pull, startup sequenceDebugging a deploy that failed or is stuck
container (default)Your app's stdout and stderrDebugging runtime behavior after deploy

Watch a deployment in real time

skytells logs my-api --type deployment --follow

--follow keeps the stream open. You'll see each build step as it happens. Press Ctrl+C to stop.

Switch to container logs once it's running

skytells logs my-api --follow

No --type flag defaults to container logs.

Look back at recent logs

# Default number of lines
skytells logs my-api

# Last 200 lines
skytells logs my-api --tail 200

Inspect a specific deployment's logs

# List recent deployments to find the ID
skytells deployments ls --app my-api

# Then pull logs for that specific deployment
skytells logs my-api --type deployment --deployment dep-003

List deployments

skytells deployments ls
┌──────────┬──────────────┬──────────┬──────────────────┬──────────────────┐
│ ID       │ App          │ Status   │ Trigger          │ Created          │
├──────────┼──────────────┼──────────┼──────────────────┼──────────────────┤
│ dep-003  │ my-api       │ success  │ cli              │ 2026-04-13 10:30 │
│ dep-002  │ my-api       │ success  │ git-push         │ 2026-04-12 15:00 │
│ dep-001  │ my-api       │ failed   │ cli              │ 2026-04-10 09:00 │
└──────────┴──────────────┴──────────┴──────────────────┴──────────────────┘

Filter by app, paginate, or get JSON:

skytells deployments ls --app my-api
skytells deployments ls --limit 10 --offset 10
skytells deployments ls --json

The standard deployment workflow

# 1. Check what's currently running
skytells status

# 2. Apply any config changes needed
skytells env set --app my-api FEATURE_FLAG=true

# 3. Trigger the deploy
skytells deploy my-api

# 4. Watch the build
skytells logs my-api --type deployment --follow

# 5. Once it completes, confirm the deploy succeeded
skytells deployments ls --app my-api --limit 1

# 6. Check the container is healthy
skytells status

Debugging a failed deployment

Deployments fail for a handful of predictable reasons. Here's how to work through each one:

Read the deployment logs

The error is almost always in the build or startup output:

skytells logs my-api --type deployment

Common things to look for:

  • Missing environment variables referenced in your code
  • A dependency install that failed
  • A port mismatch (your app listens on 3000 but the config expects 8080)
  • A health check that never returned 200

Check your environment variables

A missing DATABASE_URL or API_KEY will cause a clean build to fail at runtime:

skytells env ls --app my-api

If something is missing, set it:

skytells env set --app my-api DATABASE_URL=postgres://...

Inspect the app configuration

skytells apps inspect my-api

Verify the app type, resource allocation, and connected settings look correct.

Fix and redeploy

After fixing the issue, redeploy:

skytells apps redeploy my-api

# Watch it immediately
skytells logs my-api --type deployment --follow

Monitor a deployment in CI

When running in a pipeline you want structured output, not formatted tables:

# Get the latest deployment status as JSON
skytells deployments ls --app my-api --limit 1 --json

# Parse status with jq
STATUS=$(skytells deployments ls --app my-api --limit 1 --json | jq -r '.[0].status')

if [ "$STATUS" = "success" ]; then
  echo "Deployment succeeded"
else
  echo "Deployment status: $STATUS"
  exit 1
fi

Quick reference

What you wantCommand
Trigger a deploymentskytells deploy <app>
Check project statusskytells status
Watch deployment liveskytells logs <app> --type deployment --follow
Watch container logs liveskytells logs <app> --follow
Last N log linesskytells logs <app> --tail <n>
List all deploymentsskytells deployments ls
Filter by appskytells deployments ls --app <id>
Redeploy after a fixskytells apps redeploy <app>

Up next: Module 4 — Environment Variables & Configuration →

On this page