Complete guide for running the Skitt Backend using Docker.
- Docker Engine 20.10 or higher
- Docker Compose 2.0 or higher
Verify installation:
docker --version
docker-compose --versioncd backend
./docker-start.shThis script will:
- Check if Docker is running
- Create
.envfile if needed - Build Docker images
- Start all services (PostgreSQL + Backend)
- Show service status
cd backend
# Build and start services
docker-compose up -d
# View logs
docker-compose logs -f
# Check status
docker-compose psdocker-compose.yml- Production setup (Backend + PostgreSQL)docker-compose.dev.yml- Development setup (PostgreSQL only)docker-start.sh- Quick start scriptDockerfile- Multi-stage build configuration
βββββββββββββββ
β Backend β (Express API - Port 3001)
β Container β
ββββββββ¬βββββββ
β
β PostgreSQL
β
ββββββββΌβββββββ
β PostgreSQL β (Port 5432)
β Container β
βββββββββββββββ
Create a .env file in the backend/ directory:
# Server Configuration
PORT=3001
NODE_ENV=production
# Database Configuration
DB_HOST=postgres
DB_PORT=5432
DB_NAME=skitt_db
DB_USER=skitt_user
DB_PASSWORD=skitt_passwordNote: When running in Docker, DB_HOST should be postgres (the service name), not localhost.
If .env is not provided, Docker Compose uses these defaults:
DB_NAME:skitt_dbDB_USER:skitt_userDB_PASSWORD:skitt_passwordDB_PORT:5432
Runs both PostgreSQL and Backend in containers:
docker-compose up -dServices:
- Backend API:
http://localhost:3001 - API Docs:
http://localhost:3001/api-docs - PostgreSQL:
localhost:5432
Run PostgreSQL in Docker, Backend locally:
# Start PostgreSQL only
docker-compose -f docker-compose.dev.yml up -d
# Run backend locally (in another terminal)
npm install
npm run devBenefits:
- Hot reload for code changes
- Faster development cycle
- Direct access to logs
docker-compose up -ddocker-compose down# All services
docker-compose logs -f
# Backend only
docker-compose logs -f backend
# PostgreSQL only
docker-compose logs -f postgresdocker-compose ps# Rebuild backend
docker-compose build backend
docker-compose up -d backend
# Rebuild all (no cache)
docker-compose build --no-cache
docker-compose up -d# Backend container
docker exec -it skitt-backend sh
# PostgreSQL container
docker exec -it skitt-postgres sh# PostgreSQL shell
docker exec -it skitt-postgres psql -U skitt_user -d skitt_db
# Or using docker-compose
docker-compose exec postgres psql -U skitt_user -d skitt_dbdocker-compose down -vBoth services include health checks:
- PostgreSQL: Checks if database is ready
- Backend: Checks if API is responding
View health status:
docker-compose psThe database schema is automatically initialized when the backend starts.
docker exec skitt-postgres pg_dump -U skitt_user skitt_db > backup.sqldocker exec -i skitt-postgres psql -U skitt_user skitt_db < backup.sqldocker-compose down -v
docker-compose up -d# Check what's using the port
lsof -i :3001
lsof -i :5432
# Kill process or change port in docker-compose.yml# Check if database is healthy
docker-compose ps postgres
# Check database logs
docker-compose logs postgres
# Restart database
docker-compose restart postgres# Check backend logs
docker-compose logs backend
# Rebuild backend
docker-compose build --no-cache backend
docker-compose up -d backend# Clean build (no cache)
docker-compose build --no-cache
# Remove old images
docker system prune -a# Fix volume permissions (Linux/Mac)
sudo chown -R $USER:$USER postgres_data# Check container status
docker ps -a
# View container logs
docker logs skitt-backend
docker logs skitt-postgres
# Remove and recreate
docker-compose down
docker-compose up -ddocker statsdocker system df# Remove stopped containers, unused networks, images
docker system prune
# Remove everything (β οΈ aggressive)
docker system prune -aβ Implemented:
- Non-root user in containers
- Multi-stage builds (minimal attack surface)
- Health checks for all services
- Environment variables for secrets
- Use Docker secrets or external secret management
- Enable SSL/TLS for database connections
- Regular security updates
- Network isolation
- Resource limits
- Docker Documentation
- Docker Compose Documentation
- Node.js Docker Best Practices
- PostgreSQL Docker Image
If you encounter issues:
- Check the logs:
docker-compose logs -f - Verify Docker is running:
docker info - Check service health:
docker-compose ps - Review environment variables in
.env