# Docker Setup for QR Master

This directory contains Docker configuration files for running QR Master with PostgreSQL database.

## 🚀 Quick Start

### Development (Database Only)

For local development where you run Next.js on your host machine:

```bash
# Start PostgreSQL and Redis
docker-compose -f docker-compose.dev.yml up -d

# Run database migrations
npm run db:migrate

# Start the development server
npm run dev
```

Access:
- **Application**: http://localhost:3050
- **Database**: localhost:5432
- **Redis**: localhost:6379
- **Adminer (DB UI)**: http://localhost:8080

### Production (Full Stack)

To run the entire application in Docker:

```bash
# Build and start all services
docker-compose up -d --build

# Run database migrations
docker-compose exec web npx prisma migrate deploy

# (Optional) Seed the database
docker-compose exec web npm run db:seed
```

Access:
- **Application**: http://localhost:3050
- **Database**: localhost:5432
- **Redis**: localhost:6379
- **Adminer (DB UI)**: http://localhost:8080 (only with --profile dev)

To include Adminer in production mode:
```bash
docker-compose --profile dev up -d
```

## 📦 Services

### PostgreSQL (db)
- **Image**: postgres:16-alpine
- **Port**: 5432
- **Database**: qrmaster
- **User**: postgres
- **Password**: postgres (change in production!)

### Redis (redis)
- **Image**: redis:7-alpine
- **Port**: 6379
- **Max Memory**: 256MB with LRU eviction policy
- **Persistence**: AOF enabled

### Next.js Application (web)
- **Port**: 3050
- **Environment**: Production
- **Health Check**: HTTP GET on localhost:3050

### Adminer (adminer)
- **Image**: adminer:latest
- **Port**: 8080
- **Purpose**: Database management UI
- **Profile**: dev (optional in production)

## 🗄️ Database Management

### Migrations

```bash
# Create a new migration
npm run db:migrate

# Deploy migrations in Docker
docker-compose exec web npx prisma migrate deploy

# Reset database (caution!)
docker-compose exec web npx prisma migrate reset
```

### Prisma Studio

```bash
# On host machine
npm run db:studio

# Or in Docker
docker-compose exec web npx prisma studio
```

### Backup and Restore

```bash
# Backup
docker-compose exec db pg_dump -U postgres qrmaster > backup.sql

# Restore
docker-compose exec -T db psql -U postgres qrmaster < backup.sql
```

## 🔧 Useful Commands

### View Logs

```bash
# All services
docker-compose logs -f

# Specific service
docker-compose logs -f web
docker-compose logs -f db
docker-compose logs -f redis
```

### Shell Access

```bash
# Next.js container
docker-compose exec web sh

# PostgreSQL container
docker-compose exec db psql -U postgres -d qrmaster

# Redis container
docker-compose exec redis redis-cli
```

### Stop and Clean

```bash
# Stop all services
docker-compose down

# Stop and remove volumes (deletes data!)
docker-compose down -v

# Stop and remove everything including images
docker-compose down -v --rmi all
```

## 🔐 Environment Variables

Create a `.env` file in the root directory (copy from `env.example`):

```bash
cp env.example .env
```

Required variables:
- `DATABASE_URL`: PostgreSQL connection string
- `NEXTAUTH_SECRET`: Secret for NextAuth.js
- `NEXTAUTH_URL`: Application URL
- `IP_SALT`: Salt for hashing IP addresses
- `REDIS_URL`: Redis connection string

## 🌐 Network Architecture

All services run on a custom bridge network `qrmaster-network` which allows:
- Service discovery by container name
- Network isolation from other Docker projects
- Internal DNS resolution

## 📊 Volumes

### Persistent Data
- `dbdata`: PostgreSQL data
- `redisdata`: Redis data

### Volume Management

```bash
# List volumes
docker volume ls

# Inspect volume
docker volume inspect qrmaster_dbdata

# Remove all unused volumes
docker volume prune
```

## 🐛 Troubleshooting

### Database Connection Issues

```bash
# Check if database is ready
docker-compose exec db pg_isready -U postgres

# Check database logs
docker-compose logs db

# Restart database
docker-compose restart db
```

### Application Won't Start

```bash
# Check health status
docker-compose ps

# View application logs
docker-compose logs web

# Rebuild the application
docker-compose up -d --build web
```

### Port Already in Use

If ports 3050, 5432, 6379, or 8080 are already in use:

```bash
# Find process using port
# Windows
netstat -ano | findstr :3050

# Linux/Mac
lsof -i :3050

# Kill process or change port in docker-compose.yml
```

## 🔄 Updates and Maintenance

### Update Dependencies

```bash
# Update Node packages
npm update

# Rebuild Docker images
docker-compose build --no-cache
```

### Update Docker Images

```bash
# Pull latest images
docker-compose pull

# Restart with new images
docker-compose up -d
```

## 📝 Notes

- **Development**: Use `docker-compose.dev.yml` to run only the database and Redis
- **Production**: Use `docker-compose.yml` to run the full stack
- **Security**: Always change default passwords in production
- **Backups**: Implement regular database backups in production
- **Scaling**: For production, consider using PostgreSQL replication and Redis Sentinel

## 🆘 Support

For more information, see:
- [Docker Documentation](https://docs.docker.com/)
- [PostgreSQL Documentation](https://www.postgresql.org/docs/)
- [Prisma Documentation](https://www.prisma.io/docs/)
- [Next.js Documentation](https://nextjs.org/docs)

