Skip to main content

Overview

Effective monitoring ensures your ipMoodle deployment runs smoothly and helps identify issues before they impact users. This page covers container health monitoring, log management, and performance tracking.

Container Health Monitoring

Checking Container Status

View the status of all ipMoodle containers:
docker compose ps
Expected output shows all containers as “running”:
NAME           COMMAND                  SERVICE   STATUS    PORTS
moodle_app     "docker-php-entrypoi…"   app       running   
moodle_cron    "sh -c 'echo '*/1 * …"   cron      running   
moodle_db      "docker-entrypoint.s…"   db        running   
moodle_web     "/docker-entrypoint.…"   web       running   0.0.0.0:80->80/tcp

Real-Time Container Monitoring

1

Monitor resource usage

View CPU, memory, and network stats:
docker stats moodle_app moodle_db moodle_web moodle_cron
2

Check container uptime

See how long containers have been running:
docker ps --format "table {{.Names}}\t{{.Status}}"
3

Inspect container details

View detailed container configuration:
docker inspect moodle_app

Container Restart Policies

All ipMoodle containers use restart: always to ensure automatic recovery:
restart: always
Containers automatically restart after crashes or system reboots. Check restart counts to identify unstable containers: docker inspect moodle_app | grep RestartCount

Log Management

Viewing Container Logs

# Tail logs in real-time
docker logs -f moodle_app

# View last 100 lines
docker logs --tail 100 moodle_app

# Show logs since specific time
docker logs --since 1h moodle_app
# Access logs
docker logs -f moodle_web

# View only errors
docker logs moodle_web 2>&1 | grep error
# Database logs
docker logs -f moodle_db

# Connection errors
docker logs moodle_db | grep "connection"
# Monitor cron jobs
docker logs -f moodle_cron

# Check for cron errors
docker logs moodle_cron | grep -i error

Centralized Log Collection

Export logs to files for analysis:
# Export all logs
docker logs moodle_app > /var/log/moodle/app.log
docker logs moodle_web > /var/log/moodle/web.log
docker logs moodle_db > /var/log/moodle/db.log
docker logs moodle_cron > /var/log/moodle/cron.log

Log Rotation

Prevent Docker logs from consuming too much disk space:
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
Add this to /etc/docker/daemon.json and restart Docker:
sudo systemctl restart docker
After modifying Docker daemon configuration, you must recreate containers for changes to take effect: docker compose up -d --force-recreate

Moodle Application Logs

Accessing Moodle Logs

Moodle stores detailed logs in the database and file system:
# View PHP error log
docker exec moodle_app tail -f /var/log/php8/error.log

# Check Moodle data directory for logs
docker exec moodle_app ls -la /var/www/moodledata/

Common Log Locations

Log TypeLocation
PHP errors/var/log/php8/error.log
Moodle debug/var/www/moodledata/ (if file logging enabled)
Nginx accessContainer stdout
Nginx errorContainer stderr
PostgreSQLContainer stdout

Performance Monitoring

Database Performance

Monitor PostgreSQL query performance:
# Active queries
docker exec moodle_db psql -U moodle -d moodle -c "
  SELECT pid, age(clock_timestamp(), query_start), usename, query 
  FROM pg_stat_activity 
  WHERE query != '<IDLE>' AND query NOT ILIKE '%pg_stat_activity%' 
  ORDER BY query_start DESC;
"

# Database cache hit ratio
docker exec moodle_db psql -U moodle -d moodle -c "
  SELECT 
    sum(heap_blks_read) as heap_read,
    sum(heap_blks_hit)  as heap_hit,
    sum(heap_blks_hit) / (sum(heap_blks_hit) + sum(heap_blks_read)) as cache_ratio
  FROM pg_statio_user_tables;
"

# Table sizes
docker exec moodle_db psql -U moodle -d moodle -c "
  SELECT 
    schemaname,
    tablename,
    pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size
  FROM pg_tables
  WHERE schemaname = 'public'
  ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC
  LIMIT 10;
"

PHP-FPM Performance

Check PHP-FPM process status:
# View PHP-FPM processes
docker exec moodle_app ps aux | grep php-fpm

# Check PHP configuration
docker exec moodle_app php -i | grep -E "memory_limit|max_execution_time|upload_max_filesize"

Disk Space Monitoring

1

Check volume disk usage

du -sh ./html ./moodledata ./db_data
2

Monitor moodledata growth

# Detailed breakdown
du -h --max-depth=1 ./moodledata | sort -hr

# Find largest files
find ./moodledata -type f -size +100M -exec ls -lh {} \;
3

Database size tracking

docker exec moodle_db psql -U moodle -d moodle -c "
  SELECT pg_size_pretty(pg_database_size('moodle')) AS database_size;
"

Network Monitoring

Container Network Connectivity

Verify network communication between containers:
# Test app to database connection
docker exec moodle_app nc -zv db 5432

# Test web to app connection
docker exec moodle_web nc -zv app 9000

# Inspect network
docker network inspect moodleip_moodle-net

Port Accessibility

Check if Nginx is accessible from the host:
# Local check
curl -I http://localhost

# External check (replace with your domain)
curl -I http://your-domain.com

Health Check Scripts

Automated Health Monitoring

Create a health check script:
#!/bin/bash
# health_check.sh

echo "=== ipMoodle Health Check ==="
echo ""

# Check container status
echo "Container Status:"
docker compose ps

# Check disk space
echo -e "\nDisk Usage:"
df -h | grep -E "Filesystem|/opt/moodleip"

# Check database connectivity
echo -e "\nDatabase Connection:"
docker exec moodle_app nc -zv db 5432 && echo "✓ Database reachable" || echo "✗ Database unreachable"

# Check web server
echo -e "\nWeb Server:"
curl -s -o /dev/null -w "%{http_code}" http://localhost | grep -q 200 && echo "✓ Web server responding" || echo "✗ Web server not responding"

# Check cron
echo -e "\nCron Status:"
docker ps | grep moodle_cron > /dev/null && echo "✓ Cron running" || echo "✗ Cron not running"

# Resource usage
echo -e "\nResource Usage:"
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
Make it executable:
chmod +x health_check.sh
./health_check.sh

Alerting

Email Alerts for Container Failures

Set up monitoring with email notifications:
#!/bin/bash
# monitor_containers.sh

CONTAINERS=("moodle_app" "moodle_db" "moodle_web" "moodle_cron")
EMAIL="[email protected]"

for container in "${CONTAINERS[@]}"; do
  if ! docker ps | grep -q $container; then
    echo "Container $container is down!" | mail -s "ipMoodle Alert: Container Down" $EMAIL
  fi
done
Schedule with cron:
# Check every 5 minutes
*/5 * * * * /opt/moodleip/monitor_containers.sh
For production environments, consider using dedicated monitoring solutions like Prometheus, Grafana, or commercial services like Datadog or New Relic.

Metrics to Track

System Metrics

  • CPU usage per container
  • Memory consumption
  • Disk I/O
  • Network throughput

Application Metrics

  • Request response time
  • Database query performance
  • Cron job execution time
  • Error rates

Resource Metrics

  • Database size growth
  • moodledata volume size
  • Active user sessions
  • File upload counts

Availability Metrics

  • Container uptime
  • HTTP response codes
  • Database connection pool
  • Failed login attempts

Build docs developers (and LLMs) love