Docker Deployment¶
MultiFlexi provides a complete Docker-based deployment solution using Docker Compose. This setup allows you to run the entire MultiFlexi stack in containers, making deployment and management easier across different environments.
Overview¶
The Docker setup includes the following services:
web: MultiFlexi web interface (Apache + PHP)
executor: MultiFlexi job executor daemon
scheduler: MultiFlexi job scheduler daemon
db: MySQL 8.0 database
redis: Redis cache server
All services are orchestrated using Docker Compose and follow the same architecture as systemd-based installations.
Quick Start¶
Navigate to the docker directory:
cd docker/Copy the environment templates:
cp .env.example .env cp multiflexi.env.example multiflexi.env
Edit the configuration files:
nano .env # Docker Compose environment nano multiflexi.env # MultiFlexi application environment
Start the services:
docker-compose up -dAccess the web interface at http://localhost:8080
Service Architecture¶
Executor Service¶
The executor service runs the MultiFlexi job executor daemon:
Base Image: debian:bookworm-slim
Package: multiflexi-executor (from VitexSoftware repository)
Command:
/usr/bin/php /usr/lib/multiflexi-executor/daemon.phpUser: multiflexi:multiflexi
Purpose: Executes scheduled MultiFlexi jobs
This matches the systemd service definition in /usr/lib/systemd/system/multiflexi-executor.service.
Scheduler Service¶
The scheduler service runs the MultiFlexi job scheduler daemon:
Base Image: debian:bookworm-slim
Package: multiflexi-scheduler (from VitexSoftware repository)
Command:
/usr/bin/php /usr/lib/multiflexi-scheduler/daemon.phpUser: multiflexi:multiflexi
Purpose: Manages job scheduling and timing
This matches the systemd service definition in /usr/lib/systemd/system/multiflexi-scheduler.service.
Web Service¶
The web service provides the MultiFlexi web interface:
Base Image: Uses existing Dockerfile (Debian + Apache + PHP)
Port: 8080 (configurable via WEB_PORT)
Document Root: /opt/multiflexi/src
Purpose: Web interface and API access
Database Service¶
MySQL 8.0 database service:
Image: mysql:8.0
Port: 3306 (configurable via DB_PORT)
Health Check: Built-in MySQL ping
Persistence: Named volume for data
Redis Service¶
Redis cache service:
Image: redis:7-alpine
Purpose: Caching and job queues
Persistence: Named volume for data
Configuration¶
Docker Compose Environment (.env)¶
Docker Compose specific settings:
# Web Configuration
WEB_PORT=8080
# Database Configuration
DB_CONNECTION=mysql
DB_DATABASE=multiflexi
DB_USERNAME=multiflexiuser
DB_PASSWORD=secure_user_password
MYSQL_ROOT_PASSWORD=very_secure_root_password
# Optional: Database port exposure
DB_PORT=3306
MultiFlexi Environment (multiflexi.env)¶
Application-specific settings that match the systemd service configuration:
# Database Configuration
DB_CONNECTION=mysql
DB_HOST=db
DB_DATABASE=multiflexi
DB_USERNAME=multiflexiuser
DB_PASSWORD=secure_user_password
# Application Configuration
MULTIFLEXI_DEBUG=false
MULTIFLEXI_LOG_LEVEL=info
# Paths
MULTIFLEXI_CONFIG_DIR=/etc/multiflexi
MULTIFLEXI_LOG_DIR=/var/log/multiflexi
# Timezone
TZ=Europe/Prague
Volume Management¶
The setup uses named volumes for data persistence:
db_data: MySQL database filesredis_data: Redis dataweb_logs: Apache access and error logsexecutor_logs: Executor service logsscheduler_logs: Scheduler service logssqlite_data: SQLite database files (if using SQLite)config_data: MultiFlexi configuration files
Package Installation¶
The Dockerfiles use apt install multiflexi-* packages from the VitexSoftware repository instead of copying source files. This approach provides several benefits:
Consistency¶
Same packages as system installations
Identical file locations and permissions
Consistent behavior across environments
Dependency Management¶
All required PHP modules automatically installed
Proper system integration
Correct package dependencies resolved
Security¶
Official package updates and security patches
No custom build processes
Trusted package signatures
Repository Configuration¶
Both Dockerfiles add the VitexSoftware repository:
# Add VitexSoftware repository
RUN apt-get update && apt-get install -y \
wget \
lsb-release \
apt-transport-https \
gpg \
&& echo "deb http://repo.vitexsoftware.com $(lsb_release -sc) main backports" | tee /etc/apt/sources.list.d/vitexsoftware.list \
&& wget -O /etc/apt/trusted.gpg.d/vitexsoftware.gpg http://repo.vitexsoftware.cz/keyring.gpg \
&& apt-get update
Management Commands¶
Starting Services¶
# Start all services in background
docker-compose up -d
# Start specific service
docker-compose up -d executor
Viewing Logs¶
# View all logs
docker-compose logs -f
# View specific service logs
docker-compose logs -f executor
docker-compose logs -f scheduler
Stopping Services¶
# Stop all services
docker-compose down
# Stop and remove volumes (destructive)
docker-compose down -v
Service Status¶
# Check service status
docker-compose ps
# Check service health
docker-compose exec db mysqladmin ping -h localhost
Rebuilding Images¶
# Rebuild all images
docker-compose build --no-cache
# Rebuild specific service
docker-compose build --no-cache executor
Database Management¶
# Database backup
docker-compose exec db mysqladmin -u root -p multiflexi > backup.sql
# Database restore
docker-compose exec -i db mysql -u root -p multiflexi < backup.sql
# Connect to database
docker-compose exec db mysql -u root -p
Troubleshooting¶
Service Won’t Start¶
Check the logs:
docker-compose logs [service_name]Verify configuration files exist:
ls -la .env multiflexi.envCheck for port conflicts:
netstat -tulpn | grep :8080
Database Connection Issues¶
Ensure database service is healthy:
docker-compose ps dbTest database connectivity from executor:
docker-compose exec executor php -r "echo 'DB connection test';"Check database logs:
docker-compose logs db
Environment File Issues¶
Verify the multiflexi.env file is properly mounted:
docker-compose exec executor cat /etc/multiflexi/multiflexi.env
Permission Issues¶
If you encounter permission issues, ensure the multiflexi user has proper access:
# Check user in container
docker-compose exec executor id
# Check file permissions
docker-compose exec executor ls -la /etc/multiflexi/
Port Conflicts¶
If ports 8080 or 3306 are already in use:
Change ports in
.envfile:WEB_PORT=8081 DB_PORT=3307
Restart services:
docker-compose down && docker-compose up -d
Differences from SystemD¶
When running in Docker vs systemd:
SystemD Services¶
Services managed by systemd init system
Background daemon processes
Automatic restart on failure
System integration with journal logging
Docker Services¶
Services run as foreground processes in containers
Docker handles process management and restarts
Container-based isolation
Structured logging to stdout/stderr
Common Elements¶
Commands: Identical PHP daemon commands
User: Same multiflexi:multiflexi user/group
Environment: Same
/etc/multiflexi/multiflexi.envformatNo Cron: Both use PHP daemon processes, not cron jobs
Packages: Same VitexSoftware packages
Production Considerations¶
Resource Limits¶
Consider adding resource limits to your docker-compose.yml:
services:
executor:
deploy:
resources:
limits:
cpus: '0.50'
memory: 512M
reservations:
memory: 256M
Logging¶
Configure log rotation and retention:
services:
web:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
Health Checks¶
Add custom health checks for application services:
services:
executor:
healthcheck:
test: ["CMD", "php", "-f", "/usr/lib/multiflexi-executor/health-check.php"]
interval: 30s
timeout: 10s
retries: 3
Security¶
Use strong passwords in environment files
Keep environment files out of version control
Regularly update base images and packages
Consider using Docker secrets for sensitive data
Run containers with read-only root filesystem where possible
Backup Strategy¶
Regular database backups using
docker-compose execBackup named volumes containing persistent data
Store configuration files in version control
Test restore procedures regularly
Monitoring¶
Monitor container health and resource usage
Set up log aggregation for centralized logging
Configure alerts for service failures
Monitor database performance and storage usage