Mr_panica
XenForo one 💖
- Сообщения
- 942
- Реакции
- 460
Есть такой небольшой скрипт для синхронизации файлов на игровом сервере с файлами на FastDL.
Он смотрит какие есть файлы на игровом сервере и автоматически делает копию на FastDL с сжатием bz2.
В принципе простой скрипт, написан ИИ, может кому-то очень помочь что-бы вручную не закидывать на FastDL.
Настройки скрипта:
Полные пути до ваших серверов (где папка addons, maps)
То что в [] (например ["server1"]) будет взято за имя создаваемой папки.
Уровень сжатия bzip2, если ставить меньше, то будет быстрее обрабатывать, но и сжатие будет меньше.
Полный путь до вашего хранилища FastDL.
Форматы файлов, которые будут использоваться.
Затем нужно задать интервал исполнения скрипта через cron. Например каждые 5 минут. Ну или же выполнять скрипт вручную после изменений на сервере.
Скрипт должен полностью повторять структуру и файлы игрового сервера, то есть если у вас были 2 карты, и вы на игровом сервере удалили вторую, то она удалится и на FastDL.
Если на игровом сервере не будет папки или файлов, которые есть на FastDL или в процессе работы скрипта возникнет проблема, то папка на 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 "=== Все сервера синхронизированы ==="