Bacula - резервное копирование: быстро, бесплатно, без смс

Не секрет, что админы делятся на 2 типа: кто ещё не делает бэкапы и кто их уже делает. Я совсем недавно перешёл на сторону светлых админов, хочу поделиться реально работающими конфигами. Теперь седина пропала и мои волосы вновь мягкие и шелковистые =) Использовать буду систему под названием bacula. Соответственно всё проверялось и работает под ОС GNU/Debian 6. В интернете видел много довольно полных мануалов, где описывается конфигурация. Я описывать почти ничего не буду, просто приведу рабочие конфиги и скажу что копировать, чтобы начать бэкапить с ещё одного сервера.

Читать далее

Nginx: общие принципы конфигурации

На днях посмотрел видео с участием Игоря Сысоева - отца русского nginx =) В выступлении Игорь говорит не о мастабировании в привычном для всех понимании (высокая нагрузка), а в плане рекомендаций к написанию конфигурации для nginx, чтобы при росте конфигурации не было проблем с его редактированием. Виды location: Описанные простыми строками (статические) location /dir/ {} - обычный префиксный location location = /dir/ {} - точное совпадение по запросу location ^~ /dir/ {} - префиксный location, но после него не идёт проверка по location на регулярных выражениях Описанные регулярными выражениями location ~ /dir/ {} - с учётом регистра location ~* /dir/ {} - без учёта регистра Именнованные location location @php {} Расположение статических location не играет роли.

Читать далее

Yii: автодополнение в консоли

Очень не хватало автодополнения комманд при вызове консольных комманд yii, чувствовал какую-то неполноценность yii в bash. На просторах интернета была найдена статья, позволяющая реализовать автодополнение с помощью родной unix-утилиты bash_completion. Если у вас проект находиться под управлением git, то просто добавляем сабмодуль: git submodule add git://github.com/Stamm/yii-console-completion protected/extensions/complete/ Или создайте файл LCompleteCommand.php в protected/extensions/complete/ Теперь подключаем класс в конфигурационном файле для консольного приложения (обычно это console.php): 'commandMap' => array( 'complete' => array( 'class' => 'ext.

Читать далее

Организация рабочего потока: Phpstorm, Redmine, Changelists

Сегодня я покажу как у меня получается сделать работу удобной с использованием Phpstorm, Redmine, Teamcity. Есть задача в redmine. Я начинаю её выполнять. Всё проверяю локально и коммичу в репозиторий. Выливаю изменения на тестовый сервер. Есть несколько ньюансов. Бывают задачи очень объёмные и/или не очень срочные, которые я делаю в перерывах между задачами с более высокими приоритетами. Или спокойно делаю задачу, но прибегает менеджер с огромными глазами и криками, что сайт выдаёт ошибку, и нужно сделать быстрый hotfix.

Читать далее

Yii: используем кэш в CActiveDataProvider

Репост моей заметки из wiki: http://www.yiiframework.com/wiki/233/using-cache-in-cactivedataprovider/. Первый параметр в конструкторе CActiveDataProvider может быть строковым значением с названием модели или экземпляр класса модели. Поэтому можно использовать CActiveRecord::cache() для кэширования, но нужно установить значение 3 у третьего параметра, потому что мы должны закэшировать 2 запроса: получение количества записей и само получение записей. Не забудьте использовать зависимости для принудительного протухания кэша. {% raw %} $dependecy = new CDbCacheDependency('SELECT MAX(update_time) FROM {{post}}') CActiveDataProvider(Post::model()->cache($duration, $dependecy, 2), array ( 'criteria' => array ( 'condition' => 'status = 1', 'order' => 'DESC create_time', ) 'pagination' => array ( 'pageSize' => 20, ) )); {% endraw %}

Читать далее

Yii: CGridView и запрос с group by и having by

Задача такая: вывести данные через компонент CGridView в YII, сгруппированные по определённому полю, а также применение условий по агрегированным данным. Возьмём простую таблицу: date | clicks Нам нужно получить сгруппированные данные по каждому часу. По сути нужно применить следующий запрос SELECT * FROM table GROUP BY LEFT(date, 13); Возникают следующие трудности в реализации через Yii: Yii не может посчитать общее количество, а соответственно будет неправильно создавать пагинатор. Yii просто обнуляет поля group by и having при подсчёте общего количества.

Читать далее

Настройка exim на почту для доменов от Яндекса (pdd.yandex.ru)

Настраиваем отправку почты с нашего сервера через почту для доменов от Яндекса. Для примера, используем домен zagirov.name. Запускаем конфигурирование exim’а: dpkg-reconfigure exim4-config Отвечаем на вопросы: mail sent by SMARTHOST; received via SMTP or fetchmail Type System Mail Name: пусто Type IP Adresses to listen on for incoming SMTP connections: 127.0.0.1 ; ::1 Other destinations for which mail: пусто Machines to relay mail for: пусто Type Machine handling outgoing mail for this host (smarthost): smtp.

Читать далее

Сохраняем письма, отправленные из php, в файлы

При разработке нужно как-то складировать письма, отправляемые из php через функцию mail. Был написан такой скрипт: #!/usr/bin/env php <?php define('SENDMAIL_DIR', '/tmp/mail/'); if ( ! file_exists(SENDMAIL_DIR)) { mkdir(SENDMAIL_DIR, 0777, true); } function generateFileName($i = 1) { $fileName = SENDMAIL_DIR . date('Y-m-d_H-i-s_') . $i . '.eml'; return file_exists($fileName) ? generateFileName(++$i) : $fileName; } $mail = fopen('php://stdin', 'r') or die(); $file = fopen(generateFileName(), 'w'); while ( ! feof($mail)) { fwrite($file, fgets($mail)); } fclose($mail); fclose($file); Даём ему право на исполнение для пользователя веб-сервера (обычно www-data).

Читать далее

Nginx конфиги

В интернете довольно много можно выложено конфигов nginx под различные веб-приложения. Но в большинстве из них используются if совместно с rewrite, что достойно всяческого порицания по словам автора nginx Игоря Сысоева. Выложу используемые мной конфиги для различных систем (redmine, chive) Redmine: upstream thin { server unix:/tmp/redmine.0.sock; } server { listen 80; server_name redmine.zagirov.name; root /usr/share/redmine/public/; access_log /var/log/nginx/redmine.access.log; error_log /var/log/nginx/redmine.error.log; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; include proxy.

Читать далее

Перенос svn-репозитария в git

Если у вас есть репозиторий svn, но вы познали все прелести git и не хотите терять историю правок, то эта статья для вас ;) Первым этапом будет получение всех авторов, которые коммитили в svn. Для гита нужен дополнительно email коммитера. #!/usr/bin/env bash authors=$(svn log -q | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sort | uniq) for author in ${authors}; do echo "${author} = ${author} <email>"; done Сохраняем вывод в какой-нибудь файл (/home/user/svn-authors.

Читать далее