# Database Backup Setup Guide ## Oversigt Dette setup opretter daglige backups af alle MariaDB databaser med automatisk rotation efter 7 dage. **Features:** - ✅ Dumper alle databaser hver dag - ✅ Komprimerer backups med gzip (typisk 10-20% af original størrelse) - ✅ Roterer automatisk - holder altid kun 7 dages backups - ✅ Detaljeret logging med timestamps - ✅ Fejlhåndtering og validering - ✅ Logrotate integration for logfiler --- ## Installation ### 1. Giv execute-tilladelse til backup-scriptet ```bash chmod +x /mnt/HC_Volume_103713257/tilbudgivern/scripts/backup-databases.sh ``` ### 2. Opsæt MariaDB credentials Redigér `.env` filen: ```bash nano /mnt/HC_Volume_103713257/tilbudgivern/backend/.env ``` Tilføj disse variabler: ```env # Database Backup Configuration DB_USER=root DB_PASSWORD=your_password_here DB_HOST=localhost ``` **Sikkerhed:** Sikre at `.env` filen har korrekte tilladelser: ```bash chmod 600 /mnt/HC_Volume_103713257/tilbudgivern/backend/.env ``` ### 3. Opsæt crontab Åbn crontab editor: ```bash sudo crontab -e ``` Tilføj denne linje for daglig backup kl. 02:00 (midt om natten): ```cron # Daily MariaDB backup at 2:00 AM 0 2 * * * source /mnt/HC_Volume_103713257/tilbudgivern/backend/.env && /mnt/HC_Volume_103713257/tilbudgivern/scripts/backup-databases.sh ``` **Alternative tidspunkter:** - `0 0 * * *` - Hver dag kl. 00:00 (midnat) - `0 2 * * *` - Hver dag kl. 02:00 (anbefalet) - `0 3 * * *` - Hver dag kl. 03:00 - `0 */6 * * *` - Hver 6. time - `0 0 * * 0` - Hver søndag kl. 00:00 (ugentlig) ### 4. Opsæt logrotate (valgfrit men anbefalet) For at rotere logfilerne automatisk: ```bash sudo cp /mnt/HC_Volume_103713257/tilbudgivern/infra/logrotate-backups.conf /etc/logrotate.d/tilbudgivern-backups sudo chmod 644 /etc/logrotate.d/tilbudgivern-backups ``` --- ## Brug ### Manual backup Kør scriptet manuelt når som helst: ```bash source /mnt/HC_Volume_103713257/tilbudgivern/backend/.env && /mnt/HC_Volume_103713257/tilbudgivern/scripts/backup-databases.sh ``` ### Se backup-status Se liste over backups: ```bash ls -lh /mnt/HC_Volume_103713257/tilbudgivern/backups/ ``` ### Se backup-logfiler Se sidste log entries: ```bash tail -50 /mnt/HC_Volume_103713257/tilbudgivern/logs/backups/backup.log ``` Se alle logs: ```bash cat /mnt/HC_Volume_103713257/tilbudgivern/logs/backups/backup.log ``` ### Check crontab Se nuværende crontab: ```bash sudo crontab -l ``` ### Test crontab (uden at vente) Kør backupen manuelt for at teste: ```bash source /mnt/HC_Volume_103713257/tilbudgivern/backend/.env && /mnt/HC_Volume_103713257/tilbudgivern/scripts/backup-databases.sh ``` --- ## Direktiver ### Backup-lokation ``` /mnt/HC_Volume_103713257/tilbudgivern/backups/ ``` Format: `mariadb_all_databases_YYYYMMDD_HHMMSS.sql.gz` ### Log-lokation ``` /mnt/HC_Volume_103713257/tilbudgivern/logs/backups/backup.log ``` ### RetentionPolicy - **Antal backups:** 7 (en for hver dag) - **Auto-rotation:** Når mere end 7 backups exists, slettes den ældste - **Kompressionformat:** gzip (.gz) - **Log-rotation:** 30 dages logs (via logrotate) --- ## Fejlfinding ### Problem: "mysqldump command not found" **Løsning:** Installér MySQL client: ```bash sudo apt-get install mysql-client ``` ### Problem: "Permission denied" **Løsning:** Sørg for execute-tilladelser: ```bash chmod +x /mnt/HC_Volume_103713257/tilbudgivern/scripts/backup-databases.sh ``` ### Problem: Crontab kører ikke **Løsning:** Check crontab logs: ```bash sudo tail -50 /var/log/syslog | grep CRON ``` ### Problem: "Database connection refused" **Løsning:** Check at MariaDB er tilgængelig: ```bash mysql -u root -p -h localhost -e "SHOW DATABASES;" ``` Eller uden password: ```bash mysql -u root -h localhost -e "SHOW DATABASES;" ``` --- ## Monitoring ### Setup email notifications (valgfrit) Redigér .env og tilføj: ```env BACKUP_EMAIL=admin@example.com ``` Redigér backup-scriptet og tilføj på slutningen: ```bash if [ $? -eq 0 ]; then echo "Backup successful" | mail -s "Database Backup Success" "$BACKUP_EMAIL" else echo "Backup failed" | mail -s "Database Backup FAILED" "$BACKUP_EMAIL" fi ``` --- ## Eksempel Output ``` [2025-11-16 02:00:00] ========================================== [2025-11-16 02:00:00] Starting database backup process [2025-11-16 02:00:00] ========================================== [2025-11-16 02:00:15] Dumping all databases from localhost... [2025-11-16 02:00:45] Database dump completed successfully. Size: 245M [2025-11-16 02:00:50] Backup compressed successfully. Size: 32M [2025-11-16 02:00:50] Backup saved to: /mnt/HC_Volume_103713257/tilbudgivern/backups/mariadb_all_databases_20251116_020000.sql.gz [2025-11-16 02:00:50] Rotating backups (keeping 7 days)... [2025-11-16 02:00:50] Current backups in system: [2025-11-16 02:00:50] /mnt/HC_Volume_103713257/tilbudgivern/backups/mariadb_all_databases_20251116_020000.sql.gz (32M) [2025-11-16 02:00:50] /mnt/HC_Volume_103713257/tilbudgivern/backups/mariadb_all_databases_20251115_020000.sql.gz (31M) [2025-11-16 02:00:50] /mnt/HC_Volume_103713257/tilbudgivern/backups/mariadb_all_databases_20251114_020000.sql.gz (33M) [2025-11-16 02:00:50] ========================================== [2025-11-16 02:00:50] Backup process completed successfully [2025-11-16 02:00:50] ========================================== ``` --- ## Backup Recovery Hvis du skal gendanne fra backup: ### 1. Dekomprimér backup ```bash gunzip /mnt/HC_Volume_103713257/tilbudgivern/backups/mariadb_all_databases_YYYYMMDD_HHMMSS.sql.gz ``` ### 2. Gendanner alle databaser ```bash mysql -u root -p < /mnt/HC_Volume_103713257/tilbudgivern/backups/mariadb_all_databases_YYYYMMDD_HHMMSS.sql ``` ### 3. (Valgfrit) Gendanner specifik database ```bash # Ekstrahér kun en database fra backup sed -n '/^CREATE DATABASE.*tilbudgivern/,/^CREATE DATABASE/p' mariadb_all_databases_YYYYMMDD_HHMMSS.sql | mysql -u root -p ``` --- ## Security Best Practices 1. ✅ Gem `.env` filen sikkert (ikke i git) 2. ✅ Begræns tilladelser på backup-mappen: ```bash chmod 700 /mnt/HC_Volume_103713257/tilbudgivern/backups/ ``` 3. ✅ Brug dedikeret database-bruger med begrænsede rettigheder (valgfrit) 4. ✅ Overvej at gemme backups på et separat lager (ekstern disk, cloud) 5. ✅ Test restore-processen regelmæssigt --- ## Afsluttende setup-checklist - [ ] Backup-script har execute-tilladelser - [ ] `.env` har DB_USER, DB_PASSWORD, DB_HOST - [ ] Crontab er opsættet med ønsket tidspunkt - [ ] Logrotate config er installeret (valgfrit) - [ ] Manual test er kørt uden fejl - [ ] Backup-mappen eksisterer og er writable - [ ] Du kan se backups i mappen efter første kørsel --- ## Support For spørgsmål eller fejl, se: - Logfiler: `/mnt/HC_Volume_103713257/tilbudgivern/logs/backups/backup.log` - Cron logs: `sudo tail -50 /var/log/syslog | grep CRON`