This guide provides instructions for running Sentinel with Docker and Docker Compose, ensuring a reproducible development environment for all contributors.
- Docker: Install Docker Desktop (includes Docker Engine and Docker Compose)
- Git: For version control
- Minimum 2GB available disk space
- Ports 3000 (backend), 5432 (PostgreSQL), and 6379 (Redis) available
docker --version
docker-compose --versiongit clone https://github.com/sentinel-security-productions/Sentinel.git
cd Sentinel# Start all services (background mode)
docker-compose up -d
# Or, start with logs visible (remove -d flag)
docker-compose up# Run Prisma migrations
docker-compose exec backend npx prisma migrate deploy
# Or for development with new schema changes
docker-compose exec backend npx prisma migrate dev# Check all services are running
docker-compose ps
# Test backend health
curl http://localhost:3000/api
# Test PostgreSQL connection
docker-compose exec postgres psql -U sentinel_user -d sentinel_db -c "\dt"
# Test Redis connection
docker-compose exec redis redis-cli ping- Port: 3000
- URL: http://localhost:3000/api
- Container: sentinel-backend
- Features:
- Auto-reload on code changes (volume mounted)
- Health check enabled
- Proper signal handling via dumb-init
- Port: 5432
- Container: sentinel-postgres
- Credentials:
- Username:
sentinel_user(configurable) - Password:
sentinel_password(configurable) - Database:
sentinel_db(configurable)
- Username:
- Volume:
postgres_data(persisted) - Connection String:
postgresql://sentinel_user:sentinel_password@localhost:5432/sentinel_db
- Port: 6379
- Container: sentinel-redis
- Volume:
redis_data(persisted) - Connection:
redis://localhost:6379
Configure services using .env.docker (default) or create a .env file:
# Node environment
NODE_ENV=development
PORT=3000
# PostgreSQL
DB_USER=sentinel_user
DB_PASSWORD=sentinel_password
DB_NAME=sentinel_db
# Redis (auto-configured)
REDIS_URL=redis://redis:6379To use custom values:
# Using environment file
docker-compose --env-file .env.custom up -d
# Or set inline
DATABASE_URL="postgresql://custom_user:custom_pass@postgres:5432/custom_db" docker-compose up -d# All services
docker-compose logs -f
# Specific service
docker-compose logs -f backend
docker-compose logs -f postgres
docker-compose logs -f redis
# Last 50 lines
docker-compose logs --tail 50# Backend (NestJS)
docker-compose exec backend npm install
docker-compose exec backend npx prisma studio
docker-compose exec backend npx prisma generate
# PostgreSQL
docker-compose exec postgres psql -U sentinel_user -d sentinel_db
docker-compose exec postgres pg_dump -U sentinel_user sentinel_db > backup.sql
# Redis
docker-compose exec redis redis-cli
docker-compose exec redis redis-cli FLUSHALL# Stop services (keeps volumes)
docker-compose stop
# Stop and remove containers
docker-compose down
# Full cleanup (removes volumes - DATA LOSS!)
docker-compose down -v
# Remove images too
docker-compose down -v --rmi all# Rebuild backend after dependency changes
docker-compose build backend
# Rebuild all services
docker-compose build
# Rebuild and restart
docker-compose up -d --buildThe backend service is configured with volume mounting for hot reload:
# Start services
docker-compose up -d
# Edit files locally, they'll be reflected in the container
# Monitor logs
docker-compose logs -f backendNote: Some NestJS changes may require a container restart:
docker-compose restart backend# Create new migration
docker-compose exec backend npx prisma migrate dev --name add_feature
# Apply existing migrations
docker-compose exec backend npx prisma migrate deploy
# Reset database (development only - clears all data!)
docker-compose exec backend npx prisma migrate resetdocker-compose exec postgres psql -U sentinel_user -d sentinel_db
# Example queries
\dt # List tables
\d users # Describe users table
SELECT * FROM users LIMIT 5; # Query datadocker-compose exec backend npx prisma studioOpens interactive database UI at http://localhost:5555 (in container)
docker-compose exec redis redis-cli
# Example commands
KEYS *
GET key_name
FLUSHALL# Check for port conflicts
docker-compose ps
lsof -i :3000 # Check port usage
# Clean up and restart
docker-compose down -v
docker-compose up -d# Verify PostgreSQL is healthy
docker-compose ps postgres
# Check logs
docker-compose logs postgres
# Test connection manually
docker-compose exec postgres pg_isready -U sentinel_user# Verify Redis is running
docker-compose exec redis redis-cli ping
# Check Redis logs
docker-compose logs redis# Check backend logs
docker-compose logs backend
# Verify dependencies installed
docker-compose exec backend npm list
# Rebuild backend
docker-compose build --no-cache backend
docker-compose up -d backend# Check volumes
docker volume ls | grep sentinel
# Inspect volume
docker volume inspect sentinel_postgres_data
# Data persists across restarts unless you use docker-compose down -vFor production deployments:
- Use environment-specific
.envfiles for secrets management - Enable container restart policies (already configured:
restart: unless-stopped) - Configure persistent volume backups for PostgreSQL data
- Use secrets management (Docker Secrets or external vault)
- Enable logging drivers for centralized log aggregation
- Configure resource limits in docker-compose.yml
- Use healthchecks (already configured)
- Enable HTTPS via reverse proxy (nginx/Traefik)
- Docker Documentation
- Docker Compose Documentation
- NestJS Docker Guide
- Prisma Docker Guide
- PostgreSQL Docker Image
- Redis Docker Image
For issues or questions:
- Check existing issues
- Review logs:
docker-compose logs - Create a new issue with:
- Docker version
- Docker Compose version
- OS information
- Relevant logs
- Steps to reproduce