← Production Mastery
🏠 Главная 📚 Все курсы 🎯 RVV proof 📊 Paper proof

Урок 7 — Backblaze B2 backups

Урок 7 из 10 · Production Mastery

🟢 Не теория — наш живой бот: RVV Hunter MTF работает прямо сейчас (WR 66%, +$141 за 15 дней). Всё что в этом уроке — настроено на нашей боевой системе.

Урок 7: Backblaze B2 бэкапы для вашего трейдинг-бота

Как спать спокойно, зная, что данные вашего бота в безопасности.


⏱ Время на прочтение: ~25 минут.

📖 Основные термины

Прежде чем мы начнем, давайте быстро разберемся с ключевыми понятиями. Без сложного жаргона.


❌ До / ✅ После

❌ До внедрения бэкапов

  • Сервер "сгорел" (диск вышел из строя) → ВСЁ ПРОПАЛО.
  • История сделок, логи, настройки, база данных — всё потеряно.
  • Случайная команда `rm -rf` может уничтожить месяцы работы.
  • Постоянное чувство тревоги: "А что, если...?"

✅ После внедрения бэкапов

  • Сервер "сгорел" → 15 минут на запуск нового сервера + 5 минут на восстановление данных из бэкапа.
  • Все данные (база, конфиги, логи) надежно хранятся в другом месте.
  • Ошибки не так страшны. Можно откатиться к вчерашней копии.
  • Спокойный сон. Ваш бизнес-актив (бот и его данные) в безопасности.

Наша история: падение сервера за €5

Представьте себе: ваш трейдинг-бот, которого вы писали по ночам, наконец-то работает. Он крутится на маленьком, но шустром VPS-сервере от Hetzner за €5 в месяц. Dashboard показывает стабильную прибыль, сделки идут, логи пишутся. Жизнь прекрасна.

И вот однажды утром вы просыпаетесь, завариваете кофе, открываете ноутбук... а dashboard не загружается. "Хм, может, интернет лагает?" — думаете вы. Пробуете подключиться к серверу по SSH — тишина. Панель управления хостера показывает страшное: "Host offline".

Вы пишете в поддержку, и через час приходит ответ, от которого холодеет внутри: "К сожалению, на вашем сервере произошел сбой физического диска. Данные не подлежат восстановлению".

Щелчок. И всё пропало.

Несколько недель работы над стратегией. Вся история сделок, которую вы собирались анализировать. Все тонкие настройки в `.env` файлах. Всё превратилось в ничто. И в этот момент приходит то самое "ага"-осознание: бэкап, который стоил бы €1 в месяц, спас бы всё. Эта боль — реальна. И сегодня мы сделаем так, чтобы вы с ней никогда не столкнулись.


Часть 1: Определяем, что нужно сохранять

Бэкапить всё подряд — плохая идея. Это долго, дорого и бессмысленно. Нам нужно сохранять только то, что нельзя легко воссоздать.

Что мы ОБЯЗАТЕЛЬНО бэкапим:

Что мы НЕ бэкапим:


Часть 2: Настройка Backblaze B2

Это займет 5 минут. Мы создадим хранилище (bucket) и получим ключи для доступа.

  1. Регистрация: Перейдите на страницу регистрации Backblaze B2 и создайте аккаунт.
  2. Создание "бакета" (Bucket):
    • В левом меню выберите Buckets.
    • Нажмите Create a Bucket.
    • Придумайте уникальное имя для бакета. Например: `my-trading-bot-backups-20240521`. Имя должно быть глобально уникальным.
    • Убедитесь, что бакет Private.
    • Остальные настройки можно оставить по умолчанию. Нажмите Create Bucket.
  3. Создание ключа приложения (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

Разберем эту строку:

Сохраните и закройте файл. Готово! Теперь каждую ночь ваш сервер будет автоматически создавать и отправлять бэкап в облако.


Часть 6: Экономим деньги с Lifecycle Policies

Хранить бэкапы вечно — не нужно и дорого. Настроим Backblaze, чтобы он автоматически удалял файлы старше 30 дней.

  1. Зайдите в ваш аккаунт Backblaze B2.
  2. Перейдите в раздел Buckets и кликните на имя вашего бакета.
  3. Найдите вкладку или кнопку Lifecycle Settings.
  4. Установите следующие правила:
    • В поле "File Name Prefix": оставьте пустым (применить ко всем файлам).
    • В секции "Days from uploading to hiding": оставьте пустым.
    • В секции "Days from hiding to deleting": введите 30.
  5. Сохраните правила.

Теперь любой файл в этом бакете, который не менялся 30 дней, будет автоматически удален. Это идеальный баланс между безопасностью и затратами.


Часть 7: Проверка бэкапов — не доверяй, а проверяй

Бэкап, который ни разу не был протестирован на восстановление — это не бэкап, а просто надежда. Раз в месяц стоит проводить "учения".

Процедура проста:

  1. Зайдите на сервер по SSH.
  2. Скачайте последний бэкап во временную папку:
    rclone copyto "$B2_REMOTE:$B2_BUCKET/$(rclone lsf $B2_REMOTE:$B2_BUCKET | sort -r | head -n 1)" /tmp/restore_test.tar.gz
  3. Создайте папку для распаковки и распакуйте архив:
    mkdir /tmp/restore_test_dir
    [tokens: in=431 out=4726 thinking=3270 | cost=$0.0805]
    
    
    
    

    Хочешь больше? Полный курс AI Agents включает Production-модуль + 27 других уроков

    AI Agents $199 →