Add backup-client functionality with Docker support and backup script
This commit is contained in:
13
Dockerfile
Normal file
13
Dockerfile
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
FROM alpine:latest
|
||||||
|
|
||||||
|
RUN apk add --no-cache \
|
||||||
|
openssh-client \
|
||||||
|
sshpass \
|
||||||
|
jq \
|
||||||
|
busybox-extras \
|
||||||
|
borgbackup
|
||||||
|
|
||||||
|
COPY start_backup.sh /start_backup.sh
|
||||||
|
RUN chmod +x /start_backup.sh
|
||||||
|
|
||||||
|
CMD /start_backup.sh
|
106
start_backup.sh
Normal file
106
start_backup.sh
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
SSH_HOST=${SSH_HOST:-"localhost"}
|
||||||
|
SSH_PORT=${SSH_PORT:-20022}
|
||||||
|
SSH_USER=${SSH_USER:-"backup"}
|
||||||
|
SSH_PASSWORD=${SSH_PASSWORD:-"backup"}
|
||||||
|
HOME="/home/$SSH_USER"
|
||||||
|
SSH_DIR="$HOME/.ssh"
|
||||||
|
key_type="ed25519"
|
||||||
|
|
||||||
|
BACKUP_COMPRESSION=${BACKUP_COMPRESSION:-"zstd"}
|
||||||
|
BACKUP_PASSWORD=${BACKUP_PASSWORD:-""}
|
||||||
|
|
||||||
|
if ! id -u "$SSH_USER" >/dev/null 2>&1; then
|
||||||
|
echo "Creating user $SSH_USER..."
|
||||||
|
adduser -D -s /bin/sh -h "/home/$SSH_USER" "$SSH_USER"
|
||||||
|
# Ensure the user is properly initialized in shadow database
|
||||||
|
passwd -u "$SSH_USER" 2>/dev/null || true
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d "$SSH_DIR" ]; then
|
||||||
|
# Generate host keys if they don't exist
|
||||||
|
mkdir -p $SSH_DIR
|
||||||
|
echo "Generating $key_type host key..."
|
||||||
|
ssh-keygen -t "$key_type" -f "$SSH_DIR"/"id_$key_type" -N "" -q
|
||||||
|
chmod 600 $SSH_DIR/id_$key_type
|
||||||
|
|
||||||
|
# Add default ssh password if not set
|
||||||
|
echo "$SSH_USER:$SSH_PASSWORD" | chpasswd
|
||||||
|
chown -R $SSH_USER:$SSH_USER "/home/$SSH_USER"
|
||||||
|
|
||||||
|
echo "Host '$SSH_HOST'
|
||||||
|
HostName '$SSH_HOST'
|
||||||
|
Port '$SSH_PORT'
|
||||||
|
User '$SSH_USER'
|
||||||
|
PreferredAuthentications publickey
|
||||||
|
IdentityFile '$SSH_DIR'/id_'$key_type'
|
||||||
|
IdentitiesOnly yes
|
||||||
|
StrictHostKeyChecking no
|
||||||
|
">> $SSH_DIR/config
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd $SSH_DIR
|
||||||
|
rm /root/.ssh/config 2>/dev/null || true
|
||||||
|
rm /root/.ssh/known_hosts 2>/dev/null || true
|
||||||
|
echo "Host *
|
||||||
|
IdentityFile '$SSH_DIR'/id_'$key_type'
|
||||||
|
IdentitiesOnly yes
|
||||||
|
StrictHostKeyChecking no
|
||||||
|
"> /root/.ssh/config
|
||||||
|
|
||||||
|
if [ "$SSH_HOST" != "localhost" ]; then
|
||||||
|
SSH_HOST="$(echo $SSH_HOST | base64 -d | jq -r '.[]')"
|
||||||
|
fi
|
||||||
|
# creating cycle for backup services
|
||||||
|
for BACKUP in $( echo -n $SSH_HOST) ; do
|
||||||
|
# check backup client availability
|
||||||
|
RESPONSE=$(echo "exit" | timeout 5 telnet $BACKUP $SSH_PORT | grep Connected)
|
||||||
|
echo "RESPONSE: $RESPONSE"
|
||||||
|
if [ "$RESPONSE" == "" ]; then
|
||||||
|
echo "Expected backup client $BACKUP on port $SSH_PORT currently not available"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
# set backup client IP addresses and ports
|
||||||
|
sshpass -p "$SSH_PASSWORD" ssh -o StrictHostKeyChecking=no -o PreferredAuthentications=password -o ConnectTimeout=5 -p $SSH_PORT $SSH_USER@$BACKUP exit 2>/dev/null
|
||||||
|
PASSWORD_AUTH_EXIT_CODE=$?
|
||||||
|
echo "PASSWORD_AUTH_EXIT_CODE: $PASSWORD_AUTH_EXIT_CODE"
|
||||||
|
|
||||||
|
if [ $PASSWORD_AUTH_EXIT_CODE -eq 0 ]; then
|
||||||
|
echo "SSH password authentication enabled"
|
||||||
|
sshpass -p "$SSH_PASSWORD" ssh -p $SSH_PORT -i $SSH_DIR/id_$key_type $SSH_USER@$BACKUP "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" < $SSH_DIR/id_$key_type.pub
|
||||||
|
ssh -i $SSH_DIR/id_$key_type -p $SSH_PORT $SSH_USER@$BACKUP sed -i "s/PasswordAuthentication\ yes/PasswordAuthentication\ no/g" .ssh/server/sshd_config
|
||||||
|
sleep 2
|
||||||
|
fi
|
||||||
|
sshpass -p "$SSH_PASSWORD" ssh -o StrictHostKeyChecking=no -o PreferredAuthentications=password -o BatchMode=yes -o ConnectTimeout=5 -p $SSH_PORT $SSH_USER@$BACKUP exit 2>/dev/null
|
||||||
|
PASSWORD_AUTH_EXIT_CODE=$?
|
||||||
|
echo "PASSWORD_AUTH_EXIT_CODE: $PASSWORD_AUTH_EXIT_CODE"
|
||||||
|
# check ssh connection via pub key
|
||||||
|
if [ $PASSWORD_AUTH_EXIT_CODE -ne 0 ]; then
|
||||||
|
echo "SSH password authentication is disabled on the server."
|
||||||
|
|
||||||
|
# check borg backup state
|
||||||
|
export $BACKUP_PASSWORD # Replace your current borg check section with:
|
||||||
|
# check borg backup state
|
||||||
|
CHECK_BACKUP_STATE=$(ssh -i $SSH_DIR/id_$key_type -p $SSH_PORT $SSH_USER@$BACKUP "BORG_PASSPHRASE='$BACKUP_PASSWORD' borg info /backup/ 2> /dev/null")
|
||||||
|
if [ -z "$CHECK_BACKUP_STATE" ]; then
|
||||||
|
echo "Ready to init borg backup"
|
||||||
|
# Initialize borg repository with encryption
|
||||||
|
if [ -z "$BACKUP_COMPRESSION" ]; then
|
||||||
|
COMPRESSION=$(echo "--compression $BACKUP_COMPRESSION")
|
||||||
|
else
|
||||||
|
COMPRESSION=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
ssh -i $SSH_DIR/id_$key_type -p $SSH_PORT $SSH_USER@$BACKUP "BORG_PASSPHRASE='$BORG_PASSPHRASE' borg init --encryption=repokey-blake2 $SSH_DIR/backup/"
|
||||||
|
echo "Borg repository initialized with encryption"
|
||||||
|
else
|
||||||
|
# start backup
|
||||||
|
echo "Borg backup is already initialized. Starting backup..."
|
||||||
|
# Your backup command here with passphrase
|
||||||
|
ssh -i $SSH_DIR/id_$key_type -p $SSH_PORT $SSH_USER@$BACKUP "BACKUP_PASSWORD='$BACKUP_PASSWORD' borg create $COMPRESSION /backup/::{hostname}-{now} $SSH_DIR/backup/"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
Reference in New Issue
Block a user