Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
| vm:pgvector:03-backup [2025/08/29 08:39] – admin | vm:pgvector:03-backup [2025/08/30 17:39] (текущий) – admin | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| - | ====== | + | ====== |
| ===== Описание ===== | ===== Описание ===== | ||
| - | Скрипт автоматизированного резервного копирования | + | Автоматизированный скрипт для создания |
| + | * Дампов базы данных PostgreSQL | ||
| + | * Архивирования | ||
| + | * Автоматической очистки старых бекапов | ||
| + | * Мониторинга дискового пространства | ||
| + | * Уведомлений в Telegram | ||
| - | **Возможности: | + | ===== Требования |
| - | * Создание SQL дампов базы данных | + | |
| - | * Архивирование папок с данными PostgreSQL и pgAdmin | + | |
| - | * Автоматическая очистка старых | + | |
| - | * Подробное логирование операций | + | |
| - | * Проверка работоспособности сервисов | + | |
| - | * Уведомления | + | |
| - | <note tip> | + | |
| - | Скрипт безопасно останавливает контейнеры для создания консистентного бекапа и автоматически запускает их обратно. | + | * Bash 4.0+ |
| - | </ | + | * Утилиты: '' |
| - | + | * Права root или sudo | |
| - | ===== Предварительные требования ===== | + | |
| - | + | ||
| - | | + | |
| - | * Контейнеры PGVector запущены | + | |
| - | * Права root или sudo для выполнения операций | + | |
| ===== Установка ===== | ===== Установка ===== | ||
| - | ==== Шаг | + | ==== 1. Создание директорий ==== |
| <code bash> | <code bash> | ||
| + | # Создаем необходимые директории | ||
| sudo mkdir -p / | sudo mkdir -p / | ||
| sudo mkdir -p / | sudo mkdir -p / | ||
| + | |||
| + | # Устанавливаем права доступа | ||
| + | sudo chmod 755 / | ||
| + | sudo chmod 755 / | ||
| </ | </ | ||
| - | ==== Шаг | + | ==== 2. Создание скрипта ==== |
| <code bash> | <code bash> | ||
| Строка 38: | Строка 37: | ||
| </ | </ | ||
| - | Скопируйте следующий код в файл: | + | Скопируйте |
| - | <file bash / | + | <code bash> |
| #!/bin/bash | #!/bin/bash | ||
| + | |||
| # Скрипт резервного копирования PGVector | # Скрипт резервного копирования PGVector | ||
| # Запуск: | # Запуск: | ||
| + | |||
| # Настройки | # Настройки | ||
| COMPOSE_FILE="/ | COMPOSE_FILE="/ | ||
| Строка 52: | Строка 52: | ||
| BACKUP_NAME=" | BACKUP_NAME=" | ||
| RETENTION_DAYS=10 | RETENTION_DAYS=10 | ||
| + | |||
| # Настройки базы данных | # Настройки базы данных | ||
| + | DB_CONTAINER=" | ||
| + | DB_USER=" | ||
| + | DB_PASSWORD=" | ||
| DB_NAME=" | DB_NAME=" | ||
| - | DB_USER=" | + | |
| - | DB_PASSWORD=" | + | |
| - | DB_CONTAINER=" | + | |
| # Логирование | # Логирование | ||
| LOG_FILE=" | LOG_FILE=" | ||
| + | |||
| # Функция логирования | # Функция логирования | ||
| log() { | log() { | ||
| echo " | echo " | ||
| } | } | ||
| + | |||
| # Создаем директорию для бекапов если не существует | # Создаем директорию для бекапов если не существует | ||
| mkdir -p " | mkdir -p " | ||
| + | |||
| log "=== Начало резервного копирования PGVector ===" | log "=== Начало резервного копирования PGVector ===" | ||
| + | |||
| # Проверяем что compose файл существует | # Проверяем что compose файл существует | ||
| if [ ! -f " | if [ ! -f " | ||
| Строка 77: | Строка 77: | ||
| exit 1 | exit 1 | ||
| fi | fi | ||
| + | |||
| # Переходим в директорию с PGVector | # Переходим в директорию с PGVector | ||
| cd " | cd " | ||
| Строка 83: | Строка 83: | ||
| exit 1 | exit 1 | ||
| } | } | ||
| - | |||
| # Проверяем что контейнеры запущены | # Проверяем что контейнеры запущены | ||
| - | if ! docker-compose ps | grep -q " | + | log " |
| - | log "ПРЕДУПРЕЖДЕНИЕ: Не все контейнеры запущены" | + | if ! docker-compose |
| + | log "ОШИБКА: Контейнеры | ||
| + | exit 1 | ||
| fi | fi | ||
| - | + | # Создаем дамп базы данных | |
| - | # Создаем дамп базы данных | + | |
| log " | log " | ||
| - | DB_DUMP_FILE=" | + | DB_DUMP_PATH=" |
| - | docker exec -t " | + | # Экспортируем пароль для pg_dump |
| - | + | export PGPASSWORD=" | |
| - | if [ $? -eq 0 ]; then | + | docker exec " |
| - | log " | + | if [ $? -eq 0 ] && [ -s " |
| - | | + | log " |
| - | log " | + | |
| + | # Получаем размер дампа | ||
| + | DB_DUMP_SIZE=$(du -h "$DB_DUMP_PATH" | cut -f1) | ||
| + | log " | ||
| else | else | ||
| - | log " | + | log " |
| + | rm -f " | ||
| exit 1 | exit 1 | ||
| fi | fi | ||
| - | + | # Очищаем переменную окружения | |
| - | # Создаем дамп всех баз данных (включая системные) | + | unset PGPASSWORD |
| - | log " | + | # Останавливаем контейнеры |
| - | DB_FULL_DUMP_FILE=" | + | |
| - | docker exec -t " | + | |
| - | + | ||
| - | if [ $? -eq 0 ]; then | + | |
| - | log "Полный дамп баз данных создан: | + | |
| - | DB_FULL_SIZE=$(du -h " | + | |
| - | log " | + | |
| - | else | + | |
| - | log " | + | |
| - | fi | + | |
| - | + | ||
| - | # Останавливаем контейнеры | + | |
| log " | log " | ||
| docker-compose -f " | docker-compose -f " | ||
| + | |||
| if [ $? -eq 0 ]; then | if [ $? -eq 0 ]; then | ||
| log " | log " | ||
| Строка 126: | Строка 118: | ||
| exit 1 | exit 1 | ||
| fi | fi | ||
| + | |||
| # Ждем пару секунд для полной остановки | # Ждем пару секунд для полной остановки | ||
| sleep 5 | sleep 5 | ||
| - | + | ||
| - | # Создаем архив с данными | + | # Создаем архив с данными |
| log " | log " | ||
| - | BACKUP_ARCHIVE=" | + | BACKUP_PATH=" |
| - | tar -czf "$BACKUP_ARCHIVE" \ | + | |
| + | tar -czf "$BACKUP_PATH" \ | ||
| --exclude=' | --exclude=' | ||
| --exclude=' | --exclude=' | ||
| - | --exclude=' | + | -C " |
| - | --exclude=' | + | -C " |
| postgres_data/ | postgres_data/ | ||
| pgadmin_data/ | pgadmin_data/ | ||
| docker-compose.yml | docker-compose.yml | ||
| + | |||
| if [ $? -eq 0 ]; then | if [ $? -eq 0 ]; then | ||
| - | log " | + | log " |
| - | + | ||
| # Получаем размер архива | # Получаем размер архива | ||
| - | | + | |
| - | log " | + | log " |
| + | |||
| + | # Удаляем отдельный файл дампа, так как он теперь в архиве | ||
| + | rm -f " | ||
| + | log " | ||
| else | else | ||
| log " | log " | ||
| - | | + | |
| # Пытаемся запустить контейнеры даже при ошибке | # Пытаемся запустить контейнеры даже при ошибке | ||
| log " | log " | ||
| Строка 156: | Строка 153: | ||
| exit 1 | exit 1 | ||
| fi | fi | ||
| + | |||
| # Запускаем контейнеры обратно | # Запускаем контейнеры обратно | ||
| log " | log " | ||
| docker-compose -f " | docker-compose -f " | ||
| + | |||
| if [ $? -eq 0 ]; then | if [ $? -eq 0 ]; then | ||
| log " | log " | ||
| Строка 167: | Строка 164: | ||
| exit 1 | exit 1 | ||
| fi | fi | ||
| + | |||
| # Ждем запуска сервисов | # Ждем запуска сервисов | ||
| - | log " | + | sleep 15 |
| - | sleep 30 | + | |
| # Проверяем что все контейнеры работают | # Проверяем что все контейнеры работают | ||
| log " | log " | ||
| - | if docker-compose -f " | + | RUNNING_CONTAINERS=$(docker-compose -f " |
| - | log "Контейнеры работают корректно" | + | TOTAL_CONTAINERS=$(docker-compose -f "$COMPOSE_FILE" |
| + | if [ " | ||
| + | log "Все контейнеры | ||
| else | else | ||
| - | log " | + | log " |
| fi | fi | ||
| - | + | # Проверяем | |
| - | # Проверяем подключение к базе данных | + | |
| log " | log " | ||
| - | if docker exec " | + | export PGPASSWORD=" |
| - | log " | + | if docker exec " |
| + | log " | ||
| else | else | ||
| log " | log " | ||
| Строка 190: | Строка 188: | ||
| # Проверяем что расширение pgvector доступно | # Проверяем что расширение pgvector доступно | ||
| log " | log " | ||
| - | if docker exec " | + | if docker exec " |
| - | log " | + | log " |
| else | else | ||
| log " | log " | ||
| fi | fi | ||
| - | + | unset PGPASSWORD | |
| - | # Создаем итоговый архив с дампами базы данных | + | |
| - | log " | + | |
| - | FINAL_BACKUP=" | + | |
| - | + | ||
| - | # Добавляем в архив файлы данных и дампы | + | |
| - | tar -czf " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | + | ||
| - | if [ $? -eq 0 ]; then | + | |
| - | log " | + | |
| - | + | ||
| - | # Получаем размер итогового архива | + | |
| - | FINAL_SIZE=$(du -h " | + | |
| - | log " | + | |
| - | + | ||
| - | # Удаляем промежуточные файлы | + | |
| - | rm -f " | + | |
| - | log " | + | |
| - | else | + | |
| - | log " | + | |
| - | fi | + | |
| # Удаляем старые бекапы | # Удаляем старые бекапы | ||
| log " | log " | ||
| - | find "$BACKUP_DIR" | + | DELETED_COUNT=$(find " |
| - | find " | + | log "Удалено старых бекапов: |
| - | find " | + | |
| - | find "$BACKUP_DIR" | + | |
| # Показываем статистику бекапов | # Показываем статистику бекапов | ||
| - | BACKUP_COUNT=$(ls -1 " | + | BACKUP_COUNT=$(ls -1 " |
| - | log " | + | TOTAL_SIZE=$(du -sh " |
| - | + | log " | |
| - | # Показываем общий размер всех бекапов | + | log " |
| - | TOTAL_SIZE=$(du -sh " | + | # Получаем информацию о свободном месте на диске |
| - | log "Общий размер директории бекапов: $TOTAL_SIZE" | + | BACKUP_DISK_USAGE=$(df -h " |
| + | ROOT_DISK_USAGE=$(df -h / | awk 'NR==2 {print $4 " свободно из " $2 " (" $5 " занято)" | ||
| + | log " | ||
| + | if [ " | ||
| + | log "Свободное | ||
| + | fi | ||
| + | # Получаем процент заполнения диска с бекапами для предупреждений | ||
| + | BACKUP_DISK_PERCENT=$(df " | ||
| + | if [ " | ||
| + | log " | ||
| + | elif [ "$BACKUP_DISK_PERCENT" | ||
| + | log " | ||
| + | fi | ||
| + | |||
| log "=== Резервное копирование завершено успешно ===" | log "=== Резервное копирование завершено успешно ===" | ||
| + | # Формируем сообщение для Telegram | ||
| + | TELEGRAM_MESSAGE=" | ||
| + | 📁 Backup: $BACKUP_NAME ($BACKUP_SIZE) | ||
| + | 💾 DB dump: $DB_DUMP_SIZE | ||
| + | 📊 Total backups: $BACKUP_COUNT | ||
| + | 💿 Disk space: $BACKUP_DISK_USAGE" | ||
| + | # Добавляем предупреждение о месте, если нужно | ||
| + | if [ " | ||
| + | TELEGRAM_MESSAGE=" | ||
| + | ⚠️ WARNING: Disk >90% full!" | ||
| + | elif [ " | ||
| + | TELEGRAM_MESSAGE=" | ||
| + | ⚠️ ATTENTION: Disk >80% full" | ||
| + | fi | ||
| + | # Отправляем уведомление в Telegram (опционально) | ||
| + | curl -s -X POST " | ||
| + | -d chat_id=" | ||
| + | -d text=" | ||
| + | exit 0 | ||
| + | </ | ||
| - | # Отправляем уведомление | + | **Обязательно измените следующие параметры:** |
| - | # curl -s -X POST " | + | * '' |
| - | # | + | * '' |
| - | # -d text=" | + | * '' |
| - | exit 0 | + | ==== 3. Установка прав выполнения ==== |
| - | </ | + | |
| - | + | ||
| - | ==== Шаг | + | |
| <code bash> | <code bash> | ||
| sudo chmod +x / | sudo chmod +x / | ||
| - | sudo chown root:root / | ||
| </ | </ | ||
| - | ==== Шаг 4: Настройка владельца директории бекапов ==== | + | ===== Настройка |
| + | |||
| + | 1. Создайте бота через **@BotFather** | ||
| + | 2. Получите **токен бота** | ||
| + | 3. Замените в скрипте: | ||
| <code bash> | <code bash> | ||
| - | sudo chown -R $USER:$USER /opt/backups/pgvector | + | curl -s -X POST "https://api.telegram.org/ |
| + | -d chat_id=" | ||
| + | -d text=" | ||
| </ | </ | ||
| - | ===== Конфигурация ===== | + | ===== Автоматизация ===== |
| - | ==== Основные параметры | + | ==== Настройка Cron ==== |
| - | Отредактируйте переменные в начале скрипта под ваши нужды: | + | <code bash> |
| + | # Редактируем | ||
| + | sudo crontab -e | ||
| - | <file bash / | + | # Добавляем задание - ежедневно в 3:00 |
| - | # Настройки путей | + | 0 3 * * * /opt/scripts/ |
| - | COMPOSE_FILE="/ | + | |
| - | PGVECTOR_DIR="/ | + | |
| - | BACKUP_DIR="/ | + | |
| - | + | ||
| - | # Настройки хранения | + | |
| - | RETENTION_DAYS=10 | + | |
| - | + | ||
| - | # Настройки базы | + | |
| - | DB_NAME=" | + | |
| - | DB_USER=" | + | |
| - | DB_PASSWORD=" | + | |
| - | DB_CONTAINER=" | + | |
| - | </ | + | |
| - | + | ||
| - | <note warning> | + | |
| - | Убедитесь, что пароль базы | + | |
| - | </ | + | |
| - | + | ||
| - | ==== Настройка уведомлений Telegram (опционально) ==== | + | |
| - | + | ||
| - | Раскомментируйте и настройте строки | + | |
| - | + | ||
| - | <code bash> | + | |
| - | curl -s -X POST " | + | |
| - | -d chat_id=" | + | |
| - | -d text=" | + | |
| </ | </ | ||
| Строка 299: | Строка 282: | ||
| <code bash> | <code bash> | ||
| - | # Запуск с правами root | ||
| sudo / | sudo / | ||
| - | |||
| - | # Запуск с отображением вывода | ||
| - | sudo / | ||
| </ | </ | ||
| - | ==== Проверка | + | ==== Проверка |
| <code bash> | <code bash> | ||
| - | # Просмотр | + | # Список бекапов |
| + | ls -la / | ||
| + | |||
| + | # Просмотр лога | ||
| tail -f / | tail -f / | ||
| - | |||
| - | # Просмотр всех логов | ||
| - | cat / | ||
| </ | </ | ||
| - | ===== Автоматизация | + | ===== Структура бекапов |
| - | ==== Настройка cron ==== | + | < |
| - | + | / | |
| - | <code bash> | + | ├── pgvector_backup_20250830_201456.tar.gz |
| - | sudo crontab -e | + | ├── backup.log |
| + | └── [старые бекапы...] | ||
| </ | </ | ||
| - | Добавьте одну из следующих строк: | + | **Содержимое архива: |
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| - | < | + | ===== Восстановление ===== |
| - | # Ежедневно в 2:00 ночи | + | |
| - | 0 2 * * * / | + | |
| - | + | ||
| - | # Еженедельно по воскресеньям в 3:00 | + | |
| - | 0 3 * * 0 / | + | |
| - | + | ||
| - | # Ежедневно в 2:00 с логированием в syslog | + | |
| - | 0 2 * * * / | + | |
| - | </ | + | |
| - | + | ||
| - | ==== Проверка работы cron ==== | + | |
| - | + | ||
| - | <code bash> | + | |
| - | # Проверка статуса cron | + | |
| - | sudo systemctl status cron | + | |
| - | + | ||
| - | # Просмотр логов cron | + | |
| - | sudo grep pgvector / | + | |
| - | </ | + | |
| - | + | ||
| - | ===== Структура бекапов ===== | + | |
| - | + | ||
| - | После выполнения скрипта в ''/ | + | |
| - | + | ||
| - | ^ Файл ^ Описание ^ | + | |
| - | | '' | + | |
| - | | '' | + | |
| - | + | ||
| - | **Содержимое итогового архива: | + | |
| - | * SQL дамп основной базы данных | + | |
| - | * Полный SQL дамп всех баз данных | + | |
| - | * Архив папок '' | + | |
| - | * Файл '' | + | |
| - | + | ||
| - | ===== Восстановление | + | |
| ==== Полное восстановление ==== | ==== Полное восстановление ==== | ||
| <code bash> | <code bash> | ||
| - | # 1. Остановите контейнеры | + | # Останавливаем сервис |
| cd / | cd / | ||
| - | sudo docker-compose down | + | docker-compose down |
| - | # 2. Создайте резервную | + | # Создаем бекап текущего состояния |
| - | sudo mv postgres_data postgres_data.old | + | sudo mv postgres_data postgres_data.backup.$(date +%Y%m%d_%H%M%S) |
| - | sudo mv pgadmin_data pgadmin_data.old | + | |
| - | # 3. Извлеките бекап | + | # Извлекаем архив |
| - | cd / | + | sudo tar -xzf / |
| - | sudo tar -xzf pgvector_backup_YYYYMMDD_HHMMSS_complete.tar.gz | + | |
| - | # 4. Извлеките данные из архива | + | # Запускаем сервис |
| - | sudo tar -xzf pgvector_backup_YYYYMMDD_HHMMSS.tar.gz -C / | + | docker-compose up -d |
| - | + | ||
| - | # 5. Запустите | + | |
| - | cd / | + | |
| - | sudo docker-compose up -d | + | |
| </ | </ | ||
| - | ==== Восстановление только | + | ==== Восстановление только |
| <code bash> | <code bash> | ||
| - | # 1. Извлеките SQL дамп | + | # Извлекаем SQL дамп |
| - | cd / | + | tar -xzf backup.tar.gz |
| - | tar -xzf pgvector_backup_YYYYMMDD_HHMMSS_complete.tar.gz | + | |
| - | # 2. Восстановите базу данных | + | # Восстанавливаем |
| docker exec -i pgvector_postgres psql -U postgres -d postgres < pgvector_backup_YYYYMMDD_HHMMSS_database.sql | docker exec -i pgvector_postgres psql -U postgres -d postgres < pgvector_backup_YYYYMMDD_HHMMSS_database.sql | ||
| - | |||
| - | # Или восстановите все базы данных | ||
| - | docker exec -i pgvector_postgres psql -U postgres < pgvector_backup_YYYYMMDD_HHMMSS_all_databases.sql | ||
| </ | </ | ||
| - | ===== Мониторинг | + | ===== Мониторинг ===== |
| - | + | ||
| - | ==== Проверка размера бекапов ==== | + | |
| - | + | ||
| - | <code bash> | + | |
| - | # Размер всех бекапов | + | |
| - | du -sh / | + | |
| - | # Список всех бекапов | + | При успешном |
| - | ls -lah /opt/backups/pgvector/*.tar.gz | + | < |
| + | ✅ PGVector backup completed | ||
| + | 📁 Backup: pgvector_backup_20250830_201456 (45M) | ||
| + | 💾 DB dump: 12M | ||
| + | 📊 Total backups: 7 | ||
| + | 💿 Disk space: 2.1G свободно из 10G (79% занято) | ||
| </ | </ | ||
| - | ==== Ручная очистка старых бекапов ==== | + | Предупреждения при заполнении диска: |
| - | + | < | |
| - | <code bash> | + | ⚠️ ATTENTION: Disk >80% full |
| - | # Удалить бекапы старше 30 дней | + | ⚠️ WARNING: Disk >90% full! |
| - | find / | + | |
| - | </ | + | |
| - | + | ||
| - | ==== Тестирование бекапа ==== | + | |
| - | + | ||
| - | <code bash> | + | |
| - | # Проверка целостности архива | + | |
| - | tar -tzf / | + | |
| - | + | ||
| - | # Проверка SQL дампа | + | |
| - | head -20 pgvector_backup_YYYYMMDD_HHMMSS_database.sql | + | |
| </ | </ | ||
| ===== Устранение проблем ===== | ===== Устранение проблем ===== | ||
| - | ==== Частые ошибки ==== | + | === Контейнеры не запущены === |
| - | + | ||
| - | **Ошибка: | + | |
| <code bash> | <code bash> | ||
| - | # Проверьте путь к файлу | + | docker-compose |
| - | ls -la / | + | docker-compose up -d |
| - | # Отредактируйте переменную COMPOSE_FILE в скрипте | + | |
| </ | </ | ||
| - | **Ошибка: " | + | === Ошибка дампа БД === |
| <code bash> | <code bash> | ||
| - | # Проверьте имена контейнеров | + | # Проверяем доступность БД |
| - | docker ps -a | + | |
| - | # Обновите переменную DB_CONTAINER в скрипте | + | |
| - | </ | + | |
| - | + | ||
| - | **Ошибка подключения к базе данных** | + | |
| - | <code bash> | + | |
| - | # Проверьте | + | |
| docker exec pgvector_postgres pg_isready -U postgres | docker exec pgvector_postgres pg_isready -U postgres | ||
| - | # Проверьте пароль | + | # Проверяем логи |
| - | docker | + | docker |
| </ | </ | ||
| - | ==== Логи отладки ==== | + | === Нет места на диске === |
| <code bash> | <code bash> | ||
| - | # Запуск с подробными логами | + | # Проверяем использование |
| - | sudo bash -x /opt/scripts/ | + | df -h /opt/backups |
| - | # Проверка | + | # Удаляем старые бекапы |
| - | docker logs pgvector_postgres | + | find / |
| - | docker logs pgvector_pgadmin | + | |
| </ | </ | ||
| ===== Безопасность ===== | ===== Безопасность ===== | ||
| - | |||
| - | <note important> | ||
| - | **Рекомендации по безопасности: | ||
| - | * Храните бекапы на отдельном диске или удаленном сервере | ||
| - | * Регулярно проверяйте целостность бекапов | ||
| - | * Ограничьте права доступа к директории с бекапами | ||
| - | * Зашифруйте бекапы при передаче по сети | ||
| - | </ | ||
| - | |||
| - | ==== Настройка прав доступа ==== | ||
| <code bash> | <code bash> | ||
| - | # Ограничить доступ к директории бекапов | + | # Устанавливаем |
| - | sudo chmod 750 /opt/backups/pgvector | + | sudo chmod 700 /opt/scripts/pgvector-backup.sh |
| - | sudo chown root:backup | + | sudo chown root:root /opt/scripts/pgvector-backup.sh |
| - | # Ограничить доступ к скрипту | + | # Защищаем директорию бекапов |
| - | sudo chmod 750 / | + | sudo chmod 755 /opt/backups |
| - | </ | + | sudo chown root:root /opt/backups |
| - | + | ||
| - | ===== Дополнительные возможности ===== | + | |
| - | + | ||
| - | ==== Отправка бекапов на удаленный сервер ==== | + | |
| - | + | ||
| - | Добавьте в конец скрипта: | + | |
| - | + | ||
| - | <code bash> | + | |
| - | # Отправка через rsync | + | |
| - | rsync -avz " | + | |
| - | + | ||
| - | # Отправка через scp | + | |
| - | scp " | + | |
| - | </ | + | |
| - | + | ||
| - | ==== Интеграция с системой мониторинга ==== | + | |
| - | + | ||
| - | <code bash> | + | |
| - | # Отправка метрик в InfluxDB | + | |
| - | curl -X POST ' | + | |
| - | --data-binary " | + | |
| </ | </ | ||
| ---- | ---- | ||
| - | //Последнее обновление: $(date)// | + | //Документация |