[BASH] Автоматическая очистка Source серверов

iamdss

Участник
Сообщения
124
Реакции
9
Держу несколько сервачков, управляю при помощи шелла. Недавно решил, что мне нужен скрипт, который будет чистить мне серверы от демок, логов и прочего говна. При этом, желательно, чтобы он эти демки-логи упаковывал и куда-то складывал на будущее (мало ли) или даже заливал на сторонний сервер, веб хостинг, например. Так получилась небольшая кучка гов.. пачка скриптов, которую можно склонировать по ссылке. Пока там не густо, но уже кое-что работает:

  • Чистит и пакует демки
  • Чистит и пакует логи
  • Следит за свободным местом
  • О результатах уведомляет в телегу при помощи бота
  • Умеет запускаться systemd таймером (не cron, лучше)
Сразу скажу - я не мастер в POSIX и т. п. поэтому вы увидите здесь и function, и двойные квадратные скобки, и что-то ещё. Но меня пока устраивает. Протестировано на убунте 20+.

В общем, я к чему. Если здесь есть кто-то, кому мой код может пригодиться - велкам! Для меня он вроде как работает, но если у кого будут проблемы, рад буду исправить практики ради. Если же есть какие советы и предложения, также велкам сюда или в телегу - смотри профиль.
Оффтоп
Всем бобра и поменьше говна на сервере)

Сразу скажу, что это больше для нубиков, каким и я когда-то был. Так что постараюсь объяснить на пальцах. Если уже опытный, то не ломай мне их, пожалуйста! Спасибо.

Итак. Сперва правим конфиг (смотри ниже). Затем проверяем, запуская run.sh вручную.

Запускаем так:

./run.sh

Если не запускается, потому что прав на запуск нет, то выдай ему права:

chmod +x run.sh

После того, как конфиг настроен и запуск run.sh отдебажен и вопросов к нему нет, можно установить скрипт как службу. Для этого в меню вводи cfg и следуй инструкциям. Как правило, ничего там трогать не нужно, только выбрать интервал запуска (час, день, неделя, месяц).

Настройка конфига.

Идём в servers/ и копируем template.config в что-то-там.config:

cp template.config my-best-server.config

Далее открываем my-best-server.config за минимальной настройкой и меняем следующие переменные на свои:

CONFIG_DESCRIPTION - Описание конфига. Если конфиг не один, очень пригодится.

GAME_DIR - директория сервера. Это не корень сервера, а та директория, в которой у тебя console.log и папочка с твоими любимыми addons. Например:
GAME_DIR="/home/iamdss/servers/killbox/hl2mp"

Остальные пути можешь не трогать, если не возражаешь, чтобы скрипты клали архивы в $GAME_DIR/packed. Либо поправь сам, если возражаешь.

На этом минимальная настройка закончена, дальше выеулучшения.

Если используется телеграм:

TELEGRAM_BOT_TOKEN - Токен бота
TELEGRAM_CHATID - ID чата, в который добавлен бот
TELEGRAM_USERID - UserID чувака в чате (тебя, например). Самый простой способ получить - это использовать какой-нибудь бот типа combat_useridbot, куча их
TELEGRAM_USERNAME - Читаемый юзернейм чувака в чате.

Смысл userid и username в том, что скрипт упоминает тебя в группе и тебе придёт уведомление, при этом группу спокойно можно заглушить. Очень удобно. У меня заглушено всё - чат сервера, смены карт и т.д., но результаты скриптов я всё равно вижу в шторке.

Кстати, переменную, отвечающую за проверку свободного места на дисках (DISK_CHECKLIST) можно вообще не трогать, скрипт всё равно должен будет проверить как минимум диск с примонтированным корнем системы.

Если планируешь заливать файло по rsync на другой сервер, то поправь блок соответствующих переменных. Это похоже на то, как ты создаёшь SSH соединение в твоём клёвом терминале. Например:

# Айпишник или домен
REMOTE_HOST="123.123.123.123"
# Порт SSH (обычно 22, но как настроишь, у меня вот не 22)
REMOTE_PORT="22"
# Пользователь, под которым скрипт будет логиниться
REMOTE_USER="iamdss"
# Это приватный ключ на этой машине, на той должен лежать публичный, в authorized_keys
REMOTE_KEY="/home/iamdss/.ssh/id_rsa_hlsync"
# Это директория, откуда файлы будут залиты на удалённый сервер. Можно использовать переменную, хранящую путь к запакованным демкам
REMOTE_FROM="$DEMOS_ZIP_DIR"
# А это - директория на удалённом сервере, куда надо лить файлы
REMOTE_TO="/home/iamdss/test"

Заливка файлов работает так: обработчик запускает rsync, который логинится к $REMOTE_HOST:$REMOTE_PORT по SSH, используя приватный ключ REMOTE_KEY тут и публичный - там. Для генерации и проброса ключей используй ssh-keygen + ssh-copy-id, но если совсем лапки, то можно и вручную залить, один пенис. rsync есть почти везде, он очен быстр, льёт только то, что изменилось, плюс имеет огромное количество опций и работает по шифрованному каналу. Круто, чё!

Чтобы rsync не жрал сетевой канал, если он жидкий, подстрой переменную RSYNC_BANDWIDTH (оно в Кб/с, 5000 там поставь, не знаю). Если на удалённом сервере нужна точная копия локальных файлов, то сделай RSYNC_DELETE="yes", тогда rsync будет удалять то, чего нет в локальной директории. А если сделать RSYNC_DELETE_SOURCE="yes", то rsync будет удалять уже ЛОКАЛЬНЫЕ файлы, после того, как зальёт их на удалённый сервер. Так можно неплохо освободить место на сервере. Любые другие модификаторы (если шаришь) можно добавить через переменную RSYNC_CUSTOM_RULES, в темплейте есть реально полезный пример, который можно модифицировать: "--exclude={'console-logs','logs','sourcemod-logs'}", и хоба! Льёшь только демки, без логов.

Ну и не забывай про возможность отключения отдельных обработчиков через переменные WORKER_*, если они тебе не нужны. Ну, я не знаю. Мало ли.

Также можно отключить конфиг целиком, сделав CONFIG_ENABLED="no", скрипты такой конфиг проигнорируют.

И да! Если в путях есть пробелы, а ты используешь их в конфиге, то обязательно заверни их в ""! Ну, вдруг ты не знал.

Быдлокодерский ченджлог:
[18.02] Прогнал код через ShellCheck и причесал, исправлены ошибки
[23.02] [1] systemd юниты теперь создаются в хомяке пользака, что хорошо, а не в /etc/systemd, что плохо (запускались то они от рута, а я лопух). Теперь права sudo не нужны. Добби свободен.
[23.02] [2] Добавил обработчик для логов Sourcemod.
[27.02] Добавил синхронизацию любых каталогов между серверами через rsync+ssh. Понадобится проброс ключа на принимающий сервер. Так можно легко организовать заливку демок на веб сервер, например =)
[11.03] Добавил обработчик для загрузки заархивированных файлов на Яндекс.Диск (Используется API Яндекса). Директория предварительно чистится от старых файлов.
 
Последнее редактирование:

iamdss

Участник
Сообщения
124
Реакции
9
Не, бро, не оно, мне обсуждение нужно, код сырой ещё. А в ресурсах вроде уже отлаженное должно лежать. Но спс тебе, когда скрипты будут причёсаны (если не забью), то кину в ресурсы.
 

rejchev

Менеджер клоунов
Сообщения
1,465
Реакции
1,141
Почему не Ruby или python для автоматизации процессов подобного рода?
 

iamdss

Участник
Сообщения
124
Реакции
9
Зависимости не хочу тянуть. Ни то, ни то не используется у меня. Кроме того, и шелл справляется.
 

iamdss

Участник
Сообщения
124
Реакции
9
Обновлено. Теперь скрипты умеют заливать содержимое любой директории на любой сервер, имеющий на борту rsync и нужный публичный ключ в ~/.ssh. Я лью на файлопомойку, но вы можете организовать так заливку демок на веб сервер, например, чёбынет.
 

iamdss

Участник
Сообщения
124
Реакции
9
Обновлено. Добавлен обработчик, помогающий загрузить файлы на Яндекс.Диск по REST API. С автоочисткой старых файлов на Диске по дате. Точная доработка напильником будет чуть позже.
 
Сверху Снизу