changes
This commit is contained in:
parent
703b7ff265
commit
26e1b4bada
49
README.md
49
README.md
@ -11,4 +11,51 @@
|
|||||||
* Кроме того, необходимо проверить переменные, пути к директориям, которые указаны непосредственно в скриптах.
|
* Кроме того, необходимо проверить переменные, пути к директориям, которые указаны непосредственно в скриптах.
|
||||||
|
|
||||||
* В скрипте `remote-backup.sh` приведен пример для удаленной синхронизации папки `backups` с другим сервером.
|
* В скрипте `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
24
acme.sh
Normal 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
15
all.sh
@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
if [ "$(id -u)" != "0" ]; then
|
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
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -10,14 +10,19 @@ set -e
|
|||||||
|
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
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"
|
bash postgres.sh "$dbname" "$owner"
|
||||||
done
|
done
|
||||||
|
|
||||||
bash files.sh
|
bash files.sh
|
||||||
|
bash acme.sh
|
||||||
bash cleaner.sh
|
bash cleaner.sh
|
||||||
|
|
||||||
echo 'Done.'
|
|
||||||
|
|
||||||
trap - EXIT
|
trap - EXIT
|
||||||
echo "All backups were made successfully. Outdated backups have been deleted."
|
echo "All backups were made successfully. Outdated backups have been deleted"
|
@ -1,3 +0,0 @@
|
|||||||
# /sample/folder/
|
|
||||||
/data/appdata/gitea/
|
|
||||||
/data/projects/
|
|
28
cleaner.sh
28
cleaner.sh
@ -4,7 +4,7 @@ EXPIRE_DAYS=14
|
|||||||
SCAN_DIR=/backups
|
SCAN_DIR=/backups
|
||||||
|
|
||||||
if [ "$(id -u)" != "0" ]; then
|
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
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -13,24 +13,26 @@ set -e
|
|||||||
|
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
|
echo 'Cleaning old backups...'
|
||||||
|
|
||||||
FILES=$(find $SCAN_DIR -type f)
|
FILES=$(find $SCAN_DIR -type f)
|
||||||
for file in $FILES;
|
for file in $FILES;
|
||||||
do
|
do
|
||||||
timestamp=$(date -r $file +%Y%m%d);
|
timestamp=$(date -r "$file" +%Y%m%d)
|
||||||
echo "Processing $file file..";
|
echo "Processing $file file.."
|
||||||
date1yrs=$(date -d "$timestamp" +%Y);
|
date1yrs=$(date -d "$timestamp" +%Y)
|
||||||
date1days=$(date -d "$timestamp" +%j);
|
date1days=$(date -d "$timestamp" +%j)
|
||||||
date2yrs=$(date +%Y);
|
date2yrs=$(date +%Y)
|
||||||
date2days=$(date +%j);
|
date2days=$(date +%j)
|
||||||
diffYear=$(expr "$date2yrs" - "$date1yrs");
|
diffYear=$((date2yrs - date1yrs))
|
||||||
diffYear2days=$(expr "$diffYear" \* 365);
|
diffYear2days=$((diffYear * 365))
|
||||||
diffDays=$(expr "$date2days" - "$date1days");
|
diffDays=$((date2days - date1days))
|
||||||
DAYS=$(expr "$diffYear2days" + "$diffDays");
|
DAYS=$((diffYear2days + diffDays))
|
||||||
|
|
||||||
if [ "$DAYS" -ge $EXPIRE_DAYS ]
|
if [ "$DAYS" -ge $EXPIRE_DAYS ]
|
||||||
then
|
then
|
||||||
echo "Deleting $file file...";
|
echo "Deleting $file file..."
|
||||||
rm "$file";
|
rm "$file"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
7
files.sh
7
files.sh
@ -10,7 +10,7 @@ set -e
|
|||||||
|
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
BACKUP_LIST="./backups.list"
|
BACKUP_LIST=/data/$SRV_START_DIR/backups.cfg
|
||||||
BACKUP_DIR="/backups/files"
|
BACKUP_DIR="/backups/files"
|
||||||
|
|
||||||
# Checking the presence of a backups.list
|
# Checking the presence of a backups.list
|
||||||
@ -22,6 +22,8 @@ fi
|
|||||||
# Creating main directories (if not created)
|
# Creating main directories (if not created)
|
||||||
mkdir -p "$BACKUP_DIR"
|
mkdir -p "$BACKUP_DIR"
|
||||||
|
|
||||||
|
echo 'Creating files backup...'
|
||||||
|
|
||||||
# Reading a list of directories for backup
|
# Reading a list of directories for backup
|
||||||
while IFS= read -r DIR; do
|
while IFS= read -r DIR; do
|
||||||
# Ignore lines starting with #
|
# Ignore lines starting with #
|
||||||
@ -39,7 +41,8 @@ while IFS= read -r DIR; do
|
|||||||
|
|
||||||
# Formation of the archive name
|
# Formation of the archive name
|
||||||
BASENAME=$(basename "$DIR")
|
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"
|
ARCHIVE_NAME="${BASENAME}_${TIMESTAMP}.tar.gz"
|
||||||
|
|
||||||
# Creating a directory to store backups of this folder
|
# Creating a directory to store backups of this folder
|
||||||
|
29
postgres.sh
29
postgres.sh
@ -1,12 +1,12 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
if [ "$(id -u)" != "0" ]; then
|
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
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -z "$1" ] || [ -z "$2" ]; then
|
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
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -16,35 +16,36 @@ set -e
|
|||||||
export DEBIAN_FRONTEND=noninteractive
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
# configuration settings
|
# configuration settings
|
||||||
POSTGRES_DB="$1"
|
PGDB="$1"
|
||||||
POSTGRES_USER="$2"
|
PGUSER="$2"
|
||||||
|
|
||||||
CURRENT_MONTH=$(date +%Y-%m)
|
CURRENT_MONTH=$(date +%Y-%m)
|
||||||
CURRENT_DATE=$(date +%Y-%m-%d)
|
CURRENT_DATE=$(date +%Y-%m-%d)
|
||||||
CURRENT_DATETIME=$(date +%d-%b-%Y_%H_%M_%Z)
|
#CURRENT_DATETIME=$(date +%d-%b-%Y_%H_%M_%Z)
|
||||||
BACKUPS_PATH=/data/backups/postgres
|
CURRENT_DATETIME=$(date +%d-%m-%Y_%H%M%S)
|
||||||
|
BACKUPS_PATH=/backups/postgres
|
||||||
DOCKER_SERVICE_NAME=postgres
|
DOCKER_SERVICE_NAME=postgres
|
||||||
|
|
||||||
# backup PostgreSQL database
|
# backup PostgreSQL database
|
||||||
BACKUP_FOLDER=$BACKUPS_PATH/$POSTGRES_DB
|
BACKUP_FOLDER=$BACKUPS_PATH/$PGDB
|
||||||
if [ ! -d "$BACKUP_FOLDER" ]; then
|
if [ ! -d "$BACKUP_FOLDER" ]; then
|
||||||
mkdir -p "$BACKUP_FOLDER"
|
mkdir -p "$BACKUP_FOLDER"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo 'Creating PostgreSQL backups...'
|
echo 'Creating PostgreSQL backups...'
|
||||||
cd "$BACKUP_FOLDER"
|
cd "$BACKUP_FOLDER"
|
||||||
if [ -f 'dump_'"$POSTGRES_DB"'.sql' ]; then
|
if [ -f 'dump_'"$PGDB"'.sql' ]; then
|
||||||
rm 'dump_'"$POSTGRES_DB"'.sql'
|
rm 'dump_'"$PGDB"'.sql'
|
||||||
fi
|
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"
|
tar -cf - 'dump_'"$PGDB"'.sql' | gzip -9 > "$db_backup_filename"
|
||||||
rm 'dump_'"$POSTGRES_DB"'.sql'
|
rm 'dump_'"$PGDB"'.sql'
|
||||||
|
|
||||||
cd "$BACKUP_FOLDER"
|
cd "$BACKUP_FOLDER"
|
||||||
md5sum * > MD5SUMS
|
md5sum * > MD5SUMS
|
||||||
|
|
||||||
trap - EXIT
|
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
40
rozen_backup.sh
Normal 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
|
Loading…
Reference in New Issue
Block a user