← Back to labstack/echo

How to Deploy & Use labstack/echo

Echo Web Framework - Deployment and Usage Guide

Prerequisites

  • Go (version 1.19 or later) - Echo v5 supports the last four Go major releases
  • Git - For cloning the repository
  • Operating System - Any OS that supports Go (Linux, macOS, Windows)

Installation

Installing Echo Framework

  1. Install via Go modules:

    go get github.com/labstack/echo/v5
    
  2. Verify installation:

    go version
    # Ensure you have Go 1.19 or later
    

Setting Up a New Project

Create a new Go module and import Echo:

mkdir my-echo-app
cd my-echo-app
go mod init my-echo-app

Configuration

Environment Variables

Echo doesn't require specific environment variables for basic operation, but you may need to configure:

  • HTTP Port: Default is :8080, can be changed in your application code
  • TLS Certificates: For HTTPS, configure SSL/TLS certificates

Configuration Files

Echo doesn't have mandatory configuration files, but you can configure:

  • Logger: Set up custom logging format
  • Middleware: Configure middleware globally or per route
  • Validator: Set up custom validation rules
  • Renderer: Configure template rendering engines

API Keys and External Services

If using third-party middleware, you may need:

  • JWT: For authentication middleware
  • Database connections: For database middleware
  • External APIs: For any integrated services

Build & Run

Development Server

  1. Create a basic Echo application (main.go):
package main

import (
  "github.com/labstack/echo/v5"
  "github.com/labstack/echo/v5/middleware"
  "log/slog"
  "net/http"
)

func main() {
  // Echo instance
  e := echo.New()

  // Middleware
  e.Use(middleware.RequestLogger()) // use the RequestLogger middleware with slog logger
  e.Use(middleware.Recover()) // recover panics as errors for proper error handling

  // Routes
  e.GET("/", hello)

  // Start server
  if err := e.Start(":8080"); err != nil {
    slog.Error("failed to start server", "error", err)
  }
}

// Handler
func hello(c *echo.Context) error {
  return c.String(http.StatusOK, "Hello, World!")
}
  1. Run the application:
go run main.go
  1. Access the application:
    • Open http://localhost:8080 in your browser
    • You should see "Hello, World!"

Production Build

  1. Build the binary:
go build -o my-echo-app main.go
  1. Run the production binary:
./my-echo-app

Deployment

Platform Options

Echo applications can be deployed on various platforms:

1. Docker

Create a Dockerfile:

FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o main .

FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/main .
CMD ["./main"]

Build and run:

docker build -t my-echo-app .
docker run -p 8080:8080 my-echo-app

2. Cloud Platforms

  • Google Cloud Run: Deploy as a containerized service
  • AWS Elastic Beanstalk: Deploy as a Go application
  • Heroku: Deploy with Go buildpack
  • DigitalOcean App Platform: Deploy as a containerized application

3. Traditional Hosting

  • VPS/Virtual Machines: Deploy directly to Ubuntu, CentOS, etc.
  • Platform-as-a-Service: Deploy to services like Render, Railway

Deployment Configuration

For production deployments, consider:

  1. Environment variables: Set production configuration
  2. Reverse proxy: Use Nginx or Apache as a reverse proxy
  3. SSL/TLS: Configure HTTPS with Let's Encrypt or cloud provider certificates
  4. Process management: Use systemd, PM2, or similar for process management
  5. Monitoring: Set up logging and monitoring

Troubleshooting

Common Issues and Solutions

1. Port Already in Use

Issue: Port 8080 is already occupied by another service

Solution:

# Check what's using the port
lsof -i :8080

# Kill the process
kill -9 <PID>

# Or change the port in your application
e.Start(":8081")

2. Go Version Compatibility

Issue: Echo v5 requires Go 1.19 or later

Solution:

# Check Go version
go version

# Update Go if needed
# On Ubuntu/Debian:
sudo apt-get update && sudo apt-get install golang-go

# On macOS with Homebrew:
brew install go

3. Module Dependencies Not Found

Issue: Go modules not properly initialized

Solution:

# Initialize Go module
go mod init my-echo-app

# Download dependencies
go mod download

# Verify dependencies
go mod tidy

4. Middleware Not Working

Issue: Middleware not being applied correctly

Solution:

// Ensure middleware is added before routes
e.Use(middleware.Logger())
e.Use(middleware.Recover())

// Check middleware order
e.GET("/", handler)

5. Route Not Found (404)

Issue: Route not matching or router not configured

Solution:

// Check route registration
e.GET("/path", handler)

// Verify exact path match
// /path != /path/ (trailing slash matters)

6. Server Won't Start

Issue: Server fails to start due to binding issues

Solution:

# Check if you have permission to bind to port
# Ports below 1024 require root privileges
sudo ./my-echo-app

# Or use a higher port number
e.Start(":8080")

Debugging Tips

  1. Enable detailed logging:

    e.Logger.SetLevel(slog.LevelDebug)
    
  2. Check middleware order:

    // Middleware order matters
    e.Use(middleware.Logger())
    e.Use(middleware.Recover())
    
  3. Verify route parameters:

    e.GET("/users/:id", func(c *echo.Context) error {
        id := c.Param("id")
        return c.String(http.StatusOK, id)
    })
    
  4. Test with curl:

    curl -X GET http://localhost:8080/
    

Performance Considerations

  • Use connection pooling for database connections
  • Enable Gzip compression for responses
  • Configure proper timeouts for production
  • Use reverse proxy for SSL termination and load balancing

This guide provides a comprehensive overview of deploying and using the Echo web framework in production environments.