Deploy Logs — Spot and Fix Build Errors Instantly

Did your deploy fail? Detect build and runtime errors in seconds with the Skyversal live log stream. Debugging in production has never been this straightforward.

Read Time
3 minutes
Support
All Apps
Real-time
Yes

What will you learn in this guide?

  • You will understand the critical difference between Build and Run logs.
  • You will see how to identify the root cause of bugs instantly by streaming live logs.
  • You will learn how to resolve common errors like EADDRINUSE and Connection Refused.

The difference between a good developer and a great developer lies in the speed of reading and interpreting logs. Skyversal seamlessly transports all stdout and stderr outputs generated by your application in the background to your browser without delay. You don't need to connect to a server via SSH, run "tail" commands in a terminal, or read files for production debugging.

🧱 1. Build Logs

These are the logs of the temporary isolation step executed every time your project is updated (when you push to GitHub or trigger a manual re-deploy). Your application has not been opened to the outside world at this stage.

You will usually see the following in Build Logs:

  • Libraries downloaded by package managers (npm install, composer install).
  • TypeScript or asset compilation processes (vite build, next build).
  • Missing package or Syntax Error reports.
💡 Tip: Zero-Downtime and Safe Debugging

If your application's code is broken and it crashes during the Build phase (Failed), Skyversal does not deploy the new version. Your site continues to run with the old version, with zero downtime. You can find the missing package or code error by focusing on the red ERROR lines on the log screen and fix it locally.

⚡ 2. Runtime Logs

When the Build process is successfully completed, the system runs the Run command and your application opens to the world. Runtime logs are the production logs that constantly stream to the screen as your application receives traffic, connects to the database, or when an error is thrown inside.

[14:22:01] INFO: Server running on port 8080
[14:22:05] INFO: Database connected successfully
[14:25:12] WARN: Slow query detected in /api/users (2045ms)
[14:28:44] ERROR: Connection refused at tcp://db-host:5432

🩺 3. Common Log Errors and Solutions

EADDRINUSE

Port Binding Error

This error occurs because your application tries to listen on a fixed port within itself (e.g., 3000) instead of the port dynamically assigned by Skyversal. Skyversal sends the actual port your application will communicate with the outside world as the $PORT environment variable to your code.

❌ Incorrect Usage:
// The app is stuck on port 3000 internally and cannot be accessed from outside.
app.listen(3000, 'localhost');
✅ Correct Usage:
// Catches the port from the system, tries 8080 if not found, and opens to all IPs (0.0.0.0).
const port = process.env.PORT || 8080;
app.listen(port, '0.0.0.0');
Connection Refused

Database or Service Access

If your application is in the "Crashed" state and you see Connection Refused in the logs, make sure your database settings (DB_HOST, DB_PASSWORD, etc.) are complete on the Environment Variables (.env) page. Remember that you cannot access the local (localhost) database in your development environment via Skyversal; you must enter an open, remote database address.

🎉 Debug Like a Pro!

You now know how to track everything that goes wrong in your project from the logs and how to solve infrastructure problems at the code level. By using our platform, you are very close to managing completely autonomous applications.

In our next guide, you can learn how to connect your Custom Domain to your project and how to manage your free SSL certificate.

👉 Custom Domain & SSL
Last updated on July 29, 2026
Edit this page on GitHub