DSC_0179

Проблемы при деплое Django на виртуальный хостинг на примере jino.ru

Деплой Django на виртуальный хостинг для меня частенько превращается в квест. Это происходит из-за большого количества зависимостей Django от программного системного окружения. Но беда даже не в их количестве, а в том, что существует несколько способов их разрешения. Это красота и боль UNIX-way, воплощенная в python.

Одним из инструментов, призванных облегчить работу в этом хаосе, является виртуальное Python-окружение virtualenv. Да, использование virtualenv безусловно полезная практика, но virtualenv не решает всех проблем. Некоторые python-модули написаны на C и требуют компиляции при установке, а также имеют зависимости от -dev версий системных библиотек. Такие зависимости невозможно разрешить самостоятельно, имея лишь права пользователя виртуального хостинга. Админы же хостинга не всегда считают нужным об этом позаботиться, а времени на переписку с саппортом частенько нет. Один из таких хостингов jino.ru.

Яркий пример таких «проблемных» пакетов жизненно необходимые в большинстве Django проектов mysql-python (MySQLdb) и PIL. Проблему можно попробовать решить, используя ключ —system-site-packages при создании виртуального окружения. И тогда, если тебе немного повезет, в системе уже будут установлены эти пакеты не очень древних версий. Обрати внимание, что поведение по умолчанию в отношении установки системных пакетов у virtualenv менялось с течением времени. Поэтому либо качай и используй свежую версию virtualenv, либо предварительно сверься с документацией к используемой версии.

В моем случае ситуацию дополнительно усложняло то, что я использую более свежий форк PIL-а Pillow, так как PIL уже много лет как заброшен своими мейнтейнерами и не умеет работать с новыми форматами изображений. А Pillow для обратной совместимости маскируется под PIL и импортируется в скрипты под его псевдонимом, что избавляет от правки исходников своих и сторонних пакетов. Таким образом, при наличии PIL в окружении (один из системных пакетов), становится невозможной работа с Pillow.

В случае с Джино, я попал в следующую ситуацию: с одной стороны мне нужны системные пакеты в virtualenv из-за MySQLdb, а с другой нет — из-за PIL. Возможности выборочной установки или деинсталяции системных пакетов в virtualenv на данный момент нет. Проблему решил хладнокровным удалением PIL из myenv/lib/pythonx.x/site-packages.