• Сократить бэкапы на 99.5% с hashget

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


      Это обзорная статья для описания возможностей. Само использование hashget (довольно простое) описано в README проекта и wiki-документации.


      Сравнение


      По закону жанра, начну сразу с интриги — сравнения результатов:


      Data sample unpacked size .tar.gz hashget .tar.gz
      Wordpress-5.1.1 43 Mb 11 Mb ( 26% ) 155 Kb ( 0.3% )
      Linux kernel 5.0.4 934 Mb 161 Mb ( 20% ) 4.7 Mb ( 0.5% )
      Debian 9 (LAMP) LXC VM 724 Mb 165 Mb ( 23% ) 4.1 Mb ( 0.5% )

      Предыстория, каким должен быть идеальный и эффективный бэкап


      Каждый раз, когда я делал бэкап свежесозданной виртуалки, мне не давало покоя чувство, что я что-то делаю не так. Почему у меня получается увесистый бэкап от системы, где моего бесценного нетленного творчества — однострочный index.html с текстом "Hello world"?

      Читать дальше →
    • Простой failover для вебсайта (мониторинг + динамический DNS)

      • Tutorial
      В этой статье я хочу показать, как легко и бесплатно можно сделать failover схему для веб-сайта (или любого другого интернет-сервиса) на комбинации мониторинга okerr и динамического DNS сервиса. То есть, в случае любых проблем с основным сайтом (начиная от проблемы с «PHP Error» на странице, и до нехватки места или просто подозрительно малом числе заказов в случае интернет-магазина), новые посетители будут направлены на второй (третий, и так далее) заведомо работающий сервер, или же на «Sorry» страничку, где им вежливо объяснят, что «есть проблема, мы уже в курсе и уже чиним, скоро починим» (а вы в этом случае на самом деле будете уже в курсе и сможете чинить).
      Читать дальше →
    • evalidate: безопасная обработка пользовательских выражений

        Зачем нужно


        Различная фильтрация есть везде. Например, файрволл netfilter (iptables) имеет свой синтаксис для описания пакетов. В файле .htaccess апача свой язык, как определять, кому давать доступ к каталогу, кому нет. В СУБД свой очень мощный язык (SQL WHERE ...) для фильтрации записей. В почтовых программах (thunderbird, gmail) — свой интерфейс описания фильтров, в соответствии с которыми письма будут раскидываться по папкам.

        И везде — свой велосипед.

        Для бухгалтерской программы вам может быть удобно позволить пользователю выбрать, кому будет повышена зарплата (все женщины, а так же мужчины возрастом от 25 до 32 лет, либо же до 50 лет если у мужчины имя Вася). И каждому подходящему повысить по пользовательскому выражению ( + 2000 рублей + 20% от прежней зарплаты + по 1000 рублей за каждый год стажа)

        Для интернет-магазина (или его админки) — найти все ноутбуки, с памятью от 4 до 8 Gb, которых на складе более 3 штук, но не Acer, или даже Acer, если стоят меньше 30 000 рублей.

        Конечно, можно присобачить свою сложную систему фильтров и критериев, сделать для них веб-интерфейс, но проще было бы все сделать в пару строк?

        src="(RAM>=4 and RAM<=8 and stock>3 and not brand=='Acer') or (brand=='Acer' and price<30000)"
        success, result = evalidate.safeeval(src,notebook)
        

        Читать дальше →
        • +13
        • 6.1k
        • 8
      • reboot с веб-интерфейсом или trigger: простая и дешевая синхронизация процессов через блокируемый read()

          Часто админские и веб-программерские задачи требуют синхронизации между разными компонентами системы, например, вебморда принимает команду на совершение какого-то действия, это действие желательно выполнить как можно раньше, но сам веб-интерфейс не может это сделать (скажем — не может изменить правила файрвола или таблицу роутинга просто потому что требуются полномочия root'а). Обычно я решал это некрасивым и неэффективным способом — веб-интерфейс писал команду в какой-то специальный файл, а другой шелл-скрипт (работающий от рута) в цикле проверял этот файл раз в несколько секунд, и если есть команды — то обрабатывал их.

          В этом посте я опишу простой способ, который:
          • не требует программирования — только unix-way сборка системы из маленьких кирпичиков
          • не отжирает много ресурсов (не нужно зря поллить файл, а сама программа весит значительно меньше шелла)
          • срабатывает моментально


          Читать дальше →