#!/bin/bash
set +x
function backup_daemon_json() {
local daemon_json_file="/etc/docker/daemon.json"
local backup_dir="/etc/docker/daemon_json_backup"
if ! sudo -n true 2>/dev/null; then
echo "脚本需要sudo权限才能操作文件,请确保脚本以sudo或root身份运行。"
exit 1
fi
if [ -f "$daemon_json_file" ]; then
local backup_date=$(date "+%Y-%m-%d_%H-%M-%S")
local backup_file="$backup_dir/daemon.json_$backup_date"
if ! mkdir -p "$backup_dir"; then
echo "创建备份目录失败,请检查目录权限或路径设置。"
exit 1
fi
sudo cp "$daemon_json_file" "$backup_file"
echo "已备份原有的daemon.json文件为 $backup_file"
fi
}
function create_daemon_json() {
local daemon_json_content='{"insecure-registries": ["192.168.1.144:8083", "192.168.1.144:8082"]}'
if ! sudo -n true 2>/dev/null; then
echo "脚本需要sudo权限才能写入文件,请确保脚本以sudo或root身份运行。"
exit 1
fi
echo "$daemon_json_content" | sudo tee /etc/docker/daemon.json > /dev/null
echo "重新加载daemon.json配置"
sudo systemctl daemon-reload
echo "重启 Docker 以使daemon.json配置生效"
sudo systemctl restart docker
sleep 5
if ! docker images | awk -v image="elasticdump" -v tag="6.41.0" '$1 == image && $2 == tag { found = 1; exit } END { exit !found }'; then
if docker pull 192.168.1.144:8083/elasticdump:6.41.0; then
echo "成功从私库中拉取镜像 192.168.1.144:8083/elasticdump:6.41.0"
docker tag 192.168.1.144:8083/elasticdump:6.41.0 elasticdump:6.41.0
else
echo "从私库中拉取镜像失败,请检查私库地址和镜像是否正确。"
exit 1
fi
else
echo "本地已存在相同版本的镜像 elasticdump:6.41.0,跳过拉取镜像步骤。"
fi
}
function backup_docker_elasticsearch() {
if ! command -v docker &>/dev/null; then
echo "未安装 Docker,无法进行容器备份。"
return 1
fi
local container_id=$(docker ps -a | grep -E "es|elasticsearch" | awk '{print $1}' 2>/dev/null)
if [ -n "$container_id" ]; then
local backup_dir="$1"
local index_name="$2"
local es_user="$3"
local es_password="$4"
local es_ip="$5"
local backup_date=$(date "+%Y-%m-%d_%H-%M-%S")
local backup_path="$backup_dir/$backup_date"
if ! mkdir -p "$backup_path"; then
echo "创建备份路径失败,请检查目录权限或路径设置。"
return 1
fi
sleep 3
for index in $2; do
if [ -z "$es_password" ]; then
docker run --rm -ti -v "$backup_path/$index":/tmp "elasticdump:6.41.0" --input="http://$5:9200/$index" --output="/tmp/elasticsearch_data.json" --all=true --limit 10000
else
if docker run --rm -ti -v "$backup_path/$index":/tmp "elasticdump:6.41.0" --input="http://$3:$4@$5:9200/$index" --output="/tmp/elasticsearch_data.json" --all=true --limit 10000; then
echo "Elasticsearch 数据备份完成,备份目录:$backup_path/$index"
else
echo "备份失败,请检查 Elasticsearch 用户名和密码是否正确。"
return 1
fi
fi
done
else
echo "未找到正在运行的 Elasticsearch 容器(Docker部署)。"
return 1
fi
}
function backup_compiled_elasticsearch() {
local backup_dir="$1"
local index_name="$2"
local es_user="$3"
local es_password="$4"
local es_ip="$5"
if ! command -v elasticdump &>/dev/null; then
echo "未找到 elasticdump 命令,请确认是否已安装。"
return 1
fi
local backup_date=$(date "+%Y-%m-%d_%H-%M-%S")
local backup_path="$backup_dir/$backup_date"
if ! mkdir -p "$backup_path"; then
echo "创建备份路径失败,请检查目录权限或路径设置。"
return 1
fi
if [ -z "$es_password" ]; then
elasticdump --input="http://$5:9200/$2" --output="$backup_path/elasticsearch_data.json" --all=true --limit 10000
else
if elasticdump --input="http://$3:$4@$5:9200/$2" --output="$backup_path/elasticsearch_data.json" --all=true --limit 10000; then
echo "Elasticsearch 数据备份完成,备份目录:$backup_path"
else
echo "备份失败,请检查 Elasticsearch 用户名和密码是否正确。"
exit 1
fi
fi
}
function delete_old_backups() {
local backup_dir="$1"
local retain_days="$2"
if [ "$retain_days" -gt 0 ]; then
today=$(date "+%Y-%m-%d")
for dir in "$backup_dir"/*; do
if [ -d "$dir" ]; then
dir_date=$(basename "$dir" | cut -d'_' -f1)
days_diff=$(( ($(date -d "$today" +%s) - $(date -d "$dir_date" +%s)) / (3600*24) ))
if [ $days_diff -gt "$retain_days" ]; then
echo "删除 $dir"
rm -rf "$dir"
else
echo "保留 $dir"
fi
fi
done
echo "删除超过 $retain_days 天的备份目录完成。"
else
echo "备份保留天数设置不正确,请设置大于 0 的值。"
fi
}
${IP}}
${username}
${password}
${backup_directory}
${index_name}
${backup_retain_days}
echo "-------------备份任务开始-------------"
backup_daemon_json
create_daemon_json
backup_docker_elasticsearch "$backup_directory" "$index_name" "$username" "$password" "$IP"
backup_compiled_elasticsearch "$backup_directory" "$index_name" "$username" "$password" "$IP"
delete_old_backups "$backup_directory" "$backup_retain_days"
echo "-------------备份任务完成-------------"