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 lsto confirm)
Trigger a deployment
skytells deploy <app>You can use either the app ID or its name:
skytells deploy abc123
skytells deploy my-apiAfter 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 statusProject: 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:
| Type | What it contains | When to use it |
|---|---|---|
deployment | Build steps, image pull, startup sequence | Debugging a deploy that failed or is stuck |
container (default) | Your app's stdout and stderr | Debugging 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 --followNo --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 200Inspect 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-003List 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 --jsonThe 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 statusDebugging 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 deploymentCommon things to look for:
- Missing environment variables referenced in your code
- A dependency install that failed
- A port mismatch (your app listens on
3000but the config expects8080) - 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-apiIf something is missing, set it:
skytells env set --app my-api DATABASE_URL=postgres://...Inspect the app configuration
skytells apps inspect my-apiVerify 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 --followMonitor 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
fiQuick reference
| What you want | Command |
|---|---|
| Trigger a deployment | skytells deploy <app> |
| Check project status | skytells status |
| Watch deployment live | skytells logs <app> --type deployment --follow |
| Watch container logs live | skytells logs <app> --follow |
| Last N log lines | skytells logs <app> --tail <n> |
| List all deployments | skytells deployments ls |
| Filter by app | skytells deployments ls --app <id> |
| Redeploy after a fix | skytells apps redeploy <app> |