Troubleshooting

This page covers common issues and their solutions. For job-specific debugging, see Debugging Failed Jobs.

Quick Diagnostics

Run these checks first when something is wrong:

# Service status
systemctl status multiflexi-scheduler multiflexi-executor multiflexi-eventor

# Recent executor errors
sudo journalctl -u multiflexi-executor -n 50 --no-pager

# Recent scheduler errors
sudo journalctl -u multiflexi-scheduler -n 50 --no-pager

# Web server errors
sudo tail -20 /var/log/apache2/error.log

# Application log
sudo tail -20 /var/log/multiflexi/multiflexi.log

Authentication Issues

Invalid Security Token

Symptom: “Invalid security token.” error when logging in.

Cause: CSRF token mismatch — usually a stale session or browser cache issue.

Solutions:

  1. Clear browser cookies and cache for the MultiFlexi domain

  2. Try an incognito/private browser window

  3. Verify PHP session storage is writable:

    ls -la $(php -r "echo session_save_path();")
    # Should be writable by the web server user (www-data)
    
  4. Restart PHP-FPM and web server:

    sudo systemctl restart php8.2-fpm apache2
    
  5. Check server time synchronization:

    timedatectl status
    

Sessions Expire Much Sooner Than SESSION_TIMEOUT

Symptom: Users are silently logged out after ~20-30 minutes of inactivity, well short of the SESSION_TIMEOUT configured in /etc/multiflexi/multiflexi.env (default 14400s / 4h). No “Your session has expired” message is shown - the user just appears logged out, and a DataTables view being polled in the background (e.g. the Jobs list) may briefly show an “Invalid JSON response” warning if this happens mid-poll.

Cause: on Debian/Ubuntu, PHP session files under session.save_path (default /var/lib/php/sessions) are reaped by an OS-level housekeeper independent of the application - either a cron job (/etc/cron.d/php) or, on systemd hosts, the phpsessionclean.timer / phpsessionclean.service pair (check which is active with systemctl list-timers | grep sess). Both read session.gc_maxlifetime directly from the PHP-FPM pool’s on-disk php.ini - Debian’s stock default is 1440 seconds (24 minutes). MultiFlexi’s own SessionManager calls ini_set('session.gc_maxlifetime', ...) with the configured SESSION_TIMEOUT, but that only affects the current PHP-FPM worker process for the current request - it never reaches the static php.ini that the standalone cleanup script parses. So whichever value is smaller wins in practice, and on a stock Debian/Ubuntu PHP-FPM pool that’s almost always the 24-minute system default, not the app’s own timeout.

Because the session file simply disappears (rather than the app detecting an expired/invalid session), session.use_strict_mode (which MultiFlexi does set) causes PHP to silently start a brand-new, empty session instead of erroring - so the app’s own “session expired, redirecting to login” flow never triggers for this case, and the logout happens with no warning.

Solutions:

  1. Check what the PHP-FPM pool serving MultiFlexi actually has configured:

    php -i | grep -i gc_maxlifetime
    systemctl list-timers | grep sess
    
  2. Give MultiFlexi its own PHP-FPM pool (recommended if it shares the default www pool with other applications) with php_admin_value[session.gc_maxlifetime] = <SESSION_TIMEOUT seconds>, matching the value configured in /etc/multiflexi/multiflexi.env. This is the only way to make the pool-wide setting - and therefore what the cleanup timer reads - match the app’s intended timeout without affecting other applications sharing the default pool.

  3. Alternatively, raise session.gc_maxlifetime in the shared pool’s php.ini directly, accepting that this also extends session lifetime for any other application sharing that pool.

Cannot Log In (Wrong Password)

If you forget the administrator password, reset it via CLI:

multiflexi-cli user update --login=admin --password=newpassword

Jobs Not Running

Jobs Stay in “Pending” State

Cause: Executor daemon is not running.

systemctl status multiflexi-executor
sudo systemctl start multiflexi-executor

If it keeps failing to start:

sudo journalctl -u multiflexi-executor -n 100
# Look for "PHP Fatal error" or "Connection refused"

No New Jobs Being Created

Cause: Scheduler daemon is not running, or all RunTemplates are inactive.

systemctl status multiflexi-scheduler
multiflexi-cli run-template:list  # check Active column

Job Fails Immediately (exit code non-zero)

  1. Open the job in the web interface → Artifacts → read stderr.txt

  2. Check that the application package is installed:

    dpkg -l | grep <app-name>
    
  3. Run the application manually with the same environment:

    multiflexi-cli run-template:get --id=<ID> --export | bash -c 'eval "$(cat)" && <executable>'
    

See Debugging Failed Jobs for a complete walkthrough.

Job Runs Forever / Never Finishes

Cause: Usually the application hangs waiting for input, or the executor hit its memory ceiling (2 GB) and restarted.

# Check for zombie processes
ps aux | grep multiflexi

# Check memory usage
sudo journalctl -u multiflexi-executor | grep -i memory

# Check if executor restarted
sudo journalctl -u multiflexi-executor | grep "Started\|Stopped"

Credential Issues

Credential Fields Not Passed to Job

Cause: The CredentialType is not assigned to the RunTemplate.

multiflexi-cli run-template:list-credentials --id=<ID>
# If empty, assign the credential:
multiflexi-cli run-template:assign-credential --id=<ID> --credentialtype=<ID>

Wrong Values in Credentials

# Show current values
multiflexi-cli credential-type:get --id=<ID>

# Update
multiflexi-cli credential-type:update --id=<ID> --FIELD_NAME=newvalue

Installation Issues

APT Repository Not Found

# Re-add the repository
sudo curl -fsSL https://repo.multiflexi.eu/KEY.gpg \
  -o /usr/share/keyrings/multiflexi-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/multiflexi-archive-keyring.gpg] \
  https://repo.multiflexi.eu/ $(lsb_release -sc) main" | \
  sudo tee /etc/apt/sources.list.d/multiflexi.list
sudo apt update

Database Migration Fails During Install

# Check database connectivity
mysql -u multiflexi -p -h 127.0.0.1 multiflexi -e "SHOW TABLES;"

# Run migrations manually
sudo -u multiflexi php /usr/share/multiflexi/vendor/bin/phinx migrate \
  -c /etc/multiflexi/phinx.php

Web Interface Issues

White Screen / HTTP 500

sudo tail -50 /var/log/apache2/error.log
sudo tail -50 /var/log/multiflexi/multiflexi.log

# Enable debug mode temporarily
echo "APP_DEBUG=true" | sudo tee -a /etc/multiflexi/multiflexi.env
sudo systemctl reload apache2

# Revert after fixing
sudo sed -i '/APP_DEBUG=true/d' /etc/multiflexi/multiflexi.env

Page Not Found (404) for /multiflexi

# Ensure mod_rewrite is enabled
sudo a2enmod rewrite
sudo systemctl restart apache2

# Check Apache site configuration
sudo cat /etc/apache2/conf-available/multiflexi.conf

Slow Performance

# Check database query performance
mysql -u root -p multiflexi -e "SHOW PROCESSLIST;"

# Optimize heavy tables
mysql -u root -p multiflexi -e "OPTIMIZE TABLE job, artifacts, logger;"

# Purge old job data
multiflexi-cli job cleanup --older-than=90

Docker Deployment Issues

Container Cannot Reach Database

# Check service health in Docker Compose
docker compose ps

# Test database connectivity from web container
docker compose exec web mysql -u multiflexi -p -h db multiflexi -e "SHOW TABLES;"

Container Keeps Restarting

docker compose logs executor
docker compose logs scheduler

See Docker Deployment for full Docker troubleshooting.

Zabbix Integration Issues

Metrics Not Appearing in Zabbix

  1. Verify the Zabbix sender configuration:

    grep ZABBIX /etc/multiflexi/multiflexi.env
    
  2. Test connectivity to the Zabbix server:

    nc -zv <ZABBIX_SERVER> 10051
    
  3. Check that the MultiFlexi host exists in Zabbix and has the template applied.

See Zabbix Integration for setup details.

Getting Help

If none of the above resolves your issue:

  1. Check the GitHub Issues for known bugs

  2. Review the full documentation at https://multiflexi.readthedocs.io/

  3. Open a new GitHub issue with: - MultiFlexi version: dpkg -l multiflexi - OS and PHP version: lsb_release -a && php -v - Relevant log output - Steps to reproduce

See Also