This commit is contained in:
leo 2024-08-08 05:50:15 +05:00
parent 703b7ff265
commit 26e1b4bada
8 changed files with 157 additions and 38 deletions

View File

@ -11,4 +11,51 @@
* Кроме того, необходимо проверить переменные, пути к директориям, которые указаны непосредственно в скриптах.
* В скрипте `remote-backup.sh` приведен пример для удаленной синхронизации папки `backups` с другим сервером.
* Скрипт должен быть запущен на другом сервере, нужно правильно указать настройки адреса сервера, пути, и кроме того, на сервере должен быть установлен ключ SSH для доступа.
* Скрипт должен быть запущен на другом сервере, нужно правильно указать настройки адреса сервера, пути, и кроме того, на сервере должен быть установлен ключ SSH для доступа.
-------------------------------------------
Использование rsync для создания резервных копий на удаленный сервер, при котором инициатором подключения выступает сервер бэкапов, является хорошей практикой, повышающей безопасность ваших данных. Вот несколько советов, чтобы выполнить это правильно и надежно:
1. **Инвертируйте подключение**:
- Запускайте rsync с сервера бэкапов (сервер B), чтобы подключаться к основному серверу (сервер A) и забирать данные. Таким образом, у злоумышленника, который может получить контроль над сервером A, не будет прямого доступа к серверу B.
2. **Используйте SSH**:
- Обязательно используйте SSH для передачи данных, чтобы обеспечить шифрование соединения. Rsync может работать через SSH (например, `rsync -avz -e ssh user@serverA:/path/to/data /local/path`).
3. **Настройте управление доступом**:
- Ограничьте доступ к серверу A только для пользователя, который выполняет резервное копирование.
- Используйте ключи SSH для аутентификации, и храните закрытый ключ на сервере B.
4. **Модифицируйте права на ключи**:
- Ограничьте права файлового доступа на закрытые ключи, чтобы только соответствующий пользователь мог их читать (`chmod 600`).
5. **Используйте ограничения SSH**:
- Ограничьте команды, которые могут быть выполнены с использованием ключа SSH, назначив предопределенную команду в файле `authorized_keys` на сервере A. Это можно сделать следующим образом:
```plaintext
command="rsync --server -logDtprze.iLsfx --delete --numeric-ids . /path/to/data",no-agent-forwarding,no-port-forwarding,no-pty ssh-rsa AAAA... user@hostname
```
6. **Регулярные проверки и уведомления**:
- Настройте уведомления о сбоях и настраивайте регулярные проверки целостности данных.
Вот пример настроек, чтобы запустить резервное копирование с сервера B (сервера бэкапов):
1. На сервере B создайте ключ SSH (если он еще не создан):
```sh
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
```
2. Скопируйте публичный ключ на сервер A:
```sh
ssh-copy-id user@serverA
```
3. На сервере B настройте cron job или systemd timer для регулярного выполнения rsync. Пример крон-задачи для ежедневного выполнения копирования в 2:00 ночи:
```plaintext
0 2 * * * /usr/bin/rsync -avz -e ssh user@serverA:/path/to/data /local/path/to/backups
```
Использование этих техник значительно повысит безопасность вашего резервного копирования и уменьшит вероятность компрометации сервера бэкапов в случае взлома основного сервера.

24
acme.sh Normal file
View File

@ -0,0 +1,24 @@
#!/bin/bash
if [ "$(id -u)" != "0" ]; then
echo -e "\033[31mThis script requires superuser rights\033[0m"
exit 0
fi
ACME_FILE="/data/secrets/$SERVER_DOMAIN/letsencrypt/$SERVER_DOMAIN.acme.json"
BACKUP_DIR="/backups/acme"
ARCHIVE_FILE="$BACKUP_DIR/$SERVER_DOMAIN.tar.gz"
# load ACME_BACKUP_PASSWORD
SECRETS_PATH=/data/secrets/$SERVER_DOMAIN/$SERVER_DOMAIN.env
source $SECRETS_PATH
trap 'echo -e "\033[31mSomething went wrong\033[0m"; exit 1' EXIT
set -e
export DEBIAN_FRONTEND=noninteractive
tar -czf - -C "$ACME_FILE" . | openssl enc -aes-256-cbc -e -out "$ARCHIVE_FILE" -pass pass:"$ACME_BACKUP_PASSWORD" -pbkdf2 -iter 100000
trap - EXIT
echo "All backups were made successfully. Outdated backups have been deleted"

15
all.sh
View File

@ -1,7 +1,7 @@
#!/bin/bash
if [ "$(id -u)" != "0" ]; then
echo -e "\033[31mThis script requires superuser rights.\033[0m"
echo -e "\033[31mThis script requires superuser rights\033[0m"
exit 0
fi
@ -10,14 +10,19 @@ set -e
export DEBIAN_FRONTEND=noninteractive
docker exec postgres psql -U admin -d postgres -t -A -F',' -c "SELECT d.datname, a.rolname FROM pg_database d JOIN pg_roles a ON d.datdba = a.oid WHERE d.datistemplate = false;" | while IFS=, read -r dbname owner; do
docker exec -i postgres psql -U $POSTGRES_USER -d $POSTGRES_DB -t -A -F',' <<-EOSQL |
SELECT d.datname, a.rolname
FROM pg_database d
JOIN pg_roles a ON d.datdba = a.oid
WHERE d.datistemplate = false;
EOSQL
while IFS=, read -r dbname owner; do
bash postgres.sh "$dbname" "$owner"
done
bash files.sh
bash acme.sh
bash cleaner.sh
echo 'Done.'
trap - EXIT
echo "All backups were made successfully. Outdated backups have been deleted."
echo "All backups were made successfully. Outdated backups have been deleted"

View File

@ -1,3 +0,0 @@
# /sample/folder/
/data/appdata/gitea/
/data/projects/

View File

@ -4,7 +4,7 @@ EXPIRE_DAYS=14
SCAN_DIR=/backups
if [ "$(id -u)" != "0" ]; then
echo -e "\033[31mThis script requires superuser rights.\033[0m"
echo -e "\033[31mThis script requires superuser rights\033[0m"
exit 0
fi
@ -13,24 +13,26 @@ set -e
export DEBIAN_FRONTEND=noninteractive
echo 'Cleaning old backups...'
FILES=$(find $SCAN_DIR -type f)
for file in $FILES;
do
timestamp=$(date -r $file +%Y%m%d);
echo "Processing $file file..";
date1yrs=$(date -d "$timestamp" +%Y);
date1days=$(date -d "$timestamp" +%j);
date2yrs=$(date +%Y);
date2days=$(date +%j);
diffYear=$(expr "$date2yrs" - "$date1yrs");
diffYear2days=$(expr "$diffYear" \* 365);
diffDays=$(expr "$date2days" - "$date1days");
DAYS=$(expr "$diffYear2days" + "$diffDays");
timestamp=$(date -r "$file" +%Y%m%d)
echo "Processing $file file.."
date1yrs=$(date -d "$timestamp" +%Y)
date1days=$(date -d "$timestamp" +%j)
date2yrs=$(date +%Y)
date2days=$(date +%j)
diffYear=$((date2yrs - date1yrs))
diffYear2days=$((diffYear * 365))
diffDays=$((date2days - date1days))
DAYS=$((diffYear2days + diffDays))
if [ "$DAYS" -ge $EXPIRE_DAYS ]
then
echo "Deleting $file file...";
rm "$file";
echo "Deleting $file file..."
rm "$file"
fi
done

View File

@ -10,7 +10,7 @@ set -e
export DEBIAN_FRONTEND=noninteractive
BACKUP_LIST="./backups.list"
BACKUP_LIST=/data/$SRV_START_DIR/backups.cfg
BACKUP_DIR="/backups/files"
# Checking the presence of a backups.list
@ -22,6 +22,8 @@ fi
# Creating main directories (if not created)
mkdir -p "$BACKUP_DIR"
echo 'Creating files backup...'
# Reading a list of directories for backup
while IFS= read -r DIR; do
# Ignore lines starting with #
@ -39,7 +41,8 @@ while IFS= read -r DIR; do
# Formation of the archive name
BASENAME=$(basename "$DIR")
TIMESTAMP=$(date +%Y%m%d%H%M%S)
#TIMESTAMP=$(date +%Y%m%d%H%M%S)
TIMESTAMP=$(date +%d-%m-%Y_%H%M%S)
ARCHIVE_NAME="${BASENAME}_${TIMESTAMP}.tar.gz"
# Creating a directory to store backups of this folder

View File

@ -1,12 +1,12 @@
#!/bin/bash
if [ "$(id -u)" != "0" ]; then
echo -e "\033[31mThis script requires superuser rights.\033[0m"
echo -e "\033[31mThis script requires superuser rights\033[0m"
exit 0
fi
if [ -z "$1" ] || [ -z "$2" ]; then
echo "Please provide both the POSTGRES_DB and POSTGRES_USER as arguments."
echo "Please provide both the POSTGRES_DB and POSTGRES_USER as arguments"
exit 1
fi
@ -16,35 +16,36 @@ set -e
export DEBIAN_FRONTEND=noninteractive
# configuration settings
POSTGRES_DB="$1"
POSTGRES_USER="$2"
PGDB="$1"
PGUSER="$2"
CURRENT_MONTH=$(date +%Y-%m)
CURRENT_DATE=$(date +%Y-%m-%d)
CURRENT_DATETIME=$(date +%d-%b-%Y_%H_%M_%Z)
BACKUPS_PATH=/data/backups/postgres
#CURRENT_DATETIME=$(date +%d-%b-%Y_%H_%M_%Z)
CURRENT_DATETIME=$(date +%d-%m-%Y_%H%M%S)
BACKUPS_PATH=/backups/postgres
DOCKER_SERVICE_NAME=postgres
# backup PostgreSQL database
BACKUP_FOLDER=$BACKUPS_PATH/$POSTGRES_DB
BACKUP_FOLDER=$BACKUPS_PATH/$PGDB
if [ ! -d "$BACKUP_FOLDER" ]; then
mkdir -p "$BACKUP_FOLDER"
fi
echo 'Creating PostgreSQL backups...'
cd "$BACKUP_FOLDER"
if [ -f 'dump_'"$POSTGRES_DB"'.sql' ]; then
rm 'dump_'"$POSTGRES_DB"'.sql'
if [ -f 'dump_'"$PGDB"'.sql' ]; then
rm 'dump_'"$PGDB"'.sql'
fi
db_backup_filename=$POSTGRES_DB'_'$CURRENT_DATETIME'.tar.gz'
db_backup_filename=$PGDB'_'$CURRENT_DATETIME'.tar.gz'
docker exec -t postgres pg_dump -U $POSTGRES_USER $POSTGRES_DB > 'dump_'"$POSTGRES_DB"'.sql'
docker exec -t postgres pg_dump -U $PGUSER $PGDB > 'dump_'"$PGDB"'.sql'
tar -cf - 'dump_'"$POSTGRES_DB"'.sql' | gzip -9 > "$db_backup_filename"
rm 'dump_'"$POSTGRES_DB"'.sql'
tar -cf - 'dump_'"$PGDB"'.sql' | gzip -9 > "$db_backup_filename"
rm 'dump_'"$PGDB"'.sql'
cd "$BACKUP_FOLDER"
md5sum * > MD5SUMS
trap - EXIT
echo 'The backup of the '"$POSTGRES_DB"' database was completed successfully.'
echo 'The backup of the '"$PGDB"' database was completed successfully'

40
rozen_backup.sh Normal file
View File

@ -0,0 +1,40 @@
#!/bin/bash
REMOTE_USER=root
SERVER_ORIGIN_DOMAIN=rozenlab.com
REMOTE_DIR="$REMOTE_USER@$SERVER_ORIGIN_DOMAIN:/backups/"
LOCAL_DIR="/backups/$SERVER_ORIGIN_DOMAIN"
ssh $REMOTE_USER@$SERVER_ORIGIN_DOMAIN "mkdir -p /backups"
# Backup web server:
ssh $REMOTE_USER@$SERVER_ORIGIN_DOMAIN "tar -czvf /backups/www_backup.tar.gz -C /var www"
# Backup home dir:
ssh $REMOTE_USER@$SERVER_ORIGIN_DOMAIN "tar -czvf /backups/rozen_backup.tar.gz -C /home rozen"
# Backup sftp dir:
ssh $REMOTE_USER@$SERVER_ORIGIN_DOMAIN "tar -czvf /backups/sftp_backup.tar.gz -C /var/sftp files"
# Backup gitea app.ini:
ssh $REMOTE_USER@$SERVER_ORIGIN_DOMAIN "tar -czvf /backups/gitea_app_ini_backup.tar.gz -C /etc gitea"
# Backup gitea data:
ssh $REMOTE_USER@$SERVER_ORIGIN_DOMAIN "tar -czvf /backups/gitea_data_backup.tar.gz -C /var/lib gitea"
# Backup nginx cfgs:
ssh $REMOTE_USER@$SERVER_ORIGIN_DOMAIN "tar -czvf /backups/nfinx_cfg_backup.tar.gz -C /etc nginx"
# Backup wordpress database:
ssh $REMOTE_USER@$SERVER_ORIGIN_DOMAIN "mysqldump -u wp_blog_user -pbdcp8zxzojwz5tuhd3mr wp_blog > /backups/wordpress_backup.sql"
# Backup gitea database:
ssh $REMOTE_USER@$SERVER_ORIGIN_DOMAIN "mysqldump -u gitea -prq8vtahhm63aims8aqbz gitea > /backups/gitea_backup.sql"
# Sync all backups from $REMOTE_DIR to $LOCAL_DIR
rsync -avz --delete $REMOTE_DIR $LOCAL_DIR