| .. | ||
| backend | ||
| dev | ||
| frontend | ||
| nginx | ||
| prod | ||
| entrypoint.sh | ||
| README.md | ||
| supervisord.conf | ||
Trip Planner - Docker Setup
This directory contains Docker configurations for both development and production environments.
Directory Structure
docker/
├── README.md # This file
├── dev/ # Development environment documentation
│ └── README.md
├── prod/ # Production environment documentation
│ └── README.md
├── backend/ # Backend service configurations
│ ├── Dockerfile.dev
│ ├── Dockerfile.prod
│ └── supervisord.conf
├── frontend/ # Frontend service configurations
│ ├── Dockerfile.dev
│ └── Dockerfile.prod
├── nginx/ # Nginx configurations
│ ├── backend.conf # Backend API nginx config
│ ├── frontend.conf # Frontend SPA nginx config
│ └── production.conf # All-in-one production nginx config
├── supervisord.conf # Supervisord config for production
└── entrypoint.sh # Production container entrypoint script
Environments
Development Environment
Architecture: Multi-container setup with separate services
- Frontend (React + Vite dev server)
- Backend (Laravel + PHP-FPM)
- Database (MariaDB)
- Redis
- Mailpit (email testing)
Use case: Local development with hot-reloading and debugging
Documentation: See dev/README.md
Docker Compose: docker-compose.dev.yml (in project root)
Production Environment
Architecture: Single all-in-one container with all services
- Frontend (built React app served by Nginx)
- Backend (Laravel + PHP-FPM + Nginx)
- Database (MariaDB - internal)
- Redis (internal)
- All managed by Supervisord
Use case: Production deployment with minimal footprint
Documentation: See prod/README.md
Docker Compose: docker-compose.prod.yml (in project root)
Key Differences
| Aspect | Development | Production |
|---|---|---|
| Containers | Multiple (5 services) | Single all-in-one |
| Frontend | Vite dev server with HMR | Pre-built static files |
| Backend | Live code mounting | Copied into image |
| Database | Separate container | Internal to main container |
| Redis | Separate container | Internal to main container |
| Volumes | Source code mounted | Persistent data only |
| Ports | Multiple (5173, 8000, 3306, etc.) | Single port (80) |
| Size | ~2GB+ | ~800MB |
Port Allocation
Development (default ports)
- Frontend: 5173
- Backend: 8000
- Database: 3306
- Redis: 6379
- Mailpit UI: 8025
- Mailpit SMTP: 1025
Production (default ports)
- Application: 8080 (configurable via
APP_PORT)
Note: When running both dev and production locally, ensure they don't use conflicting ports. The production setup defaults to port 8080 to avoid conflicts with the dev setup.
Quick Start
Development
# Start all dev services
docker compose -f docker-compose.dev.yml up
# Stop all dev services
docker compose -f docker-compose.dev.yml down
Production (Local Testing)
# Build and start production container
docker compose -f docker-compose.prod.yml up --build
# Stop production container
docker compose -f docker-compose.prod.yml down
Environment Variables
Both environments use environment variables for configuration:
- Development:
.env.localin project root - Production:
.envor pass via docker-compose environment section
See the respective README files for detailed environment variable documentation.
Building Images
Development
Development images are built automatically when you run docker compose up.
Production
# Build the production image
docker build -f Dockerfile.prod -t trip-planner:latest .
# Or use docker-compose
docker compose -f docker-compose.prod.yml build
CI/CD
The production image is automatically built and pushed to Codeberg Container Registry when changes are merged to the main branch.
See .woodpecker.yml in the project root for pipeline configuration.
Troubleshooting
Development Issues
See dev/README.md
Production Issues
See prod/README.md
Security Notes
- Development setup runs with elevated privileges for convenience
- Production setup follows security best practices:
- Non-root users where possible
- Minimal base images
- No unnecessary privileges
- Security headers configured
- Internal services (DB, Redis) bound to localhost only
Need Help?
- Check the specific environment README files in
dev/orprod/ - Review the main project documentation
- Check container logs:
docker logs <container-name>