14 Commits

Author SHA1 Message Date
BeauTroll
e055d708a5 feat: add automated backup system with Docker-based cron
Implement a dedicated Docker container (backup-cron) for automated daily
backups and maintenance tasks, eliminating the need for host cron configuration.

New features:
- backup-cron service: Alpine-based container with Docker CLI and cron
- Automated daily backup at 5:00 AM (Europe/Paris timezone)
- Automated health check at 6:00 AM (after backup)
- Weekly log cleanup on Sundays at 3:00 AM (removes logs >30 days)

Files added:
- cron/Dockerfile: Alpine Linux with docker-cli, bash, and tzdata
- cron/entrypoint.sh: Starts crond and displays configuration
- cron/crontab: Scheduled tasks configuration
- cron/README.md: Complete documentation for automated backups
- scripts/clean-old-logs.sh: Automated log cleanup script

Makefile enhancements:
- make cron-status: Display backup automation status and schedule
- make cron-logs: View logs from automated tasks

Configuration improvements:
- Auto-detect COMPOSE_PROJECT_NAME from directory name (portable)
- Fix df command to use POSIX format (-P flag) for consistent output
- Updated .env.example with COMPOSE_PROJECT_NAME documentation

Benefits:
- No host cron configuration required
- Portable across different environments
- Automatic timezone handling
- Integrated with existing backup/health check scripts
- Logs all automated tasks for monitoring

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 02:24:48 +01:00
BeauTroll
a7c14f9000 fix: use absolute paths for log files in all scripts
Fixed issue where log file redirections would fail when scripts change
directories. All scripts now use $PROJECT_ROOT/logs/... instead of
relative paths ./logs/...

This prevents errors like "Aucun fichier ou dossier de ce nom" when
scripts execute commands in different directories (e.g., checksum
verification in restore.sh).

Affected files:
- scripts/backup.sh
- scripts/restore.sh
- scripts/update.sh
- scripts/recover.sh

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-17 20:24:48 +01:00
BeauTroll
b693ed1364 fix: add Redis password authentication support in health check
The health check script was not using the REDIS_HOST_PASSWORD environment
variable when checking Redis connectivity, causing failures when Redis is
password-protected. Now properly detects and uses the password from .env
when available.

Also includes minor cleanup in backup.sh (formatting and redundant log removal).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-17 20:10:20 +01:00
BeauTroll
dd27bdebb5 Fine-tune disk space estimation for maximum accuracy
Final optimizations based on real Nextcloud data characteristics:

Changes:
- Reduce DB estimate from 50MB to 10MB (mysqldump is tiny vs raw files)
- Adjust compression ratio from 90% to 30% (Nextcloud has pre-compressed files)
- Files are mostly images/PDFs already compressed, gzip gains are minimal

Results progression:
- Initial:  1.7GiB required → 55MB final (97% off)
- V2:       840MiB required → 55MB final (94% off)
- V3:       130MiB required → 55MB final (58% off)
- Final:    82MiB required  → 55MB final (5% off) ✓

The estimation is now extremely accurate because it accounts for:
1. Excluded directories (preview, cache, thumbnails)
2. SQL dump vs raw MySQL files difference
3. Realistic compression ratio for already-compressed files

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-17 20:00:34 +01:00
BeauTroll
fcc60226ca Calculate accurate disk space by using same exclusions as backup
Major improvement: Calculate size from inside containers with the
same exclusions used during actual backup, resulting in much more
accurate space estimation.

Changes:
- Use docker-compose exec to calculate size from containers
- Apply same exclusions as tar backup (preview, cache, thumbnails)
- Calculate DB size from /var/lib/mysql directly
- Reduce default fallback from 2GB to 500MB (more realistic)

Results before/after:
- Before: 1.7GiB required → 55MB final (97% difference)
- After:  840MiB required → 55MB final (35% difference)

The estimation is now much closer to reality because we exclude
preview images, caches and thumbnails that aren't backed up.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-17 19:50:41 +01:00
BeauTroll
fb2a3585d4 Improve disk space estimation messages in backup
Add compressed size estimation and better error handling:
- Show both uncompressed (for safety) and estimated compressed size
- Handle calculation failure gracefully with clear message
- Estimate compression ratio at ~90% (divide by 10)
- Add conditional check to prevent arithmetic errors

Example output:
- Espace requis (non compressé + 20%): 1.7GiB
- Espace estimé après compression: 170MiB
- Archive finale: 55MiB (actual result)

This helps users understand why the required space seems larger
than the final backup size (compression factor).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-17 19:43:04 +01:00
BeauTroll
2ed5314537 Fix backup script - resolve permission issues and restructure
Major fixes:
- Fix script structure: load .env before defining variables
- Remove duplicate color definitions (use common.sh)
- Fix permission issue: use sudo for du command on data/db dirs
- Add fallback to 2GB if disk space calculation fails
- Improve error messages and logging

The main issue was that data/ and db/ directories are owned by
different users (http, 999), causing du to fail even with stderr
redirection. Using sudo or || echo "0" fallback fixes this.

Tested: Backup now completes successfully with proper logging

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-17 19:37:56 +01:00
BeauTroll
85ed35923c Fix disk space calculation in backup.sh
The comparison was failing with "integer expression expected" error
because AVAILABLE_SPACE contained whitespace characters.

Changes:
- Add tr -d '[:space:]' to clean AVAILABLE_SPACE value
- Add validation for empty REQUIRED_SPACE (fallback to 1GB)
- Add validation for empty AVAILABLE_SPACE (exit with error)
- Add 2>/dev/null on comparison to prevent error messages
- Improve error handling for edge cases

Fixes: scripts/backup.sh: ligne 106 : [: 1712798932 0 : nombre entier attendu

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-17 19:30:12 +01:00
BeauTroll
58bc9a47cc Add colored logging with shared common.sh library
- Create scripts/common.sh with reusable log() function and color definitions
- Refactor backup.sh to use common.sh for consistent logging
- Add color support: ERROR (red), WARN (yellow), SUCCESS (green), INFO (normal)
- Colors only appear in terminal, plain text in log files
- Improve code organization and DRY principle
- Fix shellcheck spacing warnings in backup.sh

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-17 19:24:19 +01:00
BeauTroll
c6de550329 Apply critical security fixes and major improvements to all scripts
Security (CRITICAL):
- Add .env.example with strong password generation instructions
- Fix path traversal validation in restore.sh (now detects all .. patterns)
- Secure .env loading with set -a/set +a in all scripts
- Add logs/ to .gitignore to prevent credential leaks

Backup & Restore (IMPORTANT):
- Add file locking system to prevent concurrent backups
- Add disk space verification before backup operations
- Generate SHA256 checksums for all backups
- Verify checksums before restoration
- Create safety database backup before restore
- Implement comprehensive logging to ./logs/ directory
- Fix BACKUP_RETENTION_DAYS inconsistency
- Replace dangerous find -delete with safe iteration

Update & Recovery:
- Backup docker-compose.yml before updates with auto-rollback
- Add version display before/after updates
- Increase timeouts to 120s for slow containers
- Dynamic backup suggestion in recover.sh

Compatibility:
- Add Docker Compose v2 support with v1 fallback in all scripts
- Standardized log() function across all scripts

New Features:
- Add check-health.sh: comprehensive system health monitoring
- Add SECURITY.md: complete security documentation
- Update Makefile with check-health and recover commands
- Centralized logging with timestamps and levels

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-17 18:27:00 +01:00
BeauTroll
701513ce15 Standardize error message prefixes in backup.sh
Replace emoji-based prefixes with consistent [ERR], [WARN], and [*]
prefixes for better parsing and logging compatibility.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-17 18:16:21 +01:00
BeauTroll
386f731c2b improve Makefile and secure bash scripts 2025-12-15 11:35:24 +01:00
BeauTroll
517e337a25 improve scripts security 2025-12-15 11:14:16 +01:00
root
ddc99b914f add scripts 2025-12-14 22:26:17 +01:00