Страдания из-за ошибки от git push

Два дня пытался разобраться почему не проходит git push в мой репозиторий. Ошибка была вида «PUT xxxxxxxxxxxxxxxxxxxxxxx failed, aborting (22/413)». Грешил на WebDAV, даже попробовал настроить доступ к репозиторию через nginx (к слову push тогда работать не будет, т.к. nginx не умеет обрабатывать WebDAV комманды вроде PROPFIND). Проблема решилась, когда узнал, что «22/413» означает коды ошибок CURL/HTTP. А HTTP 413 — это «Request entity too large». Всего-то надо было поправить максимальный размер запроса от клиента :)

Твиттерасты

Когда смотришь конференцию вроде HTML5 Camp всегда так смешно наблюдать как в модной колонке «Twitter» стадо повторяет одно и то-же друг за другом, стремясь засветиться.

Как я настраивал gitweb

Методом проб и ошибок, наконец разобрался как настроить себе на одном домене gitweb и доступ к репозиториям через HTTP. Ошибкой было то, что я считал, что достаточно одного gitweb а на деле оказалось ещё и небольшое шаманство с Апачем. За основу взята инструкция с хабрахабр.

  • Первым делом установил сами пакеты:
    aptitude install git-core gitweb
    
  • Создал каталоги для репозиториев и веб-доступа:
    mkdir -p /web/git.domain.tld/{htdocs,logs} /web/git.domain.tld/htdocs/git
    
  • Активируем модули DAV в Апаче, для доступа с помощью git:
    a2enmod dav
    a2enmod dav_fs
    a2enmod rewrite
    a2enmod env
    
  • Создаем конфигурацию gitweb:
    vim /web/git.domain.tld/gitweb.conf
    

    Например:

    # адрес репозиториев
    $my_uri = "http://git.domain.tld";
    # название сайта, отображается в заголовке
    $site_name = "git.domain.tld";
    # путь к репозиториям git на жёстком диске
    $projectroot = "/web/git.domain.tld/htdocs/git/";
    
    $git_temp = "/tmp";
    # ссылка на «домашнюю страничку»
    $home_link = $my_uri;
    # текст, можно расскоментировать и вставить свой
    # $home_text = "indextext.html";
    $projects_list = $projectroot;
    $stylesheet = "/gitweb/gitweb.css";
    $logo = "/gitweb/git-logo.png";
    $favicon = "/gitweb/git-favicon.png";
    $projects_list_description_width = 40;
    
    $feature{'pathinfo'}{'default'} = [1];
    
  • И на закуску самое вкусное — настройки Апача:
    <VirtualHost *:80>
            ServerName git.domain.tld
            ServerSignature Off
    
            ServerAdmin admin@git.domain.tld
    
            DocumentRoot /web/git.domain.tld/htdocs/
            ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    
            SetEnv GITWEB_CONFIG /web/git.domain.tld/gitweb.conf
            Alias /gitweb /usr/share/gitweb/
    
            RewriteEngine on
            RewriteRule ^/([a-zA-Z0-9_\-]+\.git.*)$ /cgi-bin/gitweb.cgi/$1 [L,PT]
    
            <Directory /web/git.domain.tld/htdocs>
                    Options Indexes FollowSymLinks ExecCGI
                    AllowOverride None
                    Order allow,deny
                    allow from all
            </Directory>
    
            <Location /git>
                    DAV on
                    <LimitExcept GET HEAD PROPFIND OPTIONS REPORT>
                            Require valid-user
                    </LimitExcept>
            </Location>
    
            ErrorLog /var/log/apache2/error.log
    
            <Location />
                    DirectoryIndex /cgi-bin/gitweb.cgi
    
                    AuthType Basic
                    AuthName "Version Control Server"
                    AuthUserFile /web/git.domain.tld/htusers
                    Require valid-user
            </Location>
    </VirtualHost>
    

Остается только завести пользователей в web/git.domain.tld/htusers и создавать репозитории в /web/git.domain.tld/htdocs/git. Например, создав myrepo.git (с опцией --bare) мы увидим его в списке проектов, зайдя браузером на git.domain.tld, а чтобы работать с ним через git надо будет использовать url http://git.domain.tld/git/myrepo.git/,

Оперативность = любовь клиентов

Вчера, на волне регистрации доменов в зоне .рф завёл пару адресов для своих проектов и собрался уже было использовать Linode в качестве DNS, как выяснилось, что у них национальные домены не поддерживаются. Огорчённый сим фактом завёл тикет и, не успел дойти до дома, как поддержка появилась и работает! Ещё один плюс в копилку карму этой компании.

А вот один игровой сервис уже два года шлёт мне письма о всяких своих новостях, из-за регистрации, сделанной там по глупости. А ведь ещё тогда завёл у них запрос на удаление аккаунта (опции такой в интерфейсе не было вообще). На днях повторил запрос, а воз и ныне там — ни прекратить слать своё говно ни стереть регистрацию они не могут/не хотят.

Ещё про почтовые сервера

Возвращаясь к предыдущей записи: одна весьма крупная и известная телекомпания не гнушается настроить свой почтовый сервер так, чтобы он в команде HELO называл себя «bender». Всем конечно приятно вспомнить героя с именем Остап-Сулейман-Берта-Мария-Бендер-Бей из хорошей книги (да, здесь должен быть тег irony), но правильно настроенные против спама почтовые системы разорвут соединение при такой команде HELO и вы не сможете ни восстановить пароль, ни получить код активации вашего профиля.

Халатность в SPF

Довольно давно пользуюсь на своём почтовом сервере модулем проверки письма на соответствие SPF-записям в DNS отправителя. Сегодня попался первый случай, когда она зарезала письмо, из-за халатности администраторов. С одного довольно серьёзного сайта с сериалами было отправлено мне письмо с приглашением (иначе попасть было никак), и доставлять его мне напрямую взялся сервер, отсутствующий в SPF-записи как возможный отправитель. Причём глупо выглядит когда проект, использующий явно не один сервер, представляется в SMTP совершенно другим доменом (но ладно, может у них до почтового сервера руки не дошли). Но факт — письмо зарезано, администраторам отправлено описание проблемы, но пока они молчат с решением.

Настройка админской панели в django

Интересная заметка на habrahabr про то как минимальными усилиями сделать из обычной админской панели django красивый и удобный интерфейс.

Do it satchmo way

Недавно потребовалось быстро развернуть более-менее универсальный магазин для нашего нового проекта торговли велотоварами. PHP-системы мне как-то не нравились и из симпатии к python начал было писать проект на django, но вскоре понял, что скорее всего получается велосипед, и начал искать что-то готовое. Оно пришло в виде Satchmo, весьма универсального и накручиваемого решения для электронной торговли. Что понравилось — немало настроек, в которых поначалу можно запутаться. Есть тонкости в адаптации под себя, но они описаны в документации (один отсутствующий момент — это как обновлять sitemaps, пришлось додумывать и доделывать самома). Но главное, магазин развернулся из коробки и через пару часов в нём уже можно было добавлять товары. А вот допиливания мелочей происходят уже по ходу, и зачастую незаметно для посетителей :)

Антивелосипед

Python опять обрадовал меня наличием готовых модулей для всего и вся. На этот раз повезло быстро разобраться с чтением конфигурации из XML файла — для этого идеально подошёл модуль xmlobjects и простая конструкция вида:

import xmlobjects
import psycopg2

xml = """

   user
password
   dbname

"""

conf = xmlobjects.fromstring(xml)
conn = psycopg2.connect('dbname=%s user=%s password=%s' % (
    conf.db.dbname, conf.db.user, conf.db.password))

Получение приватного SSL-ключа без пароля

Защищать приватный ключ SSL-соединений паролем в большинстве случаев очень хорошая идея, но некоторое ПО (в частности некоторые классы PHP) не всегда нормально воспринимают такие файлы, особенно в формате PEM. Чтобы дать им счастье и умиротворение достаточно с помощью openssl провести пару простых операций импорта-экспорта и получить желаемый файл без паролей:

cat my.crt my.key > my.pem
openssl pkcs12 -export -in my.pem -nodes -out my.pfx
openssl pkcs12 -in my.pfx -out my-nodes.key -nodes -nocerts

В примере из файлов my.crt и my.key получаем незащищенный файл my-nodes.key. Взято отсюда.