Попытка настроить Reddit

Возникла производственная необходимость настроить клон reddit.com. Сайт имеет открытый исходный код в публичном репозитории, но написан на python, а не на php, а ещё использует большое количество всяких технологий, смысл применения которых мне, как человеку который не ковыряет серверы с нагрузкой больше пару сотен тысяч хостов в сутки, непонятен.

В любом случае, попытка установить и настроить весь комплект целиком была предпринята. Сразу оговорюсь, что реддит-клон так и не запустился, но ниже более-менее продробно опишу весь процесс установки на Debian 5.0 lenny – может кому пригодится.

Итак, на волшебной странице http://code.reddit.com/wiki/DependenciesOnDebian5 можно прочитать об особенностях установки именно под дебиан, а также ознакомиться со списком пакетов, которые придётся установить: python2.6 python-setuptools python-imaging cython libpng12-0 libjpeg62 libfreetype6 libxml2 gettext memcached libmemcached postgresql libpq git git-core libssl curl daemontools rabbitmq-server cassandra. Но не спешите забивать их в aptitude install, т.к. половина этих пакетов находится в тестовых и нестабильных репозиториях, поэтому сначала нужно изменить /etc/apt/sources.list приведя его к виду:

deb http://<mirror>/debian/ lenny main
deb-src http://<mirror>/debian/ lenny main
 
deb http://<mirror>/debian/ testing main
deb-src http://<mirror>/debian/ testing main
 
deb http://<mirror>/debian/ unstable main
deb-src http://<mirror>/debian/ unstable main
 
deb http://security.debian.org/ lenny/updates main
deb-src http://security.debian.org/ lenny/updates main
 
deb http://volatile.debian.org/debian-volatile lenny/volatile main
deb-src http://volatile.debian.org/debian-volatile lenny/volatile main

Затем создаём файл настройки приоритетов /etc/apt/preferences :

Package: *
Pin: release a=stable
Pin-Priority: 700
 
Package: *
Pin: release a=testing
Pin-Priority: 650
 
Package: *
Pin: release a=unstable
Pin-Priority: 600

Устанавливаем стандартную версию питона, а затем обновляем до 2.6 из тестового репозитория. Если этого не сделать – будут проблемы с зависимостями.

apt-get install python python-central
aptitude install -t testing python-central
aptitude install python2.6/testing

Редактируем /usr/share/python/debian_defaults чтобы там было примерно следующее:

[DEFAULT]
# the default python version
default-version = python2.6
 
# all supported python versions
supported-versions = python2.5, python2.6
 
# formerly supported python versions
old-versions = python2.4
 
# unsupported versions, including older versions
unsupported-versions = python2.4

Меняем бинарник на новый:

$ sudo rm /usr/bin/python
$ sudo ln -s /usr/bin/python2.6 /usr/bin/python

Устанавливаем пакеты setuptools, python-dev и cython:

$ sudo apt-get install python2.6-dev/testing
$ sudo apt-get -t testing install python-setuptools
$ sudo apt-get install python-support/testing
$ sudo apt-get install cython/testing

Проверяем чтобы всё остальное тоже стояло и доствялем отсутствующее:

aptitude install git git-core subversion gcc make libpng12-dev libjpeg62-dev libfreetype6-dev libxslt1-dev gettext curl python-imaging

Устанавливаем memcached:

$ sudo apt-get install memcached/testing
$ sudo apt-get install libmemcached-dev/unstable

Ставим rabbitmq-server:

$ sudo apt-get install rabbitmq-server/testing

Перед установкой Кассандры редактируем /etc/apt/sources.list :

deb http://www.apache.org/dist/cassandra/debian unstable main
deb-src http://www.apache.org/dist/cassandra/debian unstable main

Генерируем ключи:

$ gpg --recv-keys F758CE318D77295D
$ gpg --export --armor F758CE318D77295D | sudo apt-key add -

Обновляемся и ставим cassandra:

$ sudo apt-get update
$ sudo apt-get install cassandra/unstable

daemontools ставить необязательно:

$ sudo apt-get install daemontools
$ sudo apt-get install daemontools-run

Теперь клонируем репозиторий гитом, сетапимся и выполняем мэйк, для того чтобы сжать яваскрипт и прочие каскадные стили:

git clone http://code.reddit.com/repo/reddit.git
python setup.py develop
make

При комплиляции я столкнулся с проблемой нехватки памяти. Дело в том, что gcc всё время пытался сожрать больше 256Mb памяти и залезть в отключенный своп, после чего выдавал ошибки not enought virtual memory и тому подобные. Ниже приведу возможные варианты решения проблемы.

  1. Включить своп линукс. Если нет физического раздела куда будем свопиться, то можно спопиться в файл:
    $ sudo dd if=/dev/zero of=/swapfile bs=1024 count=131072
    $ sudo chmod 0600 /swapfile
    $ sudo mkswap /swapfile
    $ sudo swapon /swapfile
    swapon: /swapfile: Invalid argument

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

  2. Компилировать распределённым компилятором distcc на другой машине. Как это делается.
  3. Мне помогло редактирование значения переменной CFLAGS, но после этого процесс компиляции идёт ооочень долго.
    CFLAGS="$CFLAGS --param ggc-min-expand=0 --param ggc-min-heapsize=8192"
    export CFLAGS

Вторая проблема, возникшая во время установки – ошибка с BeautifulSoup==3.0.8.1. Такой версии easy_install не находит, поэтому придётся поправить файлы r2/r2.egg-info/require.txt и r2/setup.py и написать там BeautifulSoup>=3.0.8.1 (т.е. любая версия старше 3.0.8.1)

После удачной компиляции делаем тестовый запуск:

paster serve --reload example.ini http_port=8080

У меня всё запустилось – зашёл моим любимым браузером links и увидел надпись, что он не поддерживается :)

Затем надо настроить софт, который мы понаставили. Создаём базу и импортируем функции:

su postgres
createdb -E utf8 reddit
psql reddit &lt; ../sql/functions.sql

Создаём пользователя базы reddit с паролем password (всё ещёиз-под пользователя postgres):

psql -d template1 -U postgres
alter user reddit with password 'password';
\q

Настраиваем rabbitmq:

$ sudo rabbitmqctl add_vhost /
$ sudo rabbitmqctl add_user reddit reddit
$ sudo rabbitmqctl set_permissions -p / reddit ".*" ".*" ".*"

Если ставили daemontools, выкидываем из автозапуска:

sudo update-rc.d -f memcached remove
sudo update-rc.d -f cassandra remove

Теперь копируем конфиг example.ini в run.ini, немного его исправляем. После этого пытаемся запустить:

paster run run.ini

После чего я всегда получал ошибку относительно отсутствия asset_tag.py, который является частью python-webhelpers. Но! Newer version of python-webhelpers doesn’t have asset_tag.py. Поэтому я нашёл старый пакет и ставил вручную:

wget http://pypi.python.org/packages/source/W/WebHelpers/WebHelpers-0.6.4.tar.gz && tar -xf WebHelpers-0.6.4.tar.gz && cd WebHelpers-0.6.4 && python setup.py build && sudo python setup.py install && cd ..

Теперь снова

paster run run.ini

После которого я получаю Segmentation fault (core dumped). Насколько я понял это уже ошибки компиляции, поэтому я умываю руки – возможно, вам повезёт больше. Если так – отпишитесь в комментах :)

P.S. Проверяйте всё ли стартануло и всё ли слушает те порты, которые должно netstat -lnpt. У кассандры например были проблемы с запуском, пока я не подредактировал /etc/hosts. И я так и не нашёл как сконвертить storage-conf.xml в cassandra.yaml (который в /etc/cassandra) используя bin/config-converter (в пакете его нет).

Leave a Reply

Your email address will not be published. Required fields are marked *