пятница, 30 сентября 2011 г.

Запускаем Django на Synology ds211+

Приобрёл недавно девайс Synology ds211+ для хранения дома файлов, фильмов, фоток, дистрибутивов и т.д.
Это устройство класса NAS, оказалось довольно шустрым, внутри обычный линукс.
Родилась идея - захостить на устройстве сайт на django.
Ниже описан процесс инсталляции, приведший к успеху.
Нужно заметить, официальная документация django рекомендует использовать модуль wsgi для интеграции с apache.
Половину воскресенья пришлось потратить на то, чтобы выяснить - wsgi не работает.
При импорте модуля hashlib происходит segmentation fault. Похоже, проблема с библиотекой openssl,
разные версии которой используют python и apache.
Логичным workaround-ом показалось использование модуля FastCGI, т.к. в этом случае apache и FastCGI сервер
запускаются в разных процессах, и конфликта библиотек быть не должно.
Ещё одно замечание... В моём случае я использовал python25. Это не вызвано необходимостью,
а просто результат мучений первой половины воскресенья:)
Похоже, если в моих инструкциях заменить 25 на 26 всё будет отлично работать.

Ниже я расскажу, на что ушла вторая половина воскресенья.
Итак...

- регистрируем в службе DDNS наш сайт, например user123site.no-ip.org:8088;
заходим на сайт no-ip.com; регистрируем сайт - там всё понятно
в web интерфейсе нашей Disk Station регистрируем адрес 
user123site.no-ip.org в службе DDNS

- пробрасываем внешний порт 8088 роутера на порт 80 нашей Disk Station;
теперь если в интернете набрать адрес http://
user123site.no-ip.org:8088, то соединение придёт на 80 порт нашей Disk Station

- устанавливаем ipkg, сначала читать инструкцию: http://setaoffice.com/2011/04/08/how-to-in...a-synology-nas/
cd /volume1/@tmp/
wget http://wizjos.endofinternet.net/synology/a...7_arm-ds111.xsh
sh syno-mvkw-bootstrap_1.2-7_arm-ds111.xsh
rm syno-mvkw-bootstrap_1.2-7_arm-ds111.xsh
reboot
ipkg update

- устанавливаем необходимые пакеты (под root-ом)
ipkg install python25
ipkg install py25-psycopg2
ipkg install py25-flup
ipkg install py25-docutils
ipkg install svn
ipkg install mod-fastcgi
ipkg install postgresql

- устанавливаем опциональные пакеты (для удобства работы)
ipkg install mc
mc
F9->Options->Learn keys... настройка клавиш, в частности, стрелок
Alt-h история команд
Ctrl-x p подставляет путь текущего файла в командную строку
Ctrl-x t подставляет имя текущего файла в командную строку
F4 удобный редактор

- python должен быть правильной версии
rm /opt/bin/python
ln -s /opt/bin/python2.5 /opt/bin/python

- создаём в postgresql базу данных django; пользователь admin, пароль admin
есть варианты;
первый - http://forum.synology.com/enu/viewtopic.php?f=39&t=8916; web интерфейс администрирования - красиво, но я не пробовал
второй, проверенный:
берём pgAdmin3 для Windows с сайта http://www.pgadmin.org/, скачиваем pgAdmin3 и инсталлим на комп во внутренней сети
редактируем файл /usr/syno/pgsql/etc/pg_hba.conf, в секции IPv4 local connections добавляем строку (колонки разделены tab-ами):
host all all 192.168.1.0/24 trust
логинимся в терминал под пользователем admin (НЕ root) и выполняем команду
/usr/syno/pgsql/bin/pg_ctl reload
заходим под Windows в pgAdmin3, настраиваем соединение к Disk Station (пользователь admin с пустым паролем)
меняем пароль администратора на admin
создаём БД django

- инсталлируем django; допустим, есть пользователь user123
cd /volume1/homes/user123
svn co http://code.djangoproject.com/svn/django/tags/releases/1.3/
cd 1.3
python setup.py install
ln -s /opt/local/lib/python2.5/site-packages/django/bin/django-admin.py /usr/bin/django-admin.py

- создаём структуру каталогов сайта
cd /volume1/homes/user123
mkdir django-projects
cd django-projects
mkdir mysite_ss
cd mysite_ss
mkdir deploy
mkdir lib
mkdir logs
mkdir media

- создаём site
cd /volume1/homes/
user123/django-projects/mysite_ss
django-admin.py startproject mysite

- редактируем в mysite/settings.py строки
...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': 'django', # Or path to database file if using sqlite3.
'USER': 'admin', # Not used with sqlite3.
'PASSWORD': 'admin', # Not used with sqlite3.
'HOST': 'localhost', # Set to empty string for localhost. Not used with sqlite3.
'PORT': '5432', # Set to empty string for default. Not used with sqlite3.
}
}
...
TIME_ZONE = 'Europe/Moscow'
...
LANGUAGE_CODE = 'ru-ru'
...
ADMIN_MEDIA_PREFIX = '/media_admin/'
...
ROOT_URLCONF = 'urls'
...
INSTALLED_APPS = (
...
'django.contrib.admin',
...
'django.contrib.admindocs',
)

- редактируем в mysite/urls.py строки
...
from django.contrib import admin
admin.autodiscover()
...
urlpatterns = patterns('',
...
url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
...
url(r'^admin/', include(admin.site.urls)),
)

- инициализируем БД, создаются необходимые таблицы и пользователь-администратор
cd /volume1/homes/
user123/django-projects/mysite_ss/mysite
./manage.py syncdb

- создаём скрипт для запуска fcgi сервера /usr/syno/etc/rc.d/S91mysitefcgi.sh; не забываем chmod +x /usr/syno/etc/rc.d/S91mysitefcgi.sh
#!/bin/sh
PROJDIR="/var/services/homes/
user123/django-projects/mysite_ss/mysite"
PIDFILE="$PROJDIR/mysite.pid"
PORT="3033"
case "$1" in
stop)
echo "Stop mysite FastCGI..."
if [ -f $PIDFILE ]; then
kill `cat -- $PIDFILE` > /dev/null 2>&1
rm -f -- $PIDFILE
fi
;;
start)
export PYTHONPATH=".:../lib"
/opt/bin/python $PROJDIR/manage.py runfcgi method=threaded host=localhost port=$PORT pidfile=$PIDFILE
echo "Start mysite FastCGI..."
;;
restart)
$0 stop
sleep 1
$0 start
;;
*)
echo "usage: $0 { start | stop | restart}" >&2
exit 1
;;
esac

- создаём настройки виртуального хоста apache; скрипт /volume1/homes/
user123/django-projects/mysite_ss/deploy/mysite.ss
<VirtualHost *:80>
ServerName 
user123site.no-ip.org
ServerAdmin admin@
user123site.no-ip.org
ErrorLog /var/services/homes/
user123/django-projects/mysite_ss/logs/error_log
CustomLog /var/services/homes/
user123/django-projects/mysite_ss/logs/access_log common
Alias "/media_admin/" "/opt/local/lib/python2.5/site-packages/django/contrib/admin/media/"
<Directory /opt/local/lib/python2.5/site-packages/django/contrib/admin/media/>
Order deny,allow
Allow from all
</Directory>
Alias "/media/" "/var/services/homes/
user123/django-projects/mysite_ss/media/"
<Directory /var/services/homes/
user123/django-projects/mysite_ss/media/>
Order deny,allow
Allow from all
</Directory>
RewriteEngine On
RewriteRule ^/(media.*)$ /$1 [QSA,L,PT]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/(.*)$ /mysite.fcgi/$1 [QSA,L]
</VirtualHost>

- редактируем настройки apache; в конец файла /usr/syno/apache/conf/httpd.conf-user добавляем строки
LoadModule fastcgi_module /opt/libexec/mod_fastcgi.so
FastCGIExternalServer /var/services/web/mysite.fcgi -host localhost:3033
Include /var/services/homes/
user123/django-projects/mysite_ss/deploy/mysite.ss

- перезапускаем fcgi сервер и apache
/usr/syno/etc/rc.d/S91mysitefcgi.sh restart
/usr/syno/etc/rc.d/S97apache-user.sh restart

- тестируем в браузере то, что получились
http://
user123site.no-ip.org:8088/admin/

- перезапускаем Disk Station и ещё раз тестируем
reboot


Комментариев нет:

Отправить комментарий