[VDS/VPS] Скрипт синхронизации FastDL

Mr_panica

XenForo one 💖
Сообщения
942
Реакции
460
Есть такой небольшой скрипт для синхронизации файлов на игровом сервере с файлами на FastDL.
Он смотрит какие есть файлы на игровом сервере и автоматически делает копию на FastDL с сжатием bz2.

В принципе простой скрипт, написан ИИ, может кому-то очень помочь что-бы вручную не закидывать на FastDL.

Настройки скрипта:
Полные пути до ваших серверов (где папка addons, maps)

То что в [] (например ["server1"]) будет взято за имя создаваемой папки.
C-подобный:
declare -A SERVERS=(
    ["server1"]="/var/lib/pterodactyl/volumes/6beb8240-660d-4ed5-b9cb-488aa9bb4b86/tf"
    ["server2"]="/var/lib/pterodactyl/volumes/21a10f59-ffd8-438c-b32f-ece79364c2be/tf"
)

Уровень сжатия bzip2, если ставить меньше, то будет быстрее обрабатывать, но и сжатие будет меньше.
C-подобный:
COMPRESSION_LEVEL

Полный путь до вашего хранилища FastDL.
C-подобный:
FASTDL_ROOT="/var/lib/pterodactyl/volumes/667c6699-ee3a-4475-958d-8cd85603a982/webroot/fastdl"

Форматы файлов, которые будут использоваться.
C-подобный:
declare -A FILE_TYPES=(
    ["maps"]="*.bsp"
    ["materials"]="*.vtf *.vmt"
    ["models"]="*.mdl *.vtx *.phy *.vvd"
    ["sound"]="*.wav *.mp3"
)

Затем нужно задать интервал исполнения скрипта через cron. Например каждые 5 минут. Ну или же выполнять скрипт вручную после изменений на сервере.

Скрипт должен полностью повторять структуру и файлы игрового сервера, то есть если у вас были 2 карты, и вы на игровом сервере удалили вторую, то она удалится и на FastDL.
Если на игровом сервере не будет папки или файлов, которые есть на FastDL или в процессе работы скрипта возникнет проблема, то папка на FastDL будет удалена.

C-подобный:
#!/bin/bash
# Скрипт для создания FastDL с интеллектуальной синхронизацией и очисткой

declare -A SERVERS=(
    ["server1"]="/var/lib/pterodactyl/volumes/6beb8240-660d-4ed5-b9cb-488aa9bb4b86/tf"
    ["server2"]="/var/lib/pterodactyl/volumes/21a10f59-ffd8-438c-b32f-ece79364c2be/tf"

)

FASTDL_ROOT="/var/lib/pterodactyl/volumes/667c6699-ee3a-4475-958d-8cd85603a982/webroot/fastdl"
COMPRESSION_LEVEL=9

declare -A FILE_TYPES=(
    ["maps"]="*.bsp"
    ["materials"]="*.vtf *.vmt"
    ["models"]="*.mdl *.vtx *.phy *.vvd"
    ["sound"]="*.wav *.mp3"
)

# Сжатие и синхронизация файлов
sync_folder() {
    local server_path="$1"
    local fastdl_dir="$2"
    local folder="$3"
    shift 3
    local patterns=("$@")

    src_dir="${server_path}/${folder}"
    dst_dir="${fastdl_dir}/${folder}"

    echo "--- Проверка папки: ${folder}"

    if [ ! -d "$src_dir" ]; then
        echo "⛔ Папка отсутствует: $src_dir"
        rm -rf "$dst_dir"
        return
    fi

    mkdir -p "$dst_dir"

    # Формируем выражение find
    find_expr=()
    for pattern in "${patterns[@]}"; do
        find_expr+=(-iname "$pattern" -o)
    done
    unset 'find_expr[${#find_expr[@]}-1]'  # убираем последний -o

    # Сжатие новых или изменённых файлов
    while IFS= read -r -d '' file; do
        rel_path="${file#${server_path}/}"
        dest_file="${fastdl_dir}/${rel_path}.bz2"

        mkdir -p "$(dirname "$dest_file")"

        if [ ! -f "$dest_file" ] || [ "$file" -nt "$dest_file" ]; then
            echo "📦 Сжатие: $rel_path"
            bzip2 -ck$COMPRESSION_LEVEL "$file" > "$dest_file"
            chmod 644 "$dest_file"
        fi
    done < <(find "$src_dir" -type f \( "${find_expr[@]}" \) -print0)

    # Удаление устаревших .bz2 файлов
    if [ -d "$dst_dir" ]; then
        while IFS= read -r -d '' bz2_file; do
            original_file="${bz2_file%.bz2}"
            original_rel="${original_file#${fastdl_dir}/}"
            if [ ! -f "${server_path}/${original_rel}" ]; then
                echo "🗑️ Удаление устаревшего: ${bz2_file#$FASTDL_ROOT/}"
                rm -f "$bz2_file"
            fi
        done < <(find "$dst_dir" -type f -name "*.bz2" -print0)
    fi
}

# Обработка одного сервера
process_server() {
    local name="$1"
    local path="$2"
    local fastdl_path="${FASTDL_ROOT}/${name}"

    echo "=== Обработка сервера: $name ==="
    mkdir -p "$fastdl_path"

    for folder in "${!FILE_TYPES[@]}"; do
        IFS=' ' read -r -a patterns <<< "${FILE_TYPES[$folder]}"
        sync_folder "$path" "$fastdl_path" "$folder" "${patterns[@]}"
    done

    echo "✅ Завершена обработка $name"
}

# Основной запуск
mkdir -p "$FASTDL_ROOT"
for name in "${!SERVERS[@]}"; do
    path="${SERVERS[$name]}"
    if [ -d "$path" ]; then
        process_server "$name" "$path"
    else
        echo "⚠️ Папка сервера $name не найдена: $path"
    fi
done

echo "=== Все сервера синхронизированы ==="
 
Сверху Снизу