Skip to content

Zagato27/CleanDB

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 

Repository files navigation

Монитор заполненности PostgreSQL

Сервис‑демон следит за размером нескольких баз PostgreSQL и запускает заранее заданные SQL‑действия, если объём данных превышает заданный процент от лимита. Скрипт читает настройки из config.yaml, опрашивает базы по очереди раз в 30 минут и логирует всё в stdout.

Возможности

  • Поддержка любого количества баз (каждая с собственным порогом и лимитом).
  • Расчёт процента заполненности через pg_database_size.
  • Последовательное выполнение SQL‑экшенов с отдельным коммитом после каждого.
  • Перезагрузка конфигурации на каждом цикле без перезапуска демона.
  • Ошибки по одной базе не мешают обработке остальных.

Требования

  • Python 3.10+
  • PostgreSQL client libraries (для psycopg/psycopg2)
  • Установленные пакеты:
    pip install psycopg[binary] PyYAML

Структура конфигурации

databases:
  - name: <человекочитаемое имя базы, обязательное поле>
    dsn: postgresql://user:pass@host:port/dbname
    max_size_gb: <лимит в гигабайтах>
    threshold_percent: <порог в %; необязателен, по умолчанию 80>
    actions:
      - "SQL команда 1;"
      - "SQL команда 2;"

Пример доступен в config.example.yaml.
Каждый экшен должен быть валидным SQL‑запросом; он выполняется в одном подключении и завершается commit. Если массив actions пуст, даже при превышении порога никакие команды не выполняются.

Запуск

python /Users/pmbekker/CleanDB/db_size_monitor.py /путь/к/config.yaml
  • Если путь к конфигу не указан, скрипт ищет config.yaml рядом с собой.
  • По умолчанию опрос выполняется раз в 30 минут (SLEEP_SECONDS в коде); при необходимости измените константу.

Логирование и отказоустойчивость

  • Логи пишутся в stdout через стандартный logging на уровне INFO.
  • Любая ошибка подключения или выполнения SQL по конкретной базе логируется и не останавливает остальные базы.
  • Скрипт перехватывает KeyboardInterrupt и завершает работу корректно.

Интеграция как сервис

Systemd (пример)

[Unit]
Description=PostgreSQL size monitor
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/python3 /Users/pmbekker/CleanDB/db_size_monitor.py /etc/db-monitor/config.yaml
Restart=always
User=postgres

[Install]
WantedBy=multi-user.target

После добавления юнита выполните:

sudo systemctl daemon-reload
sudo systemctl enable --now db-size-monitor.service

Cron / Supervisor

Альтернативно можно запускать скрипт через cron/supervisord, но рекомендуется использовать systemd для перезапуска и логирования.

Разработка и тестирование

  • Перед деплоем проверьте соединение к каждой БД вручную (psql / psycopg).
  • Для тестов можно временно заменить SLEEP_SECONDS на меньший интервал.
  • При добавлении новых экшенов убедитесь, что команды идемпотентны либо безопасны к повторному запуску.
  • При необходимости расширения логирования можно перенаправлять вывод в файл или настроить logging.handlers.

Безопасность

  • Храните config.yaml с ограничением прав (например, chmod 600), так как он содержит DSN с учётными данными.
  • Если нужно использовать внешние секреты, можно генерировать config.yaml динамически или внедрять переменные окружения перед запуском.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages