Шаблон для debian-пакетов, использующих virtualenv

Так как уже несколько раз, в том числе и по работе, столкнулся с задаче завернуть django-проект в установочный пакет для debian и, т.к. хотелось сделать это хорошо и с использованием virtualenv, то потратил некоторое время и собрал на github шаблон для создания таких пакетов. После разворачивания и небольшой правки Makefile остаётся только перенести свой проект в папку project, быстренько глянуть инструкцию, чтобы убедиться, что ничего не забыто, и запустить make builddeb.

Настраиваем sentry с virtualenv и uwsgi

UPD: для debian-систем появилась возможность упростить порядок инсталляции и сделать её более изолированной и удобной для управления: см. здесь.

В предыщуем посте я описал свой рецепт установки django + virtualenv + uwsgi. Сегодня настраивал под свои проекты новую версию Sentry для протоколирования ошибок и описываю шаги, которые специфичны для неё:

Continue reading Настраиваем sentry с virtualenv и uwsgi

Настройка nginx, uwsgi и django с django CMS на ubuntu 12.04 LTS

Записываю свой типовой шаблон настройки сервера с Ubuntu 12.04 LTS с нуля для раздачи django-проектов с помощью nginx, uwsgi и с изоляцией окружений с помощью virtualenv.

Для начала установка собственно ПО:

sudo apt-get install nginx uwsgi uwsgi-plugin-python \
python-virtualenv libjpeg62-dev

Используемая структура каталогов:

  • /var/lib/django/projects: для окружений virtualenv, соответствующих проектам
  • /web/: для статичных файлов проектов

Continue reading Настройка nginx, uwsgi и django с django CMS на ubuntu 12.04 LTS

Service name given as port is unknown

Встретился с забавной ошибкой от twisted при отладке очередного проекта:

Service name given as port is unknown: service/proto not found ('5672')

Поиск выводит только на сообщения с похожей ошибкой без ответов, а ларчик открывается просто: при вызове connectTCP номер порта должен быть строго целым числом, иначе twisted ищёт нужный порт, считая что вы передали ему название сервиса (как описано в /etc/services). Конечно, в этом справочнике сервисов такого названия не будет.

Экспорт-импорт данных django-cms

Приводил сегодня в порядок базу данных одного проекта на django-cms и в ходе этого процесса решил перенести накопившиеся данные в новую БД, инициализированную с нуля и с успешно прогнанными миграциями. И, т.к в документации об этом не было ни слова, пришлось искать решение, и наткнуться на пару ошибок, после которых удалось создать готовый рецепт:

  • Первым делом переносим данные из таблицы auth_user, например, средствами БД;
  • Далее делаем два файла с данными. Так нужно, чтобы избежать проблемы с ключами в таблице cms_placeholder (IntegrityError: duplicate key value violates unique constraint “cms_placeholder_pkey”), которые например описаны в рассылке django-cms:

    ./manage.py dumpdata --indent=2 cms.placeholder > initial_data.cms.01.json

    ./manage.py dumpdata --indent=2 cms.cmsplugin cms.page cms.pagemoderatorstate cms.pageuser \
    cms.title picture snippet text (сюда-же впишем и остальные плагины) > initial_data.cms.02.json

  • И теперь загружаем полученные данные в новую БД:

    ./manage.py loaddata initial_data.cms.01.json
    ./manage.py loaddata initial_data.cms.02.json

К слову о многопоточности

Довелось по работе столкнуться с сервисом шифрования, который был написан по словам авторов, вроде бы очень просто и примитивно, но протокол был очень неприятный: обмен шёл 18-байтовыми блоками символов через TCP-порт. Решил сделать к нему небольшой проксирующий сервис на twisted, который бы вёл приём данных через HTTP POST запросы, выдавая результат в ответ. Стал проверять на скорость работы, и, этот «лёгкий простой» Java-сервис шифрования оказалось не выдержал и 100 единовременных запросов. Пришлось в тестах ограничиться 10-ю потоками, а заодно озадачиться вопросом как twisted переиспользует объекты протокола в многопоточном доступе (об этом другая история).

Мораль такова: как и бывший коллега в тестах обнаружил, что twisted выдерживает на удивление столько потоков, что падаёт то, что стоит за ним, так и здесь получилось, что то, что кажется кому-то простым и надёжным, на деле оказывается весьма падуче-тяжеловесным, когда речь идёт о высокой нагрузке. И спасибо разработчикам twisted за столь стремительный фреймворк 🙂

BCM4313 в Ubuntu 11.10

Вышла свежая Ubuntu Oneiric Ocelot и с ней появилась новая проблема с WiFi на моём Lenovo U165. Помимо того, что нужно было сделать для Ubuntu 11.04, теперь стоит поступить следующим образом:

  1. Снести, если установлены, драйвера broadcom-sta-common и файл /etc/modprobe.d/broadcom-sta-common.conf;
  2. Добавить в /etc/modprobe.d/blacklist.conf строку:

    blacklist bcma

После этого беспроводная связь будет беспроблемно подниматься при каждой загрузке.

Сборка debian пакета для дополнения к PHP из PECL

Я довольно часто использую удобный класс HTTPRequest из дополнения pecl_http, который описан в официальной документации по PHP. Но в очередной раз устанавливая его из PECL поразился тому сколько шагов нужно сделать для его сборки на чистой системе, после чего решил подсобить админам, собрав для него стандартный debian-пакет.

Continue reading Сборка debian пакета для дополнения к PHP из PECL

Польза новых задач

По-настоящему мощь очередного фреймворка понимаешь, когда наконец-то сталкиваешься с задачей под которую он очевидно был заточен и вокруг базы под которую он обрастал. Как сейчас столкнулся на работе с необходимостью реализации немного извращённого соединения с обменом данными через TCP-сокеты сообщениями по ISO 8583. Быстрый любопытный взгляд в классы Twisted открыл что всё написано до нас, и всё, что остаётся – обернуть в красивую запускалку, дописать чуток логики и поработать над тестами, которые открыли несколько скрытых болезней. Ну и спасибо нашим админам, ещё поучиться засовывать получившийся модуль в красивый debian-пакет со скриптами и прочими свистелками :).

об incrontab замолвите слово

Сегодня озадачился тем, как сделать так, чтобы при обновлении данных об остатках товаров (которые хранятся в 1С и выгружаются в виде .csv файла), происходило автоматическое обновление данных в Satchmo. Сам скрипт для чтения остатков из csv довольно простой, и на днях выложу его на github, хотя уверен, что подобное ищется в интернете легко и быстро. А вот проблему с тем, как угадать с моментом запуска, раньше решали просто — независимо от состояния файла, данные из него импортировались раз в 15 минут. Теперь же нашёл весьма изящное решение — incrontab, демон, работающий аналогично cron, но срабатывающий по событиям, связанным с созданием/удалением/изменением файлов и их атрибутов. Удобно и просто 🙂