Added first version of script and updated README.md
This commit is contained in:
@@ -1,3 +1,326 @@
|
||||
# gitea-updater
|
||||
|
||||
A script to backup and update your Gitea instance
|
||||
A comprehensive bash script for automated backup and updating of Gitea instances on Linux servers with multi-channel notifications.
|
||||
Features
|
||||
|
||||
## Disclaimer - Use at Your Own Risk
|
||||
### This script is provided as-is without any warranties, guarantees, or support. By using this script, you acknowledge and accept all risks associated with its use.
|
||||
|
||||
* Automated Backups — Creates compressed backups before each update
|
||||
* Auto-Update Detection — Fetches the latest Gitea release from GitHub
|
||||
* Architecture Detection — Automatically detects your system (amd64, arm64, armv7)
|
||||
* Service Management — Gracefully stops and starts Gitea service
|
||||
* Multi-Channel Notifications — Email, Discord, and Slack alerts
|
||||
* Status Updates — Real-time progress notifications during execution
|
||||
* Error Handling — Comprehensive error reporting and automatic rollback
|
||||
* Backup Retention — Keeps only the last 5 backups to save disk space
|
||||
* Detailed Logging — All operations logged to file for audit trails
|
||||
|
||||
System Requirements
|
||||
|
||||
* OS: Linux (Ubuntu, Debian, CentOS, etc.)
|
||||
* Privileges: Root access (required to manage Gitea service)
|
||||
* Dependencies:
|
||||
- curl — For downloading Gitea and sending webhooks
|
||||
- tar — For compressing backups
|
||||
- systemctl — For service management
|
||||
- Mail client (optional) — For email notifications: msmtp, ssmtp, or mailutils
|
||||
- Chat Server (optional) — For IM notifications: Discord, Fluxer, or Slack
|
||||
|
||||
### Installation
|
||||
1. Download the Script
|
||||
```
|
||||
sudo curl -o /usr/local/bin/gitea-backup-update.sh https://example.com/gitea-backup-update.sh
|
||||
```
|
||||
|
||||
Or create it manually:
|
||||
```
|
||||
sudo nano /usr/local/bin/gitea-backup-update.sh
|
||||
```
|
||||
|
||||
Paste the script contents, then save and exit (Ctrl+X, Y, Enter).
|
||||
|
||||
2. Make it Executable
|
||||
```
|
||||
sudo chmod +x /usr/local/bin/gitea-backup-update.sh
|
||||
```
|
||||
|
||||
3. Configure Variables
|
||||
|
||||
Edit the script to customize settings:
|
||||
```
|
||||
sudo nano /usr/local/bin/gitea-backup-update.sh
|
||||
```
|
||||
|
||||
- Update these sections:
|
||||
|
||||
Gitea Paths:
|
||||
```
|
||||
GITEA_HOME="/var/lib/gitea" # Path to Gitea data directory
|
||||
GITEA_USER="git" # User that runs Gitea
|
||||
GITEA_BIN="/usr/local/bin/gitea" # Path to Gitea binary
|
||||
BACKUP_DIR="/var/backups/gitea" # Backup storage location
|
||||
|
||||
Email Configuration:
|
||||
bash
|
||||
|
||||
ENABLE_EMAIL="true"
|
||||
EMAIL_FROM="[email protected]"
|
||||
EMAIL_TO="[email protected]"
|
||||
SMTP_SERVER="smtp.gmail.com"
|
||||
SMTP_PORT="587"
|
||||
SMTP_USER="[email protected]"
|
||||
SMTP_PASS="your-app-password"
|
||||
|
||||
Discord Configuration:
|
||||
bash
|
||||
|
||||
ENABLE_DISCORD="true"
|
||||
DISCORD_WEBHOOK_URL="https://discordapp.com/api/webhooks/YOUR_WEBHOOK_ID/YOUR_WEBHOOK_TOKEN"
|
||||
|
||||
Slack Configuration (optional):
|
||||
bash
|
||||
|
||||
ENABLE_SLACK="false"
|
||||
SLACK_WEBHOOK_URL="https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
|
||||
|
||||
Notification Setup
|
||||
Email Notifications
|
||||
Option 1: Using msmtp (Recommended)
|
||||
```
|
||||
|
||||
|
||||
### Usage
|
||||
Manual Execution
|
||||
|
||||
* Run the script manually anytime:
|
||||
```
|
||||
sudo /usr/local/bin/gitea-backup-update.sh
|
||||
```
|
||||
|
||||
* Automated Scheduling with Cron
|
||||
|
||||
Set up automatic backups and updates on a schedule using cron.
|
||||
|
||||
Edit the crontab:
|
||||
```
|
||||
sudo crontab -e
|
||||
```
|
||||
Add one of the following:
|
||||
|
||||
- Weekly (every Sunday at 2 AM):
|
||||
```
|
||||
0 2 * * 0 /usr/local/bin/gitea-backup-update.sh >> /var/log/gitea-backup-update.log 2>&1
|
||||
```
|
||||
|
||||
- Daily (every day at 3 AM):
|
||||
```
|
||||
0 3 * * * /usr/local/bin/gitea-backup-update.sh >> /var/log/gitea-backup-update.log 2>&1
|
||||
```
|
||||
|
||||
- Monthly (first day of each month at 1 AM):
|
||||
```
|
||||
0 1 1 * * /usr/local/bin/gitea-backup-update.sh >> /var/log/gitea-backup-update.log 2>&1
|
||||
```
|
||||
|
||||
- Twice weekly (Tuesday and Friday at 2 AM):
|
||||
```
|
||||
0 2 * * 2,5 /usr/local/bin/gitea-backup-update.sh >> /var/log/gitea-backup-update.log 2>&1
|
||||
```
|
||||
|
||||
### View Execution Logs
|
||||
```
|
||||
sudo tail -f /var/log/gitea-backup-update.log
|
||||
```
|
||||
|
||||
### Script Workflow
|
||||
|
||||
The script performs the following steps in order:
|
||||
|
||||
| Step | Action | Duration |
|
||||
|------|--------|----------|
|
||||
| 1 | Stop Gitea service | ~2 seconds |
|
||||
| 2 | Create full data backup | | Varies with data size |
|
||||
| 3 | Compress backup | Varies with data size |
|
||||
| 4 | Fetch latest Gitea version | ~2-3 seconds |
|
||||
| 5 | Download new binary | ~5-10 seconds |
|
||||
| 6 | Install and verify binary | ~1 second |
|
||||
| 7 | Start Gitea service | ~2 seconds |
|
||||
| 8 | Verify service status | ~1 second |
|
||||
| 9 | Clean up old backups | ~1 second |
|
||||
| 10 | Send notifications | ~2-3 seconds |
|
||||
|
||||
### Notifications
|
||||
What Gets Sent
|
||||
|
||||
Each notification includes:
|
||||
* Status — RUNNING, SUCCESS, or FAILED
|
||||
* Server Name — Hostname of the server
|
||||
* Duration — Total execution time in minutes and seconds
|
||||
* Timestamp — Date and time of execution
|
||||
* Status Message — Detailed information about what happened
|
||||
* Backup Location — Path where backups are stored
|
||||
* Version Info — Updated Gitea version (on success)
|
||||
|
||||
Discord Example
|
||||
```
|
||||
✅ Gitea Backup & Update - SUCCESS
|
||||
|
||||
Server: my-server
|
||||
Duration: 2m 34s
|
||||
Timestamp: 2024-01-15 02:15:47
|
||||
Status Message: Backup completed and Gitea updated to v1.21.5 successfully
|
||||
Backup Location: /var/backups/gitea
|
||||
```
|
||||
|
||||
Email Example:
|
||||
```
|
||||
To: [email protected]
|
||||
Subject: Gitea Backup & Update - SUCCESS
|
||||
|
||||
Gitea Backup and Update Script Results
|
||||
|
||||
Server: my-server
|
||||
Status: SUCCESS
|
||||
Duration: 154 seconds
|
||||
Timestamp: 2024-01-15 02:15:47
|
||||
Log File: /var/log/gitea-backup-update.log
|
||||
|
||||
Details:
|
||||
Backup completed and Gitea updated to v1.21.5 successfully
|
||||
|
||||
Backup Location: /var/backups/gitea
|
||||
```
|
||||
|
||||
Slack Example:
|
||||
```
|
||||
Similar to Discord with formatted blocks and color coding.
|
||||
Backup Management
|
||||
Backup Location
|
||||
|
||||
By default, backups are stored in:
|
||||
|
||||
/var/backups/gitea/
|
||||
|
||||
Backup Format
|
||||
```
|
||||
|
||||
Each backup is named with a timestamp:
|
||||
```
|
||||
gitea_backup_20240115_021547.tar.gz
|
||||
```
|
||||
|
||||
### Backup Retention
|
||||
|
||||
The script automatically keeps only the last 5 backups. Older backups are deleted to save disk space.
|
||||
|
||||
To disable auto-cleanup, comment out or remove this section:
|
||||
```
|
||||
# Step 8: Cleanup old backups (keep only last 5)
|
||||
# cd "$BACKUP_DIR"
|
||||
# ls -t *.tar.gz 2>/dev/null | tail -n +6 | xargs -r rm
|
||||
```
|
||||
|
||||
### Manual Backup Cleanup
|
||||
|
||||
List all backups:
|
||||
```
|
||||
ls -lh /var/backups/gitea/
|
||||
```
|
||||
|
||||
Delete a specific backup:
|
||||
```
|
||||
sudo rm /var/backups/gitea/gitea_backup_20240115_021547.tar.gz
|
||||
```
|
||||
|
||||
### Advanced Configuration
|
||||
#### Custom Gitea Installation
|
||||
|
||||
If your Gitea installation uses different paths, update these variables:
|
||||
bash
|
||||
|
||||
```
|
||||
# For Docker installations
|
||||
GITEA_HOME="/data/gitea"
|
||||
GITEA_BIN="/data/gitea/gitea"
|
||||
```
|
||||
```
|
||||
# For custom installations
|
||||
GITEA_HOME="/opt/gitea/data"
|
||||
GITEA_BIN="/opt/gitea/bin/gitea"
|
||||
```
|
||||
|
||||
Database Backups
|
||||
|
||||
If Gitea uses PostgreSQL or MySQL, add backup commands:
|
||||
|
||||
PostgreSQL:
|
||||
```
|
||||
sudo -u postgres pg_dump gitea > "$BACKUP_DIR/$BACKUP_NAME/gitea_db_backup.sql"
|
||||
```
|
||||
|
||||
MySQL:
|
||||
```
|
||||
mysqldump -u gitea_user -p gitea_db > "$BACKUP_DIR/$BACKUP_NAME/gitea_db_backup.sql"
|
||||
```
|
||||
|
||||
Add these after Step 2 (backup Gitea data).
|
||||
Skip Notifications for Specific Channels
|
||||
|
||||
Disable email:
|
||||
```
|
||||
ENABLE_EMAIL="false"
|
||||
```
|
||||
|
||||
Disable Discord:
|
||||
```
|
||||
ENABLE_DISCORD="false"
|
||||
```
|
||||
|
||||
Disable Slack:
|
||||
```
|
||||
ENABLE_SLACK="false"
|
||||
```
|
||||
|
||||
Change Backup Retention
|
||||
|
||||
Keep last 10 backups instead of 5:
|
||||
```
|
||||
ls -t *.tar.gz 2>/dev/null | tail -n +11 | xargs -r rm
|
||||
```
|
||||
|
||||
### Security Considerations
|
||||
#### Credentials Management
|
||||
|
||||
Never hardcode passwords in plaintext — Use environment variables or credential files
|
||||
Restrict script permissions:
|
||||
```
|
||||
sudo chmod 700 /usr/local/bin/gitea-backup-update.sh
|
||||
sudo chmod 600 ~/.msmtprc
|
||||
sudo chmod 600 /etc/ssmtp/ssmtp.conf
|
||||
```
|
||||
|
||||
* Use app-specific passwords for email (Gmail App Passwords)
|
||||
* Rotate webhook URLs regularly if security is compromised
|
||||
|
||||
#### Backup Security
|
||||
|
||||
Protect backup directory:
|
||||
```
|
||||
sudo chmod 700 /var/backups/gitea
|
||||
sudo chown root:root /var/backups/gitea
|
||||
```
|
||||
Store backups offsite (cloud storage, external server)
|
||||
|
||||
#### Log Security
|
||||
|
||||
Restrict log file access:
|
||||
```
|
||||
sudo chmod 600 /var/log/gitea-backup-update.log
|
||||
```
|
||||
Monitor logs for errors:
|
||||
```
|
||||
sudo tail -f /var/log/gitea-backup-update.log
|
||||
```
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user