# 🐳 Docker Setup Guide for QR Master Complete guide for setting up and running QR Master with Docker and PostgreSQL. ## Prerequisites - Docker Desktop (Windows/Mac) or Docker Engine (Linux) - Docker Compose V2 - Git - Node.js 18+ (for local development) ## 🚀 Getting Started ### Option 1: Development Mode (Recommended for Development) Run only the database services in Docker and the Next.js app on your host machine: 1. **Clone the repository** ```bash git clone cd QRMASTER ``` 2. **Install dependencies** ```bash npm install ``` 3. **Set up environment variables** ```bash cp env.example .env ``` Edit `.env` and update the values, especially: - `NEXTAUTH_SECRET` (generate with: `openssl rand -base64 32`) - `IP_SALT` (generate with: `openssl rand -base64 32`) 4. **Start database services** ```bash npm run docker:dev ``` This starts PostgreSQL, Redis, and Adminer. 5. **Run database migrations** ```bash npm run db:migrate ``` 6. **Seed the database (optional)** ```bash npm run db:seed ``` 7. **Start the development server** ```bash npm run dev ``` 8. **Access the application** - **App**: http://localhost:3050 - **Database UI (Adminer)**: http://localhost:8080 - System: PostgreSQL - Server: db - Username: postgres - Password: postgres - Database: qrmaster ### Option 2: Full Production Mode Run everything in Docker containers: 1. **Clone and configure** ```bash git clone cd QRMASTER cp env.example .env ``` 2. **Update environment variables in `.env`** Make sure to set strong secrets in production! 3. **Build and start all services** ```bash npm run docker:prod ``` 4. **Run migrations inside the container** ```bash docker-compose exec web npx prisma migrate deploy ``` 5. **Access the application** - **App**: http://localhost:3050 ## 📦 What Gets Installed ### Services 1. **PostgreSQL 16** - Main database - Port: 5432 - Database: qrmaster - User: postgres - Password: postgres (change in production!) 2. **Redis 7** - Caching and rate limiting - Port: 6379 - Max memory: 256MB with LRU eviction - Persistence: AOF enabled 3. **Next.js App** - The QR Master application - Port: 3000 - Built with production optimizations 4. **Adminer** - Database management UI (dev only) - Port: 8080 - Lightweight alternative to pgAdmin ## 🗄️ Database Management ### Prisma Commands ```bash # Generate Prisma Client npm run db:generate # Create a new migration npm run db:migrate # Deploy migrations (production) npm run db:deploy # Seed the database npm run db:seed # Open Prisma Studio npm run db:studio ``` ### Direct PostgreSQL Access ```bash # Connect to PostgreSQL docker-compose exec db psql -U postgres -d qrmaster # Backup database docker-compose exec db pg_dump -U postgres qrmaster > backup_$(date +%Y%m%d).sql # Restore database docker-compose exec -T db psql -U postgres qrmaster < backup.sql ``` ## 🔧 Docker Commands ### Starting Services ```bash # Development mode (database only) npm run docker:dev # or docker-compose -f docker-compose.dev.yml up -d # Production mode (full stack) npm run docker:prod # or docker-compose up -d --build # Production with database UI docker-compose --profile dev up -d ``` ### Stopping Services ```bash # Stop all services npm run docker:stop # or docker-compose down # Stop and remove volumes (⚠️ deletes data!) docker-compose down -v ``` ### Viewing 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 ``` ### Rebuilding ```bash # Rebuild the web application docker-compose build web # Rebuild without cache docker-compose build --no-cache web # Rebuild and restart docker-compose up -d --build web ``` ## 🌍 Environment Variables ### Required Variables ```env # Database (automatically set for Docker) DATABASE_URL=postgresql://postgres:postgres@db:5432/qrmaster?schema=public # NextAuth NEXTAUTH_URL=http://localhost:3050 NEXTAUTH_SECRET= # Security IP_SALT= ``` ### Optional Variables ```env # OAuth (Google) GOOGLE_CLIENT_ID= GOOGLE_CLIENT_SECRET= # Redis (automatically set for Docker) REDIS_URL=redis://redis:6379 # Features ENABLE_DEMO=false ``` ### Generating Secrets ```bash # On Linux/Mac openssl rand -base64 32 # On Windows (PowerShell) [Convert]::ToBase64String((1..32 | ForEach-Object { Get-Random -Maximum 256 })) ``` ## 🔍 Health Checks All services include health checks: ```bash # Check status of all services docker-compose ps # Check database health docker-compose exec db pg_isready -U postgres # Check Redis health docker-compose exec redis redis-cli ping # Check web app health curl http://localhost:3050 ``` ## 🐛 Troubleshooting ### Database Connection Failed ```bash # Check database is running docker-compose ps db # Check database logs docker-compose logs db # Restart database docker-compose restart db # Test connection docker-compose exec db psql -U postgres -d qrmaster -c "SELECT version();" ``` ### Port Already in Use ```bash # Windows - find process using port netstat -ano | findstr :3050 # Linux/Mac - find process using port lsof -i :3050 # Kill the process or change the port in docker-compose.yml ``` ### Migration Errors ```bash # Reset the database (⚠️ deletes all data!) docker-compose exec web npx prisma migrate reset # Or manually docker-compose down -v docker-compose up -d db redis npm run db:migrate ``` ### Container Won't Start ```bash # Remove all containers and volumes docker-compose down -v # Remove dangling images docker image prune # Rebuild from scratch docker-compose build --no-cache docker-compose up -d ``` ### Prisma Client Not Generated ```bash # Generate Prisma Client npm run db:generate # Or in Docker docker-compose exec web npx prisma generate ``` ## 🔐 Production Checklist Before deploying to production: - [ ] Change PostgreSQL password - [ ] Generate strong `NEXTAUTH_SECRET` - [ ] Generate strong `IP_SALT` - [ ] Set proper `NEXTAUTH_URL` (your domain) - [ ] Configure OAuth credentials (if using) - [ ] Set up database backups - [ ] Configure Redis persistence - [ ] Set up monitoring and logging - [ ] Enable HTTPS/SSL - [ ] Review and adjust rate limits - [ ] Set up a reverse proxy (nginx/Traefik) - [ ] Configure firewall rules - [ ] Set up automated database backups ## 📊 Monitoring ### Resource Usage ```bash # View resource usage docker stats # View specific container docker stats qrmaster-web qrmaster-db qrmaster-redis ``` ### Database Size ```bash # Check database size docker-compose exec db psql -U postgres -d qrmaster -c " SELECT pg_size_pretty(pg_database_size('qrmaster')) as db_size, pg_size_pretty(pg_total_relation_size('\"QRCode\"')) as qrcode_table_size; " ``` ### Redis Info ```bash # Get Redis info docker-compose exec redis redis-cli info # Get memory usage docker-compose exec redis redis-cli info memory ``` ## 🔄 Backup and Recovery ### Automated Backups Create a backup script `backup.sh`: ```bash #!/bin/bash BACKUP_DIR="./backups" TIMESTAMP=$(date +%Y%m%d_%H%M%S) mkdir -p $BACKUP_DIR # Backup database docker-compose exec -T db pg_dump -U postgres qrmaster > "$BACKUP_DIR/qrmaster_$TIMESTAMP.sql" # Backup Redis docker-compose exec redis redis-cli BGSAVE echo "Backup completed: $BACKUP_DIR/qrmaster_$TIMESTAMP.sql" ``` ### Restore from Backup ```bash # Stop the web service docker-compose stop web # Restore database cat backup_20241013.sql | docker-compose exec -T db psql -U postgres qrmaster # Restart docker-compose start web ``` ## 🚀 Performance Tips 1. **Increase PostgreSQL shared buffers** (in production): Edit `docker-compose.yml`: ```yaml db: command: postgres -c shared_buffers=256MB -c max_connections=100 ``` 2. **Enable Redis persistence**: Already configured with AOF in docker-compose.yml 3. **Use connection pooling**: Prisma already includes connection pooling 4. **Monitor slow queries**: ```bash docker-compose exec db psql -U postgres -d qrmaster -c " SELECT query, mean_exec_time, calls FROM pg_stat_statements ORDER BY mean_exec_time DESC LIMIT 10;" ``` ## 📚 Additional Resources - [Docker Documentation](https://docs.docker.com/) - [PostgreSQL Documentation](https://www.postgresql.org/docs/) - [Redis Documentation](https://redis.io/documentation) - [Prisma Documentation](https://www.prisma.io/docs/) - [Next.js Documentation](https://nextjs.org/docs) ## 🆘 Getting Help If you encounter issues: 1. Check the logs: `docker-compose logs -f` 2. Check service health: `docker-compose ps` 3. Review this guide 4. Check the `docker/README.md` for more details --- **Happy coding! 🎉**