253 lines
5.0 KiB
Markdown
253 lines
5.0 KiB
Markdown
# Docker Setup for Task Receipts
|
|
|
|
This document explains how to build and run the Task Receipts application using Docker.
|
|
|
|
## Prerequisites
|
|
|
|
- Docker installed and running
|
|
- Docker Compose (usually included with Docker Desktop)
|
|
|
|
## Quick Start
|
|
|
|
### Option 1: Using Docker Compose (Recommended)
|
|
|
|
1. **Build and run both services:**
|
|
```bash
|
|
docker-compose up --build
|
|
```
|
|
|
|
2. **Run in background:**
|
|
```bash
|
|
docker-compose up -d --build
|
|
```
|
|
|
|
3. **Stop services:**
|
|
```bash
|
|
docker-compose down
|
|
```
|
|
|
|
### Option 2: Using the Build Script
|
|
|
|
1. **Build both images:**
|
|
```bash
|
|
./build-docker.sh
|
|
```
|
|
|
|
2. **Build with specific version:**
|
|
```bash
|
|
./build-docker.sh v1.0.0
|
|
```
|
|
|
|
3. **Run containers individually:**
|
|
```bash
|
|
# Run server
|
|
docker run -p 4000:4000 task-receipts-server:latest
|
|
|
|
# Run client (in another terminal)
|
|
docker run -p 80:80 task-receipts-client:latest
|
|
```
|
|
|
|
## Services
|
|
|
|
### Server
|
|
- **Port:** 4000
|
|
- **Health Check:** GraphQL endpoint at `/graphql`
|
|
- **Database:** SQLite (persisted in `./server/data`)
|
|
- **Features:**
|
|
- GraphQL API
|
|
- YAML import/export
|
|
- Receipt printing
|
|
- Database management
|
|
|
|
### Client
|
|
- **Port:** 80
|
|
- **Web Server:** Nginx
|
|
- **Features:**
|
|
- React application
|
|
- Material-UI components
|
|
- Apollo Client for GraphQL
|
|
|
|
## Docker Images
|
|
|
|
### Client Image (`task-receipts-client`)
|
|
- **Base:** `nginx:stable` (Ubuntu-based)
|
|
- **Build:** Multi-stage build with Node.js 18 (Ubuntu-based)
|
|
- **Size:** Optimized for production
|
|
- **Features:**
|
|
- Static file serving
|
|
- Gzip compression
|
|
- Security headers
|
|
|
|
### Server Image (`task-receipts-server`)
|
|
- **Base:** `node:18-slim` (Ubuntu-based)
|
|
- **Build:** Multi-stage build with Node.js 18 (Ubuntu-based)
|
|
- **Size:** Optimized for production
|
|
- **Features:**
|
|
- Non-root user execution
|
|
- Health checks
|
|
- Graceful shutdown handling
|
|
- Signal handling with dumb-init
|
|
|
|
## Development
|
|
|
|
### Building Individual Images
|
|
|
|
```bash
|
|
# Build client only
|
|
cd client
|
|
docker build -t task-receipts-client:dev .
|
|
|
|
# Build server only
|
|
cd server
|
|
docker build -t task-receipts-server:dev .
|
|
```
|
|
|
|
### Development with Docker Compose
|
|
|
|
Create a `docker-compose.dev.yml` for development:
|
|
|
|
```yaml
|
|
version: '3.8'
|
|
|
|
services:
|
|
server:
|
|
build:
|
|
context: ./server
|
|
dockerfile: Dockerfile
|
|
ports:
|
|
- "4000:4000"
|
|
environment:
|
|
- NODE_ENV=development
|
|
volumes:
|
|
- ./server/src:/app/src
|
|
- ./shared:/app/shared
|
|
command: npm run dev
|
|
|
|
client:
|
|
build:
|
|
context: ./client
|
|
dockerfile: Dockerfile
|
|
ports:
|
|
- "5173:80"
|
|
volumes:
|
|
- ./client/src:/app/src
|
|
- ./shared:/app/shared
|
|
```
|
|
|
|
## Configuration
|
|
|
|
### Environment Variables
|
|
|
|
The server supports the following environment variables:
|
|
|
|
- `NODE_ENV`: Environment (production/development)
|
|
- `PORT`: Server port (default: 4000)
|
|
|
|
### Database Persistence
|
|
|
|
The server's SQLite database is persisted in the `./server/data` directory when using Docker Compose.
|
|
|
|
## Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
1. **Port conflicts:**
|
|
- Ensure ports 80 and 4000 are available
|
|
- Modify ports in `docker-compose.yml` if needed
|
|
|
|
2. **Build failures:**
|
|
- Check Docker is running
|
|
- Ensure all source files are present
|
|
- Check network connectivity for npm packages
|
|
|
|
3. **Client can't connect to server:**
|
|
- Verify server is running and healthy
|
|
- Check CORS configuration
|
|
- Ensure proper network connectivity
|
|
|
|
### Logs
|
|
|
|
```bash
|
|
# View all logs
|
|
docker-compose logs
|
|
|
|
# View specific service logs
|
|
docker-compose logs server
|
|
docker-compose logs client
|
|
|
|
# Follow logs in real-time
|
|
docker-compose logs -f
|
|
```
|
|
|
|
### Health Checks
|
|
|
|
```bash
|
|
# Check service health
|
|
docker-compose ps
|
|
|
|
# Check individual container health
|
|
docker inspect task-receipts-server | grep Health -A 10
|
|
```
|
|
|
|
## Production Deployment
|
|
|
|
### Using Docker Compose
|
|
|
|
1. **Build and deploy:**
|
|
```bash
|
|
docker-compose -f docker-compose.yml up -d --build
|
|
```
|
|
|
|
2. **Update services:**
|
|
```bash
|
|
docker-compose pull
|
|
docker-compose up -d
|
|
```
|
|
|
|
### Using Individual Containers
|
|
|
|
1. **Build images:**
|
|
```bash
|
|
./build-docker.sh v1.0.0
|
|
```
|
|
|
|
2. **Deploy with orchestration:**
|
|
```bash
|
|
# Example with Docker Swarm or Kubernetes
|
|
docker stack deploy -c docker-compose.yml task-receipts
|
|
```
|
|
|
|
## Security Considerations
|
|
|
|
- Images run as non-root users
|
|
- Ubuntu-based images for better security and performance
|
|
- No sensitive data in images
|
|
- Health checks for monitoring
|
|
- Graceful shutdown handling
|
|
|
|
## Performance Optimization
|
|
|
|
- Multi-stage builds reduce image size
|
|
- Nginx for static file serving
|
|
- Ubuntu-based images for better performance
|
|
- Production-only dependencies in final images
|
|
- Layer caching optimization
|
|
|
|
## Monitoring
|
|
|
|
### Health Checks
|
|
- Server: GraphQL endpoint availability
|
|
- Client: Nginx process status
|
|
|
|
### Metrics
|
|
- Container resource usage
|
|
- Application logs
|
|
- Health check status
|
|
|
|
## Support
|
|
|
|
For issues with the Docker setup:
|
|
1. Check the troubleshooting section
|
|
2. Review container logs
|
|
3. Verify Docker and Docker Compose versions
|
|
4. Ensure all prerequisites are met |