1313 - [ Local Development] ( #local-development )
1414 - [ Environment Variables] ( howto/ENV_VARIABLES.md )
1515- [ Authentication] ( #authentication )
16- - [ REST API] ( #rest-api )
1716- [ Usage] ( #usage )
1817 - [ Viewing System Information] ( #viewing-system-information )
1918 - [ Managing Cron Jobs] ( #managing-cron-jobs )
2827## Features
2928
3029- ** Modern UI** : Beautiful, responsive interface with dark/light mode.
31- - ** System Information** : Display hostname, IP address, uptime, memory, network and CPU info.
30+ - ** System Information** : Display uptime, memory, network, CPU, and GPU info.
3231- ** Cron Job Management** : View, create, and delete cron jobs with comments.
3332- ** Script management** : View, create, and delete bash scripts on the go to use within your cron jobs.
3433- ** Job Execution Logging** : Optional logging for cronjobs with automatic cleanup, capturing stdout, stderr, exit codes, and timestamps.
@@ -115,7 +114,7 @@ services:
115114
116115# # API
117116
118- ` cr*nmaster` includes a REST API for programmatic access to your checklists and notes . This is perfect for integrations.
117+ ` cr*nmaster` includes a REST API for programmatic access to your cron jobs and system information . This is perfect for integrations.
119118
120119📖 **For the complete API documentation, see [howto/API.md](howto/API.md)**
121120
@@ -131,7 +130,7 @@ services:
131130
132131# # Localization
133132
134- ` cr*nmaster` officially support [some languages](app/_transations ) and allows you to create your custom translations locally on your own machine.
133+ ` cr*nmaster` officially support [some languages](app/_translations ) and allows you to create your custom translations locally on your own machine.
135134
136135📖 **For the complete Translations documentation, see [howto/TRANSLATIONS.md](howto/TRANSLATIONS.md)**
137136
@@ -229,82 +228,11 @@ Cr\*nMaster supports SSO via OIDC (OpenID Connect), compatible with providers li
229228- Entra ID (Azure AD)
230229- And many more!
231230
232- For detailed setup instructions, see **[README_SSO.md](README_SSO.md)**
233-
234- Quick example :
235-
236- ` ` ` yaml
237- environment:
238- - SSO_MODE=oidc
239- - OIDC_ISSUER=https://your-sso-provider.com
240- - OIDC_CLIENT_ID=your_client_id
241- - APP_URL=https://your-cronmaster-domain.com
242- ` ` `
243-
244- # ## Combined Authentication
245-
246231You can enable **both** password and SSO authentication simultaneously :
247232
248- ` ` ` yaml
249- environment:
250- - AUTH_PASSWORD=your_password
251- - SSO_MODE=oidc
252- - OIDC_ISSUER=https://your-sso-provider.com
253- - OIDC_CLIENT_ID=your_client_id
254- ` ` `
255-
256233The login page will display both options, allowing users to choose their preferred method.
257234
258- # ## Security Features
259-
260- - ✅ **Secure session management** with cryptographically random session IDs
261- - ✅ **30-day session expiration** with automatic cleanup
262- - ✅ **HTTP-only cookies** to prevent XSS attacks
263- - ✅ **Proper JWT verification** for OIDC tokens using provider's public keys (JWKS)
264- - ✅ **PKCE support** for OIDC authentication (or confidential client mode)
265-
266- <a id="rest-api"></a>
267-
268- # # REST API
269-
270- Cr\*nMaster provides a full REST API for programmatic access. Perfect for :
271-
272- - External monitoring tools
273- - Automation scripts
274- - CI/CD integrations
275- - Custom dashboards
276-
277- # ## API Authentication
278-
279- Protect your API with an optional API key :
280-
281- ` ` ` yaml
282- environment:
283- - API_KEY=your-secret-api-key-here
284- ` ` `
285-
286- Use the API key in your requests :
287-
288- ` ` ` bash
289- curl -H "Authorization: Bearer YOUR_API_KEY" \
290- https://your-domain.com/api/cronjobs
291- ` ` `
292-
293- For complete API documentation with examples, see **[howto/API.md](howto/API.md)**
294-
295- # ## Available Endpoints
296-
297- - ` GET /api/cronjobs` - List all cron jobs
298- - ` POST /api/cronjobs` - Create a new cron job
299- - ` GET /api/cronjobs/:id` - Get a specific cron job
300- - ` PATCH /api/cronjobs/:id` - Update a cron job
301- - ` DELETE /api/cronjobs/:id` - Delete a cron job
302- - ` POST /api/cronjobs/:id/execute` - Manually execute a job
303- - ` GET /api/scripts` - List all scripts
304- - ` POST /api/scripts` - Create a new script
305- - ` GET /api/system-stats` - Get system statistics
306- - ` GET /api/logs/stream?runId=xxx` - Stream job logs
307- - ` GET /api/events` - SSE stream for real-time updates
235+ **For detailed setup instructions, see **[howto/SSO.md](howto/SSO.md)**
308236
309237<a id="usage"></a>
310238
@@ -337,125 +265,7 @@ The application automatically detects your operating system and displays:
337265
338266# ## Job Execution Logging
339267
340- CronMaster includes an optional logging feature that captures detailed execution information for your cronjobs :
341-
342- # ### How It Works
343-
344- When you enable logging for a cronjob, CronMaster automatically wraps your command with a log wrapper script. This wrapper :
345-
346- - Captures **stdout** and **stderr** output
347- - Records the **exit code** of your command
348- - Timestamps the **start and end** of execution
349- - Calculates **execution duration**
350- - Stores all this information in organized log files
351-
352- # ### Enabling Logs
353-
354- 1. When creating or editing a cronjob, check the "Enable Logging" checkbox
355- 2. The wrapper is automatically added to your crontab entry
356- 3. Jobs run independently - they continue to work even if CronMaster is offline
357-
358- # ### Log Storage
359-
360- Logs are stored in the `./data/logs/` directory with descriptive folder names :
361-
362- - If a job has a **description/comment** : ` {sanitized-description}_{jobId}/`
363- - If a job has **no description** : ` {jobId}/`
364-
365- Example structure :
366-
367- ` ` `
368- ./data/logs/
369- ├── backup-database_root-0/
370- │ ├── 2025-11-10_14-30-00.log
371- │ ├── 2025-11-10_15-30-00.log
372- │ └── 2025-11-10_16-30-00.log
373- ├── daily-cleanup_root-1/
374- │ └── 2025-11-10_14-35-00.log
375- ├── root-2/ (no description provided)
376- │ └── 2025-11-10_14-40-00.log
377- ` ` `
378-
379- **Note**: Folder names are sanitized to be filesystem-safe (lowercase, alphanumeric with hyphens, max 50 chars for the description part).
380-
381- # ### Log Format
382-
383- Each log file includes :
384-
385- ` ` `
386- ==========================================
387- === CronMaster Job Execution Log ===
388- ==========================================
389- Log Folder: backup-database_root-0
390- Command: bash /app/scripts/backup.sh
391- Started: 2025-11-10 14:30:00
392- ==========================================
393-
394- [command output here]
395-
396- ==========================================
397- === Execution Summary ===
398- ==========================================
399- Completed: 2025-11-10 14:30:45
400- Duration: 45 seconds
401- Exit code: 0
402- ==========================================
403- ` ` `
404-
405- # ### Automatic Cleanup
406-
407- Logs are automatically cleaned up to prevent disk space issues :
408-
409- - **Maximum logs per job**: 50 log files
410- - **Maximum age**: 30 days
411- - **Cleanup trigger**: When viewing logs or after manual execution
412- - **Method**: Oldest logs are deleted first when limits are exceeded
413-
414- # ### Custom Wrapper Script
415-
416- You can override the default log wrapper by creating your own at `./data/wrapper-override.sh`. This allows you to :
417-
418- - Customize log format
419- - Add additional metadata
420- - Integrate with external logging services
421- - Implement custom retention policies
422-
423- **Example custom wrapper**:
424-
425- ` ` ` bash
426- #!/bin/bash
427- JOB_ID="$1"
428- shift
429-
430- # Your custom logic here
431- LOG_FILE="/custom/path/${JOB_ID}_$(date '+%Y%m%d').log"
432-
433- {
434- echo "=== Custom Log Format ==="
435- echo "Job: $JOB_ID"
436- "$@"
437- echo "Exit: $?"
438- } >> "$LOG_FILE" 2>&1
439- ` ` `
440-
441- # ### Docker Considerations
442-
443- - Mount the `./data` directory to persist logs on the host
444- - The wrapper script location : ` ./data/cron-log-wrapper.sh` . This will be generated automatically the first time you enable logging.
445-
446- # ### Non-Docker Considerations
447-
448- - Logs are stored at `./data/logs/` relative to the project directory
449- - The codebase wrapper script location : ` ./app/_scripts/cron-log-wrapper.sh`
450- - The running wrapper script location : ` ./data/cron-log-wrapper.sh`
451-
452- # ### Important Notes
453-
454- - Logging is **optional** and disabled by default
455- - Jobs with logging enabled are marked with a blue "Logged" badge in the UI
456- - Logs are captured for both scheduled runs and manual executions
457- - Commands with file redirections (>, >>) may conflict with logging
458- - The crontab stores the **wrapped command**, so jobs run independently of CronMaster
268+ 📖 **For complete logging documentation, see [howto/LOGS.md](howto/LOGS.md)**
459269
460270# ## Cron Schedule Format
461271
@@ -477,26 +287,6 @@ The application uses standard cron format: `* * * * *`
4772874. **Delete Scripts** : Remove unwanted scripts (this won't delete the cronjob, you will need to manually remove these yourself)
4782885. **Clone Scripts** : Clone scripts to quickly edit them in case they are similar to one another.
479289
480- <a id="technologies-used"></a>
481-
482- # # Technologies Used
483-
484- - **Next.js 14**: React framework with App Router
485- - **TypeScript**: Type-safe JavaScript
486- - **Tailwind CSS**: Utility-first CSS framework
487- - **Lucide React**: Beautiful icons
488- - **next-themes**: Dark/light mode support
489- - **Docker**: Containerization
490-
491- <a id="contributing"></a>
492-
493- # # Contributing
494-
495- 1. Fork the repository
496- 2. Create a feature branch from the `develop` branch
497- 3. Make your changes
498- 4. Submit a pull request to the `develop` branch
499-
500290# # Community shouts
501291
502292I would like to thank the following members for raising issues and help test/debug them!
0 commit comments