A production-ready Docker stack for Ofelia - a modern cron job scheduler for Docker containers with integrated logrotate functionality.
Ofelia is a Docker job scheduler that enables running cron jobs directly in Docker containers. Instead of running a separate cron daemon in each container, Ofelia centrally manages all time-based tasks via Docker labels.
- Central management of all cron jobs for Docker containers
- Automatic log rotation with configurable schedule
- Secure configuration (Docker socket read-only)
- Timezone support (Europe/Berlin)
- Job logging in separate directory
- Production-ready with restart policy
- Docker Engine 20.10+
- Docker Compose 2.0+
- Access to
/var/run/docker.sock
- Clone repository:
git clone https://github.com/csaeum/DockerStackOfelia.git
cd DockerStackOfelia- Adjust environment variables (optional):
cp .env.example .env
nano .env- Start stack:
docker-compose up -dCOMPOSE_PROJECT_NAME=ofelia # Prefix for container names
TIMEZONE=Europe/Berlin # Timezone for cron jobsAdd labels to your Docker containers to define cron jobs:
services:
myapp:
image: myapp:latest
labels:
ofelia.enabled: "true"
ofelia.job-exec.backup.schedule: "0 2 * * *"
ofelia.job-exec.backup.command: "/app/backup.sh"- job-exec: Execute command in running container
- job-run: Execute command in new container (deleted afterwards)
- job-local: Execute command on host
- Cron format:
0 2 * * *(daily at 2 AM) - Go format:
@every 5m(every 5 minutes) - Shortcuts:
@hourly,@daily,@weekly,@monthly
The logrotate configuration is located in config/logrotate.conf:
/ofelia/logs/*.log {
daily
rotate 2
missingok
notifempty
compress
delaycompress
copytruncate
}
Customizations:
rotate 2: Number of log files to keepdaily: Rotation interval (daily, weekly, monthly)compress: Compress logs after rotation
# Start stack
docker-compose up -d
# Show logs
docker-compose logs -f ofelia
# Stop stack
docker-compose down
# Restart stack
docker-compose restart# Show Ofelia logs
docker logs ofelia
# Job logs in logs directory
tail -f logs/*.logdocker exec ofelia-logrotate logrotate /etc/logrotate.conf.
├── config/
│ └── logrotate.conf # Logrotate configuration
├── logs/ # Job logs (created automatically)
├── .env # Environment variables
├── docker-compose.yaml # Docker Compose configuration
├── Dockerfile # Logrotate container image
└── README.md # This file
- Docker socket mounted read-only (
:ro) - No root privileges required
- Logs stored in separate volume
- No sensitive data in container images
- Container running?
docker ps | grep ofelia- Labels set correctly?
docker inspect <container-name> | grep ofelia- Check Ofelia logs:
docker logs ofelia- Logrotate container running?
docker ps | grep logrotate- Test manually:
docker exec ofelia-logrotate logrotate -d /etc/logrotate.confservices:
database:
image: postgres:15
labels:
ofelia.enabled: "true"
ofelia.job-exec.db-backup.schedule: "0 3 * * *"
ofelia.job-exec.db-backup.command: "pg_dump -U postgres mydb > /backup/dump.sql"services:
webapp:
image: nginx:alpine
labels:
ofelia.enabled: "true"
ofelia.job-exec.cleanup.schedule: "@every 6h"
ofelia.job-exec.cleanup.command: "find /var/log -name '*.log' -mtime +7 -delete"This project is open source (GPL-3.0-or-later) and free. If it helped you, I'd appreciate your support:
Made with ❤️ by WSC - Web SEO Consulting
- Ofelia by mcuadros
- Alpine Linux for minimal container images
Pull requests are welcome! For major changes, please open an issue first.