# Environment Files Backup System This document describes the secure backup system for `.env` files from Docker containers to a private Gitea repository. ## Overview The environment files backup system provides: - **Automated discovery** of all `.env` files in `~/docker/*` directories - **Secure version control** using private Git repository - **Change tracking** with timestamps and commit history - **Easy restoration** of backed up configurations - **Validation tools** to ensure backup integrity ## Components ### Scripts 1. **backup-env-files.sh** - Main backup script 2. **validate-env-backups.sh** - Validation and integrity checking ### Repository Structure ``` ~/.env-backup/ ├── .git/ # Git repository ├── .gitignore # Security-focused gitignore ├── README.md # Repository documentation ├── .env-backup-config # Configuration file └── docker-containers/ # Backed up files ├── container1/ │ ├── .env # Environment file │ └── docker-compose.yml.ref # Reference compose file ├── container2/ │ └── .env └── ... ``` ## Security Considerations ### 🔒 Critical Security Points 1. **Repository Privacy**: The backup repository MUST be private 2. **Access Control**: Only you should have access to the repository 3. **Network Security**: Use HTTPS or SSH for Git operations 4. **Local Security**: Backup directory should have restricted permissions ### Best Practices - Use SSH keys for Git authentication (more secure than passwords) - Regularly rotate any exposed credentials - Monitor repository access logs - Consider encrypting the entire backup repository ## Setup Instructions ### 1. Initial Setup ```bash # First time setup ./backup-env-files.sh --init # Follow prompts to configure: # - Gitea instance URL # - Username # - Repository name ``` ### 2. Create Repository in Gitea 1. Log into your Gitea instance 2. Create a new **private** repository named `docker-env-backup` 3. Do not initialize with README (the script handles this) ### 3. Configure Authentication #### Option A: SSH Key (Recommended) ```bash # Generate SSH key if you don't have one ssh-keygen -t ed25519 -C "your_email@domain.com" # Add public key to Gitea: # 1. Go to Settings → SSH/GPG Keys # 2. Add the content of ~/.ssh/id_ed25519.pub ``` #### Option B: Personal Access Token ```bash # In Gitea: Settings → Applications → Generate Token # Configure Git to use token: git config --global credential.helper store ``` ### 4. First Backup ```bash # List all .env files that will be backed up ./backup-env-files.sh --list # Perform dry run to see what would happen ./backup-env-files.sh --dry-run # Execute actual backup ./backup-env-files.sh ``` ## Usage ### Regular Backup ```bash # Standard backup (only backs up changed files) ./backup-env-files.sh # Force backup all files ./backup-env-files.sh --force # See what would be backed up ./backup-env-files.sh --dry-run ``` ### Validation ```bash # Basic validation ./validate-env-backups.sh # Detailed validation with file differences ./validate-env-backups.sh --diff --verbose # Show only missing files ./validate-env-backups.sh --missing-only ``` ### Restoration ```bash # Restore all .env files from backup ./backup-env-files.sh --restore # This will: # 1. Pull latest changes from remote # 2. Prompt before overwriting existing files # 3. Create directory structure as needed ``` ## Automation ### Cron Job Setup Add to your crontab for automated backups: ```bash # Backup .env files daily at 2 AM 0 2 * * * /home/yourusername/shell/backup-env-files.sh >/dev/null 2>&1 # Validate backups weekly on Sundays at 3 AM 0 3 * * 0 /home/yourusername/shell/validate-env-backups.sh --summary-only ``` ### Integration with Existing Backup System Add to your main backup script: ```bash # In your existing backup script echo "Backing up environment files..." /home/yourusername/shell/backup-env-files.sh # Validate the backup if ! /home/yourusername/shell/validate-env-backups.sh --summary-only; then echo "Warning: .env backup validation failed" fi ``` ## File Discovery The system automatically finds: - `*.env` files (e.g., `production.env`, `staging.env`) - `.env*` files (e.g., `.env`, `.env.local`, `.env.production`) - `env.*` files (e.g., `env.development`, `env.local`) ### Example Structure ``` ~/docker/ ├── traefik/ │ ├── .env # ✓ Backed up │ └── docker-compose.yml ├── nextcloud/ │ ├── .env.production # ✓ Backed up │ ├── .env.local # ✓ Backed up │ └── docker-compose.yml ├── grafana/ │ ├── env.grafana # ✓ Backed up │ └── docker-compose.yml └── plex/ ├── config.env # ✓ Backed up └── docker-compose.yml ``` ## Troubleshooting ### Common Issues 1. **Git Push Fails** ```bash # Check remote URL cd ~/.env-backup && git remote -v # Test connectivity git ls-remote origin ``` 2. **Missing Files** ```bash # List what would be found ./backup-env-files.sh --list # Check file permissions ls -la ~/docker/*/ ``` 3. **Repository Not Found** - Ensure repository exists in Gitea - Check repository name matches configuration - Verify you have access permissions ### Recovery Scenarios #### Disaster Recovery If you lose your entire system: ```bash # 1. Clone your backup repository git clone https://git.yourdomain.com/username/docker-env-backup.git ~/.env-backup # 2. Restore all files cd /path/to/shell ./backup-env-files.sh --restore ``` #### Selective Recovery ```bash # Restore specific file manually cp ~/.env-backup/docker-containers/traefik/.env ~/docker/traefik/ ``` ## Monitoring ### Log Files - **backup-env-files.sh**: `logs/env-backup.log` - **validate-env-backups.sh**: `logs/env-backup-validation.log` ### Health Checks ```bash # Weekly health check script #!/bin/bash echo "=== .env Backup Health Check ===" ./validate-env-backups.sh --summary-only # Check last backup time cd ~/.env-backup echo "Last backup: $(git log -1 --format='%ci')" # Check repository status git status --porcelain ``` ## Security Enhancements ### Additional Security Measures 1. **GPG Encryption** (Optional) ```bash # Encrypt sensitive files before committing gpg --symmetric --cipher-algo AES256 file.env ``` 2. **Restricted Permissions** ```bash # Secure backup directory chmod 700 ~/.env-backup chmod 600 ~/.env-backup/.env-backup-config ``` 3. **Audit Trail** ```bash # Monitor repository access git log --oneline --graph --all ``` ## Best Practices 1. **Regular Testing**: Test restoration process monthly 2. **Version Control**: Never force push; preserve history 3. **Documentation**: Keep README.md updated with changes 4. **Monitoring**: Set up alerts for failed backups 5. **Security**: Regularly review repository access permissions ## Support For issues or questions: 1. Check the troubleshooting section 2. Review log files for error details 3. Validate your Gitea configuration 4. Test Git connectivity manually