Возникла производственная необходимость настроить клон 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 и тому подобные. Ниже приведу возможные варианты решения проблемы.
- Включить своп линукс. Если нет физического раздела куда будем свопиться, то можно спопиться в файл:
$ 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
Последняя ошибка появиться, если вы попытаетесь сделать это на виртуальной машине.
- Компилировать распределённым компилятором distcc на другой машине. Как это делается.
- Мне помогло редактирование значения переменной 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 < ../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 (в пакете его нет).