Stack Overflow風のサービスを使いたかったので頑張りましたが失敗しました。
代わりにPHPの Question2Answer を使えばそこまでの苦労なく成功。
以下は結局無駄に終わった記録です。
さくらのVPSのCentOS上でStack Overflowのクローンを動かしたかったのでRailsで書かれてて開発もアクティブなShapadoを入れようとしたけど失敗したので、今度はPythonのフレームワークDjangoで書かれてるAskBotを使うことにした。今度こそインストールがうまくいきますように。
Python のパッケージ管理
どうやらインストールにはpip
か easy_install
を使うらしいけど、俺はそんなもん知らん!
調べてみると両方共Pythonのパッケージ管理コマンドみたいだけど easy_install とか他に被りそうな名前はやめて欲しい。 easy_install の機能を拡張したのが pip なので特に理由がなければ pip を使うのが良さげ。
Pythonは2.7.3が入ってるのに $ which pip
や $ which easy_install
しても何も出てこないのでデフォルトでは入ってないらしい。なので
$ wget http://peak.telecommunity.com/dist/ez_setup.py
$ sudo python ez_setup.py
$ sudo easy_install pip
で easy_install と pip を入れておく。
Askbot のインストール
準備ができたので Askbot をインストールする。
$ sudo pip install askbot
「おっ、こりゃ簡単だ。やほーいヽ(=´▽`=)ノ」と思ってたら
Could not find a version that satisfies the requirement pytz (from askbot) (from versions: 2011h, 2010b, 2012f, 2010e, 2005m, 2011e, 2010l, 2011k, 2010e, 2009u, 2008c, 2006j, 2009f, 2005m, 2009j, 2009g, 2005k, 2010g, 2010h, 2007c, 2009i, 2007k, 2008g, 2008g, 2009j, 2007i, 2006g, 2008h, 2008i, 2009i, 2006p, 2009p, 2010k, 2007f, 2008i, 2009l, 2009i, 2008g, 2007d, 2010l, 2007k, 2007g, 2009g, 2007c, 2009n, 2009e, 2008c, 2007i, 2008a, 2010o, 2006g, 2009a, 2009p, 2009a, 2010l, 2007k, 2010h, 2007c, 2009r, 2006j, 2011c, 2011j, 2012h, 2009u, 2006g, 2009g, 2005r, 2010b, 2009n, 2009u, 2010g, 2005k, 2007i, 2006p, 2011b, 2013b, 2005k, 2005m, 2006p, 2005r, 2009r, 2009f, 2006j, 2009p, 2009n, 2009l, 2009j, 2008h, 2009e, 2009d, 2008b, 2010o, 2008b, 2008i, 2011k, 2009d, 2009a, 2009r, 2010k, 2010e, 2007f, 2008a, 2008a, 2009d, 2008h, 2012j, 2008b, 2009e, 2007f, 2010k, 2010g, 2011e, 2012h, 2011g, 2012g, 2011g, 2011c, 2013d, 2011e, 2011h, 2012j, 2011n, 2007d, 2012g, 2011j, 2008c, 2009f, 2013b, 2007g, 2005r, 2012c, 2012j, 2010b, 2009l, 2007g, 2012b, 2011c, 2011g, 2012c, 2011d, 2011d, 2012d, 2011k, 2012b, 2011n, 2012f, 2012f, 2010o, 2007d, 2012b, 2012c, 2011h, 2013d, 2013b, 2010h, 2011d, 2012d, 2011n, 2013d, 2011j, 2012g, 2012d, 2004b)
Cleaning up...
No distributions matching the version for pytz (from askbot)
と妙に長いエラーメッセージに怒られて凹む。
pipは標準では stable のパッケージしか利用しないのが原因らしいので
$ sudo pip install --pre askbot
とするとOKらしい。
DBをインストール
推奨はPostgreSQLらしい。 既にPostgreSQLは入ってるのでpythonの関連パッケージだけインストール
$ sudo pip install psycopg2
すると
UnicodeDecodeError: 'ascii' codec can't decode
とかエラーが出たので調べてみると python-devel を入れとかないと出るらしい、なので
$ sudo yum install python-devel
したあとにもう一度 psycopg2 をインストールしたら無事成功
データベースを作成
psql -U username -d postgres
でログインして
postgres=> create database database_no_namae with owner=username;
CREATE DATABASE
postgres=> alter user username with password 'himitsu_no_pass';
postgres=> \q
Askbot用のデータベースを作成して、それからパスワードを決めてなかったらユーザーにちゃんとパスワードを設定しておく。
そして pg_hba.conf
の一番上の方に以下の記述を追加
local database_no_namae username md5
ただしこの pg_hba.conf がどこにあるかを探すのは結構めんどくさいらしい。
自分の環境では /var/lib/pgsql/9.2/data/pg_hba.conf
にあったけど、別の所にあるかも知れない。
詳しくは参考のリンクを見てください。
んで postgresql を再起動
$ sudo /etc/init.d/postgresql-9.2 restart
Askbotの初期設定
……疲れた。さてここからがやっと Askbot自体の設定の始まりです。
まずAskbotを置くディレクトリを作成。この時に .
を含まないように注意する。(Pythonのモジュール名の規則に違反するため。)
自分の場合は /home/username/apps/askbotnobasyo
な感じで作成。
※ここで少し飛ばして下の『再トライ』ぐらいまで移動したほうが幸せになれます。
作ったディレクトリ内に移動して、そこで $ askbot-setup
を叩く。
そうするとセッてアップのためのファイルが作成されるのでインストールコマンドの collectstatic を使う
$ python manage.py collectstatic
そしてデータベースの初期化
$ python manage.py syncdb
したところまたTypeError: Item in ``from list'' not a string
なんて出てきて心が折れそうになる。
何でもDjangoのバージョンが1.4だと出るデラーで 1.4.2 にアップデートすればいいという情報を見つけたけどアップデートの方法どころかDjangoのバージョンを調べる方法さえわかんねえ。
Django のバージョンの調べ方
$ python
Python 2.6.6 (r266:84292, Jul 10 2013, 22:48:45)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> django.get_version()
'1.5.2'
せめてこれが1.4 ならアップデートを試せたのに…。
-- 時間経過 --
どうやら1.5は新しすぎてダメなので 1.4 にダウングレードするとよいらしい。
ただ、どうも調べてると virtualenv という特定のディレクトリにPythonの環境を構築するモジュールを使うのが常識らしく、それを前提にした回答しか出てこない。
virtualenv 環境にAskbotを入れなおす
仕方がないのでvirtualenvで環境を作ってそこにAskbotを入れなおすことにする。
まずはvirtualenv をインストール
$ sudo pip install virtualenv
仮想環境を作って、仮想環境を activate して、それからDjango1.4.5をインストール
$ virtualenv askbotnobasyo
$ cd askbotnobasyo
$ . /bin/activate
$ pip install django==1.4.5
askbot の初期化ファイルを作成
$ askbot-setup
聞かれたことに答えてると終了。んで
$ python manage.py collectstatic
すると .css や .js などの全ての静的ファイルが一つのフォルダに生成され……
…ないっ!! またエラーだよ! ふぁーーっく!!
再トライ
やっぱり virtualenv 使うのはやめとこう。どうせ一個しか環境ないんだし。
なので$ deactivate
でvirtualenv から脱出しておく。
Djangoのダウングレード方法がわからなかったのでvirtualenv使ったけど、よく考えたら「uninstall -> install でええやん。」ということに気付く。
$ sudo pip uninstall django
$ sudo pip install django==1.4.5
んでプロジェクトフォルダ作ってそこに移動して
$ askbot-setup
$ python manage.py collectstatic
$ python manage.py syncdb
で今まではエラーで躓いてしまってたけどやっとできたー!!! やったー!!
Nginx と uWSGI で公開する
まずドメインをとっといてそのドメインにさくらのVPSを登録しておく。ココらへんが分からなかったらほかのサイトを参照してください。
んで、Nginxも自分の環境では既に動いてるのでスルー。とりあえずドメインでNginxで動いてるサーバーにアクセスできるように設定しておく。
uWGSI のインストールには pypi が使えるらしい。pypi のコマンドが pip なんだと思う。
$ sudo pip install uwgsi
そして当然のように帰ってくる UnicodeDecodeError
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 17: ordinal not in range(128)
これは *-devel パッケージが足りないから起きるらしいんだけど、それならちゃんとエラーメッセージもそういう風に書いて欲しい。
uwgsi には python-devel だけじゃなくて libevent-devel も必要らしいので入れる。
$ yum install libevent-devel
んで、$ sudo pip install uwgsi
してみたけどやっぱりこける。ほかのサイトの情報によると libxml2-devel
や python-pip
もいるらしいので $ sudo yum install libxml2-devel python-pip
で入れてみる。
3度めの $ sudo pip install uwgsi
でやっと成功!
で Nginx の設定 /etc/nginx/site-available/example.com.conf を作って
$ sudo ln -s /etc/nginx/site-available/example.com.conf /etc/nginx/site-enabled/exsample.com.conf
んで $ sudo vi exsample.com.conf
で設定ファイルを開いて
server {
listen 80;
server_name exmaple.com;
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/exmaple.com.error.log info;
location / {
include uwsgi_params;
uwsgi_pass localhost:44863
#uwsgi_param UWSGI_PYHOME /path/to/your/virtualenv;
uwsgi_param UWSGI_SCRIPT wsgi; #this is the name of the script
uwsgi_param UWSGI_CHDIR /home/username/apps/appname;
}
location /m/ {
#use this for askbot <= 0.7.39
#alias /path/to/your/virtualenv/lib/python2.7/site-packages/askbot/skins/;
alias /home/username/apps/appname/static/;
autoindex off;
}
location /upfiles/ {
alias /home/username/apps/appname/askbot/upfiles/;
autoindex off;
}
location /admin/media {
alias /home/username/apps/appname/static/admin; #or path to admin media in <= 0.7.39
autoindex off;
}
}
んで $ sudo service nginx restart
で再起動。設定にミスがあったらここでエラー。
プロジェクトフォルダにある django.wsgi を wsgi.py にリネームしてから uwsgi を色々オプションつけながら起動。
$ sudo uwsgi --chdir=/home/username/apps/appname \
--module='appname.wsgi:application' \
--env DJANGO_SETTINGS_MODULE=appname.settings \
--master --pidfile=/tmp/project-master.pid \
--socket=127.0.0.1:44863 \
--processes=5 \
--harakiri=20 \
--limit-as=128 \
--max-requests=5000 \
--vacuum --daemonize=/var/log/uwsgi/appname.log
参考
python - Why is pip not listed in easy_install on CentOS 6? Where to get it? - Super User
http://superuser.com/questions/407926/why-is-pip-not-listed-in-easy-install-on-centos-6-where-to-get-it
python - Could not find a version that satisfies the requirement pytz - Stack Overflow
http://stackoverflow.com/questions/18230956/could-not-find-a-version-that-satisfies-the-requirement-pytz
Create database for Askbot — Askbot 0.7.48 documentation
http://askbot.org/doc/create-database.html
virtualenv - How to install psycopg2 with "pip" on Python? - Stack Overflow
http://stackoverflow.com/questions/5420789/how-to-install-psycopg2-with-pip-on-python
python - can't install psycopg2 on centos - Stack Overflow
http://stackoverflow.com/questions/12908807/cant-install-psycopg2-on-centos
postgresql - How do I find the path to pg_hba.conf from the shell? - Ask Ubuntu
http://askubuntu.com/questions/256534/how-do-i-find-the-path-to-pg-hba-conf-from-the-shell
Re: I need to know password for postgres
http://www.postgresql.org/message-id/1029274812.1353.648.camel@linda
Trying AGAIN to install askbot on a clean server and getting TypeError - Askbot: Open Source Q&A Forum
http://askbot.org/en/question/11071/trying-again-to-install-askbot-on-a-clean-server-and-getting-typeerror/
python - How to know what django version i use? is it 1.0, 1.1, or 1.2? - Stack Overflow
http://stackoverflow.com/questions/4151788/how-to-know-what-django-version-i-use-is-it-1-0-1-1-or-1-2?answertab=votes#tab-top
On syncdb getting TypeError: Item in ``from list'' not a string - Askbot: Open Source Q&A Forum
http://askbot.org/en/question/10153/on-syncdb-getting-typeerror-item-in-from-list-not-a-string/
Generics 3.0: Downgrade the pip installed package
http://generics7.blogspot.jp/2013/05/downgrade-pip-installed-package.html
今日のPython: VIRTUALENV について
http://blog1.erp2py.com/2011/07/virtualenv.html
virtualenv 1.10.1 : Python Package Index
https://pypi.python.org/pypi/virtualenv
How to leave a python virtualenv? - Stack Overflow
http://stackoverflow.com/questions/990754/how-to-leave-a-python-virtualenv
How to Step by Step Deploy Askbot uWSGI Nginx on CentOS 6 64bit? - Askbot: Open Source Q&A Forum
http://askbot.org/en/question/7829/how-to-step-by-step-deploy-askbot-uwsgi-nginx-on-centos-6-64bit/
How to deploy on nginx webserver using uwsgi? - Askbot: Open Source Q&A Forum
http://askbot.org/en/question/7492/how-to-deploy-on-nginx-webserver-using-uwsgi/
python - 'ascii' codec can't decode error when use pip to install uwsgi - Stack Overflow http://stackoverflow.com/questions/17931726/ascii-codec-cant-decode-error-when-use-pip-to-install-uwsgi
Django + uWSGI + NGINX 環境構築メモ on Ubuntu 12.04 | とある Vimmer のブログ http://shu-b10g.blogspot.jp/2012/08/django-uwsgi-nginx-on-ubuntu-1204.html