This commit is contained in:
2
.dbpassword.cnf
Normal file
2
.dbpassword.cnf
Normal file
@@ -0,0 +1,2 @@
|
||||
[mysqldump]
|
||||
password="yourdbpassword"
|
||||
240
.github/workflows/release_build.yml
vendored
Normal file
240
.github/workflows/release_build.yml
vendored
Normal file
@@ -0,0 +1,240 @@
|
||||
name: Build, Push, Publish
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: '28 5 * * *'
|
||||
workflow_run:
|
||||
workflows: ["Sync Repo"]
|
||||
types:
|
||||
- completed
|
||||
|
||||
jobs:
|
||||
release:
|
||||
name: Build & Release
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
packages: write
|
||||
|
||||
steps:
|
||||
- name: 📥 Checkout code with full history and tags
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Check if any tags exist
|
||||
id: check_tags_exist
|
||||
run: |
|
||||
git fetch --tags
|
||||
TAG_COUNT=$(git tag | wc -l)
|
||||
if [ "$TAG_COUNT" -eq 0 ]; then
|
||||
echo "has_tags=false" >> "$GITHUB_OUTPUT"
|
||||
echo "latest_tag=v0.0.0" >> "$GITHUB_OUTPUT"
|
||||
else
|
||||
echo "has_tags=true" >> "$GITHUB_OUTPUT"
|
||||
LATEST_TAG=$(git describe --tags --abbrev=0)
|
||||
echo "latest_tag=$LATEST_TAG" >> "$GITHUB_OUTPUT"
|
||||
fi
|
||||
|
||||
- name: Check if meaningful commits exist since latest tag
|
||||
id: check_commits
|
||||
run: |
|
||||
if [ "${{ steps.check_tags_exist.outputs.has_tags }}" = "false" ]; then
|
||||
# No tags exist, so we should create first release
|
||||
echo "commit_count=1" >> "$GITHUB_OUTPUT"
|
||||
CHANGED_FILES=$(git ls-files | grep -v '^manifest.json$' || true)
|
||||
if [ -n "$CHANGED_FILES" ]; then
|
||||
echo "changed_files<<EOF" >> "$GITHUB_OUTPUT"
|
||||
printf '%s\n' "$CHANGED_FILES" >> "$GITHUB_OUTPUT"
|
||||
echo "EOF" >> "$GITHUB_OUTPUT"
|
||||
else
|
||||
echo "changed_files=Initial release" >> "$GITHUB_OUTPUT"
|
||||
fi
|
||||
else
|
||||
LATEST_TAG="${{ steps.check_tags_exist.outputs.latest_tag }}"
|
||||
CHANGED_FILES="$(git diff --name-only "${LATEST_TAG}..HEAD" | grep -v '^manifest.json$' || true)"
|
||||
if [ -n "$CHANGED_FILES" ]; then
|
||||
echo "commit_count=1" >> "$GITHUB_OUTPUT"
|
||||
echo "changed_files<<EOF" >> "$GITHUB_OUTPUT"
|
||||
printf '%s\n' "$CHANGED_FILES" >> "$GITHUB_OUTPUT"
|
||||
echo "EOF" >> "$GITHUB_OUTPUT"
|
||||
else
|
||||
echo "commit_count=0" >> "$GITHUB_OUTPUT"
|
||||
fi
|
||||
fi
|
||||
|
||||
- name: Get latest release tag (from GitHub API)
|
||||
id: get_latest_release
|
||||
run: |
|
||||
LATEST_RELEASE_TAG=$(curl -sL -H "Accept: application/vnd.github+json" \
|
||||
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
|
||||
"https://api.github.com/repos/${GITHUB_REPOSITORY}/releases/latest" | jq -r .tag_name)
|
||||
if [ -z "$LATEST_RELEASE_TAG" ] || [ "$LATEST_RELEASE_TAG" = "null" ]; then
|
||||
LATEST_RELEASE_TAG="v1.0.0"
|
||||
fi
|
||||
echo "latest_release_tag=$LATEST_RELEASE_TAG" >> "$GITHUB_OUTPUT"
|
||||
echo "latest_release_version=${LATEST_RELEASE_TAG#v}" >> "$GITHUB_OUTPUT"
|
||||
|
||||
# -------------------------------
|
||||
# Sync manifest.json to last release version if behind (only when no meaningful commits)
|
||||
# -------------------------------
|
||||
- name: 🛠 Ensure manifest.json matches latest release version
|
||||
if: steps.check_commits.outputs.commit_count == '0'
|
||||
run: |
|
||||
if [ -f manifest.json ]; then
|
||||
MANIFEST_VERSION=$(jq -r '.version // empty' manifest.json)
|
||||
else
|
||||
MANIFEST_VERSION=""
|
||||
fi
|
||||
LATEST_RELEASE_VERSION="${{ steps.get_latest_release.outputs.latest_release_version }}"
|
||||
PYTHON_CODE="from packaging import version; \
|
||||
print(version.parse('$LATEST_RELEASE_VERSION') > version.parse('$MANIFEST_VERSION') if '$MANIFEST_VERSION' else True)"
|
||||
NEED_UPDATE=$(python3 -c "$PYTHON_CODE")
|
||||
if [ "$NEED_UPDATE" = "True" ]; then
|
||||
echo "Updating manifest.json to version $LATEST_RELEASE_VERSION (sync with release)"
|
||||
jq --arg v "$LATEST_RELEASE_VERSION" '.version = $v' manifest.json > tmp.json && mv tmp.json manifest.json
|
||||
git config user.name "github-actions"
|
||||
git config user.email "github-actions@github.com"
|
||||
git add manifest.json
|
||||
git commit -m "Sync manifest.json to release $LATEST_RELEASE_VERSION [🔄]" || echo "Nothing to commit"
|
||||
git push origin main || true
|
||||
else
|
||||
echo "Manifest.json is already up-to-date with the latest release."
|
||||
fi
|
||||
|
||||
# -------------------------------
|
||||
# Continue normal workflow if commits exist
|
||||
# -------------------------------
|
||||
- name: 📃 Get list of changed files (Markdown bullet list)
|
||||
if: steps.check_commits.outputs.commit_count != '0'
|
||||
id: changed_files
|
||||
run: |
|
||||
BULLET_LIST="$(printf '%s\n' "${{ steps.check_commits.outputs.changed_files }}" | sed 's/^/- /')"
|
||||
echo "CHANGED<<EOF" >> "$GITHUB_OUTPUT"
|
||||
printf '%s\n' "$BULLET_LIST" >> "$GITHUB_OUTPUT"
|
||||
echo "EOF" >> "$GITHUB_OUTPUT"
|
||||
COUNT="$(printf '%s\n' "${{ steps.check_commits.outputs.changed_files }}" | wc -l)"
|
||||
echo "COUNT=$COUNT" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Get manifest version
|
||||
if: steps.check_commits.outputs.commit_count != '0'
|
||||
id: get_manifest_version
|
||||
run: |
|
||||
if [ -f manifest.json ]; then
|
||||
MANIFEST_VERSION=$(jq -r '.version // empty' manifest.json)
|
||||
if [ -z "$MANIFEST_VERSION" ] || [ "$MANIFEST_VERSION" = "null" ]; then
|
||||
MANIFEST_VERSION="1.0.0"
|
||||
fi
|
||||
else
|
||||
MANIFEST_VERSION="1.0.0"
|
||||
fi
|
||||
echo "manifest_version=$MANIFEST_VERSION" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Pick base version
|
||||
if: steps.check_commits.outputs.commit_count != '0'
|
||||
id: pick_base_version
|
||||
run: |
|
||||
LATEST_RELEASE="${{ steps.get_latest_release.outputs.latest_release_version }}"
|
||||
MANIFEST="${{ steps.get_manifest_version.outputs.manifest_version }}"
|
||||
BASE_VERSION=$(python3 -c "from packaging import version; \
|
||||
print(str(max(version.parse('$LATEST_RELEASE'), version.parse('$MANIFEST'))))")
|
||||
echo "base_version=$BASE_VERSION" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: 🔢 Determine version
|
||||
if: steps.check_commits.outputs.commit_count != '0'
|
||||
id: version
|
||||
run: |
|
||||
BASE_VERSION="${{ steps.pick_base_version.outputs.base_version }}"
|
||||
IFS='.' read -r MAJOR MINOR PATCH <<< "$BASE_VERSION"
|
||||
COUNT="${{ steps.changed_files.outputs.COUNT }}"
|
||||
if [ "$COUNT" -ge 5 ]; then
|
||||
MAJOR=$((MAJOR + 1))
|
||||
MINOR=0
|
||||
PATCH=0
|
||||
elif [ "$COUNT" -ge 3 ]; then
|
||||
MINOR=$((MINOR + 1))
|
||||
PATCH=0
|
||||
else
|
||||
PATCH=$((PATCH + 1))
|
||||
fi
|
||||
NEW_VERSION="${MAJOR}.${MINOR}.${PATCH}"
|
||||
REPO_NAME="$(basename "$GITHUB_REPOSITORY")"
|
||||
ZIP_NAME="${REPO_NAME}-${NEW_VERSION}.zip"
|
||||
echo "VERSION=$NEW_VERSION" >> "$GITHUB_OUTPUT"
|
||||
echo "ZIP_NAME=$ZIP_NAME" >> "$GITHUB_OUTPUT"
|
||||
echo "REPO_NAME=$REPO_NAME" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: 🛠 Update or create manifest.json
|
||||
if: steps.check_commits.outputs.commit_count != '0'
|
||||
run: |
|
||||
VERSION="${{ steps.version.outputs.VERSION }}"
|
||||
AUTHOR="Ivan Carlos"
|
||||
VERSION_FILE="manifest.json"
|
||||
if [ -f "$VERSION_FILE" ]; then
|
||||
jq --arg v "$VERSION" --arg a "$AUTHOR" \
|
||||
'.version = $v | .author = $a' "$VERSION_FILE" > tmp.json && mv tmp.json "$VERSION_FILE"
|
||||
else
|
||||
echo "{ \"version\": \"$VERSION\", \"author\": \"$AUTHOR\" }" > "$VERSION_FILE"
|
||||
fi
|
||||
|
||||
- name: 💾 Commit and push updated manifest.json
|
||||
if: steps.check_commits.outputs.commit_count != '0'
|
||||
run: |
|
||||
git config user.name "github-actions"
|
||||
git config user.email "github-actions@github.com"
|
||||
git add manifest.json
|
||||
git commit -m "Update manifest version to ${{ steps.version.outputs.VERSION }} [▶️]" || echo "Nothing to commit"
|
||||
git push origin main
|
||||
|
||||
- name: 📦 Create ZIP package (excluding certain files)
|
||||
if: steps.check_commits.outputs.commit_count != '0'
|
||||
run: |
|
||||
ZIP_NAME="${{ steps.version.outputs.ZIP_NAME }}"
|
||||
zip -r "$ZIP_NAME" . -x ".git/*" ".github/*" "docker/*" ".dockerignore" "CNAME" "Dockerfile" "README.md" "LICENSE"
|
||||
|
||||
- name: 🚀 Create GitHub Release
|
||||
if: steps.check_commits.outputs.commit_count != '0'
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
tag_name: "v${{ steps.version.outputs.VERSION }}"
|
||||
name: "${{ steps.version.outputs.REPO_NAME }} v${{ steps.version.outputs.VERSION }}"
|
||||
body: |
|
||||
### Changelog
|
||||
Files changed in this release:
|
||||
${{ steps.changed_files.outputs.CHANGED }}
|
||||
files: ${{ steps.version.outputs.ZIP_NAME }}
|
||||
|
||||
# ----- Docker steps -----
|
||||
- name: 🔍 Check if Dockerfile exists
|
||||
if: steps.check_commits.outputs.commit_count != '0'
|
||||
id: dockerfile_check
|
||||
run: |
|
||||
if [ -f Dockerfile ]; then
|
||||
echo "exists=true" >> "$GITHUB_OUTPUT"
|
||||
else
|
||||
echo "exists=false" >> "$GITHUB_OUTPUT"
|
||||
fi
|
||||
|
||||
- name: 🛠 Set up Docker Buildx
|
||||
if: steps.check_commits.outputs.commit_count != '0' && steps.dockerfile_check.outputs.exists == 'true'
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: 🔐 Login to GitHub Container Registry
|
||||
if: steps.check_commits.outputs.commit_count != '0' && steps.dockerfile_check.outputs.exists == 'true'
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: 🐳 Build and Push Docker image
|
||||
if: steps.check_commits.outputs.commit_count != '0' && steps.dockerfile_check.outputs.exists == 'true'
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: .
|
||||
push: true
|
||||
tags: ghcr.io/${{ github.repository }}:latest
|
||||
78
.github/workflows/update_readme.yml
vendored
Normal file
78
.github/workflows/update_readme.yml
vendored
Normal file
@@ -0,0 +1,78 @@
|
||||
name: Update README
|
||||
|
||||
# Allow GitHub Actions to commit and push changes
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: '0 4 * * *' # Every day at 4 AM UTC
|
||||
|
||||
jobs:
|
||||
update-readme:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
env:
|
||||
SOURCE_REPO: ivancarlosti/.github
|
||||
SOURCE_BRANCH: main
|
||||
|
||||
steps:
|
||||
- name: Checkout current repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Checkout source README template
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: ${{ env.SOURCE_REPO }}
|
||||
ref: ${{ env.SOURCE_BRANCH }}
|
||||
path: source_readme
|
||||
|
||||
- name: Update README.md (buttons and footer)
|
||||
run: |
|
||||
set -e
|
||||
REPO_NAME="${GITHUB_REPOSITORY##*/}"
|
||||
|
||||
# --- Extract buttons block from source ---
|
||||
BUTTONS=$(awk '/<!-- buttons -->/{flag=1;next}/<!-- endbuttons -->/{flag=0}flag' source_readme/README.md)
|
||||
BUTTONS_UPDATED=$(echo "$BUTTONS" | sed "s/\.github/${REPO_NAME}/g")
|
||||
|
||||
# --- Extract footer block from source (everything from <!-- footer --> onward) ---
|
||||
FOOTER=$(awk '/<!-- footer -->/{flag=1}flag' source_readme/README.md)
|
||||
|
||||
# --- Replace buttons section in README.md ---
|
||||
UPDATED=$(awk -v buttons="$BUTTONS_UPDATED" '
|
||||
BEGIN { skip=0 }
|
||||
/<!-- buttons -->/ {
|
||||
print
|
||||
print buttons
|
||||
skip=1
|
||||
next
|
||||
}
|
||||
/<!-- endbuttons -->/ && skip {
|
||||
print
|
||||
skip=0
|
||||
next
|
||||
}
|
||||
!skip { print }
|
||||
' README.md)
|
||||
|
||||
# --- Replace everything after <!-- footer --> with FOOTER ---
|
||||
echo "$UPDATED" | awk -v footer="$FOOTER" '
|
||||
/<!-- footer -->/ {
|
||||
print footer
|
||||
found=1
|
||||
exit
|
||||
}
|
||||
{ print }
|
||||
' > README.tmp && mv README.tmp README.md
|
||||
|
||||
- name: Remove source_readme from git index
|
||||
run: git rm --cached -r source_readme || true
|
||||
|
||||
- name: Commit and push changes
|
||||
uses: stefanzweifel/git-auto-commit-action@v5
|
||||
with:
|
||||
file_pattern: README.md
|
||||
commit_message: "Sync README from template [▶️]"
|
||||
branch: ${{ github.ref_name }}
|
||||
21
LICENSE
Normal file
21
LICENSE
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2025 Ivan Carlos de Almeida
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
69
README.md
69
README.md
@@ -1,2 +1,69 @@
|
||||
# bkpscripts
|
||||
# Backup Scripts
|
||||
Backup Scripts gives ideas do generate backup of webservers and databases for backup purposes with option to send it to BackBlaze buckets configured on Rclone, also check BackBlaze repositories for outdated buckets and send email messages when find outdated buckets to you through Amazon SES. You can change the script to fit it for other backup storage services and messaging.
|
||||
|
||||
<!-- buttons -->
|
||||
[](https://github.com/ivancarlosti/bkpscripts/stargazers)
|
||||
[](https://github.com/sponsors/ivancarlosti)
|
||||
[](https://github.com/sponsors/ivancarlosti)
|
||||
[](https://github.com/ivancarlosti/bkpscripts/pulse)
|
||||
[](https://github.com/ivancarlosti/bkpscripts/issues)
|
||||
[](LICENSE)
|
||||
[](https://github.com/ivancarlosti/bkpscripts/commits)
|
||||
[](https://github.com/ivancarlosti/bkpscripts/security)
|
||||
[](https://github.com/ivancarlosti/bkpscripts?tab=coc-ov-file)
|
||||
[][sponsor]
|
||||
<!-- endbuttons -->
|
||||
|
||||
## Instructions
|
||||
|
||||
* Setup `rclone.sh` file to run backup of webserver and MariaDB/MySQL or Postgres database
|
||||
* Setup `checkbackup.sh` file to check outdated buckets
|
||||
* Setup `bkppostgres.sh` file to backup entire Postgres database on a Docker
|
||||
* Run `chmod +x scriptfile.sh` to make the script executable
|
||||
* Run `crontab -e` to add execution line to run periodically
|
||||
* Suggestion to run script `/home/username/scriptfile.sh` everyday at 02:00:
|
||||
```
|
||||
0 2 * * * cd /home/username; ./scriptfile.sh >/dev/null 2>&1
|
||||
```
|
||||
|
||||
#### Set password DB on file if needed to setup MariaDB/MySQL backup
|
||||
|
||||
* Write and edit file `.dbpassword.cnf`
|
||||
* Setup permission running `chmod 0600 .dbpassword.cnf`
|
||||
|
||||
#### Check the articles below for additional information (Google Translator may be required)
|
||||
|
||||
* [Setting up a script to notify by email that a repository in Rclone is without a recent backup](https://suporte.ivancarlos.com.br/hc/pt-br/articles/25861271868301)
|
||||
* [Configuring Rclone to send backup to its destination](https://suporte.ivancarlos.com.br/hc/pt-br/articles/25731464664461)
|
||||
|
||||
## Requirements
|
||||
|
||||
* Linux Server
|
||||
* MariaDB/MySQL or Postgres database if want backup of it
|
||||
* Rclone properly configured if want offsite backup
|
||||
* BackBlaze bucket if want offsite backup on BackBlaze
|
||||
|
||||
<!-- footer -->
|
||||
---
|
||||
|
||||
## 🧑💻 Consulting and technical support
|
||||
* For personal support and queries, please submit a new issue to have it addressed.
|
||||
* For commercial related questions, please [**contact me**][ivancarlos] for consulting costs.
|
||||
|
||||
## 🩷 Project support
|
||||
| If you found this project helpful, consider |
|
||||
| :---: |
|
||||
[**buying me a coffee**][buymeacoffee], [**donate by paypal**][paypal], [**sponsor this project**][sponsor] or just [**leave a star**](../..)⭐
|
||||
|Thanks for your support, it is much appreciated!|
|
||||
|
||||
[cc]: https://docs.github.com/en/communities/setting-up-your-project-for-healthy-contributions/adding-a-code-of-conduct-to-your-project
|
||||
[contributing]: https://docs.github.com/en/articles/setting-guidelines-for-repository-contributors
|
||||
[security]: https://docs.github.com/en/code-security/getting-started/adding-a-security-policy-to-your-repository
|
||||
[support]: https://docs.github.com/en/articles/adding-support-resources-to-your-project
|
||||
[it]: https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository#configuring-the-template-chooser
|
||||
[prt]: https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/creating-a-pull-request-template-for-your-repository
|
||||
[funding]: https://docs.github.com/en/articles/displaying-a-sponsor-button-in-your-repository
|
||||
[ivancarlos]: https://ivancarlos.it
|
||||
[buymeacoffee]: https://www.buymeacoffee.com/ivancarlos
|
||||
[paypal]: https://icc.gg/donate
|
||||
[sponsor]: https://github.com/sponsors/ivancarlosti
|
||||
|
||||
12
bkppostgres.sh
Normal file
12
bkppostgres.sh
Normal file
@@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
|
||||
FILENAMEDATE=$(date +%Y-%m-%dT%H-%M-%S) # date/time formula to compose filename
|
||||
DOCKERNAME=postgres # docker name to access it and send pg_all command
|
||||
PGUSER=postroot # username with access to gather all databases using pg_dumpall, usually root
|
||||
RELATPATH=/backups # relative path folder where the files will be stored
|
||||
RETDAYS=3 # number of days to retain files before deletion
|
||||
|
||||
docker exec -i $DOCKERNAME pg_dumpall -U $PGUSER > .$RELATPATH/$FILENAMEDATE.sql
|
||||
tar -czf .$RELATPATH/$FILENAMEDATE-DB.tar.gz --remove-files .$RELATPATH/$FILENAMEDATE.sql
|
||||
find .$RELATPATH -type f -mtime +$RETDAYS -exec rm {} \;
|
||||
chmod 0600 .$RELATPATH/$FILENAMEDATE-DB.tar.gz
|
||||
19
checkbackup.sh
Normal file
19
checkbackup.sh
Normal file
@@ -0,0 +1,19 @@
|
||||
#!/bin/bash
|
||||
|
||||
BUCKET_PATHS=(
|
||||
"repo1:bucket1"
|
||||
"repo1:bucket2"
|
||||
"repo1:bucket3"
|
||||
"repo2:bucket"
|
||||
"repo3:bucket"
|
||||
)
|
||||
DAYS_THRESHOLD=2
|
||||
MAILFROM="noreply+alert@icc.gg"
|
||||
MAILTO="recipient@icc.gg"
|
||||
|
||||
for bucket in "${BUCKET_PATHS[@]}"; do
|
||||
rclone_output=$(rclone lsl "$bucket" --max-age 2d)
|
||||
if [ -z "$rclone_output" ]; then
|
||||
aws ses send-email --from $MAILFROM --to $MAILTO --text "This $bucket looks outdated in $DAYS_THRESHOLD days or more." --html "<h1>Warning!</h1><p>This $bucket looks outdayed in $DAYS_THRESHOLD days or more.</p>" --subject "❌ $bucket outdated!"
|
||||
fi
|
||||
done
|
||||
4
manifest.json
Normal file
4
manifest.json
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"version": "1.1.18",
|
||||
"author": "Ivan Carlos"
|
||||
}
|
||||
31
rclone.sh
Normal file
31
rclone.sh
Normal file
@@ -0,0 +1,31 @@
|
||||
#!/bin/bash
|
||||
|
||||
FILENAMEDATE=$(date +%Y-%m-%dT%H-%M-%S) # date-time format to be used on files
|
||||
DATABASE=db-name # database name
|
||||
USER=db-username-or-db-root # db username with read access
|
||||
RCLONEREMOTE=rclone-remote-name # rclone remote name
|
||||
BUCKET=bucket-name # rclone remote name
|
||||
WEBDIR1=/path1/of/webdir/before/webfolder # path previous to planned for backup
|
||||
# WEBDIR2=/path2/of/webdir/before/webfolder # use it if you have more than 1 webdir to backup
|
||||
WEBFOLDER1=htdocs-or-equivalent # path previous to planned for backup
|
||||
# WEBFOLDER2=htdocs-or-equivalent # use it if you have more than 1 webfolder to backup
|
||||
RETENTION=7d # retention required before delete file
|
||||
# PGPASSWORD=db-user-password # uncomment and update with Postgres password if needed
|
||||
|
||||
mkdir -p ./backup
|
||||
|
||||
# Edit accordly for MariaDB backup. You can also use for MySQL backup just changing dump application. Comment of you do not need it.
|
||||
mariadb-dump --defaults-extra-file=./.dbpassword.cnf -u $USER --single-transaction --skip-lock-tables --quick $DATABASE > ./backup/$FILENAMEDATE.sql
|
||||
|
||||
# Ucomment and edit accordly for Postgres backup.
|
||||
# export PGPASSWORD=$PGPASSWORD
|
||||
# pg_dump -h 127.0.0.1 -U $USER $DATABASE > ./backup/$FILENAMEDATE.sql
|
||||
|
||||
tar -czf ./backup/$FILENAMEDATE-DB.tar.gz --remove-files ./backup/$FILENAMEDATE.sql
|
||||
tar -zcf ./backup/$FILENAMEDATE-$WEBFOLDER1.tar.gz --exclude=*.tar.gz -C $WEBDIR1 $WEBFOLDER1
|
||||
# tar -zcf ./backup/$FILENAMEDATE-$WEBFOLDER2.tar.gz --exclude=*.tar.gz -C $WEBDIR2 $WEBFOLDER2
|
||||
|
||||
rclone move ./backup/$FILENAMEDATE-DB.tar.gz $RCLONEREMOTE:$BUCKET/
|
||||
rclone move ./backup/$FILENAMEDATE-$WEBFOLDER1.tar.gz $RCLONEREMOTE:$BUCKET/
|
||||
# rclone move ./backup/$FILENAMEDATE-$WEBFOLDER2.tar.gz $RCLONEREMOTE:$BUCKET/
|
||||
rclone delete --min-age $RETENTION $RCLONEREMOTE:$BUCKET/ --b2-hard-delete
|
||||
Reference in New Issue
Block a user