🟢
Не теория — наш живой бот: RVV Hunter MTF работает прямо сейчас (WR 66%, +$141 за 15 дней). Всё что в этом уроке — настроено на нашей боевой системе.
Урок 7: Backblaze B2 бэкапы для вашего трейдинг-бота
Как спать спокойно, зная, что данные вашего бота в безопасности.
⏱ Время на прочтение: ~25 минут.
📖 Основные термины
Прежде чем мы начнем, давайте быстро разберемся с ключевыми понятиями. Без сложного жаргона.
- Backup (Бэкап): Это просто резервная копия ваших данных. Как запасной ключ от квартиры, только для информации.
- Backblaze B2: Облачное хранилище. Представьте себе бесконечный и очень дешевый жесткий диск в интернете, куда мы будем складывать наши бэкапы.
- S3-compatible: Стандарт общения с облачными хранилищами. Backblaze B2 его поддерживает, а это значит, что для работы с ним подходят десятки инструментов, изначально созданных для Amazon S3.
- rclone: "Швейцарский нож" для работы с облачными хранилищами. Эта утилита умеет копировать, синхронизировать и управлять файлами между вашим сервером и десятками облачных сервисов, включая Backblaze B2.
- cron: Встроенный в Linux планировщик задач. Мы скажем ему: "Эй, cron, запускай наш скрипт бэкапа каждый день в 4 утра", и он будет это делать.
- Lifecycle Policy (Политика жизненного цикла): Набор правил в Backblaze B2, которые автоматически удаляют старые файлы. Например, "удалять все бэкапы старше 30 дней". Это помогает экономить деньги.
❌ До / ✅ После
❌ До внедрения бэкапов
- Сервер "сгорел" (диск вышел из строя) → ВСЁ ПРОПАЛО.
- История сделок, логи, настройки, база данных — всё потеряно.
- Случайная команда `rm -rf` может уничтожить месяцы работы.
- Постоянное чувство тревоги: "А что, если...?"
|
✅ После внедрения бэкапов
- Сервер "сгорел" → 15 минут на запуск нового сервера + 5 минут на восстановление данных из бэкапа.
- Все данные (база, конфиги, логи) надежно хранятся в другом месте.
- Ошибки не так страшны. Можно откатиться к вчерашней копии.
- Спокойный сон. Ваш бизнес-актив (бот и его данные) в безопасности.
|
Наша история: падение сервера за €5
Представьте себе: ваш трейдинг-бот, которого вы писали по ночам, наконец-то работает. Он крутится на маленьком, но шустром VPS-сервере от Hetzner за €5 в месяц. Dashboard показывает стабильную прибыль, сделки идут, логи пишутся. Жизнь прекрасна.
И вот однажды утром вы просыпаетесь, завариваете кофе, открываете ноутбук... а dashboard не загружается. "Хм, может, интернет лагает?" — думаете вы. Пробуете подключиться к серверу по SSH — тишина. Панель управления хостера показывает страшное: "Host offline".
Вы пишете в поддержку, и через час приходит ответ, от которого холодеет внутри: "К сожалению, на вашем сервере произошел сбой физического диска. Данные не подлежат восстановлению".
Щелчок. И всё пропало.
Несколько недель работы над стратегией. Вся история сделок, которую вы собирались анализировать. Все тонкие настройки в `.env` файлах. Всё превратилось в ничто. И в этот момент приходит то самое "ага"-осознание: бэкап, который стоил бы €1 в месяц, спас бы всё. Эта боль — реальна. И сегодня мы сделаем так, чтобы вы с ней никогда не столкнулись.
Часть 1: Определяем, что нужно сохранять
Бэкапить всё подряд — плохая идея. Это долго, дорого и бессмысленно. Нам нужно сохранять только то, что нельзя легко воссоздать.
Что мы ОБЯЗАТЕЛЬНО бэкапим:
- База данных: Это сердце вашего бота.
- Если у вас SQLite — это просто один файл (например, `trading_bot.db`).
- Если у вас PostgreSQL/MySQL — нужно делать специальный дамп базы данных.
- Файлы конфигурации: Все файлы `.env`, `config.yml`, `settings.json` и т.д. В них содержатся ключи API, настройки стратегий и другие важные параметры.
- Логи сделок (Trade Logs): Если ваш бот пишет историю сделок в текстовые файлы, их нужно бэкапить для анализа и аудита.
Что мы НЕ бэкапим:
- Docker-образы: Их всегда можно скачать заново из Docker Hub или вашего приватного репозитория.
- Виртуальное окружение Python (`venv`): Оно создается заново при установке зависимостей из `requirements.txt`.
- Системные файлы и библиотеки: Они являются частью операционной системы и восстанавливаются при создании нового сервера.
Часть 2: Настройка Backblaze B2
Это займет 5 минут. Мы создадим хранилище (bucket) и получим ключи для доступа.
- Регистрация: Перейдите на страницу регистрации Backblaze B2 и создайте аккаунт.
- Создание "бакета" (Bucket):
- В левом меню выберите Buckets.
- Нажмите Create a Bucket.
- Придумайте уникальное имя для бакета. Например: `my-trading-bot-backups-20240521`. Имя должно быть глобально уникальным.
- Убедитесь, что бакет Private.
- Остальные настройки можно оставить по умолчанию. Нажмите Create Bucket.
- Создание ключа приложения (Application Key):
- В левом меню выберите Application Keys.
- Прокрутите вниз до секции "Your Application Keys" и нажмите Add a New Application Key.
- Дайте ключу имя, например, `vps-backup-key`.
- В поле "Allow access to Bucket(s)" выберите только что созданный бакет.
- Тип доступа (Type of Access): Read and Write.
- Остальные поля можно оставить пустыми. Нажмите Create New Key.
ВАЖНО! После создания ключа вы увидите `keyID` и `applicationKey`. Скопируйте их и сохраните в надежном месте НЕМЕДЛЕННО. `applicationKey` показывается только один раз. Если вы его потеряете, придется создавать новый ключ.
Часть 3: Установка и настройка rclone на сервере
Теперь подключимся к нашему серверу по SSH и установим "швейцарский нож".
1. Установка rclone
Самый простой способ — выполнить официальный скрипт установки. Он безопасен и широко используется.
curl https://rclone.org/install.sh | sudo bash
2. Настройка rclone
Запустите интерактивную настройку командой `rclone config`. Утилита будет задавать вопросы, а мы — отвечать. Вот пошаговый диалог:
$ rclone config
No remotes found - make a new one
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> b2_backup (введите это имя и нажмите Enter)
Type of storage to configure.
...
[список провайдеров]
...
4 / Backblaze B2
\ "b2"
...
Storage> b2 (введите 'b2' или '4' и нажмите Enter)
Account ID or Application Key ID.
account> 004xxxxxxxxxxxx (вставьте сюда ваш keyID из Backblaze)
Application Key.
key> K004xxxxxxxxxxxxxxxxx (вставьте сюда ваш applicationKey из Backblaze)
Hard delete.
hard_delete> false (просто нажмите Enter, оставив по умолчанию)
Edit advanced config?
y/n> n (просто нажмите Enter)
Remote config
--------------------
[b2_backup]
type = b2
account = 004xxxxxxxxxxxx
key = ***REDACTED***
hard_delete = false
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y (нажмите 'y' и Enter)
Current remotes:
Name Type
==== ====
b2_backup b2
e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q (выходим из конфигуратора)
Проверим, что все работает. Выполните команду, которая покажет список бакетов в вашем аккаунте:
rclone lsd b2_backup:
Если вы видите имя вашего бакета (например, `my-trading-bot-backups-20240521`), значит, все настроено правильно!
Часть 4: Скрипт для создания бэкапа
Создадим на сервере файл `backup.sh`. Этот скрипт будет делать всю грязную работу: собирать данные, архивировать и отправлять в облако.
Создайте файл `sudo nano /usr/local/bin/backup.sh` и вставьте в него следующий код, внимательно заменив значения в секции VARIABLES.
#!/bin/bash
# Останавливаем скрипт при любой ошибке
set -e
set -o pipefail
# ============== VARIABLES ==============
# Директория, где лежат данные вашего бота (например, где docker-compose.yml)
PROJECT_DIR="/home/user/my_trading_bot"
# Имя вашего SQLite файла (если используете)
SQLITE_DB_FILE="trading_bot.db"
# Данные для Postgres (если используете, раскомментируйте)
# PG_USER="your_pg_user"
# PG_DB="your_pg_db"
# PG_PASSWORD="your_pg_password"
# PG_HOST="localhost" # или имя контейнера
# Файлы и папки для бэкапа (через пробел)
# Пути указываются относительно PROJECT_DIR
FILES_TO_BACKUP=".env config/ trade_logs/"
# Настройки rclone и Backblaze
B2_REMOTE="b2_backup" # Имя, которое мы задали в `rclone config`
B2_BUCKET="my-trading-bot-backups-20240521" # Ваше имя бакета
# Временная директория для сборки бэкапа
TMP_DIR="/tmp/backup_$$" # $$ - это ID процесса, чтобы избежать конфликтов
# Лог-файл
LOG_FILE="/var/log/backup.log"
# ============== SCRIPT ==============
echo "=== $(date) - Starting backup ===" >> $LOG_FILE
# 1. Создаем временную директорию
mkdir -p "$TMP_DIR/data"
# 2. Делаем дамп базы данных
# --- Для SQLite ---
echo "Backing up SQLite database..." >> $LOG_FILE
cp "$PROJECT_DIR/$SQLITE_DB_FILE" "$TMP_DIR/data/database.db"
# --- Для PostgreSQL (раскомментируйте, если используете) ---
# echo "Backing up PostgreSQL database..." >> $LOG_FILE
# export PGPASSWORD="$PG_PASSWORD"
# pg_dump -h "$PG_HOST" -U "$PG_USER" -d "$PG_DB" -F c -b -v -f "$TMP_DIR/data/database.dump"
# unset PGPASSWORD
# 3. Копируем остальные файлы и папки
echo "Copying config files and logs..." >> $LOG_FILE
for item in $FILES_TO_BACKUP; do
cp -r "$PROJECT_DIR/$item" "$TMP_DIR/data/"
done
# 4. Создаем архив
ARCHIVE_NAME="backup-$(date +%Y-%m-%d-%H%M%S).tar.gz"
echo "Creating archive: $ARCHIVE_NAME" >> $LOG_FILE
tar -czf "$TMP_DIR/$ARCHIVE_NAME" -C "$TMP_DIR/data" .
# 5. Отправляем архив в Backblaze B2
echo "Uploading archive to Backblaze B2..." >> $LOG_FILE
rclone copy "$TMP_DIR/$ARCHIVE_NAME" "$B2_REMOTE:$B2_BUCKET/" --log-file=$LOG_FILE --progress
# 6. Очищаем временные файлы
echo "Cleaning up temporary files..." >> $LOG_FILE
rm -rf "$TMP_DIR"
echo "=== $(date) - Backup successful ===" >> $LOG_FILE
echo "" >> $LOG_FILE
# Если что-то пойдет не так, set -e прервет скрипт, и эта строка не выполнится.
# Можно добавить оповещение об ошибке, например, через curl на webhook в Telegram.
# trap 'echo "Backup FAILED" | mail -s "Bot Backup Failed" your@email.com' ERR
Сделайте скрипт исполняемым:
sudo chmod +x /usr/local/bin/backup.sh
И протестируйте его, запустив вручную:
sudo /usr/local/bin/backup.sh
После выполнения зайдите в веб-интерфейс Backblaze B2. В вашем бакете должен появиться файл архива!
Часть 5: Cron — ежедневная автоматизация
Запускать скрипт вручную — не наш метод. Настроим `cron`, чтобы он делал это за нас каждую ночь в 04:00 UTC.
Откройте редактор crontab от имени суперпользователя:
sudo crontab -e
В открывшемся файле добавьте в самый конец одну строку:
0 4 * * * /usr/local/bin/backup.sh >/dev/null 2>&1
Разберем эту строку:
0 4 * * * — означает "в 0 минут 4 часа, каждый день, каждый месяц, в любой день недели".
/usr/local/bin/backup.sh — путь к нашему скрипту.
>/dev/null 2>&1 — эта магия перенаправляет весь стандартный вывод (STDOUT и STDERR) в "никуда". Это важно, чтобы cron не слал вам письма на почту после каждого запуска. Наш скрипт уже пишет свой собственный лог в `/var/log/backup.log`.
Сохраните и закройте файл. Готово! Теперь каждую ночь ваш сервер будет автоматически создавать и отправлять бэкап в облако.
Часть 6: Экономим деньги с Lifecycle Policies
Хранить бэкапы вечно — не нужно и дорого. Настроим Backblaze, чтобы он автоматически удалял файлы старше 30 дней.
- Зайдите в ваш аккаунт Backblaze B2.
- Перейдите в раздел Buckets и кликните на имя вашего бакета.
- Найдите вкладку или кнопку Lifecycle Settings.
- Установите следующие правила:
- В поле "File Name Prefix": оставьте пустым (применить ко всем файлам).
- В секции "Days from uploading to hiding": оставьте пустым.
- В секции "Days from hiding to deleting": введите 30.
- Сохраните правила.
Теперь любой файл в этом бакете, который не менялся 30 дней, будет автоматически удален. Это идеальный баланс между безопасностью и затратами.
Часть 7: Проверка бэкапов — не доверяй, а проверяй
Бэкап, который ни разу не был протестирован на восстановление — это не бэкап, а просто надежда. Раз в месяц стоит проводить "учения".
Процедура проста:
- Зайдите на сервер по SSH.
- Скачайте последний бэкап во временную папку:
rclone copyto "$B2_REMOTE:$B2_BUCKET/$(rclone lsf $B2_REMOTE:$B2_BUCKET | sort -r | head -n 1)" /tmp/restore_test.tar.gz
- Создайте папку для распаковки и распакуйте архив:
mkdir /tmp/restore_test_dir
[tokens: in=431 out=4726 thinking=3270 | cost=$0.0805]
Хочешь больше? Полный курс AI Agents включает Production-модуль + 27 других уроков
AI Agents $199 →