This guide explains how to deploy the complete inventory management system using Docker and Docker Compose.
git clone <repository-url>
cd inventory
# Copy environment file
cp .env.example .env
# Edit configuration (optional)
nano .env
# Make build script executable
chmod +x build.sh
# Run the build script
./build.sh
The Docker setup creates a single container that includes:
inventory-app (main container)
├── Apache Web Server
├── PHP Backend (/var/www/html/api)
├── Vue.js Frontend (/var/www/html/frontend/dist)
├── Uploads (/var/www/html/uploads)
└── Configuration
inventory-redis (optional)
└── Redis 7 Cache
External Database (user-provided)
└── MySQL/MariaDB Database
# Database Configuration (External)
DB_HOST=your-external-db-host # Your database server
DB_PORT=3306
DB_NAME=inventory_db
DB_USER=your-db-username
DB_PASS=your-db-password
# Application Port
APP_PORT=80 # Web server port
# Redis (optional)
REDIS_PORT=6379
# Company Information
COMPANY_NAME=Your Company Name
COMPANY_ADDRESS=123 Business Street
COMPANY_CITY=Helsinki
COMPANY_POSTAL_CODE=00100
COMPANY_COUNTRY=Finland
COMPANY_PHONE=+358 123 456 789
COMPANY_EMAIL=info@yourcompany.com
COMPANY_Y_TUNNUS=1234567-8
# File Upload Configuration
UPLOAD_MAX_SIZE=10M
ALLOWED_FILE_TYPES=pdf,doc,docx,xls,xlsx,jpg,jpeg,png,gif
UPLOADS_PATH=./uploads
backend/migrate_complete.sql to create database schema# 1. Create database
mysql -u root -p -e "CREATE DATABASE inventory_db;"
# 2. Create user
mysql -u root -p -e "CREATE USER 'inventory_db'@'%' IDENTIFIED BY 'your_password';"
# 3. Grant permissions
mysql -u root -p -e "GRANT ALL PRIVILEGES ON inventory_db.* TO 'inventory_db'@'%';"
# 4. Import schema
mysql -u inventory_db -p inventory_db < backend/migrate_complete.sql
# 5. Flush privileges
mysql -u root -p -e "FLUSH PRIVILEGES;"
inventory/
├── Dockerfile # Multi-stage build (Node.js + PHP)
├── docker-compose.yml # Container orchestration
├── docker/
│ └── apache.conf # Apache configuration
├── backend/
│ ├── api/ # PHP API endpoints
│ ├── config/ # Configuration files
│ ├── models/ # PHP models
│ └── migrate_complete.sql # Database schema (for external DB)
├── frontend/
│ ├── src/ # Vue.js source code
│ ├── dist/ # Built frontend (generated)
│ └── package.json # Node.js dependencies
├── uploads/ # File upload directory
├── .env.example # Environment template
├── .env # Environment configuration
└── build.sh # Build script
docker-compose up -d
docker-compose down
# All logs
docker-compose logs
# Specific service logs
docker-compose logs inventory-app
docker-compose logs db
docker-compose logs redis
# Follow logs
docker-compose logs -f inventory-app
# Force rebuild without cache
docker-compose build --no-cache
# Rebuild specific service
docker-compose build inventory-app
# Access external database
mysql -h your-external-db-host -u your-db-username -p inventory_db
# Backup external database
mysqldump -h your-external-db-host -u your-db-username inventory_db > backup.sql
# Restore external database
mysql -h your-external-db-host -u your-db-username inventory_db < backup.sql
# Test connection from container
docker-compose exec inventory-app php -r "echo 'Testing DB connection...';"
# List containers
docker-compose ps
# Access container shell
docker-compose exec inventory-app bash
# Restart specific service
docker-compose restart inventory-app
# Update environment variables
docker-compose down
# Edit .env file
docker-compose up -d
# Check application logs
docker-compose logs inventory-app
# Test database connectivity from container
docker-compose exec inventory-app ping your-external-db-host
# Test database connection manually
docker-compose exec inventory-app php -r "
try {
\$pdo = new PDO('mysql:host=your-external-db-host;dbname=inventory_db', 'your-db-username', 'your-db-password');
echo 'Database connection successful';
} catch (Exception \$e) {
echo 'Database connection failed: ' . \$e->getMessage();
}
"
# Verify database schema exists
mysql -h your-external-db-host -u your-db-username -p inventory_db -e "SHOW TABLES;"
# Check application logs
docker-compose logs inventory-app
# Rebuild frontend
docker-compose build --no-cache inventory-app
# Check Apache configuration
docker-compose exec inventory-app apache2ctl -M
# Check uploads directory permissions
docker-compose exec inventory-app ls -la /var/www/html/uploads
# Fix permissions
docker-compose exec inventory-app chown -R www-data:www-data /var/www/html/uploads
docker-compose exec inventory-app chmod -R 755 /var/www/html/uploads
# Test API endpoint
curl http://localhost/api/company.php
# Check Apache status
docker-compose exec inventory-app service apache2 status
# Restart Apache
docker-compose exec inventory-app service apache2 restart
The application includes health checks:
/api/company.php endpointView health status:
docker-compose ps
# Secure .env file
chmod 600 .env
# Use secrets for sensitive data
echo "DB_PASSWORD=your_secure_password" > .env.secret
# Monitor resource usage
docker stats
# Monitor disk usage
docker-compose exec inventory-app df -h
# Monitor memory usage
docker-compose exec inventory-app free -m
# Pull latest code
git pull
# Rebuild and restart
docker-compose build --no-cache
docker-compose up -d
# Run database migrations if needed
docker-compose exec db mysql -u inventory_db inventory_db < migration.sql
# Backup database
docker-compose exec db mysqldump -u inventory_db inventory_db > backup_$(date +%Y%m%d).sql
# Backup uploads
tar -czf uploads_$(date +%Y%m%d).tar.gz uploads/
# Backup configuration
cp .env .env.backup
For issues with the Docker deployment:
docker-compose logsYour inventory management system is now running in Docker with: