Сервис‑демон следит за размером нескольких баз 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и завершает работу корректно.
[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/supervisord, но рекомендуется использовать systemd для перезапуска и логирования.
- Перед деплоем проверьте соединение к каждой БД вручную (psql / psycopg).
- Для тестов можно временно заменить
SLEEP_SECONDSна меньший интервал. - При добавлении новых экшенов убедитесь, что команды идемпотентны либо безопасны к повторному запуску.
- При необходимости расширения логирования можно перенаправлять вывод в файл или настроить
logging.handlers.
- Храните
config.yamlс ограничением прав (например,chmod 600), так как он содержит DSN с учётными данными. - Если нужно использовать внешние секреты, можно генерировать
config.yamlдинамически или внедрять переменные окружения перед запуском.